GNU-Linux

UNIX as IDE: 3. Editing

동건 2017. 11. 6. 02:25

이 시리즈의 원 저자인 Tom Ryder의 허락을 받고 올리는 번역글입니다. IDE가 할 수 있는 기능을 UNIX 계열의 shell 안에서도 원활하게 할 수 있는 비결을 초보자도 알기 쉽게 잘 설명한 글일 뿐만 아니라 UNIX 자체의 철학이나 기본 사용법을 따라잡기에도 굉장히 좋은 글이라 생각되어 우리말로 옮기고자 합니다. 프로그래밍 용어는 웬만하면 원래 영단어로 쓰겠습니다. 언제든지 더 좋은 표현에 대한 의견은 감사합니다.



UNIX as IDE: Editing

2012년 2월 11일 Tom Ryder가 작성


모든 프로그래머들에게 텍스트 편집기는 필수 도구이기 때문에, 에디터의 선택에 관해 밑도 끝도 없이 열정이 넘치는 논쟁이 발발하기도 한다. UNIX 운영 체제는 Emacs와 Vim, 이 두 가지 유서 깊은 에디터와 긴밀히 연결되어 있는데, 이 편집기들은 굉장히 다른 철학을 갖고 있지만 대등한 능력을 보유하고 있다.


필자 역시 Vim 추종자이기 때문에 이 글에서는 필수적인 Vim의 기능을 소개하고 Vim의 부족한 점을 보완하기 위해서 쉘 기능을 Vim에서 부르는 법을 알아보겠다. 여기서 소개할 원칙 중 몇 가지는 Emacs에서도 통할 수 있겠지만, nano와 같은 단순 메모장에서는 안 그럴 수 있다.


여기서는 Vim에 대해 매우 일반적인 소개글을 쓰려고 하는데, Vim 자체의 능력이 출중하기 때문에 꽤 긴 글이 될 것 같다. 그러므로 가장 중요한 것들만 엄선해서 정리하고자 하고 상세한 설명이 필요할 경우 링크로 남기려 한다. Vim의 :help는 겉보기와 달리 굉장한 퀄리티를 자랑한다는 점을 잊지 말자.



파일 타입 감지

Vim은 자체적으로 파일 타입을 인식해서 그에 맞는 작업 -- 대표적인 예로 syntax highlighting -- 을 할 수 있다. 프로그래밍 언어에 따른 들여쓰기 스타일을 설정할 수도 있다. 아래에 .vimrc에 첫 설정을 입력해보자.

if has("autocmd")
  filetype on
  filetype indent on
  filetype plugin on
endif




Syntax highlighting

16-color 터미널이라도 syntax highlight 설정을 할 수 있다.

syntax on


16-color 터미널에서의 색상 표시가 그닥 예쁘게 나오지는 않지만, 거의 모든 언어에 대한 기본적인 기능을 해낸다. 색상 조합의 가능한 수는 무궁무진하며, 색상 조합을 적용하기도 쉽고 자신의 색상 조합을 만들 수도 있다. 256-color 터미널 또는 gVim의 경우에 가능한 선택지는 더욱 많아진다. 좋은 syntax highlight 기능이라면 syntax error를 빨간 경고 색상으로 알려줄 것이다.



Line numbering

전통적인 IDE처럼 라인 넘버를 보이고 싶다면

set number


Vim 7.3 버전 이상이라면 상대적인 라인 넘버를 볼 수도 있다.

set relativenumber



파일 태깅

Vim은 ctags 유틸과 좋은 궁합을 갖고 있다. 이를 통해서 필요한 검색을 프로젝트 통째로 할 수도 있고, 변수가 정의된 파일로 (같은 파일 안에 정의돼있더라도) 바로 이동할 수도 있게 해준다. 대형 C 프로젝트에서는 이런 기능이 엄청난 시간을 단축해준다. 아마도 대중적인 IDE에 비견할 수 있는 Vim의 대표적인 기능이라고 할 수 있을 것이다.


프로젝트 root에서 :!ctags -R를 통해서 여러 언어에 맞는 프로젝트의 각종 정의와 식별자의 위치를 인식해서 tags 파일을 생성해준다. 태그 생성이 완료되면, 프로젝트 전체에서 태그를 통해서 검색할 수 있다.

:tag someClass


