GNUEmacsManual:13

From 흡혈양파의 번역工房
Jump to navigation Jump to search
오타 수정을 위한 명령어

오타 수정을 위한 명령어

본 장에서는 편집 중에 실수를 범했을 때 유용한 명령어를 설명하고자 한다. 이러한 명령어들 중에서 가장 기본은 실행취소 명령어 C-/ 라고 할 수 있겠다(C-x uC-_ 에도 바인딩되어 있다). 이것은 단일 명령어 또는 명령어의 일부(

query-replace

와 같이) 또는 여러 연속된 문자 삽입을 실행취소한다. C-/ 를 연속하여 반복하면 이전, 그 이전의 변경 실행을 취소하여 이용할 수 있는 실행취소 정보의 한계값까지 거슬러간다.


본문에 설명된 명령어 외에 DEL (

delete-backward-char

)과 같은 삭제 명령어를 이용해 텍스트를 제거할 수도 있다. 이러한 명령어들은 이미 매뉴얼 앞 부분에서 설명한 바 있으니 19 페이지의 4.3절 [제거하기]를 참고한다.



실행취소

실행취소(undo) 명령어는 최근에 버퍼 텍스트에 일어난 변경 내용을 되돌린다. 각 버퍼는 개별적으로 변경내용을 저장하고, 실행취소 명령어는 항상 현재 버퍼에 적용된다. 버퍼 기록에 남는 한 버퍼에 이루어진 변경 내용은 모두 실행취소가 가능하다. 보통 각 편집 명령어는 실행취소 기록에 엔트리를 구분하여 만들지만

query-replace

를 비롯한 일부 명령어는 실행취소에서 유연성을 이유로 변경 내용을 다중 엔트리에 나눠 저장한다. 연속 문자 삽입 명령어들은 실행취소가 덜 지루하도록 주로 단일 실행취소 기록에 그룹화된다. C-/ C-x u C-_ 현재 버퍼의 실행취소 기록에 하나의 엔트리만 실행취소한다 (

undo

).


실행취소를 시작하려면 C-/ (또는 그와 동일한 C-_ 혹은 C-x u)[1]라고 입력한다. 그러면 버퍼에 최근 이루어진 변경내용이 취소되고 그러한 변경이 이루어지기 이전 위치로 포인트가 이동한다. C-/ 를 (또는 그와 동일한) 연속 반복하면 현재 버퍼의 이전, 그보다 이전 변경내용을 실행취소한다. 기록된 변경내용이 모두 실행취소되면 실행취소 명령어는 오류를 보낸다.


실행취소 명령어 이외의 명령어는 실행취소 명령어의 시퀀스를 중단시킨다. 그 순간부터 사용자가 현재까지 실행한 실행취소 명령어의 전체 시퀀스는 실행취소 기록에 하나의 변경내용 집합으로 위치된다. 따라서 실행취소한 변경내용을 다시 적용하기 위해서는 C-f 또는 실행취소 시퀀스를 해롭지 않게 중단시킬 다른 명령어를 입력한 후 C-/ 를 입력하면 실행취소 명령어의 실행을 취소할 수 있다.


또 이전에 사용한 실행취소 명령어를 다시 사용하지 않고 실행취소를 재개하고 싶다면 M-x undo-only 를 사용한다. 이것은 undo와 같지만 사용자가 방금 실행취소한 변경내용을 다시 실행하지는 않을 것이다.


버퍼가 실수로 수정된 것을 발견했다면 모드 행 앞에서 별 모양이 사라질 때까지 C-/ 를 반복하여 입력하는 방법이 가장 쉬운 복구 방법이다(8 페이지의 1.3절 [모드 행] 참고). 실행취소 명령어가 모드 행에서 별 모양을 사라지게 만들 때마다 버퍼 내용은 파일이 마지막으로 읽히거나 저장되었을 때와 같아짐을 의미한다. 버퍼를 고의로 수정하였는지 기억이 나지 않는다면 C-/ 를 한 번만 입력한다. 마지막 변경내용을 실행취소한 사실이 확인되면 고의로 변경한 내용인지 확인할 수 있을 것이다. 실수라면 실행취소된 채로 내버려 두면 된다. 의도적으로 변경한 내용이라면 위에서 설명한 바와 같이 변경 내용을 재실행한다.


