Skip to content

Vi

VIM 명령어 단축키 VIM 이동 단축키

vi(브이아이, /ˈviːˈaɪ/)는 Emacs와 함께 유닉스 환경에서 가장 많이 쓰이는 문서 편집기이다. 1976년 빌 조이가 초기 BSD 릴리즈에 포함될 편집기로 만들었다. vi라는 이름은 한 줄씩 편집하는 줄단위 편집기가 아니라 한 화면을 편집하는 비주얼 에디터(visual editor)라는 뜻에서 유래했다. 간결하면서도, 강력한 기능으로 열광적인 사용자가 많다.

현재는 오리지널 vi를 사용하는 경우는 거의 없고, 일반적으로 기능을 모방하여 만들어진 클론을 사용하고 있다. 이런 클론 중 많이 쓰이는 것은 기능이 다양한 것을 장점으로 내세우며, 리눅스 배포판에 포함되는 Vim, 그리고, BSD 라이선스로 제공되며 원본 vi의 동작과 호환성으로 정평이 나 있는 nvi, 독자적인 팬층을 확보한 elvis등이 있다.

How to install

$ yum install vim-X11 vim-common vim-enhanced vim-minimal

Category

Example

간단한 사용방법에 대하여 정리한다.

  • Visual Mode
    • <C-v> 또는 <C-q>
  • 변환.
    • >, <: (Visual Mode 에서) 틀여쓰기 넣기 & 빼기 (블록을 지정하여 사용하면 된다).
    • =: (Visual Mode 에서) 자동정렬.
    • <C-a>, <C-x>: (Visual Mode 에서) 수치 증가/감소.
    • u, U, ~: (Visual Mode 에서) 소문자, 대문자, 반전.
  • 이력(History)
    • u: Undo
    • <C-r>: Redo
  • 검색(Search)
    • #, *: 현재 커서의 단어를 뒤로/앞으로 찾기.
  • 점프 목록 (Jumplist)
    • :jumps: 점프 목록을 본다.
    • ctrl-i: goes forward in jump list
    • ctrl-o: goes back in jump list
  • 버퍼(Buffer)
    • :bp: 이전 버퍼로 이동.
    • :bn: 다음 버퍼로 이동.
    • :ls: 버퍼 목록 출력.
    • :ls!: 버퍼 목록 출력. (Unlisted된 버퍼도 출력한다)
  • 매크로(Macro)
    • qa: a 레지스터에 매크로 입력 시작.
    • q: (매크로 입력중일 경우) 레지스터에 매크로 입력 종료.
    • 3@a: a 레지스터의 매크로를 3회 사용.
  • 마킹(Marking) 명령.
    • :marks: 마킹 목록을 출력.
    • mA: 마킹하기. 전역 마킹은 대문자(A ~ Z)를 사용하고 지역마킹은 소문자(a ~ z)를 사용한다.
    • :delmarks A: 마킹 제거. 제거할 마킹을 나열할 수 있다.
    • `A: 마킹된 위치로 이동.
    • 'A: 마킹된 위치로 이동.
    • ``: 직전(마지막) 커서로 이동.
    • '': 직전(마지막) 커서로 이동.
    • `.: 직전(마지막) 수정 위치로 커서로 이동.
  • 레지스터(Register) 조작.
    • "ayy, "ap: a 레지스터에 복사/붙여넣기. 레지스터는 a ~ z 까지 총 26개 존재한다.
    • <C-R>": 명령행 모드에서 사용할 경우, 기본 레지스터의 내용을 붙여넣는다. ("대신 a ~ z 를 사용하면 해당 레지스터를 사용한다.)
  • 화면 이동.
    • z<CR>, zt: 현재 행을 화면의 맨위로 이동
    • z., zz: 현재 행을 화면의 중앙으로 이동
    • z-, zb: 현재 행을 화면의 최하단으로 이동
    • ctrl-f: Scroll forward one screen.
    • ctrl-b: Scroll back one screen.
    • ctrl-u: Scroll up one half of a screen.
    • ctrl-d: Scroll down one half of a screen.
    • ctrl-y: Scroll forward one line.
    • ctrl-e: Scroll back one line.
  • 커서 이동 (Text object motions; object-motions)
    • H: 커서를 화면 맨 위로 이동
    • M: 커서를 화면 중안으로 이동
    • L: 커서를 화면 최하단으로 이동
    • ]]: 다음 구절의 처음으로.
    • [[: 이전 구절의 처음으로
    • ][:
    • []:
    • [{: 열기 브레이스(Open Brace; {)로 이동.
    • ]}: 닫기 브레이스(Close Brace; })로 이동.
    • %: Pair가 되는 브레이스로 이동.
  • Delete
    • dd: 현재 커서가 있는 라인 제거.
    • dw: 현재 커서 부터 시작하여 1워드 제거. (공백 포함, 커서 뒷 부분은 지워지지 않음)
    • diw: 현재 커서가 위치한 1워드 제거 (공백 미포함)
    • daw: 현재 커서가 위치한 1워드 제거 (다음 단어까지의 공백 포함).
  • 창(Window)과 창(Window) 사이에 커서 이동.
    • <C-w>h: 왼쪽 창으로 커서 이동
    • <C-w>j: 아래쪽 창으로 커서 이동
    • <C-w>k: 위쪽 창으로 커서 이동
    • <C-w>l: 오른쪽 창으로 커서 이동
    • <C-w>w: 창을 순차적으로 이동
    • <C-w>W: 창을 역순으로 이동
  • 창(Window) 이동. (:help window-moving)
    • <C-w>r: 이것은 창을 회전시킵니다 (첫 번째 창이 두 번째 창이 되고 두 번째 창이 세 번째 창이 되는 등).
    • <C-w>x: 현재 창을 다음 창으로 교체.
    • <C-w>H: 이 창을 맨 왼쪽으로 이동.
    • <C-w>K: 이 창을 맨 위로 이동.
  • 창(Window) 크기 조정.
    • <C-w>[N]-: N만큼 창의 행 감소
    • <C-w>[N]=: N만큼 창의 행 증가
    • <C-w>[N]<: N만큼 창의 열 감소
    • <C-w>[N]>: N만큼 창의 열 증가
  • 쉡(Shell) 통합
    • <C-z>: Shell로 빠져나간다. 정확히 표현하면 vi를 Background로 보낸다. fg명령을 사용하면 다시 돌아올 수 있다.
  • 기타 명령.
    • :map: 현재, 바인딩 된 키맵(Key-map) 목록을 출력한다.
    • :f, <C-g>: 현재 파일 정보를 출력한다.
    • q:: 명령행 모드의 히스토리 창(Window)을 연다.
    • Q: ":"명령을 연속적으로 입력할 수 있는 Ex-mode로 들어간다. 빠져나가기 위해 :visual를 입력하면 된다.
  • Navigation
    • C-]: Jump tag. (or alternative keys CR)
    • C-T: Prev tag. (or alternative keys BS)
    • C-O: 이전 커서 위치로.
    • C-I: 다음 커서 위치로.
  • 자동완성
  • Go to definition.
    • gd: will take you to the local declaration.
    • gD: will take you to the global declaration.
    • g*: search for the word under the cursor (like , but g on 'rain' will find words like 'rainbow').
    • g#: same as g* but in backward direction.
    • gg: 첫 번째 라인으로.
    • G: 마지막 라인으로.
    • gf: will go to the file under the cursor
    • g]: and other commands will jump to a tag definition (a tag can be a function or variable name, or more).
  • Filename
    • :echo @%: Print file path (relative)
    • :echo expand('%:p'): Print file path (absolute)
  • HEX
    • :%!xxd: HEX모드로 본다.
    • :%!xxd -r: 일반 TEXT모드로 본다.