:tn:tp 명령을 사용하면 프로젝트 다른 곳의 태그를 연속적으로 이용할 수 있다. 기본 내장된 태깅 기능만으로도 충분한 기능을 커버하지만, 태그 리스트 창과 같은 고급 기능이 필요하다면 Taglist 플러그인이 굉장히 유명하므로 설치해서 사용해보시라. Tim Pope의 Unimpaired 플러그인 역시 태깅과 관련된 단축키들을 제공한다.



외부 명령 실행하기

2017년이 오기 전까지는 아래 세 가지 방법으로 Vim 세션에서 외부 명령어를 부를 수 있었다.

  • :!<command> — 명령의 출력물을 Vim buffer에 담고자 할 때 유용하다.
  • :shell — Vim의 subprocess로서 shell을 시작한다. 상호 대화가 필요한(interactive) 명령에 적합하다.
  • <CTRL-Z> — Vim을 잠깐 나와서 shell에서 직접 명령을 실행시킨다.


2017년 이후 Vim 8.x 버전부터는 새로 나온 :terminal 명령어를 통해 터미널 에뮬레이터가 Vim 창 안에 들어가게 되었다. Conque와 같이 이전의 플러그인 기반의 접근법보다 더 나은 방법으로 터미널에 접근할 수 있는 걸로 보인다. 그래도 이 글에서는 다른 Vi 종류의 에디터에서 모두 작동할 수 있는 전통적인 방법을 훨씬 추천한다.



Lint 프로그램과 syntax 검사기

perl -cgcc 등의 외부 명령어를 통해서 syntax를 검사하고 컴파일하는 작업은 Vim 안의 :! 명령을 통해서 사용할 수 있는 좋은 사례다. Perl 코딩을 한다면 아래 명령을 사용할 수 있다.

:!perl -c %

/home/tom/project/test.pl syntax OK

Press Enter or type command to continue


% 심볼은 현재 편집 중인 파일을 가르키는 단축키가 된다. 명령 실행 후 출력되는 것이 있다면 그것도 명령줄 아래에서 확인할 수 있다. 자주 실행하게 되는 명령어가 있다면 .vimrc 파일에 Vim 명령으로 연결하거나 단축키로 연결할 수도 있다. 아래 예제는 :PerlLint라는 명령어로, \l 키조합으로 연결하는 예시이다.

command PerlLint !perl -c %
nnoremap <leader>l :PerlLint<cr>


Vim에 내장된 quickfix 창을 이용해서 아까보다 훨씬 좋은 방법으로 명령을 실행하고 확인할 수 있다. 파일 타입에 맞게 makeprg를 설정해서 명령의 결과물을 quicklist에 보내주는 Vim 명령과 두 가지 에러 포맷을 추가하는 명령을 아래와 같이 추가하면 된다.

:set makeprg=perl\ -c\ -MVi::QuickFix\ %
:set errorformat+=%m\ at\ %f\ line\ %l\.
:set errorformat+=%m\ at\ %f\ line\ %l


CPAN에서 모듈을 설치하거나 데비안이라면 libvi-quickfix-perl 패키지를 통해서 설치할 수도 있다. 이제 :make 명령을 통해서 파일의 syntax를 검사하고, 문제가 있다면 quicklist 창을 열어서 에러를 조사할 수도 있으며, :cn, :cp를 통해 문제가 있는 위치로 이동할 수도 있다.

Vim quickfix working on a Perl fileVim quickfix working on a Perl file



gcc 등의 다른 컴파일러나 syntax 검사기가 내보내는 에러 메세지에 담겨있는 파일명, 라인 넘버, 에러 문자열을 사용해서 Vim의 quickfix 창에 연결하는 것도 비슷하게 할 수 있다. 웹 분야에 잘 쓰이고 있는 PHP나, JavaScript 관련 도구인 JSLint도 연결할 수 있다. 또한 Syntastic과 같은 플러그인도 비슷한 기능을 훌륭하게 수행한다.



외부 명령의 결과물 가지고 Vim 안으로 들어오기

:rs!를 통해서 명령 결과로 나오는 출력을 바로 Vim buffer에 붙여넣을 수 있다. ls의 결과를 이용하는 예를 들면,

:r!ls


물론 :r은 shell 명령만을 위한 것이 아니다. 당신의 public key나 boilerplate 코드 등, 다른 파일의 내용물을 :r을 통해 바로 읽어들일 수 있다.

:r ~/.ssh/id_rsa.pub
:r ~/dev/perl/boilerplate/copyright.pl



외부 명령을 통한 검색 및 필터링

