jump 관련 명령 정리 – vim

vim에서 h,j,k,l 명령에만 익숙해지는 것도 사실 쉽지 않고, 일단 익숙해지면 이 키들을 연타하는 식으로 커서를 움직이는데, 특정한 위치로 바로 이동할 수 있는 jump관련 명령이 손에 익으면 그만큼 편리할 수가 없더라. jump와 관련된 명령들을 한 번은 정리하고 가자.

마커

m을 이용해서 현재 위치를 특정한 마커로 지정할 수 있고, 백팃 ` 이나 '작은 따옴표를 이용해서 그 위치로 되돌아 갈 수 있다. 보통 마크는 a-z, A-Z, 0-9 와 몇 가지 특수문자가 적용되는데, 특수문자들은 특별한 의미를 가지는 것들이다. 다음은 vim에서 사용되는 마커의 특징이다. 이 중에서 사용자가 임의로 설정할 수 있는 마커는 0-9,a-z,A-Z 이며, 이 각각은 문자의 종류에 따라 또 의미가 조금씩 다르다. 그 외에 편집/선택과 관련하여 특징적인 마커가 있으니 살펴봐두자.

  • a-z 영어 소문자는 일반적인 마크. 파일마다 따로 관리된다.
  • A-Z는 여러 파일간에 유지된다.
  • 0-9는 역시 여러 파일간에 유지되는데 … .viminfo 파일 내에 저장된다고 한다. 따라서 vim을 종료/재시작한 후에도 위치를 기억할 수 있다. (실제로 이는 vim을 빠져나갔을 때 위치를 기억한다고 한다.)
  • < > 는 이전 선택 영역의 처음과 끝을 가리킨다.
  • " 는 최종적으로 수정한 위치를 가리킨다.
  • ' 는 점프하기 이전 위치로 돌아간다.
  • ^는 삽입모드가 최종적으로 종료된 위치로 돌아간다.
  • .은 최종 변경이 시작된 위치이다.
  • [ ] 는 최종적으로 수정한 영역의 처음과 끝을 가리킨다.

:marks를 사용하면 현재 이동할 수 있는 마크들을 보여준다. jump 관련 명령 정리 – vim 더보기

여러 파일에 대해 한 번에 문자열 치환하는 방법들

문자열에 대한 찾기/바꾸기를 여러 파일에 대해 한 번에 적용하는 방법

Sublime Text 3 에서

Find > Find in Files... 메뉴를 사용하여 찾을 패턴, 찾을 폴더들 (,로 구분가능하며, 와일드카드 패턴으로 특정 확장자를 한정할 수 있다.) 지정하고 변경할 값을 만들어서 한 번에 적용 가능하다.

여러 파일에 대해 한 번에 문자열 치환하는 방법들 더보기

vim의 autocmd 이벤트들

vim은 특정 이벤트가 발생할 때 자동으로 명령을 수행할 수 있는데, 이를 au[tocmd]로 지정할 수 있다. 자동 명령 세팅 방법은 다음에 다루기로 하고, 오늘은 이들 이벤트에 대해서 좀 정리

  • 버퍼 읽기/시작하기
    • BufNewFile 새 파일을 만들어서 편집하기 시작함
    • BufReadPre 파일을 읽기 전, 새 버퍼를 편집하기 시작함
    • BufRead 파일을 읽고 새 버퍼를 편집함
    • BufReadPost 위와 같이 파일을 읽고 새 버퍼를 편집함 (차이가?)
    • BufReadCmd 새 버퍼를 시작하는 명령을 받았을 때
  • 파일 읽기
    • FileReadPre :read 명령으로 새 파일을 읽기 직전
    • FileReadPost :read 명령으로 새 파일을 읽은 직후
    • FileReadCmd :read 명령을 입력받는 때
  • 버퍼 전체 쓰기
    • BufWrite 전체 버퍼를 파일에 쓰기 시작할 때
    • BufWritePre 전체 버퍼를 파일에 쓰기 시작할 때
    • BufWritePost 전체 버퍼를 파일에 쓴 후
    • BufWriteCmd 쓰기 명령을 받았을 때, 아직 파일에는 쓰기 전
  •  버퍼 일부 쓰기
    • FileWritePre 버퍼의 일부를 파일에 쓰기 시작함
    • FileWritePre 버퍼의 일부를 파일에 쓰기 시작함
    • FileWriteCmd 버퍼의 일부를 파일에 쓰는 명령을 받을 때
    • FileAppendPre 파일의 뒤에 내용을 덧붙일 때
    • FileAppendPost 파일의 뒤에 내용을 추가한 후
    • FileAppendCmd 파일에 추가 명령을 받을 때
  •  버퍼 관련
    • BufAdd 새 버퍼가 버퍼 목록에 추가된 직후
    • BufCreate 새 버퍼가 생성되어 버퍼 목록에 추가된 직후
    • BufDelete 버퍼 목록에서 버퍼가 삭제되기 전
    • BufWipeout 버퍼를 완전히 삭제하기 직전
    • BufFilePre 현재 버퍼의 이름을 바꾸기 직전
    • BufFilePost 현재 버퍼의 이름이 바뀐 직후
    • BufEnter 버퍼에 진입한 직후
    • BufLeave 버퍼를 떠나 다른 버퍼로 옮기기 직전
    • BufWinEnter 화면 창에 버퍼가 표시된 후
    • BufWinLeave 창에서 버퍼가 제거되기 직전
    • BufUnload 버퍼가 언로드되기 전
    • BufHidden 버퍼가 숨겨진 직후
    • BufNew 새 버퍼를 만든 직후
  • 스왑
    • SwapExists 스왑파일이 있을 때
  • 옵션
    • FileType “filetype” 옵션이 세팅될 때
    • Syntax “syntax”옵션이 세팅될 때
    • EncodingChanged “encoding” 옵션이 세팅될 때
    • TermChanged “term”의 값이 바뀔 때
  • 시작 및 종료
    • VimEnter vim 시작 후
    • GUIEnter GUI가 잘 시작된 후
    • TermResponse 터미널 응답 t_RV을 받은 후
    • VimLeavePre vim 종료 직전, viminfo 파일에 쓰기 전
    • VimLeave 종료 직전, viminfo 파일을 쓴 후
  • 그 외
    • FileChangedShell – Vim에서 파일을 편집한 이후, 이 파일이 변경됐음을 vim이 감지했을 때
    • FileChangedShellPost – 편집이 시작된 후 파일이 변경되었을 때
    • FileChangedRO – 읽기 전용 파일에 변경을 시작하려 할 때
    • ShellCmdPost – 쉘 명령을 실행한 후
    • ShellFilterPost – 쉘 명령으로 필터링한 후
    • FuncUndefined – 정의되지 않은 사용자 함수를 호출할 때
    • SpellFileMissing – 존재하지 않는 문법 파일을 사용하려할 때
    • SourcePre – vim 스크립트를 반입하기 직전
    • SourceCmd – 명령모드에서 vim 스크립트를 반입할 때
    • VimResized – vim 창의 크기가 변경되었을 때
    • FocusGained – vim이 입력 포커스를 받을 때
    • FocusLost – 입력 포커스를 잃을 때
    • CursorHold – 특정 시간 동안 아무 것도 눌러지지 않을 때
    • CursorHoldI – 입력 모드에서 특정 시간 동안 아무 키도 눌러지지 않을 때
    • CursorMoved – 일반 모드에서 커서가 움직일 때
    • CursorMovedI – 입력모드에서 커서가 움직일 때
    • WinEnter – 다른 창으로 들어갈 때
    • WinLeave – 창을 떠날 때
    • TabEnter – vim 창 내의 특정 탭으로 들어갈 때
    • TabLeave – 특정 탭을 떠날 때
    • ColorScheme –  색상 스킴이 변경될 때
    • RemoteReply – 서버의 응답을 vim이 받았을 때
    • QuickFixCmdPre – quickfix 명령이 실행되기 전
    • QuickFixCmdPost – quickfix 명령이 실행된 후
    • SessionLoadPost – 세션 파일의 로딩이 끝난 후
    • MenuPopup – 메뉴 팝업을 보여준 후
    • User“:doautocmd”와 함께 쓰임

 

[업데이트]윈도의 gVim의 한글 폰트 설정 문제 2

원글을 처음 작성했을 때는 vim의 버전이 7.2였는데, 7.3버전의 vim을 쓰면서 encoding 설정값을 utf-8로 바꾸면 메뉴와 각종 메시지들이 깨져서 보이는 대참사를 겪는 문제가 있었다. 따라서 이 글의 원래 내용은 이 문제를 ‘시간차’로 피하고자 하는 꼼수였는데 보다 다른 방법으로 해결해 보고자 한다.

기존의 방식은 encoding의 값을 utf-8로 지정한 후 guifont 속성과 guifontwide속성을 사용해 영문과 한글에 적용되는 글꼴을 다르게 설정하는 것이었다. 이 때 guifontwide 속성은 인코딩이 utf-8일 때만 작동했고, 문제는 이 설정에서는 vim 7.3에서 메시지가 한글로 나오는 부분이 죄 깨지는 문제가 발생했다. 아울러 상단의 메뉴의 한글도 와장창.

set encoding=utf-8
set guifont=Consolas:h10:cANSI
set guifontwide=Dotumche:h9:cDEFAULT

lang mes en_US

source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim

이상의 내용을 vimrc 파일에 추가한다. 이는 먼저 위에서 설명한대로 encoding값을 utf-8로 설정하고 한글, 영문의 글꼴을 각각 다르게 설정해준다.그런 다음 메시지 언어를 영문으로 변경한다. 물론 영문으로 메시지들이 표시되기는 하지만 아주 어려운 내용들은 아니므로 영어로 보는 것이 편할 것이다.

마지막으로 번역된 (그래서 깨지는) 메뉴를 없앤다음, 디폴트(영문) 메뉴를 다시 추가해준다.

이렇게하면 우리가 (적어도 내가) 원하는 형태로 vim의 글꼴을 설정할 수 있다.

 

지난 글에서 윈도용 gVim에서 한글 폰트와 영문 폰트를 따로 따로 지정하는 법에 대해 설명했는데, 몇 가지 부가적인 설명도 필요하고, 이 팁을 적용하는 경우에 gVim 실행 시 메뉴나 welcome 메시지 등이 깨져서 표시되는 문제가 있어서 추가 포스트로 적어본다.

지난 글에서는 ANSI 문자들에 대해서는 Consolas를 적용하고, 그 외의 글꼴은 돋움체를 설정하는 방법으로 guifont 옵션과 guifontwide 옵션을 사용했는데, guifontwide 옵션은  encoding 옵션이 utf-8 일때만 유효해진다. 그런데 문제는 윈도의 기본 문자 인코딩이 cp949라는 점이다. 따라서 한글과 영문의 글꼴을 따로 따로 표시하고 싶다면 다음의 설정이 모두 세팅되어야 한다.

set encoding=utf-8
set guifont=Consolas:h9:cANSI
set guifontwide=Dotumche:h10:cDEFAULT

그런데 encoding 옵션 값을 utf-8로 지정하면 gVim이 구동할 때 그려주는 메뉴나 welcome 메시지가 모두 깨져서 표시된다. 한가지 다행스러운 점은, 일단 gVim이 cp949 인코딩으로 실행되고 난 후 encoding 옵션을 변경하면 다른 UI 부분은 영향을 받지 않는다는 것이다.

따라서 이 부분은 다음과 같이 autocmd를 사용하여 조정해주어야 한다.

 

 

set encoding=cp949
set guifont=Consolas:h9:cANSI
set guifontwide=Dotumche:h10:cDEFAULT

au BufNew, BufEnter * set encoding=utf-8

즉, gVim이 처음 실행되어 메뉴 등의 UI가 구성될 때에는 윈도의 기본 인코딩을 사용하도록하고, Buffer가 만들어진 이후부터는 UTF-8을 인코딩으로 사용해서 guifontwide 옵션이 활성화될 수 있도록 해주면 된다.

 

 

 

윈도용 gVim의 폰트 설정 문제

윈도용 gVim을 쓸 때 개인적으로 가장 싫었던(?)점은 다름 아닌 폰트 문제였다. 영문 글꼴의 가독성 때문에 고정폭 폰트인 Courier나 Consolas등을 쓰면 한글이 보기 싫은 모양으로 표시되고, 그렇다고 돋움체를 쓰자니 대문자 I와 소문자 l이 구분이 잘 되지 않는 등의 문제가 있다. 그래서 오늘은 추석 특집(?)으로 윈도용 gVim에서 한글과 영문의 글꼴을 따로 따로 설정하여 보기 좋은 화면을 만들 수 있는 팁을 공개하고자 한다.

보통 별다른 설정을 하지 않는다면 gVim의 폰트는 시스템 기본 폰트인 굴림[1. 실제로는 콘솔 기본 폰트인 Fixdays로 표시되는데, 이에 대응하는 굴림으로 한글이 표시되는 것이다.]으로 표시된다. 개인적으로 굴림은 가장 싫어하는 글꼴 중 하나이다.

 

 

이 때 guifont 세팅을 바꾸면 글꼴을 바꿀 수 있다. 아래 명령은 글꼴을 돋움체로 바꾸고, 크기는 10으로 한다.

:set guifont=Dotumche:h10:cHANGUL

하지만 돋움체에 영문자도 포함되어 있어서 영문 글꼴도 함께 돋움체로 표시된다. 개인적으로 선호하는 폰트인 Consolas를 쓰자니 다시 한글이 문제가 된다. 아래 명령으로 글꼴을 Consolas로 다시 바꾸자.

:set guifont=Consolas:h10:cHANGUL

Consolas는 serif 계열의 폰트인데, 한글을 표시해야 하는 경우에는 해당 폰트에 한글 글자 모양이 없으므로, 시스템은 자동적으로 “기본 serif”인 바탕체를 사용한다. 물론 한글에는 Serif라는 개념이 없는데 보통은 바탕/돋움으로 획 끝이 구부러지는 여부를 나눈다. [1. 명조/고딕이라는 표현도 있지만, 이건 일본식 용어라고 한다.]

다시 원하는 결과를 얻기 위해서는 아래의 명령을 모두 사용한다.

:set guifont=Consolas:h10:cANSI
:set guifontwide=Dotumche:h10:cDEFAULT

이제 한글은 돋움체로, 영문은 Consolas로 표시되는 말끔한(?) 화면을 즐길 수 있다.

위 명령에서 h10 은 글자의 높이(크기)를 설정하는 부분이며, 이 값을 바꾸면 한글과 영문자의 글자 크기를 달리 표시할 수도 있다.