Vim은 반복 작업에 최적화되어 있다.
점(.) 명령어는 마지막 변경을 반복한다.
*은 현재 커서 밑 단어를 검색한다.
키 입력 한 번으로 이동, 키 입력 한 번으로 실행하기
언제 삽입 모드에서 일반 모드로 변경하냐면, 취향 문제이긴 하나 글을 작성하다가 멈춰서 생각이 필요할 때마다 삽입 모드를 벗어난다.
단어를 삭제할 때 커서의 위치에 상관 없이 사용할 수 있는 daw가 좋다. 반복하기 좋기 때문이다.
커서 아래, 혹은 커서 아래가 숫자가 아닐 경우 커서 이후 숫자로 이동한 후 가감 연산을 하는 방법이다.
d{모션} 명령은 모션 범위에 따라 문자 하나(dl), 단어 하나(daw)를 제거한다. 동일한 규칙은 c{모션}, y{모션} 등에도 적용되며 이러한 명령을 오퍼레이터 operator 라고 한다.
기본 제공 외에 유저들이 만든 플러그인으로 여러 커스텀 오퍼레이터, 커스텀 모션을 사용할 수 있다.
Vim의 명령은 대부분 삽입 모드 외에서 사용 가능하지만, 삽입 모드에서 사용할 수 있는 명령도 있다.
사실 타자 속도가 빠르면 지우고 다시 쓰는게 더 빠를 수 있다.
다른 방법은 아래와 같다.
예를 들어 삽입 모드에서 편집 중, 현재 행을 화면 중간으로 이동시키는 zz왜 조합해서<C-o>zz 같이 사용할 수 있다.
표현식 레지스터를 이용해 삽입 모드에서 산술 계산을 할 수 있다.
명령행 모드는 Ex 명령(:), 검색 패턴(/), 표현식(<C-r>=)을 입력 시 활성화된다.
어디에서나 광범위하게 활용할 수 있다는 장점이 있다. 즉 직접 커서를 옮기지 않아도 된다.
또 y,p와 다르게 copy, move는 레지스터를 사용하지 않는다.
삽입 모드에서 사용하는 것 대부분 사용할 수 있다.
<C-w> <C-u> <C-v> <C-k> 등
비주얼 모드로 영역 지정 후 :를 누르면 '<,'> 로 범위 지정되서 명령을 쓸 수 있다. 저 기호는 각각 비주얼 영역의 첫 행과 마지막 행을 의미한다.
:/<html>/,/</html>/d 처럼 패턴도 쓸 수 있다.
오프셋으로 디테일한 범위 지정이 가능하다.
예를 들어 html 태그 자체는 제외하고 내부를 삭제하고 싶다면
:/<html>/+1/</html>/-1d
처럼 사용할 수 있다.
zsh 처럼 세팅할 경우,
set wildmenu
set wildmode=full
이러면 탭만으로 선택된 것이 하이라이트된 상태로 목록 출력
:로 진입해서 사용하면 현재 커서의 단어가 복사되서 올라간다.
이를 치환 등의 명령과 응용하면 좋다. 또는 vimrc 설정을 알고 싶을 때 해당 설정으로 커서 옮기고 :help CrCw 하면 바로 확인할 수 있다.
명령행 모드에서의 활동은 히스토리로 기록된다. Vim을 종료해도 지워지지 않는다.
기본값은 20개인데 제한을 더 늘릴 것을 권장한다.
set history=200
Vim을 벗어나지 않고 간단하게 외부 셸을 사용할 수 있다.
셸 명령의 결과를 표준 입출력으로 버퍼로 불러와 쓸 수도 있는데 별로인 것 같다.
Vim은 여러 파일을 관리할 수 있도록 버퍼 목록을 제공한다.
Vim은 파일에 실제로 접근해서 편집하는 것이 아닌 메모리 공간에 파일을 복사해서 편집을 하는데, 이 메모리에 존재하는 파일의 사본을 Vim에서 사용하는 용어로 버퍼 buffer 라고 한다.
아래처럼 매핑해서 쓰면 편하다.
nnoremap <silent> [b :bprevious<CR>
nnoremap <silent> ]b :bnext<CR>
nnoremap <silent> [B :bfirst<CR>
nnoremap <silent> ]B :blast<CR>
인자 목록 arguments list 은 파일들을 쉽게 관리하기 위해 그룹으로 묶는 기능을 제공한다.
와일드카드를 조합해 파일들을 인자 목록으로 가져오는 방법을 글롭 glob 라고 한다.
백택 안의 문자를 셸 명령으로 처리한다.
예를 들어 파일 목록들이 적힌 파일이 있다면,
:args `cat fileList.txt`
로 내부 내용을 읽어 인자 목록을 갱신할 수 있다.
여기서 숨김 파일은 수정된 버퍼가 저장하지 않고 숨겨진 경우를 의미한다.
버퍼를 수정한 상태(+)에서 버퍼를 전환하려고 하면 저장하든가 !로 강제 전환하라고 하는데 강제 전환 할 경우 기존 버퍼는 숨김 상태(h)가 된다.
vim 종료 시 숨김 됬던 버퍼를 어떻게 처리할지 묻는다.
*.do 명령은 순차적으로 목록에 실행되는데 만약 버퍼를 수정하는 내용이 있다면, 작업 후 넘어갈 때 오류가 발생한다.
:argdo명령 은 아래 처럼 작동한다.
:first
{command}
:next
{command}
...반복
여기서 next때 오류가 발생한다. 이를 해결하기 위해 hidden 설정(set hidden)을 사용하면 느낌표를 붙이지 않고 n, bn, cn 등을 사용할 수 있다.
작업 후에는 :argdo w (또는 :wa)로 일괄 저장할 수 있다.
터미널 탭, tmux, vim-airline 버퍼 리스트로 대체 가능
절대 경로는 물론 현재 작업 디렉터리 기준으로 상대 경로도 사용할 수 있다.
:find 를 이용하면 경로를 입력하지 않고도 파일을 열 수 있다.
하지만 먼저 path 를 설정해야 한다.
:set path+=./**
예시로, 위 명령은 현재 디렉터리 아래 모든 디렉토리를 path 로 설정한다.
만약 동일한 이름의 파일이 있다면 탭으로 고를 수 있다.
NERDTree로 대체 가능
Vim 은 디렉터리 존재 여부와 상관 없이 새로운 버퍼를 생성하지만, 존재하지 않는 디렉터리에 버퍼를 저장(:write)하려고 하면 에러가 발생한다.
이 문제는 외부 mkdir 호출로 해결할 수 있다.
:!mkdir -p %:h
:write
-p 는 mkdir 에서 존재하지 않는 디렉터리가 있다면 생성하라는 플래그이다.
% 는 현재 활성 버퍼의 경로, :h 는 파일 경로에서 파일명을 제거한다는 의미이다.
읽기 전용 파일 등을 편집하고 저장이 안될 경우, sudo vim 이나 sudoedit vim 으로 관리자 권한으로 다시 vim을 실행하면 된다.
하지만 vim을 껐다 켜지 않고 외부 명령어로 바로 저장하는 방법도 있다.
:w !sudo tee % > {dir/file}
모션 motion 은 Vim을 조작하는데 중요한 명령 중 하나이다. 단순히 커서 이동 뿐만 아니라 오퍼레이터-대기 모드 사용 중 문서의 범위를 조작할 때도 사용한다.
어떤 모션이 어떤 상왕에 유용한지, 또 파일 간 이동을 더 빠르게 하는 뛰어넘기에 관한 내용이다.
방향키 대신 hjkl 사용 권장
줄바꿈 처리될 만큼의 긴 문자열을 편집할 경우가 거의 없다. 또 행 번호 설정해놓으면 햇갈릴 일이 없다.
h, l로 열을 하나 하나 이동하는 것보다 훨씬 빠르다.
'단어의 끝에 덧붙이기'라는 뜻으로, ea, gea를 하나의 명령으로 쓸 때가 많다.
word는 문자, 숫자, 밑줄 또는 다른 논블럭 문자의 연속으로 이뤄지고 공백으로 분리된 단위를 의미한다.
WORD는 단순하게 문자의 연속이며 공백으로 분리된 경우이다.
위 명령들의 WORD 단위 모션 명령은 W, B, E, gE 이다.
행 안에서 빠르게 이동해야 할 경우 유용하다.
find, till로 외우자.
예를 들어 excellent 라는 단어를 지우려고 검색할 때 e보다 x로 접근하는 것이 더 빠르다.
문자 검색(f, t)는 가볍지만 한 문자, 현재 행이라는 제한을 가진다.
문자를 하나 이상 검색하고 싶거나, 현재 행을 넘는 범위에서 찾고 싶다면 검색 명령을 이용한다.
이를 이용하여 행을 넘어 원하는 위치로 즉시 이동할 수 있다.
검색 명령은 일반 모드 뿐만 아니라 동작 대기 모드(오퍼레이터), 비주얼 모드에서도 사용할 수 있다.
예제를 따라하되 고런갑다 하고 빠르게 넘어갈 것
출처: Drew Nail, Practical Vim(2015)