Settings

:help vimrc
vimrc 파일에 대한 HELP Manual.
:!echo $VIMRUNTIME
Vim 설치경로 확인.
:colorscheme [테마이름]
테마를 변경한다. 테마 목록은 colors디렉터리를 확인하면 된다.
:help feature-list
특성 목록을 출력한다. has()를 사용하여 사용여부를 확인할 수 있다.
:help expr-env
:help expression-syntax
변수 확인
:set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:<
:set list
특수문자(공백 등)을 다른 문자로 대체한 후 출력한다. 1
:set scrolloff=n
스크롤시 n개 라인수 만큼 여유를 둔다.
:set cursorline
:set cursorcolumn
현재 커서의 라인과 컬럼을 강조한다.
:set filetype={원하는파일타입}
현재 버퍼의 파일 타입 설정.
예를 들면 빈 버퍼를 열고 :set filetype=python 라고 하면 파이썬 파일로 인식한다.
:let mapleader=","
LEADER KEY를 설정한다.
:echo mapleader
LEADER KEY를 출력한다.
:e ++enc=인코딩
현재 파일 인코딩 변경. (출력을 이걸로 한다)
이 후, set fileencoding=utf-8 라고 입력하면 현재 파일의 character set 을 해당 fileencoding 으로 간주한다. (파일을 수정함) -> iconv로 대체 가능.