활성화 영역이 있을 때

undo

를 사용하면 선택적 실행취소(selective undo)를 실행하여 전체 버퍼 대신 영역 내 가장 최근 변경내용의 실행을 취소한다. 하지만 Transient Mark 모드가 꺼지면 (50 페이지의 8.7절 [비활성화된 Transient 마크] 참고) C-/ 는 항상 전체 버퍼에서 작동하고 영역은 무시한다. 이런 경우

undo

명령어에 접두 인자를 제공하여 선택적 실행취소를 수행할 수 있다: C-u C-/. 동일한 영역에서 이후 변경내용을 실행취소하기 위해서는

undo

명령어를 반복한다(접두 인자는 필요하지 않다).


일부 특수화된 버퍼들은 실행취소 기록을 만들지 않는다. 이름이 공백으로 시작하는 버퍼들은 사용자가 보통 사용하거나 편집하지 않는 텍스트를 보유하기 위해 Emacs에서 내부적으로 사용하는 버퍼들로서 절대 실행취소 기록을 생성하지 않는다.


버퍼에 대한 실행취소 정보가 너무 커지면 Emacs는 한 번씩 (쓰레기 수집 중에) 오래된 기록들을 파기한다. 얼마나 많은 실행취소 정보를 보관할 것인지는

undo-limit

,

undo-strong-limit

,

undo-outer-limit

변수를 설정하여 명시할 수 있다. 값은 바이트로 표시된다.


undo-limit

변수는 부드러운(soft) 한계를 설정하는데, Emacs는 이 크기에 도달할 만큼 혹은 초과할 만큼 많은 명령어에 대해 실행취소 자료를 보관하지만 그 범위를 벗어난 명령어에 대한 자료는 보관하지 않는다. 기본값은 80000이다.

undo-strong-limit

변수는 좀 더 엄격한 한계를 적용하여 (가장 최근 명령어가 아니더라도) 그 크기를 초과하는(push past) 이전 명령어는 잊어버린다.

undo-strong-limit

의 기본값은 120000이다.


그러한 변수들의 값과 상관없이 가장 최근에 이루어진 변경내용은

undo-outer-limit

(주로 12,000,000)보다 커지지 않는 이상 절대 파기되지 않는다. 그 값이 되면 Emacs는 실행취소 자료를 파기하고 사용자에게 경고한다. 따라서 마지막 명령어의 실행취소가 불가능한 유일한 경우다. 이런 일이 발생하면

undo-outer-limit

의 값을 증가시켜 향후에 그러한 일이 발생하는 일이 줄어들도록 한다. 하지만 명령어가 그렇게 큰 실행취소 자료를 생성할 것이라고 예상하지 못했다면 버그일 수 있으니 보고하도록 한다. 448 페이지의 34.3절 [버그 보고하기]를 참고한다.


텍스트 순서조정

C-t 두 문자의 순서를 바꾼다(

transpose-chars

). M-t 두 단어의 순서를 바꾼다(

transpose-words

). C-M-t 두 균형 표현식의 순서를 바꾼다(

transpose-sexps

). C-x C-t 두 행의 순서를 바꾼다(

transpose-lines

).


두 문자의 순서를 바꾸는 데에 공통적으로 발생하는 오류는 문자가 근접할 때 C-t 명령어(

transpose-chars

)를 이용해 수정 가능하다. 보통 C-t 는 포인트의 양쪽 중 한 쪽에 있는 두 문자의 순서를 바꾼다. 행의 끝에 있을 경우에는 행의 마지막 문자와 새 행의 순서를 바꾸는 것은 의미가 없으므로 C-t 는 대신 행의 마지막 두 문자의 순서를 바꾼다. 따라서 순서조정에서 오류를 즉시 발견했다면 C-t 를 이용해 수정 가능하다. 빠르게 오류를 포착하지 못했다면 C-t 를 입력하기 전에 순서가 조정된 두 문자 사이에 커서를 이동시켜야 한다. 공백과 그 앞 단어의 마지막 문자를 바꾸었다면 단어 움직임 명령어를 이용하여 이동하는 것이 좋은 방법이다. 그 외의 경우는 역방향 검색(reverse search)이 최선의 방도다. 90 페이지의 12장 [검색]을 참고한다.


