부록 C: 명령줄 편집기

부록 C: 명령줄 편집기

터미널에서 R을 쓰다 보면, 화살표 키로 아까 입력했던 명령을 다시 꺼내고, 오타를 고치고, 그대로 다시 실행하는 일이 아주 흔하죠. 이 부록은 바로 그 편집 기능들이 어떻게 동작하는지, 어떤 키가 어떤 일을 하는지 정리해 둔 내용이에요. 편집 단축키 전체를 암기하려 들지 말고, "이런 동작이 가능하다"는 걸 먼저 익히는 게 좋아요.

출처: R 공식 매뉴얼

본문

C.1 사전 준비 (Preliminaries)

UNIX에서 R을 컴파일할 때 GNU readline 라이브러리가 설치돼 있으면, R 안에 이전 명령을 불러오고(recall), 고치고(editing), 다시 제출하는(re-submission) 기능을 갖춘 내장 명령줄 편집기가 함께 들어와요. 단, readline에는 여러 버전이 있고, 내장 편집기가 다른 버전을 쓰는 경우도 있어요 — 특히 macOS에서 흔하죠. 지금 어떤 버전이 쓰이는지(혹은 아예 없는지)는 R 세션에서 extSoftVersion()을 실행해 확인할 수 있어요.

이 기능은 시작 옵션 --no-readline으로 끌 수도 있는데, ESS(Emacs Speaks Statistics)를 쓸 때 유용해요.

Windows용 R은 명령줄 편집 기능이 조금 더 단순해요. GUI의 Help 메뉴에 있는 Console 항목과, Rterm.exe에서의 명령줄 편집을 다루는 README.Rterm 파일을 참고하면 돼요.

GNU readline 기능을 쓰는 R이라면, 아래에서 설명하는 함수들은 물론이고 시스템의 man readline이나 info readline에 (아마) 문서화돼 있을 다른 기능들도 쓸 수 있어요.

이 기능들 상당수는 Control 문자나 Meta 문자를 사용해요. Control 문자(예: Control-m)는 CTRL 키를 누른 채 m 키를 누르면 입력돼요. 이 문서에서는 C-m처럼 표기할게요. Meta 문자(예: Meta-b)는 META 키를 누른 채 b를 누르면 되고, 이하 M-b로 표기해요. 터미널에 META 키가 없다면, ESC로 시작하는 두 글자 조합으로도 Meta 문자를 입력할 수 있어요. 즉 M-b를 입력하려면 ESC b라고 누르면 되죠. 실제 Meta 키가 있는 터미널에서도 ESC 조합은 쓸 수 있어요. Meta 문자에서는 대소문자가 구분되니 주의하세요.

readline의 일부 버전은 터미널 창 크기 변경을 인식하지만, 전부 그런 건 아니에요. 그래서 창 크기를 바꾸는 건 되도록 피하는 게 좋아요.

C.2 편집 동작 (Editing actions)

R은 여러분이 입력한 명령줄 전체를 히스토리로 기억해요 — 오류가 났던 줄까지 포함해서요. 히스토리 안의 명령은 불러오고, 필요하면 고치고, 새로운 명령으로 다시 제출할 수 있어요. Emacs 스타일 명령줄 편집에서는, 편집 중에 아무 문자나 그냥 치면 그 문자가 현재 편집 중인 명령에 삽입되고, 커서 오른쪽에 있던 문자는 한 칸씩 밀려나요. vi 모드에서는 문자 삽입 모드를 M-iM-a로 시작하고, 문자를 입력한 뒤 다시 ESC를 누르면 검색·이동 모드로 돌아와요. (기본값은 Emacs 스타일이고, 여기서는 그것만 설명해요. vi 모드는 readline 문서를 참고하세요.)

언제든 RET를 누르면 명령이 다시 제출돼요.

그 밖의 편집 동작은 아래 표에 정리했어요.

C.3 명령줄 편집기 요약 (Command-line editor summary)

명령 불러오기와 위·아래 이동 (Command recall and vertical motion)

C-p — 이전 명령으로 이동 (히스토리에서 뒤로).

C-n — 다음 명령으로 이동 (히스토리에서 앞으로).

C-r texttext 문자열을 포함한 마지막 명령을 찾아요. C-g로 취소할 수 있고, (일부 R 버전에서는 C-c로도) 되돌릴 수 있어요.

대부분의 터미널에서는 C-pC-n 대신 위·아래 화살표 키를 써도 돼요.

커서의 좌·우 이동 (Horizontal motion of the cursor)

C-a — 명령의 맨 앞으로 이동.

C-e — 줄의 맨 끝으로 이동.

M-b — 한 단어 뒤로 이동.

M-f — 한 단어 앞으로 이동.

C-b — 한 문자 뒤로 이동.

C-f — 한 문자 앞으로 이동.

대부분의 터미널에서는 C-bC-f 대신 왼쪽·오른쪽 화살표 키를 써도 돼요.

편집과 재제출 (Editing and re-submission)

text — 커서 위치에 텍스트를 삽입.

C-f text — 커서 뒤에 텍스트를 추가.

DEL — 커서 바로 왼쪽(앞) 문자를 삭제.

C-d — 커서 위치(아래)의 문자를 삭제.

M-d — 커서 아래 단어의 나머지를 삭제하고 "저장"해요.

C-k — 커서부터 명령 끝까지 삭제하고 "저장"해요.

C-y — 마지막으로 "저장"한 텍스트를 여기에 붙여 넣어요(yank).

C-t — 커서 아래 문자와 다음 문자를 서로 바꿔요(transpose).

M-l — 단어의 나머지를 소문자로 바꿔요.

M-c — 단어의 나머지를 대문자로 바꿔요.

RET — 명령을 R에 다시 제출해요.

마지막 RET가 명령줄 편집 시퀀스를 끝내요.

readline 키 바인딩은 평소처럼 ~/.inputrc 파일로 바꿀 수 있어요. 이 설정은 애플리케이션 R에 조건을 둘 수도 있어요. 예를 들어 아래처럼 $if R 구간을 넣으면 되죠.

$if R
  "\C-xd": "q('no')\n"
$endif

더 알아보기

  • 이 부록의 원문은 R 공식 매뉴얼 An Introduction to R의 Appendix C예요. 편집 동작 전체를 코드로 보고 싶다면 시스템의 man readline이나 info readline을 펼쳐 보세요.
  • ESS(Emacs Speaks Statistics)나 vi 모드에서 이 편집기를 쓰려면 --no-readline 시작 옵션과 readline 문서를 함께 확인해 두면 좋아요.