gt (다음 탭으로 이동 :tabn)
gT (이전 탭으로 이동 :tabp)
m{a-z} (ma 하면 a이름으로 마크, 현재 버퍼내에서만 마크됨, 다른 파일에선 마크로 이동 못함)
m{A-Z0-9} (mA 하면 A이름으로 마크, 파일까지 마크됨, 다른 파일에서도 마크로 이동 가능)
'마크이름 (마크 위치의 라인 첫위치로 이동)
`마크이름 (마크 정확한 위치로 이동)
ctrl+6 (이전 파일 열기)
ctrl+o (이전 위치로 점프)
ctrl+i (앞 위치로 점프)
v zf (블럭 선택 후 블럭 폴딩/닫기)
zo (폴딩된 라인에서 폴딩 열기)
zd (폴딩 삭제)
zk (이전 폴딩으로 이동)
zj (다음 폴딩으로 이동)
zM (모든 폴딩 닫기)
zR (모든 폴딩 열기)
= (프로그램 소스코드에서 v 로 영역을 선택하고 = 누르면 선택된 영역들의 줄들이 알맞게 들여쓰기됨)
== (현재 라인 들여쓰기)
gg=G (파일 처음부터 끝까지 알맞게 들여쓰기됨)
=% (프로그램 소스코드에서 시작블럭{ 이나 끝블럭} 에서 =% 누르면 블럭내의 줄들이 알맞게 들여쓰기됨)
K (현재 커서에 대한 대문자 메뉴얼 페이지 보기)
ctrl+r (최근 취소된 편집명령 복구)
ctrl+g (현재 파일이름과 라인수 보기)
ctrl+n (자동완성 리스트에서 다음 항목)
ctrl+p (자동완성 리스트에서 이전 항목, 프로그래밍시 함수,변수에서 ctrl+p 하면 자동완성, 예를 들어 int YoonByoungHon = 0; 후 다음 줄에서 Yo부분에서 ctrl+p 하면 YoonByoungHoon 이 바로 입력되거나 Yo 로 시작하는 리스트중에서 선택가능)
"레스트터이름명y (레지스터에 내용 복사)
"레스트터이름명p (레지스터의 내용 붙여넣기)
"+y (+는 CLIPBOARD, vim -> CLIPBOARD 으로 복사)
"+p (+는 CLIPBOARD, CLIPBOARD -> vim 으로 붙여 넣기)
:reg (레지스터 내용 보기, type -> c:characterwise, l:linewise, b:blockwise-visual)
:help 또는 :h (도움말 보기)
:help i (i 도움말보기)
:help :e (:e 도움말보기)
:help ctrl-r (ctr+r 도움말보기)
:messages (vim 이 출력하는 메시지 보기)
:stop 또는 :suspend (suspend vim 로 ctrl+z 와 같다.)
:color 또는 colo 또는 colorschem (현재 설정된 컬러 스킵 보기, 공백 후 tab, shift-tab 을 누르면 사용 가능한 컬러 스킴이름이 표시된다.)
:intro (인트로 화면 보기)
:print (현재 커서 위치의 라인 내용 출력)
:language 또는 lang (현재 언어 설정 보기)
:!외부명령 (외부명령실행, 예를 들어 !ls -ahl 하면 는 ls -ahl 실행)
:f (현재 파일이름과 라인 수 보기)
:n (n라인으로 이동)
:% (%는 현재파일을 의미한다. 파일 전체 범위 지정, :1,$ 와 같다.)
:0 또는 gg (파일의 첫번째 행으로 이동)
:$ 또는 G (파일의 마지막 행으로 이동)
:e filename (파일 새로 열기(버퍼), :e filename 입력시 ctrl+d 하면 현재 위치의 파일 리스트 표시)
:e ++enc=cp949 (cp949 인코딩으로 다시 열기, 참고로 .vimrc 에서 set fencs=utf-8,cp949 하면 알맞은 인코딩을 파일을 연다)
:e! (파일 다시 읽기)
:noau e filename.gz 또는 vi -c "noau e filename.gz" (gzip 파일 압축해서해서 열지 않기, vim 은 기본적으로 gzip 파일은 압축해서 연다.)
:bp 또는 bprevious (이전 버퍼로 이동, 버퍼는 메모리에 올라가 있는 파일로 vim a.txt b.txt 했을때 2개의 텍스트 버퍼가 생성된다. 화면 위에 버퍼 내용들이 표시된다.)
:echo 표현 (뒤 오는 표현 내용 출력)
:echo winnr() (현재 창 번호 출력)
:echo winnr('$') (마지막 현재 창 번호 = 창 개수 출력)
:echo bufnr() (현재 버퍼 번호 출력)
:echo bufnr('$') (마지막 버퍼 번호 출력)
:bn 또는 :bnext (다음 버퍼로 이동)
:bd 또는 :bdel (현재 버퍼 삭제/닫기)
:buffers 또는 :ls 또는 :files (버퍼 리스트 보기)
:%bwipeout 또는 :%bw (모든 버퍼 삭제/닫기)
:tabs (탭 리스트 정보)
:tabe 또는 :tabnew (새탭열기) 또는 :tabe 파일명
:tabc 또는 :tabclose (현재 탭닫기, tabc! 저장하지 않고 닫기)
:tabo (모든 탭 닫기, tabo! 저장하지 않고 닫기)
:tabp 또는 :tabprevious 또는 gT (이전 탭으로 이동, vim -p a.txt b.txt 했을때 2개의 탭으로 열린다.)
:tabn 또는 :tabnext 또는 gt (다음 탭으로 이동, tabn3 3번 탭으로 이동)
:marks (마크 리스트)
:delmarks 마크이름 (:delmarks a b 하면 a와 b 마크 지우기, :delmarks \" 하면 " 마크 지우기, delmarks 0-9 a-z A-Z 숫자,영문자 마크 모두 삭제, ' 이름의 마크는 바로 이전 위치에 대한 마크로 삭제할 수 없다.)
:new (새창 만들기)
:sp (수평으로 창을 나누기)
:vs (수직으로 창을 나누기)
:sp 파일명 (수평으로 창을 나누고 파일 열기)
:vs 파일명 (수직으로 창을 나누고 파일을 열기)
:Explore (현재 파일 탐색 표시, 탐색창에서 o 는 파일 열기, p 는 파일 프리뷰)
:Sexplore (수평으로 창을 나누고 탐색 표시)
:Vexplore (수직으로 창을 나누고 탐색 표시)
:ju 또는 :jumps (점프 리스트 표시, 점프는 ctrl+o(이전위치), ctrl+i(앞위치))
:clearjumps (현재 윈도우 점프 리스트 지우기)
:sh (잠시 쉘로 나가기, 쉘에서 exit 하면 vi로 복귀)
:copen (quickfix list 창 열기)
:ccl 또는 :cclose (quickfix list 창 닫기)
:cw 또는 :cwindow (에러 있으면 quickfix list 창 열기)
:cl 또는 :clist (quickfix list 보기)
:cn (quickfix list 중 다음 항목)
:cp (quickfix list 중 이전 항목)
:cfirst (quickfix list 중 첫번째 항목)
:clast (quickfix list 중 마지막 항목)
:cfdo 명령 (quickfix list 항목별 명령 실행)
:lopen (location list 창 열기)
:lcl 또는 :lclose (location list 창 닫기)
:lnext (location list 중 다음 항목)
:lprev (location list 중 이전 항목)
:lfirst (location list 중 첫번째 항목)
:llast (location list 중 마지막 항목)
:retab (set expandtab 으로 탭입력이 스페이스로 변경되는 상태에서, 모든 tab 을 space 로 변경)
:retab! (set noexpandtab 으로 탭입력이 스페이스로 변경되지 않는 상태에서, 모든 space 를 tab 으로 변경)
:set all (모든 설정 보기)
:set 설정명 (설정 값 보기)
:set enc=utf-8 (인코딩 utf-8 로 사용)
:set visualbell t_vb= (beep 대신 t_vb 로 설정된 문자로 표시하는데 설정 문자가 없어 visual bell 도 사용하지 않게 된다.)
:set hidden (버퍼 숨김 활성화, 버퍼를 수정 후 파일로 저장하지 않아도 다른 버퍼로 이동 :bn 할 수 있다. 숨김이 비활성화되어 있으면, 버퍼를 수정 후 저장해야 다른 버퍼로 이동 할 수 있다.)
:set autoread (파일 자동 refresh)
:set updatetime=1000 "화면 갱신 주기(default: 4000ms), 커서 사용중일때는 갱신 않함
:set laststatus=2 (상태바 활성 0:비활성 1:윈도우가2개이상일때(디폴트) 2:항상)
:set showtabline=2 (탭바 활성 0:비활성 1:탭이2개이상일때(디폴트) 2:항상)
:set mouse=a (gui 환경에서 마우스 사용 가능, 기본 mouse="")
:set number 또는 :set nu (라인 번호 표시, 끝에 !붙이면 토글)
:set nonumber 또는 :set nonu (라인 번호 표시 안하기)
:set relativenumber 또는 :set rnu (라인 번호 표시, 끝에 !붙이면 토글)
:set incsearch 또는 :set is (키 입력 마다 찾기 결과 표시)
:set noincsearch 또는 :set nois (키 입력 후 엔터시에만 찾기 결과 표시)
:set hlsearch (검색결과 하이라이트)
:nohl (하이라이트 제거)
:highlight (하이라이트 색설정 상태)
:set showcmd (명령모드에서 명령 표시, 비주얼 모드에서 선택크기 표시)
:set cursorline 또는 :set cul (현재 커서 라인 하이라이팅 활성화)
:set nocursorline 또는 :set nocul (현재 커서 라인 하이라이팅 비활성화)
:set cursorcolumn 또는 :set cuc (현재 커서 컬럼 하이라이팅 활성화)
:set nocursorcolumn 또는 :set nocuc (현재 커서 컬럼 하이라이팅 비활성화)
:set colorcolumn=100 (컬럼 가이드 라인 컬러로 보이기)
:set syntax=sh (파일 타입을 .sh 로 설정)
:set autoindent (자동들여 쓰기 활성화)
:set noautoindent (자동들여 쓰기 비활성화)
:set cindent (C 프로그래밍용 들여쓰기 활성화)
:set nocindent (C 프로그래밍용 들여쓰기 비활성화)
:set wrap (자동 줄 바꿈)
:set nowrap (자동 줄 바꿈 안하기)
:set textwidth=n (n만큼 텍스길이기 넘으면 다음줄로 이동, 0이면 다음줄 이동 제한 없음)
:set ignorecase 또는 :set ic (찾기시 대소문자 무시)
:set noignorecase 또는 :set noic (찾기시 대소문자 구분)
:set lines (라인 크기 설정보기)
:set lines=80 (라인 80 로 설정)
:set list (탭,스페이스,엔터 등의 기호 표시)
:set listchars=tab:→\ ,space:·,trail:·,precedes:«,extends:»,eol:↵ (탭,공백,라인끝공백,접기,펼치기,엔터 문자 설정)
:set nolist (탭,스페이스,엔터 등의 기호 표시 안하기)
:set ts=n 또는 :set tabstop=n (탭크기를 n으로 설정)
:set sw=n 또는 :set shiftwidth=n (들여쓰기 >>, 내여쓰기 <<, 될때 또는 엔터등으로 자동 들여쓰기 될때 이동 크기)
:set et 또는 :set expandtab (탭키 입력시 탭 대신 tabstop=n 만큼의 스페이스 사용)
:set noet 또는 :set noexpandtab (et 비활성화, 탭키 입력시 탭 사용)
:set esckeys (insert 모드에서 방향키 제대로 작동시키기)
:set backspace=indent,eol,start (insert 모드에서 백스페이스 제대로 작동시키기)
:set paste (붙여넣기모드,텍스트를 복사 후 vim 에 붙여넣기하면 autoindent, textwidth 등의 값이 설정 되어 있는 경우 계단처럼 들여쓰기 되는 현상이 발생한다. set paste 를 수행하면 autoindent, textwidth 등의 값을 리셋하거나 비활성하여 있는 그대로 붙여넣을 수 있다.)
:set shellcmdflag=-ic (vim 에서는 .bashrc 를 로딩하지 않아 :!alias명령을 실행 할 수 없는데 shell 에 -i (inertactive 모드로 .bashrc 을 로딩하는 새로운 쉘 생성) -c (뒤에 오는 스트링을 명령으로 처리한다.) 옵션을 주어 alias 명령도 실행하도록 한다.)
:set tm=1000 또는 :set timeoutlen=1000 (맵핑키 입력 완료까지의 대기시간ms, 기본 1000, ttm<0 이면 키코드(<esc><up><enter>등)도 tm 값으로 대기한다.)
:set ttm=50 또는 :set ttimeoutlen=50 (ttm>=0 일때 키코드의 입력 후 대기시간ms, 기본:-1)
:let (변수 설정 모두 보기)
:let 변수명 또는 :echo 변수명 (변수 값 보기)
:let 변수명=값 (내부 변수 설정, g:변수명 전역변수, b:변수명 버퍼변수)
:let mapleader = "," (leader 키 , 로 설정, 디폴트는 \ => "\\" 로 설정)
:verbose set (설정된 모든 옵션 보기)
:verbose set 옵션이름 (옵션에 대한 상태 보기, tabstop 옵션 상태 보기 예) :verbose set tabstop)
:10, 100 d (10~100번재 행 삭제)
:w (저장)
:w 파일명 (파일명으로 저장)
:w! (강제로 저장)
:q! (저장하지 않고 종료)
:qall! (저장하지 않고 모든 열려있는 창 종료)
:wq (저장하고 종료)
:wa (변경파일 모두 저장)
:xa (변경파일 모두 저장 후 종료)
:%!xxd (%파일전체, !외부명령, xxd 명령 실행, hex 모드) 또는 :%!hexdump -C (hexdump 명령 실행, -C(canonical hex+ASCII) hex 모드)
:%!xxd -r (xxd 명령 실행, hex 모드 해제)
:g/문자/d (파일 전체에서 문자가 포함된 라인들 모두 삭제)
:g/문자/m 0 (파일 전체에서 문자가 포함된 라인들 모두 0번째 아래로 이동)
:g/문자/m -2 (파일 전체에서 문자가 포함된 라인들 한줄 위로 이동)
:g/문자/m +1 (파일 전체에서 문자가 포함된 라인들 한줄 아래로 이동)
:%s/문자//gn (파일전체에서 문자 개수 파악)
:s/문자1/문자2/ (현재라인에서 문자1을 문자2로 바꾼다.)
:s#문자2#문자2# (구분자를 # 로 사용할 수도 있다.)
:s/문자1/문자2/i (대소문자 무시한 문자1을 문자2로 바꾼다.)
:%s/문자1/문자2/gc (파일전체범위(%), g 옵션이 없으면 각 라인에서 첫번째로 매칭된는것 하나만 변경된다. c를 붙이면 바꿀때 물어본다.)
:%s/\//문자2/ (/ 자체를 문자2로 변경하기)
:%s#/#문자2# (/ 자체를 문자2로 변경하기)
:%s/\n/\r\r/ 또는 :%s/\n/ctrl+v 후 엔터입력/ (2줄씩 줄바꿈, 줄바꿈 문자변경시 검색부분은 \n 변경부분 \r 를 사용해야 한다.)
:라인번호1,라인번호2s/문자1/문자2/ (라인번1~2 사이에서 문자1 문자2로 바꾼다.)
:'<,'>s/.\{2}$// (블록지정 후 :s/.\{2}$//) (블럭지정된 영역의 마직막 2글자 삭제)
:map 매핑키 매핑내용 (Normal, Visual, Seclt 모드에서 동작하는 키 매핑, 재귀적 매핑, map a b 과 map b c 로 하면 a -> c 로 매핑될 수 있다. map, noremap 은 Normal, Visual, Select, Operator-pending 모드에서 키 매핑을 사용할 수 있다. :h map-table 참고)
:noremap 매핑키 매핑내용 (Normal, Visual, Select 모드에서 동작하는 키 매핑, 비재귀적 매핑)
:nmap 매핑키 매핑내용 (Normal 모드에서만 동작하는 키 매핑)
:nnoremap 매핑키 매핑내용 (Normal 모드에서만 동작하는 키 매핑, 비재귀)
:vmap 매핑키 매핑내용 (Visual, Select 모드에서만 동작하는 키 매핑)
:vnoremap 매핑키 매핑내용 (Visual, Select 모드에서만 동작하는 키 매핑, 비재귀)
:imap 매핑키 매핑내용 (Insert 모드에서만 동작하는 키 매핑)
:inoremap 매핑키 매핑내용 (Insert 모드에서만 동작하는 키 매핑, 비재귀)
:cnoreabbrev 매핑키 매핑내용 (Command 모드에서 축약어 매핑, 비재귀)
:function 설정된 함수리스트 보기
:scriptnames 설치된 플러그인 리스트 보기
:so ~/.vimrc 또는 :source ~/.vimrc (수정된 vimrc 설정 반영)
[mac option(alt,meta) 키 동작 안되는 문제 해결하기]
mac 에선 기본적으로 option 키가 조합되면 특정 문자로 취급된다.
option+a == å
option+d == ∂
option+p == π
사실 option 는 alt 와 다르고, 각 터미널에 따른 설정이 필요하다.
iterm --> option 키 normal --> esc+
kitty --> macos_option_as_alt no
alacritty
--> alt_send_esc: true 는0.12.0 에서 디폴트로 설정에서 제거됨
--> windows > option_as_alt: Both 로 설정함
:h key-notation 참고
[remove trailing whitespace, 라인끝 공백 제거]
% 파일전체범위, s 바꾸기, \s\+ 공백1개이상, $ 끝에서, // 빈값으로, e 에러 메시지 표시하지 않기
:%s/\s\+$//e
[블럭내 변경]
1. visual 모드에서 v 로 블럭 지정
2. :입력(자동으로 :'<,'> 로 변경)s/대상문자/변경될문자/g
[블럭내 정렬]
1. visual 모드에서 v 로 블럭 지정
2. :입력(자동으로 :'<,'> 로 변경)sort
[멀티라인 수정]
1. 라인 처음으로 커서를 위치 시키고 블록 모드로 변경 ctrl+v
2. 커서로 아래(또는 j)로 멀티 라인 선택
3. 블럭 첫음에 추가시: I(shift+i)로 첫번째 라인 처음에 문자 insert
또는
블럭 수정(삭제하고 입력모드)시: c 로 수정
또는
블럭 끝에 추가시: $로 모든 라인의 끝까지 선택 후 A(shift+a)로 문자 append
4. esc 하면 선택한 전체 라인 반영
참고로 c로 수정하는것 외 insert/append 시 삭제만 하면 멀티 라인으로 반영되지 않는다.
[멀티 커서(선택)로 리팩토리링(변경)하기]
1. v로 검색할 부분 지정 후 ctrl+n 로 선택하고 다음 찾기 (ctrl+x는 스킵, ctrl+p는 현재 선택해제 후 이전 선택으로 이동)
2. I 로 insert 모드 시작 또는 c 로 삭제 후 insert 모드 시작
3. 수정 후 esc 로 종료
[블럭단위 찾기]
1. v 로 블록지정
2. y (yank 로 디폴트 레지스터에 저장)
3. / 찾기모드 변경
4. ctrl+r, " (디폴트 레지스터의 내용 붙여넣기)
[파일들에서 찾아 변경하기]