M-t 는 포인트 앞의 단어와 포인트 뒤의 단어 위치를 바꾼다(

transpose-words

). 이는 포인트를 단어를 넘어 순방향으로 이동시키면서 포인트를 앞서거나 포인트를 포함하는 단어 역시 순방향으로 끌고 간다. 단어 사이에 구두점 문자는 이동하지 않는다. 예를 들어 '

FOO, BAR

'는 '

BAR FOO,

'가 아니라 '

BAR, FOO

'로 바뀐다.


C-M-t (

transpose-sexps

)는 두 표현식의 위치를 조정하는 데에 사용되는 비슷한 명령어이고 (246 페이지의 23.4.1절 [표현식] 참고) C-x C-t (

transpose-lines

)는 행을 교환한다. 이 둘은 위치를 조정하는 텍스트 단위가 다르다는 것만 제외하면 M-t 와 같이 작동한다.


위치조정 명령어에 대한 수치적 인자는 반복 계수의 역할을 하여 위치조정 명령어에게 포인트 앞의 또는 포인트를 포함한 문자(단어, 표현식, 행)를 여러 개의 다른 문자(단어, 표현식, 행)만큼 이동시킬 것을 알린다. 가령 C-u 3 C-t 는 포인트 앞의 문자를 세 개의 다른 문자만큼 순방향으로 이동시킨다. 따라서 '

f*oobar

' 는 '

oobf*ar

' 가 될 것이다. C-t 를 세 번 반복하여도 같은 결과를 얻는다. C-u - 4 M-t 는 포인트 앞의 단어를 네 개의 단어만큼 역방향으로 이동시킨다. C-u - C-M-t 는 일반 C-M-t 의 효과를 취소시킬 것이다.


수치적 인자 0에는 특별한 의미가 할당되어 (그렇지 않으면 반복 계수 0을 이용한 명령어는 어떤 일도 수행하지 않기 때문이다) 포인트 뒤에서 끝나는 문자(단어, 표현식, 행)의 위치와 마크 다음에 끝나는 문자와 위치가 바뀐다.


대, 소문자 변환

M-- M-l 마지막 단어를 소문자로 변환한다.

Meta--

는 Meta-minus 임을 명심한다.

M-- M-u 마지막 단어를 모두 대문자로 변환한다.

M-- M-c 마지막 단어를 이니셜만 대문자로 하고 나머지는 소문자로 변환한다.


단어의 대, 소문자를 잘못 쓰는 것은 흔히 범하는 오류다. 이러한 문제 때문에 단어 대, 소문자 변환 명령어 M-l, M-u, M-c 는 음의 인자와 사용할 때 특별한 기능을 갖는데, 바로 커서를 움직이지 않는다는 것이다. 마지막 단어를 잘못 입력한 것이 보이는 즉시 대, 소문자 변환을 실행하고 계속 입력해 나가면 된다. 216 페이지의 22.6절 [대, 소문자] 참고.


맞춤법 검사와 수정

본 절에서는 버퍼의 일부 또는 하나의 단어에서 맞춤법을 검사하는 명령어를 설명한다. 이러한 명령어들은 맞춤법 검사 프로그램 Aspell, Ispell, Hunspell 중 하나가 설치되어 있을 때에만 작동한다. 해당 프로그램들은 Emacs에 포함되어 있지 않지만 GNU/Linux나 다른 무료 운영 체제에는 셋 중 하나가 설치되어 있다.


M-$ 포인트에 위치한 단어의 맞춤법을 검사하고 올바로 수정한다(

ispell-word

). 영역이 활성화되어 있으면 영역 내 모든 단어를 대상으로 실행한다.


M-x ispell 버퍼 내 모든 단어의 맞춤법을 검사하고 올바로 수정한다. 영역이 활성화되어 있으면 영역 내 모든 단어를 대상으로 실행한다.


M-x ispell-buffer 버퍼 내 맞춤법을 검사하고 올바로 수정한다


M-x ispell-region 영역 내 맞춤법을 검사하고 올바로 수정한다


M-x ispell-message 인용된 자료만 제외한 초안 메일 메시지의 맞춤법을 검사하고 올바로 수정한다.


M-x ispell-change-dictionary RET dict RET dict를 디렉터리로 이용하여 Aspell/Ispell/Hunspell 프로세스를 재시작한다.


