0. 시작하며

 

VIM은 역사와 전통의 훌륭한 도구다.

지금 VIM을 쓰는 사람들은 앞으로도 계속 VIM을 사용할 것이다. 1970년대 이후 많은 사람들이 그래온 것처럼.

* VI (브이아이, 1976~)와 VIM (빔, 1991~)은 사실상 같은 도구다. 굳이 구별할 필요 없다.

 

VIM은 어디서나 쓸 수 있다.

VIM이 없는 OS는 없다. 만약 VIM조차 없는 환경이라면 다른 어떤 도구도 사용할 수 없을 것이다. 그만큼 VIM은 요구사항이 낮다 (콘솔 입출력만 가능하면 된다). 최악의 환경에서도 VIM은 실행된다.

 

그리고 VIM은 익숙해지면 편하다.

이건 양날의 검인데, 최소한의 학습 장벽을 넘지 않으면 전혀 쓸 수 없다. VIM을 켜고 끄지 못해 당황했던 기억이 누구에게나 있을 것이다. VIM은 마우스가 없던 시절에 만들어진 도구다. 그리고 두손의 움직임을 최소화하는 것이 VIM의 철학이다. 그래서 일단 학습 장벽을 넘어 사용법이 손에 익숙해지면 다른 어떤 도구보다 적은 동작으로 많은 것을 할 수 있다 (다른 어떤 도구보다 생산성이 높다).

 

VIM 최초의 학습 장벽은 이 글로 넘자. 좋은 글을 멋지게 번역했다.

[번역] Vim 정복하기: 4주 계획

원글은 How To Learn Vim: A Four Week Plan

윗 글을 읽고, 일주일만 꾸준히 vimtutor를 수련해서, VIM에서

1) h,j,k,l 키 만으로 이동할 줄 알고,

2) 원하는 문자열을 찾고 바꿀 줄 안다면

최초의 문턱을 아주 훌륭하게 넘은 셈이다. 이 정도만 알아도 VIM의 생산성을 체감할 것이다.

 

이 글은

1) VIM에서 윈도를 분할하고 쓰는 법,

2) VIM에서 비주얼블록을 선택하고 쓰는 법,

3) VIM 플러그인을 검색하고 쓰는 법을 소개하려고 한다.

 

1. VIM 윈도

 

VIM은 가로/세로로 윈도를 나누어 쓸 수 있다. CTRL-w 가 윈도 기능을 부르는 핵심 키다.

* 윈도 세로 분할 - CTRL-w, v

* 윈도 가로 분할 - CTRL-w, s

* 윈도 이동 (다음 윈도로) - CTRL-w, w

* 윈도 이동 (h,j,k,l 방향으로) - CTRL-w, 방향키 [h | j | k | l]

* 윈도 닫기 - (명령줄에서) :q

 

VIM 윈도 기능 예시를 동영상으로 한땀한땀 캡쳐했다. 시나리오는 다음과 같다.

VIM 열기 -> CTRL-w, v 키입력으로 윈도 세로 나누기

-> :e FILENAME 명령으로 나뉘어진 윈도에서 새 파일 열기

-> CTRL-w, s 키입력으로 윈도 가로 나누기

-> :e FILENAME 명령으로 나뉘어진 윈도에서 새 파일 열기

-> CTRL-w, w 키입력으로 윈도 이동하기 (6번 반복)

-> CTRL-w, l 키입력으로 오른쪽 윈도로 이동하기

-> CTRL-w, h 키입력으로 왼쪽 윈도로 이동하기

-> CTRL-w, j 키입력으로 아래쪽 윈도로 이동하기

-> CTRL-w, k 윈도로 위쪽 윈도로 이동하기

-> :q 명령으로 윈도 닫기 (모든 윈도를 닫을 때까지 반복)

 

2. 비주얼 블록

 

비주얼 블록은 간단하지만 무척 유용한 기능이다. V (대문자 v) 가 Visual Block을 부르는 핵심키다.

* 라인 단위 블록 선택 - V (대문자 v) + 방향키 [j | k]

* 블록 해제 - ESC

 

블록을 선택한 상태에서 해당 블록만을 대상으로 문자열을 검색/치환할 수 있다.

예를 들어 (블록 밖에 있는 "abc"는 그대로 두고) 블록 안에 있는 "abc"를 "def"로 검색/치환하려면 블록을 선택한 상태에서 다음과 같이 입력한다.

