Vim의 비주얼 모드와 텍스트 블록 저장과 파일 임포트

19 Sep 2016

일반적인 텍스트 에디터에서 블록을 지정하고 Copy&Paste하는 방법은 컴초보도 다 알고 있는 방법이다. 그러나 그것을 파일로 저장하거나 불러올 때는 약간은 귀찮은 절차를 거쳐야 한다. 텍스트 블록을 파일로 저장하거나 다른 파일을 불러와서 현재 문서의 적당한 부분에 삽입하는 작업을 대량으로 해야할 일이 생겨서 여러 유무료 에디터를 헤매다가 제대로 사용하지 못하고 있던 Vim에 그 기능이 거의 기본적으로 있다는 것을 알게 되어 Vim에 엉겁결에 입문하게 되었다. 마침 Vim 8이 십 년 만의 메이저 업그레이드를 하여 설치법부터 정리하고 바로 원하던 기능에 대해 정리하였다.

Visual Mode(선택 모드)

Vim에는 일반 모드(normal mode), 입력 모드(Insert Mode), 명령 모드(command-line mode)가 있다. 입력 모드에는 블록 모드라고도 불리는 비주얼 모드가 있다. 일반 모드에서 v(characterwise-visual), V(linewise-visual), Ctrl-v(blockwise-visual) 키로 각각 진입할 수 있다.

텍스트 블록을 복사하여 파일로 저장

  • 텍스트 블록의 시작으로 커서를 옮긴다.
  • v로 비주얼 모드로 들어간다.
  • 커서를 움직여 저장하려는 부분을 선택한다.
  • :'<,'>w 파일명으로 저장한다. 블록을 선택한 경우에는 '<,'>이 미리 입력되므로 실제로는 :w new-file만 입력하면 된다. 이후 명령에선 ` :’<,’>`부분을 생략한다. +
  • '<,'>은 블럭을 해제했더라도 '<,'>붙여 마지막에 선택한 블록에 대해 명령할 수 있다. 기계인간님의 제보
  • 기존 파일을 덮어쓰려면 w!을 사용하고, 선택한 블록을 추가하려면 >>를 사용한다.

일반 모드에서 파일로 저장

  • 행번호,행번호w 파일명으로 비주얼 모드가 아닌 일반 모드에서 범위를 지정해서 저장할 수도 있다.
  • mark를 이용하는 방법도 있는데 시작하는 곳에 ma, 끝에 mb하여 a 마크와 b 마크를 찍은 후, :'a'bw 파일명으로 저장할 수 있다. 기계인간님의 제보와 이종립님이 댓글로 제보해주셨어요^^

linewise와 blockwise는 줄 단위로 저장된다.

기존에 선택한 블록을 잘라내면서 저장하고 싶을 때 사용할 수 있는 방법이 몇 개 있다.

잘라내면서 파일로 저장

  • 위의 과정에서 원래 파일에서 지정한 텍스트 블록을 지우려면 파일을 저장한 후 gvd를 입력한다. +: g 명령에 대해서는 Vim의 g 명령으로 별도로 정리하였다.

  • 더 줄이면 :!> 파일명 +이나, 링크와 같이 아무런 결과를 제공하지 않는 외부명령으로 블록을 삭제하면서 저장할 수 있다.

  • 함수로 만드는 방법도 있으나 일단은 패스!

파일 임포트(:read)

반대로 읽어 들이기는 쉽다. :read 명령을 사용하여 커서 위치에 삽입한다. 위키아 위키의 예제를 그대로 번역하면:

  • :r foo.txt 커서 위치에 foo.txt 파일을 임포트한다.
  • :0r foo.txt 파일의 첫 줄 앞에 foo.txt 파일을 임포트한다.
  • :r !ls 커서 위치에 ls 결과를 임포트한다.
  • :$r !pwd 파일의 마지막 줄 뒤에 현재 디렉토리를 입력한다.

파일뿐만 아니라 외부명령을 실행한 결과도 불러올 수도 있고 임포트 위치도 지정할 수 있다.

리스트 만들기

비주얼 모드 중 Ctrl-v로 진입하는 blockwise-visual 모드는 여러 행에 걸쳐서 같은 문자를 입력할 때 유용하다.

  • 마크다운 리스트로 만들기 원하는 여러 줄을 줄의 처음에 커서를 위치한다.
  • Ctrl-V로 진입한다.
  • 블록을 컬럼으로 선택한다. 줄의 한두글자만 선택해도 되고, 아래로 원하는 행까지 선택한다.
  • I를 누른다. 선택한 칼럼 블록의 첫 번째 위치에 커서가 위치하며, 커서 모양이 바뀐다.
  • 선택된 *space를 눌러 마크다운 리스트 문법을 첫째 줄에 적용한다.
  • esc를 눌러서 일반모드로 변경하면 선택한 줄 모두에 적용되는 것을 볼 수 있다.

참고 링크

혹시 텍스트 블록 저장과 불러오기에 대한 다른 방법이나 에디터가 있다면 추천을 부탁합니다!

Share this:

comments powered by Disqus