Basic search and replace

:%s/foo/bar/g
Find each occurrence of 'foo' (in all lines), and replace it with 'bar'.
:s/foo/bar/g
Find each occurrence of 'foo' (in the current line only), and replace it with 'bar'.
:%s/foo/bar/gc
Change each 'foo' to 'bar', but ask for confirmation first.
:%s/\<foo\>/bar/gc
Change only whole words exactly matching 'foo' to 'bar'; ask for confirmation.
:%s/foo/bar/gci
Change each 'foo' (case insensitive) to 'bar'; ask for confirmation.
This may be wanted after using :set noignorecase to make searches case sensitive (the default).
:%s/foo/bar/gcI
Change each 'foo' (case sensitive) to 'bar'; ask for confirmation.
This may be wanted after using :set ignorecase to make searches case insensitive.
:%s/^M//g
^M는 CR(캐리지리턴)이다. 주의할 점은 문자 그대로 타이핑 하면 안되고 Ctrl+V와 Ctrl+M을 입력해야 한다.
:g/profile/d
패턴("profile") 이 있는 줄 제거.
:v/profile/d
패턴("profile") 이 없는 줄 제거.
:g!/^\s*"/d
패턴이 포함되지 않는 줄 제거.
:g/^\s*$/d or :v/\S/d
공백이 있는 빈 줄 제거.
:s/_\([a-zA-Z0-9]*\)/\u\1/g
스네이크 케이스 (Snake case)로 된 글자를 파스칼 케이스 (Pascal case)로 변환.
:%s/aaa/bbb/e
검색 패턴이 실패하면 오류 메시지를 발행하지 말고, 특히, 오류가 발생하지 않은 것처럼 계속 진행. 이는 Pipe(|)로 연결할 때 유용하다.
  • ex - :%s/aaa/bbb/e | %s/111/222/e

Information

:scriptnames
현재, LOAD된 vim 스크립트 목록을 출력한다.
:function
사용 가능한 함수 목록
:command
사용 가능한 명령 목록
:map, :vmap
사용 가능한 Key map 목록
:messages
메시지 히스토리 출력.
:version
vim --version과 같이 추력된다. Features 항목에 컴파일시 함께 설치된 Runtime plugin 목록이 출력된다.
:checkhealth
vim의 상태를 점검한다. Python 설치여부 등 또는 설정파일의 에러를 점검할 수 있다.
health#provider#check항목에서 Provider (e.g. python, ruby, node) 상태를 점검할 수 있다.
:NeoBundleList
NeoBundle로 설치된 전체 플러그인 목록을 출력한다.

abbreviate

