JShell: 4. 편집

이 문서는 Java9의 오라클 공식 문서 중 JShell 사용자 가이드의 한글화 문서입니다. 원문 정보는 다음과 같습니다.

JShell 사용자 가이드의 한글화 문서는 다음과 같이 구성됩니다.


JShell 사용자 가이드: 4. 편집


JShell은 프롬프트에서 입력된 것을 수정하는 편집 기능을 제공합니다. 또한, 이런 수정 작업에 여러분이 선호하는 외부 편집기를 사용할 수 있습니다.

쉘 편집 기능을 이용하여 이전에 입력한 스니펫과 명령을 입력한 후에, 다시 스니펫과 명령을 편집할 수 있습니다. 이전에 입력했던 스니펫과 명령을 검색하고 변경할 수 있습니다. 또한, 스니펫을 편집하고 생성할 때 외부 편집기를 사용할 수도 있습니다. 외부 편집기 이용은 여러 줄로 구성된 스니펫을 작성할 때 매우 유용합니다.

  • 문서 구성
    • 쉘 편집
    • 외부 편집기 사용

쉘 편집

명령 프롬프트의 입력을 수정하는 기능을 이용하여 여러분의 입력을 손쉽게 고칠 수 있고, 이전에 입력한 명령과 스니펫을 검색하고 수정할 수 있습니다.

JShell의 쉘 편집 기능은 JLine21을 기반으로 만들었습니다. 기능적으로 Emacs 모드의 BSD editlineGNU readline과 유사합니다. 더 자세한 내용은 JLine2 사용자 정보GNU Readline 문서를 참조하십시오.

입력 행 탐색(Input Line Navigation)

쉡 편집은 현재 행 편집을 지원합니다. JShell의 이전 세션에서 만들어진 히스토리에도 접근할 수 있습니다.

입력 행 탐색을 위한 키 조합에 Ctrl 키와 Meta 키를 사용합니다. 키보드에 Meta 키가 없으면, Alt 키가 Meta 키를 대체합니다.

행(line) 안에서 이동은 왼쪽 화살표 방향키(<-)와 오른쪽 화살표 방향키(->)를 사용합니다. 뒤로 이동할 때는 Ctrl+B를, 앞으로 이동할 때는 Ctrl+F를 사용합니다. 히스토리에서 행(line)을 탐색하는 경우에는 위 화살표 방향키아래 화살표 방향키를 사용합니다. 위 화살표 키를 누르면, 현재 행이 이전 명령이나 스니펫 행으로 대체됩니다. 위 화살표 키를 다시 누르면 현재 행은 그 이전 행으로 대체됩니다. 히스토리에는 명령과 스니펫이 모두 기록됩니다. 스니펫이 여러 행으로 구성된 경우, 위 화살표 키와 아래 화살표 키는 스니펫의 개별 행을 탐색하고 출력합니다.

다음 표는 입력 행 탐색에 사용되는 키와 기능을 정리합니다.

액션
Return 현재 행 입력
<–, 왼쪽 화살표 방향키 한 문자 뒤로 이동
–>, 오른쪽 화살표 방향키 한 문자 앞으로 이동
Up arrow, 위 화살표 방향키 한 줄 위로 이동, 히스토리에서 뒤로 한 줄 이동
Down arrow, 아래 화살표 방향키 한 줄 아래로 이동, 히스토리에서 앞으로 한 줄 이동
Ctrl+A 행 시작 부분으로 이동
Ctrl+E 행 끝으로 이동
Meta+B 한 단어 뒤로 이동
Meta+F 한 단어 앞으로 이동

히스토리 탐색(History Navigation)

히스토리에는 여러 JShell 세션의 스니펫과 명령이 기록되고 관리됩니다. 히스토리를 통해서 현재 세션과 이전 세션에서 입력한 항목에 접근할 수 있습니다.

이전애 입력한 것을 다시 입력하거나 수정하려면, 위 혹은 아래 화살표 방향키, 왼쪽 및 오른쪽 화살표 방향키를 사용하여 기록을 탐색한 후 커서가 위치한 곳에 텍스트를 입력합니다. 텍스트를 삭제해야 할 경우 Delete 키를 사용합니다. Enter 키를 눌러 히스토리 행을 재입력합니다.