M-x ispell-kill-ispell Aspell/Ispell/Hunspell 하위프로세스를 종료한다(kill).


M-TAB ESC TAB 맞춤법 사전을 바탕으로 포인트 앞의 단어를 완성한다(

ispell-complete-word

).


M-x flyspell-mode 맞춤법이 잘못된 단어를 모두 강조하는 Flyspell 모드를 활성화한다.


M-x flyspell-prog-mode 주석과 문자열에 대해서만 Flyspell 모드를 활성화한다.


포인트 주변이나 포인트 앞에 단어의 맞춤법을 검사하고 선택적으로 올바로 수정까지 가능하게 하려면 M-$ (

ispell-word

)를 입력한다. 영역이 활성화되어 있을 경우 M-$ 는 영역 내 모든 단어의 맞춤법을 검사한다. 45 페이지의 8장 [마크]를 참고한다. (Transient Mark 모드가 꺼져 있을 때 M-$ 를 사용하면 항상 포인트 주변이나 포인트 앞의 단어를 대상으로 실행되어 영역은 무시해 버리는데, 관련 내용은 50 페이지의 8.7절 [비활성화된 Transient Mark]를 참고한다.)


이와 유사하게 M-x ispell 명령어 역시 영역이 활성화되어 있으면 영역에서 맞춤법 검사를 실행하고 그 외에는 전체 버퍼에서 실행한다. M-x ispell-bufferM-x ispell-region 명령어는 각각 전체 버퍼와 영역에서 맞춤법 검사를 수행한다. 사용자가 작성 중인 이메일 메시지에서 맞춤법을 검사하려면 M-x ispell-message 를 사용하면 되는데, 이 명령어는 다른 메시지에서 이용하는 것으로 나타나거나 띄어쓰기가 된 자료(material)를 제외한 전체 버퍼를 검사할 것이다. 350 페이지의 29장 [메일 전송하기]를 참고한다.


이러한 명령어들 중 하나가 올바르지 않은 것으로 나타나는 단어를 만나면 사용자에게 어떤 일을 수행할 것인지 묻는다. 주로 번호가 매겨진 "near-misses" 목록을 표시하는데, 이는 틀린 단어와 비슷한 단어의 목록이다. 그러면 사용자는 단일 문자로 된 응답을 입력해야 한다. 이 때 이용할 수 있는 몇 가지 응답을 소개하겠다:


digit

이번에만 표시된 near-misses 중 한 단어로 대체한다. Near-miss 마다 하나의 숫자가 함께 열거되어 있으니 숫자를 입력하여 선택한다.


SPC

이 단어를 틀린 것으로 간주하지만 이번에는 변경하지 말고 건너뛴다.


r new RET

이번뿐만 아니라 계속 해당 단어를 new 로 대체한다. (대체 문자열은 맞춤법 오류가 없는지 다시 스캔될 것이다.)


R new RET

단어를 new 로 대체하고

query-replace

를 실행하여 원할 경우 버퍼 내 다른 곳에서 대체할 수 있도록 한다. (대체 문자열은 맞춤법 오류가 없는지 다시 스캔될 것이다.)


a

틀린 단어를 수용하고 올바른 단어로 취급하되 해당 편집 세션에서만 유효하다.


A

틀린 단어를 수용하고 올바른 단어로 취급하되 해당 편집 세션과 해당 버퍼에서만 유효하다.


i

해당 단어를 private 사전에 삽입하여 Aspell, Ispell, Hunspell 이 향후 세션에서도 이 단어를 올바른 단어로 간주하도록 한다.


m

i와 마찬가지이나 사용자가 사전 완성(dictionary completion) 정보를 명시할 수 있다.


u

사용자의 private 사전 파일에 해당 단어의 소문자 버전을 삽입한다.


l word RET

사전에서 word 에 일치하는 단어를 찾는다. 이러한 단어들이 "near-misses"의 새 목록이 되며, 그 중 하나를 선택하여 대체하려면 해당 숫자를 입력한다. word 에 '

*

'를 와일드카드로 사용할 수 있다.


C-g

X

대화형 맞춤법 검사를 중단하고, 검사 중이던 단어에 포인트를 둔다. C-u M-$ 를 이용해 후에 검사를 재시작할 수 있다.


x