축약어(abbreviation)를 등록할 수 있다.

  • insert, command-line 모드에서만 작동하는 일종의 자동 완성 기능.
    • abbr: insert, command-line 모드 양쪽에서 작동.
    • iabbr: insert 모드에서만 작동
    • cabbr: command-line 모드에서만 작동
  • :ab로 써도 작동한다.
    • 이러면 너무 짧아서 헷갈릴 수 있으니 나는 :abbr로 사용하고 있다.

Scripting

:py {python-code}
Python 코드를 실행할 수 있다. :py import vim으로 vim 확장을 사용할 수 있다.

Ignorecase find string

간단한 Ignorecase 방법은 \c를 아래와 같이 사용하면 된다.

/\cstring

pattern

ignorecase

smartcase

matches

foo

off

-

foo

foo

on

-

foo Foo FOO

Foo

on

off

foo Foo FOO

Foo

on

on

Foo

\cfoo

-

-

foo Foo FOO

foo\C

-

-

foo

Select area command

선택영역에 한정된 명령(문자열 치환 등)을 사용하고 싶을 경우 VisualMode에서 :를 사용하여 명령어를 입력할 경우 아래와 같이 출력된다.

:'<,'>

이 때 입력한 명령은 선택된 영역에 한정되어 작동한다.

현재 커서의 단어

expand("<cword>")

MACRO

a 부터 z까지 레지스터를 지정할 수 있다. 매크로 등록은 아래와 같다.

q<letter><commands>q

매크로 실행은 아래와 같다.

<number>@<letter>

So, the complete process looks like:

qd  start recording to register d
... your complex series of commands
q   stop recording
@d  execute your macro
@@  execute your macro again

JUMP

Buffers

  • [Stackoverflow - Vim: How do you open another No Name buffer like the one on startup?]
  • :new will create a split window with an unnamed buffer.
  • :enew will open one in the current window.
  • :vnew will open one in a vertically split window.
  • :tabnew will open one in a new tab.

Sorting

:sort
정렬
:%sort!
역방향 정렬
:%sort u
Remove duplicate lines
:sort n
Numeric sort

키맵을 스크립트로

feedkeys 함수를 사용하면 된다.

또한 특수 키를 포함하려고 싶다면 큰 따옴표와 "\..." 표기법을 사용하면 된다.

예제:

call feedkeys("\<C-Y>")

여러 명령을 한 줄로

파이프(|)로 연결하면 된다.

:%s/aaa/bbb/e | %s/111/222/e

메뉴얼은 다음 명령으로 확인:

:help :s_flags

Simple settings

set hlsearch " 검색어 하이라이팅
set nu " 줄번호
set autoindent " 자동 들여쓰기
set scrolloff=2
set wildmode=longest,list
set ts=4 "tag select
set sts=4 "st select
set sw=1 " 스크롤바 너비
set autowrite " 다른 파일로 넘어갈 때 자동 저장
set autoread " 작업 중인 파일 외부에서 변경됬을 경우 자동으로 불러옴
set cindent " C언어 자동 들여쓰기
set bs=eol,start,indent
set history=256
set laststatus=2 " 상태바 표시 항상
"set paste " 붙여넣기 계단현상 없애기
set shiftwidth=4 " 자동 들여쓰기 너비 설정
set showmatch " 일치하는 괄호 하이라이팅
set smartcase " 검색시 대소문자 구별
set smarttab
set smartindent
set softtabstop=4
set tabstop=4
set ruler " 현재 커서 위치 표시
set incsearch
set statusline=\ %<%l:%v\ [%P]%=%a\ %h%m%r\ %F\

" 마지막으로 수정된 곳에 커서를 위치함
au BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "norm g`\"" |
\ endif

" 파일 인코딩을 한국어로
if $LANG[0]=='k' && $LANG[1]=='o'
set fileencoding=korea
endif

" 구문 강조 사용
if has("syntax")
 syntax on
endif

" 컬러 스킴 사용
colorscheme jellybeans