다음 예제에서, 위쪽 및 아래쪽 화살표 키는 한 번에 한 줄씩 히스토리를 앞뒤로 이동합니다

jshell> class C {
   ...>    int x;
   ...> }
|  created class
jshell> /list

   1 : class C
         int x;
       }

jshell> <up arrow>

위 화살표 방향키를 입력하면 다음과 같이 /list 명령이 출력됩니다.

jshell> /list

위 방향 화살표 키를 다시 입력하면 클래스 정의 마지막 라인이 출력됩니다.

jshell> }

아래 방향 화살표 키를 누르면 “/list” 명령을 반환합니다. 엔터 키를 누르면 “/list” 명령이 실행됩니다.

jshell> /list

   1 : class C {
         int x;
       }

Ctrl+위 화살표 방향키는 이전 스니펫으로 이동합니다. 스니펫이 한 줄이라면 Ctrl+위 화살표 방향키2위 화살표 방향키 와 결과가 같습니다. 클래스 C와 같이 여러 줄로 구성된 스니펫에서 Ctrl+위 화살표 방향키는 해당 스니펫의 첫 번째 행으로 이동합니다. 그 사이에 행은 건너 뜁니다.

입력 행 수정(Input Line Modification)

히스토리로 부터 입력 행을 조회한 후, 필요에 따라서 코드를 변경하고 재입력할 수 있습니다. 이 기능을 사용할 경우, 코드의 일부분을 수정하기 위해서 행 전체를 다시 입력할 필요가 없습니다.

현재 커서가 위치한 곳에서 텍스트를 입력하면 됩니다. 행에서 커서를 움직이는 키에 대해서는 “입력 행 탐색” 절을 확인하시기 바랍니다.

다음 표는 입력 행 수정에 사용되는 키와 기능을 정리합니다.

액션
Delete 커서 위 또는 이후의 문자를 삭제합니다. 이것은 운영체제에 따라서 결정됩니다.
Backspace 커서 앞에 있는 문자를 삭제합니다.
Ctrl+K 커서 위치부터 행의 마지막까지 텍스트를 삭제합니다.
Meta+D 커서에서 워드(Word) 끝까지 텍스트를 삭제합니다.
Ctrl+W 커서에서 이전 공백(White Space)까지 텍스트를 삭제합니다.
Ctrl+Y 행에 가장 최근에 삭제된 문자를 붙여넣습니다.
Meta+Y Ctrl+Y 다음에 Meta+Y 이전에 삭제된 텍스를 순환합니다.

검색과 기타

히스토리 검색은 JShell의 기능으로, 이 기능을 통해서 한 번에 한 줄씩 히스토리를 이동하지 않고도 원하는 줄을 쉽게 찾을 수 있습니다.

검색을 시작하려면 Ctrl-R을 누릅니다. 프롬프트에서 검색 문자열을 입력합니다. 검색은 가장 최근 항목에서 뒤쪽으로 이동하며 처리됩니다. 검색은 JShell의 이전 세션을 포함합니다. 다음 예제는 Ctrl-R을 누른 후에 표시되는 프롬프트를 보여줍니다.