(명령줄에서) :s/abc/def/g

 

블록을 선택한 상태에서 해당 블록을 대상으로 일괄 작업을 실행할 수 있다.

예를 들어 해당 블록 앞에 "//" 문자열을 삽입해서 블록을 c/c++ 주석문으로 변환하려면 다음과 같이 입력한다.

(명령줄에서) :norm i//

 

그러면 norm 뒤에 나열된 키 입력이 블록 안의 각 라인에 일괄 적용 된다. 이렇게 변환된 주석문을 다시 일반문으로 변환하려면 (각 라인 첫머리의 "//" 문자열을 제거하려면, 다시 블록을 정의하고 다음과 같이 입력한다.

(명령줄에서) :norm xx

 

역시나 비주얼 블록 기능 예시를 한땀한땀 캡쳐했다. 시나리오는 다음과 같다.

VIM 열기 -> 비주얼 블록 선택/해제하기 (3회 반복)

-> :s/a/b/g 명령으로 문자열 바꾸기

-> norm i// 명령으로 라인 첫머리에 "// " 문자열 넣기

-> u 키입력으로 작업취소하기 (2회 반복)

-> :q 명령으로 VIM 닫기

 

3. VIM 플러그인

 

새로운 개발 머신을 갖게 되면 자기만의 VIM 사용 환경을 새로 설정해야 한다. 이때 사용하는 것이 ~/.vimrc 설정 파일이다. 필자의 ~/.vimrc 파일을 샘플로 링크에 걸어 둔다. 참조가 되면 좋겠다. 여기서 특기할만한 것은 VIM 플러그인 매니저 Vundle 이다. Vundle  이외에 다른 플러그인 매니저들도 많다. 어떤 것을 쓸지는 취향의 문제다. 필자는 처음 만난 플러그인 매니저가 Vundle이어서 Vundle을 쓴다.

 

VimAwesome (https://vimawesome.com/)이라는 훌륭한 VIM 플러그인 검색 사이트가 있다. 이 사이트를 이용하면 원하는 VIM 플러그인을 찾을 수 있고 해당 플러그인의 설치/설정/사용 방법을 알 수 있다. VimAwesome 사이트는 (Vundle 포함) 모든 VIM 플러그인 매니저들을 위한 알맞은 설정 방법을 안내해준다.

 

VIM 만세!

 

Posted by ingeeC
,

VIM의 Netrw 디렉토리 화면에서 PWD 설정 키 변경 (c --> cd)

 

VIM 버전을 올렸더니 (version 8.2), netrw 디렉토리 화면에서 현재 디렉토리를 지정하는 명령이 바뀌었다.

 

현상

netrw 디렉토리 화면에서 'c' 키를 누르면, 기대했던 것처럼 현재 디렉토리(PWD)가 변경되지 않고 Cannot make changes, 'modifiable' is off 라는 에러 메시지가 표시된다 (엄밀하게 말하면 'c' 키를 누르고나서 다른 키를 누를 때 에러가 발생).

" ============================================================================
" Netrw Directory Listing                                        (netrw v168)
"   /tmp
"   Sorted by      name
"   Sort sequence: [\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,\~\=\*$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~
"   Quick Help: <F1>:help  -:go up dir  D:delete  R:rename  s:sort-by  x:special
" ==============================================================================
../
./
.ICE-unix/
.Test-unix/
.X11-unix/
.XIM-unix/
.font-unix/
go-build130920707/
go-build151298825/
go-build497434673/
go-build528811745/
go-build792304239/
go-build882984587/
hsperfdata_root/
systemd-private-4187beacd3f54ff8a36d04d8588cf77e-ntpd.service-xnhf54/
tmux-1801/
telegraf_command_time.touch
~
~
~
~
~
~
~
~
E21: Cannot make changes, 'modifiable' is off                                               8,1           All

 

 

원인 및 조치

VIM Netrw 화면에서 "현재 디렉토리 (PWD)" 바꾸는 명령어가 c 키에서 c,d 키로 바뀌었다 (c 키와 d 키를 순서대로 입력). PWD를 변경하기 위해 c 키 대신 cd 키를 사용하면 된다.

 

Reference

정말 이렇게 저렇게 구글링하다 포기하려던 참에 VIM 의 netrw-quickhelp 문서에서 원인을 발견함 (Netrw 화면에서 <F1> 키를 누르면 나오는 도움말 문서).

netrw-c : This map's name has been changed from "c" to cd (see netrw-cd).

 

(먼지 팁, 끝)

Posted by ingeeC
,

VIM-GO, Golang 개발환경 꾸미기


회사 업무 때문에 Golang을 쓰고 있다. 코딩 스타일과 디렉토리 구조를 강제하는 점이 불만이지만, 그에 대한 반대급부로 편리함을 제공해준다. Golang은 개성이 중요한 예술가적 마인드의 개발자를 위한 도구가 아니라 문제해결이 중요한 실용가적 마인드의 개발자를 위한 도구인 것 같다.

Golang이 강제하는 코딩 스타일과 디렉토리 구조를 받아들인다면, 주요 OS마다 제공되는 표준 툴의 편리함과 일관됨을 누릴 수 있다. Golang을 설치하고 vim-go를 설치하면 다른 번잡한 툴이 필요 없다.

Golang 툴 설치

https://golang.org/doc/install 페이지가 안내하는 대로 따라하면 어렵지 않게 설치할 수 있다. GOROOT 환경변수와 GOPATH 환경변수 설정이 중요하다. GOROOT는 Golang 툴이 설치된 root 디렉토리 (예를 들어 /usr/local/go)이고, GOPATH는 Golang 프로젝트 관리를 위해 사용할 home 디렉토리 (예를 들어 /home/some-usr/go)이다. GOPATH 디렉토리 아래에는 툴에 의해 bin, pkg, src 디렉토리가 강제로 생성되고 관리된다. 개발자는 $GOPATH/src/ 디렉토리 아래에 프로젝트 디렉토리를 만들어야 한다 (안 내켜도 받아들이는게 편하다).

Vim-go 설치

  1. Vundle (VIM 플러그인 매니저) 설치
    .vimrc 설정파일을 GitHub에 올렸다. 해당 파일에 Vundle 플러그인 매니저의 설치방법도 메모해뒀다.
    https://gist.github.com/ingee/0554f2a8ae8c018d0f8b0c0c2c322767
  2. vim-go (Golang VIM 플러그인) 설치
    VIM 에디터에는 Vundle 말고도 다양한 플러그인 매니저가 존재한다. 어느 플러그인 매니저를 사용하든 상관 없다. VimAwesome 페이지(https://vimawesome.com/)를 방문하면 수많은 VIM 플러그인들의 목록과 설치방법을 확인할 수 있다. Golang 프로젝트 개발을 위해서는 vim-go 플러그인을 설치해야 한다. 바로 위 .vimrc 파일에는 Vundle 플러그인 매니저를 이용해서 vim-go 를 활용하는 설정이 이미 존재한다. .vimrc 를 수정한 다음, vim 을 실행시키고 커맨드 모드에서 :PluginInstall 을 실행시키면 vim-go 가 설치된다. vim-go 가 설치된 상태에서 :GoInstallBinaries 를 실행시키면 필요한 Golang 바이너리들이 설치된다 (바이너리 업데이트는 :GoUpdateBinaries). 여기까지 오면 준비 끝이다.
  3. Go 소스 탐색
    • hello.go 새로 편집
      vim hello.go를 입력하면 vim-go가 기본 뼈대를 자동으로 만들어 준다.
      package main
      
      import "fmt"
      
      func main() {
        fmt.Println("vim-go")
      }
      
    • <ctrl> ] 입력으로 소스코드 추적
      커서를 Println 구문 위에 놓고 <ctrl>+] 키를 입력하면 fmt.Println() 함수 구현부로 이동한다.
      // Println formats using the default formats for its operands and writes to standard output.
      // Spaces are always added between operands and a newline is appended.
      // It returns the number of bytes written and any write error encountered.
      func Println(a ...interface{}) (n int, err error) {
        return Fprintln(os.Stdout, a...)
      }
      
    • <ctrl> o 입력으로 소스코드 복귀
      다시 <ctrl>+o 키를 입력하면 직전 편집 위치로 복귀한다. <ctrl>+] 키와 함께 쓰면 편하다.
      package main
      
      import "fmt"
      
      func main() {
        fmt.Println("vim-go")
      }
      
끝!


Posted by ingeeC
,