Clipboard tool

작동하는 클립 보드 도구가 있으면 +*레지스터가 암시 적으로 활성화됩니다. 이는 yank 를 할 때 전역 클립보드로 복사할 수 있는 기능이다. Nvim은 우선 순위에 따라 다음 클립 보드 도구를 찾습니다.

Use the clipboard

vi에서의 복사/붙이기

  • "+Y: 클립보드에 현재 라인을 복사.
  • "+gP: 클립보드로부터 텍스트를 붙여넣고, 붙여넣은 위치 뒤로 커서 이동.

아래와 같이 키맵을 사용할 수 있다.

map <F3> "+Y
map <F4> "+gP
vmap <F3> "+y
vmap <F4> "+gP
imap <F4> <ESC>"+gPi

스크롤 동기화

다국어 지원 같이, 동일한 위치(라인 넘버)의 텍스트를 수정할 때 유용한다.

세로로 분할 :vs한 후 다음 명령을 동기화 시킬 버퍼에 각각 입력하면 된다.

:set scrollbind

이 때, 자동 개행 옵션은 끄는편이 좋다.

:set nowarp

Colors

t_Co

t_Co옵션 (&t_Co)은 Vim이 호스트 터미널에서 표시 할 수 있는 최대 색상 수로 간주하는 값입니다.

terminfo$TERM 값에 따라 다음과 같이 정의된다:

term

t_Co

xterm

8

xterm-256color

256

screen

8

screen-256color

256

Vim이 시작되면 TERM환경 변수 의 값을 가져와 해당 값으로 terminfo데이터베이스를 쿼리 하고 환경에 대한 많은 정보를 여러 t_...변수 에 저장합니다.

참고로 이 값이 88일 경우는 xterm-88color 항목 참조.

TIP

Vim messages to buffer

vim 에서 출력되는 메시지를 버퍼에 붙여넣는 방법은 다음과 같다. Q를 누르면, ex 모드로 전환된다.

:redir > messages.txt
:messages
:redir END

:visual 명령으로 Ex 모드에서 Visual 모드로 전환한다. 후, :e messages.txt 명령으로 해당 파일을 열면 된다.

PS. 명령이 캡쳐되는 동안 화면에 출력을 억제하고 싶다면 :messages 대신 :silent messages를 사용하면 된다.

Replace newline

Newline(Enter)를 Replace 문자열로 적용하고 싶을 경우 아래와 같이 나와야 한다.

:%s/CHAR/^M/g

여기에서 ^MCtrl + v후, Enter를 입력하면 된다.

개행(\n)이 ^@ 문자로 치환될 때

:%s/,/\n/g

와 같이 사용했을 때 개행(\n)이 ^@ 문자로 치환된다.

결론, \n 대신 \r 를 사용하면 된다.

ALT 키 바인딩

Ctags tselect

Ctrl+]가 정상적으로 작동하지 않을 경우 아래와 같이 다른 키 맵으로 사용할 수 있다.

nmap <leader>d :tselect <C-R>=expand("<cword>")<CR><CR>

참고로 <C-R>=expand("<cword>")<CR><CR>는 현재 커서에 위치한 단어로 치환하라는 의미이다.

현재 파일명을 출력하는 방법은 아래와 같다.

:echo @%

Shell setting

기본 단축키는 아래와 같이 확인할 수 있다.

:help index

Map 목록은 아래와 같다.

:verbose map
:map

Unused keys

<Plug>

이것은 플러그인 작성자가 복잡한 매핑을 사용자가 사용할 수 있도록 하는 데 사용됩니다. 플러그인 코드에서는 <plug>...실제 키 시퀀스가 ​​아니지만 사용자가 매핑에서 오른쪽 표현식으로 사용할 수 있는 매핑을 정의합니다.

<Plug> 명령을 실행하는 방법은 다음과 같다:

:execute "normal \<Plug>NiceCenterCursor"