대화형 맞춤법 검사를 중단하고 맞춤법 검사를 시작할 때 위치로 포인트를 다시 이동시킨다.


q

대화형 맞춤법 검사를 중단하고 맞춤법 검사 하위프로세스를 종료한다.


?

옵션 목록을 표시한다.


Text 모드를 비롯해 그와 관련된 모드에서 M-TAB (

ispell-complete-word

)는 맞춤법 수정을 바탕으로 in-buffer 완성을 수행한다. 단어 시작을 삽입하고 M-TAB 을 입력하면 완성 목록을 표시한다. (창 관리자가 M-TAB 을 가로막으면 ESC TAB 또는 C-M-i 를 입력한다.) 완성(completion)마다 하나의 숫자 또는 문자와 함께 열거되니 해당하는 숫자 또는 문자를 입력하여 선택할 수 있다.


시작되고 나면 Aspell 또는 Ispell 또는 Hunspell 하위프로세스는 할 일을 기다리면서 계속 실행하여 잇따른 맞춤법 검사 명령어가 좀 더 빠르게 완료되도록 한다. 프로세스를 제거하고 싶다면 M-x ispell-kill-ispell 을 사용한다. 이는 주로 불필요한 일인데, 사용자가 맞춤법 수정을 원할 때를 제외하곤 프로세스가 프로세서(processor)를 사용하는 일이 없기 때문이다.


Ispell, Aspell, Hunspell은 두 개의 사전에서 맞춤법을 검색하는데, 하나는 표준 사전이고 나머지 하나는 사용자의 개인 사전이다. 표준 사전은

ispell-local-dictionary

변수로 명시되고, 이 값이

nil

일 경우에는

ispell-dictionary

로 명시한다. 두 값 모두

nil

일 경우 맞춤법 프로그램의 기본 사전이 사용된다. M-x ispall-change-dictionary 명령어는 버퍼에 대한 표준 사전을 설정한 후 하위 프로세스를 재시작하여 다른 표준 사전을 사용할 수 있도록 한다. 개인 사전은

ispell-personal-dictionary

변수에 의해 명시된다. 이 값이

nil

이면 맞춤법 프로그램은 기본 위치에서 개인 사전을 검색한다.


단어 완성에는 다른 사전이 사용된다.

ispell-complete-word-dict

변수는 해당 사전의 파일명을 명시한다. 완성 사전은 루트(root)를 이용하거나 정보를 부착할 수 없으므로 달라야 한다. 일부 언어의 경우 맞춤법 검사 사전은 있지만 단어 완성 사전이 없는 경우도 있다.


Flyspell 모드는 사용자가 입력하는 동안 자동 맞춤법 검사를 수행한다. 인식하지 못하는 단어를 발견하면 그 단어를 강조한다. M-x flyspell-mode 라고 입력하면 현재 버퍼에서 Flyspell 모드를 토글한다. 모든 텍스트 모드 버퍼에서 Flyspell 모드를 활성화하기 위해서는

flyspell-mode

text-mode-hook

로 추가한다. 422 페이지의 33.2.2절 [훅]을 참고한다.


Flyspell 모드가 맞춤법이 틀린 단어를 강조하면 사용자는 Mouse-2 로 그 단어를 클릭하여 가능한 수정내용과 행동을 보여주는 메뉴를 표시한다. 수동으로 원하는 대로 단어를 편집하여 수정할 수도 있다.


Flyspell Prog 모드는 주석과 문자열 상수의 단어만 검사한다는 점만 제외하면 일반 Flyspell 모드와 동일하다. 이 기능은 프로그램 편집에 유용하다. M-x flyspell-prog-mode 를 이용하여 현재 버퍼에서 해당 모드를 활성화 또는 비활성화한다. 모든 프로그래밍 모드 버퍼에서 해당 모드를 활성화하려면

flyspell-prog-mode

prog-mode-hook

로 추가한다(422 페이지의 33.2.2절 [훅]을 참고).


Notes

  1. C-/ 외에
    undo
    명령어는 초보자가 기억하기 쉽도록 C-x u 에도 바인딩되어 있으며, 여기서 '
    u
    '는 실행취소의 'undo'를 의미한다. 일부 텍스트 터미널에서 C-/ 를 입력하면 C-_ 가 입력되어 C-_ 에도 바인딩되어 있다.