지금까지 소개한 기능들을 확장시키면 현재 buffer에서 찾아바꾸기를 수행할 수 있다. 심지어 buffer의 선택된 일부분에서 찾아바꾸기를 할 수도 있다. Vim의 visual block mode는 테이블 유형의 데이터를 훌륭하게 다루므로, 이와 연계해서 column, cut, sort, awk와 같은 도구를 이용하면 매우 편리한 기능을 누릴 수 있다.


예를 들어 아래 명령은 파일 전체의 두 번째 열을 기준으로 정렬할 수 있다.

:%!sort -k2,2r


visual mode로 선택한 영역 안에서 \vim\ 패턴이 일치하는 행의 세 번째 열만 출력할 수도 있다.

:'<,'>!awk '/vim/ {print $3}'


첫 번째 줄부터 열 번째 줄까지의 키워드들을 예쁘게 정렬할 수도 있다.

:1,10!column -t


어떤 텍스트 필터나 명령이라도 이런 식으로 Vim에서 조작할 수 있다. 이렇게 간단한 방법으로 상호간 함께 작동하는 것(interoperability)이 가능하기 때문에 Vim 편집기는 메모장 차원을 넘어서는 작업을 할 수 있다. Vim buffer는 기존 도구들이 서로 오고갈 수 있는 대화의 장이 되는 것이다.


필자의 "Shell from Vi" 글에서 더 상세한 면모를 볼 수 있다.



Vim의 기본 내장 기능으로도 가능하다

정렬이나 검색과 같은 정말로 기본적은 작업은 사실 Vim 자체 명령 :sort:grep 등으로 으로 구현이 되어있다는 점을 언급하고 싶다. 이 자체 명령어는 Windows 운영체제에서 Vim을 사용하는 것을 더욱 쉽게 만들어주지만, shell 명령을 이어쓰는 것 만큼의 자유자재로 활용할 수는 없다.



Diffing

Vim은 vimdiff라는 diffing mode를 탑재하고 있어서 한 파일의 다른 버전 간 비교를 볼 수도 있을 뿐더러 three-way merge 충돌 처리도 가능하며, :diffput:diffget 등의 명령을 이용해서 여러 방향에서 코드 차이점을 수정할 수 있다. shell에서 두 개 이상의 파일을 비교하기 위해 vimdiff를 호출하려면 아래와 같이 하면 된다.

$ vimdiff file-v1.c file-v2.c

Vim diffing a .vimrc fileVim diffing a .vimrc file




버전 관리

Vim 안에서 버전 관리 도구의 명령들을 직접 호출할 수 있다. % 기호는 항상 현재 buffer와 이어진 파일을 가르키는 단축키라는 것을 잊지 말자. 아래와 같은 예제를 통해서 우리가 원하는 대부분의 버전 관리 기능을 사용할 수 있다.

:!svn status
:!svn add %
:!git commit -a


최근들어 Vim의 Git 기능 연결에 있어서의 승자는 Tim Pope의 Fugitive라고 확실하게 말할 수 있다. 필자 역시 Git 사용자라면 필히 추천할만 한 플러그인이다. 이 UNIX as IDE 시리즈의 마지막 즈음에 UNIX에 있어서 버전 관리의 역사와 그 근본에 접근해보겠다.



간극

GUI 기반의 IDE를 사용하는 많은 프로그래머들에게 Vim이 고대 유물이나 장난감 취금을 받는 이유를 들자면, Vim을 그저 서버에서 직접 파일을 고칠 때만 사용하는 도구 정도로 인식하기 때문일 것이다. Vim 그 자체로 shell 환경에서의 충분한 기능을 가진 편집기 레벨로 생각되지 않는 것이다. UNIX 친화적인 시스템에서 Vim이 외부 도구와 매우 쉽게 연결할 수 있고 조합하여 사용할 수 있는 기능은 Vim을 편집기가 아니라 편집 발전소(text editing powerhouse)로 승격시켜준다. 숙련된 경력자도 Vim의 이런 면모를 보고 놀라는 경우도 있다.



UNIX as IDE




반응형

'GNU-Linux' 카테고리의 다른 글

UNIX as IDE: 5. Building  (0) 2017.11.07
UNIX as IDE: 4. Compiling  (0) 2017.11.06
UNIX as IDE: 2. Files  (0) 2017.11.06
UNIX as IDE: 1. Introduction  (0) 2017.11.06
Vim 사용자가 되기 위한 첫 걸음 (.feat tmux)  (1) 2017.10.06