자세한 내용은 :h using-<Plug>으로 확인 가능하다.

Quick command in insert mode

CTRL-O 또는 CTRL-\ CTRL-O(:help ins-special-special 참조)를 사용하여 삽입 모드를 종료하지 않고 일반 모드 명령을 실행할 수 있습니다.

주로 inoremap에서 노멀모드 명령을 사용할 때 사용된다.

inoremap <C-P> <C-\><C-O>:call CocActionAsync('showSignatureHelp')<cr>

명령행에서 'More' 없이 스크립트 또는 명령 실행 방법

NeoBundle의 bin/neoinstall 스크립트를 참조.

vim의 경우:

ARGS=(
    -N  # No-compatible mode
    -u "$HOME/.vimrc"
    -c "try | NeoBundleUpdate! | finally | qall! | endtry"
    -U NONE  # GUI initializations
    -i NONE  # viminfo file
    -V1 # Verbose level 1
    -e  # Start Vim in Ex mode
    -s  # Silent mode
)
vim "${ARGS[@]}" 2>&1 | grep -v "^not found in"

neovim의 경우:

ARGS=(
    -u "$HOME/.config/nvim/init.vim"
    -c "try | UpdateRemotePlugins | finally | qall! | endtry"
    -V1
    -es
)
nvim "${ARGS[@]}" 2>&1 | grep -v "^not found in"

전체 Keymap 확인하는 방법

다음 방법으로 확인 가능:

:map
:nmap
:imap
:vmap

Vim 의 messages 로 출력되므로 검색하기가 곤란하다. 그래서 redir!명령(Redirection)을 사용하여 파일로 저장한다:

:redir! > vim_keys.txt
:silent verbose map
:redir END

뭔가 불편하다. 직접 버퍼로 적고 싶다면 put명령을 사용하면 된다.

:silent put =execute('map')
:silent put =execute('nmap')
:silent put =execute('imap')
:silent put =execute('vmap')

슬래시(/)를 키맵으로 사용하고 싶을 때

붙여 넣기 계단 현상 없애는 방법

붙여 넣기 모드로 이동:

:set paste

붙여 넣기 모드 해제:

set nopaste

붙여 넣기 모드 토글 단축키:

set pastetoggle=<F3>

Troubleshooting

VIM을 사용하는 중 발생할 수 있는 문제점에 대하여 설명한다.

E21: Cannot make changes, 'Modifiable' is off

.vimrc에 아래를 추가하면 된다.

set modifiable

E474: Invalid argument

아래와 같은 에러메시지가 출력될 수 있다.

E474: Invalid argument: listchars=eol:¶,tab:»

이 경우 .vimrc와 같은 스크립트 파일의 인코딩을 정상적으로 설정해야 한다.

scriptencoding utf-8

Font setting

How do I make vim with netbeans_intg

See: Vim:Netbeans#How_do_I_make_vim_with_netbeans_intg

gVim GUI Setting

Ubuntu에서 GUI 폰트가 정상적으로 적용되지 않아 이상하게 보일 수 있다. 이 때 아래와 같이 설정하면 된다.

if has('gui_running')
  set guioptions-=T  " no toolbar
  colorscheme elflord
  set lines=60 columns=108 linespace=0
  if has('gui_win32')
    set guifont=DejaVu_Sans_Mono:h10:cANSI " 이 방식은 Windows에서만 가능하다.
  else
    set guifont=DejaVu\ Sans\ Mono\ 10
  endif
endif

VIM 한글화

Download: Vim-ko-master-_4ef19e0.zip

See also

Favorite site

Cheat Sheet

Documentation

Tutorial

Guide

Project site

References


  1. http://askubuntu.com/questions/74485/how-to-display-hidden-characters-in-vim 

  2. Joinc-used_vim.pdf 

  3. Joinc.co.kr-UsedVim.zip 

  4. ViEditor_-_GyparkWiki.pdf 

  5. Learn_Vimscript_the_Hard_Way.pdf