jshell> <Ctrl+R>
((reverse-i-search)`':

히스토리 탐색의 예제에서, class를 입력하면 텍스트 “class”를 포함하는 가장 최근 입력 행을 출력합니다.

(reverse-i-search)`class': class C {

검색은 점증적으로 처리됩니다. 첫 번째 문자 “c”로 검색하고 예제와 같이 결과를 출력합니다. Ctrl+R를 반복적으로 입력해서 히스토리의 이전 결과를 검색할 수 있습니다. Ctrl+S는 현재 위치에서 앞 방향으로 검색을 계속합니다.

Ctrl-x (“를 입력하여 키보드 매크로를 정의할 수 있습니다. 그 다음 텍스트를 입력합니다. 매크로를 종료할 때 “Ctrl-x )“를 입력합니다. “Ctrl + x e“를 입력하면 앞에서 정의한 매크로가 실행됩니다.

다음 표에서는 검색과 매크로 생성에 사용되는 키 조합과 기능을 정리합니다.

액션
Ctrl+R 히스토리 마지막에서 뒤쪽으로 검색
Ctrl+S 히스토리 처음부터 앞 방향으로 검색
Ctrl+X ( 매크로 정의 시작
Ctrl+X ) 매크로 정의 종료
Ctrl+X e 매크로 실행

외부 편집기 사용

JShell 코드 편집에 외부 편집기를 사용할 수도 있습니다. 이 편집기는 스니펫 편집 및 생성에 사용됩니다. 특히 여러 줄로 작성된 스니펫 작업에 유용합니다. 여러분이 선호하는 편집기를 JShell에 지정할 수 있습니다.

기존에 만들어진 모든 스니펫을 편집기에서 한 번에 편집할 경우, 별도 옵션 없이 /edit 명령을 사용합니다. 편집기에서 특정 스니펫을 지정하여 편집할 경우, /edit 명령에 스니펫 이름 혹은 ID를 추가하여 실행합니다. /list 명령을 사용 스니펫 ID를 얻을수 있습니다. 다음 예제를 실행하면 편집기를 열고, 앞에서 정의한 volume 스니펫 코드가 편집기에 출력됩니다.

jshell> /edit volume

편집기에서 새로운 스니펫을 작성할 수 있습니다. 편집기를 저장하면, 변경되거나 새로 작성된 스니펫은 JShell 세션에 입력됩니다. 이때 스니펫 입력에 대한 피드백은 JShell 윈도우에서 확인할 수 있습니다. 그러나 현재 JShell 윈도우에는 프롬프트가 없는 상태입니다. 편집기를 종료한 이후에는 JShell 윈도우에 명령이나 스니펫을 다시 입력할 수 있습니다.

/edit 명령을 실행할 때 편집기를 지정하지 않으면, 환경 변수에 설정된 편집기가 실행됩니다. 환경 변수는 JSHELLEDITOR, VISUAL, 그리고 EDITOR 순서로 참조합니다. 설정된 환경 변수가 없다면, JShell에 포함되어 있는 기본 편집기3를 사용합니다. /set editor 명령을 사용하여, 여러분이 선호하는 편집기를 사용하도록 JShell을 설정할 수 있습니다. /set editor 명령의 매개 변수로 여러분이 사용하고자 하는 외부 편집기를 실행하는 명령을 추가합니다. 다음은 편집기로 “kwrite”를 설정하고 기존의 모든 스니펫을 편집기에 오픈하는 예제입니다.

JShell에 포함된 기본 편집기
그림 1: JShell에 포함된 기본 편집기
jshell> /set editor kwrite
|  Editor set to: kwrite

jshell> /edit

외부 편집기 윈도우에 x 변수를 정의한 다음에, 외부 편집기에 변경을 저장하면, JShell 윈도우에 다음과 메시지가 출력됩니다.

|  created variable x of type int with initial value 6

외부 편집기를 종료하면 JShell 윈도우에 프롬프트가 다시 나타납니다.

jshell>

  1. [역자주]JLine은 콘솔 입력을 처리하기 위한 Java 라이브러리입니다. bash의 명령 편집, 자동완성, 히스토리 기능을 제공합니다. https://github.com/jline/jline2 [return]
  2. Mac 환경에서 Ctrl+위 화살표 방향키 는 Missing Control로 맵핑되어 있습니다. 따라서 Ctrl+위 화살표 방향키 를 사용하기 위해서는 “시스템 환경 설정”에서 Missing Control의 키 맵핑을 변경해야 합니다. [return]
  3. [역자주]JShell은 자바로 개발된 편집기를 표함합니다. JShell은 이 편집기를 기본 편집기로 사용합니다. [return]
김태완 avatar
작성자: 김태완
1999년 부터 Java, Framework, Middleware, SOA, DB Replication, Cache, CEP, NoSQL, Big Data, Cloud를 키워드로 살아왔습니다. 현재는 빅데이터와 Machine Learning을 중점에 두고 있습니다.
E-mail: taewanme@gmail.com