본문 바로가기
Development/Editor

리눅스 편집기 - vi editor

by 드로니뚜벅이 2022. 4. 6.

리눅스에서 개발을 하다 보면 타의반 자의반으로 vi 에디터를 사용하게 됩니다. 특히 임베디드 개발자나 서버 개발자는 SSH로 접속하는 경우가 많기 때문에 터미널에서 능수능란하게 사용할 수 있는 에디터 하나 정도는 있어야 손가락이 부끄럽지 않겠지요?
리눅스도 우분투(Ubuntu)와 같이 GUI 환경을 갖춘 패키지들이 배포되어 많이 사용하고 있긴 하지만 스크립트 작업의 경우는 여전히 쉘에서 작업을 해야 하는 경우가 종종 발생하기 때문에 vi 에디터 사용법을 알고 있으면 여러 모로 도움이 될 것 같아 요점만 간단히 정리해 보았습니다.
VIM(ViIMproved) 는 자동 완성기능, 파일의 비교 및 병햡기능과 통합된 도움말 시스템, 확장된 정규식 표현, 스크립트 언어 (Perl, Python, Ruby, Tcl 등) 인터프리팅, gzip, bzip2, zip 등으로 압축된 파일 편집기술과 철자 체크, 창 분할, 구문강조, 유니코드 및 다국어 지원, 검색, 커서 위치기록 등과 같이 수 많은 기능을 가지고 있습니다. 또한 그 외에도 여러가지 플러그인(ctags, cscope, taglist 등)이 상당히 유용하다.

vi(vim) 에디터 설치

리눅스(Ubuntu)를 설치하면 기본으로 Vi 에디터는 타이니(tiny) 버전(vim-tiny)으로 설치됩니다.
단순히 파일 내용을 편집만 할 경우에는 상관없겠지만 프로그래밍 언어별 스타일(syntax 등) 및 고급 기능을 사용하기 위해서는 버전을 변경하시는 게 좋습니다. vim-tiny 버전은 "syntax on" 구문을 비롯해서 많은 기능이 빠져 있습니다. 저같은 경우 아래와 같은 파일 탐색창을 띄울 수 없어서 기본 Vi 에디터로 변경했습니다.

파일 탐색 창 분할 화면 예시 (:vs ./)

 

기본(basic) 버전은 두 가지 방법으로 설치할 수 있습니다.

첫 번째는 vim-tiny 버전을 삭제하고 vim 기본 버전을 설치하는 방법이고 두 번째는 tiny 버전을 삭제하지 않고 기본(basic) 버전을 설치한 후 "sudo update-alternatives --config editor"로 변경해 주는 방법입니다. 여기서는 간단히 첫 번째 방법으로 설명하겠습니다.


● vim-tiny 삭제

$ sudo apt remove vim-tiny

● vim 설치

$ sudo apt install vim

설치 가 정상적으로 되었다면 쉘에서 "vi" 명령어를 실행하면 아래와 같이 에디터 화면이 출력됩니다.

vi 에디터 설정

사용자계정 홈(~/UserID) 폴더에 숨은 파일로 .vimrc 파일을 확인할 수 있습니다.

$ ls -al ~/.vimrc
-rw-rw-r-- 1 yunny yunny 65 2021-12-20 11:08 /home/yunny/.vimrc
$ vi ~/.vimrc

아래 설정 내용 중 필요하신 항목을 추가 및 수정하시면 됩니다.

.vimrc
set tabstop=2 "탭 간격을 2 칸 으로 지정한다
set shiftwidth=2 " >>나 << 사용시 들여쓰기 간격을 지정한다
set expandtab " 탭 문자를 공백문자로 변환한다.
set softtabstop=2 "탭 간격을 공백문자로 변환하면 두 칸 단위로 삭제한다
set visualbell " 사용자 실수 경고시 비프음 대산 화면을 한 번 반짝인다.
set nobackup "백업 파일을 생성하지 않는다
set cindent "C 언어 스타일의 들여쓰기를 사용합니다.
set autoindent "자동 들여쓰기를 사용합니다.
set smartindent "좀 더 지능적인 들여쓰기를 사용합니다.
set enc=euc-kr "인코딩을 한글로 지정합니다.
syntax on "구문 강조기능을 사용합니다
filetype on "파일 종류에 따라 구문을 강조합니다.
set background=dark "배경색을 어두운 색으로 설정합니다. (dark or light)
colorscheme evening "VI 색상 테마를 evening 으로 설정합니다
set backspace=eol,start,indent "줄의 끝, 시작, 들여쓰기서 백스페이스 사용시 이전 줄과 연결
set history=1000 " VI 편집 기록을 1000개 까지 저장합니다.
set hlsearch "검색어 강조 기능을 사용합니다.
set ignorecase "검색, 편집, 치환시 대소문자를 구분하지 않습니다.
set showmatch "() 과 {} 에서 한 괄호만 입력해도 일치하는 괄호를 보여줍니다
set nu " 행번호(number)를 보여 줍니다. (nonu는 행번호를 보이지 않게 합니다)

저는 위 설정 항목 중에서 일부만 사용하고 있습니다.

  1 " vim editor configuration
  2 
  3 syntax on
  4 
  5 set tabstop=4
  6 set shiftwidth=4
  7 set cindent
  8 set smartindent
  9 set number
 10 set hlsearch

 

vi 실행하기

터미널 창에서 편집하고자 하는 파일명을 입력합니다.

$ vi test.cxx

vi 종료하기

편집모드로 전환하기 위해서는 <i/I> or <a/A> or <o/O> 키를 누른 후에 에디터 창에 편집을 할 수 있습니다.
편집이 완료되었으면 <:q> or <:q!> or <:wq> 키를 눌러 에디터를 종료하면 됩니다.

 

vi 단축키 정리

분류 단축 키 설명
이동 기본 이동
  h, j, k, l left, down, up, right 커서 이동
이동 한 문장 내에서의 이동
  ^ 문장 맨 앞으로 커서 이동
$ 문장 맨 뒤로 커서 이동
이동 단어 단위로 이동
  w 단어의 시작 위치로 커서 이동 (3w: 세 단어 앞으로 이동)
e 단어의 마지막 위치로 커서 이동
b 단어의 시작 위치로 커서 이동
이동 대략적인 위치로 이동
  H 현재 보이는 페이지를 기준으로 맨 위로 커서 이동
M 현재 보이는 페이지를 기준으로 중간 라인으로 커서 이동
L 현재 보이는 페이지를 기준으로 맨 아래로 커서 이동
이동 줄(Line) 이동
  행번호+G
행번호로 이동
gg 문서의 첫 행으로 이동
G
문서의 마지막 행으로 이동
  페이지 이동
  <CTRL>+f 다음 페이지의 첫 줄로 커서 이동
<CTRL>+b 이전 페이지의 마지막 줄로 커서 이동
<CTRL>+d 페이지의 절반 크기만큼 아래로 커서 이동
<CTRL>+u 페이지의 절반 크기만큼 위로 커서 이동
편집 삽입 관련 단축키
  i 현재 커서가 위치한 문자의 앞에 삽입하기
I 현재 커서가 위치한 줄(행)의 맨 앞에 삽입하기
a 현재 커서가 위치한 문자의 뒤에 삽입하기
A 현재 커서가 위치한 줄(행)의 맨 뒤에 삽입하기
o 현재 커서가 위치한 줄 바로 아랫줄에 삽입하기
O 현재 커서가 위차한 줄 바로 윗줄에 삽입하기
편집 삭제/잘라내기/수정
  dd 커서가 위치한 줄 잘라내기
dw 커서가 위치한 곳부터 단어의 마지막까지 잘라내기
number+dd: 커서 위치 줄에서 숫자만큼 줄 잘라내기
D 현재 커서의 위치부터 줄의 끝까지 잘라내기
x 커서가 위치한 문자 잘라내기
X 커서가 위치한 문자 바로 앞에 있는 문자 잘라내기
s 커서가 위치한 문자 잘라내고 삽입하기
S 커서가 위치한 줄 전체 잘라내고 삽입하기
cw 커서가 위치한 곳부터 단어의 마지막까지 잘라내고 삽입하기
r + 문자 커서가 위치한 문자 하나 수정하기
편집 복사하기
  yl 현재 커서가 위치한 문자 하나만 복사하기
3yl: 현재 커서 이후 3개의 문자를 복사하기
yy 현재 커서가 위치한 줄 복사하기
yw 현재 커서의 위치부터 단어가 끝나는 위치까지 복사하기
y 블록 단위로 체크한 내용(Visual mode) 복사하기
숫자 + y 커서가 위치한 줄부터 숫자에 해당하는 수만큼의 줄 복사하기
y$ 커서가 위치한 곳부터 줄의 마지막까지 복사하기
편집 붙여넣기
  p 단어 복사: 현재 커서가 위치한 바로 다음 위치에 붙여넣기
행 복사: 현재 커서가 위치한 줄 바로 아랫줄에 붙여넣기
P 현재 커서가 위치한 바로 앞 위치에 붙여놓기
숫자 + p 해당 숫자만큼 붙여넣기 반복하기
선택 한 줄 선택
  V 라인 단위로 블록 지정
단어 단위로 여러 줄 선택
  v 단어 단위
기타


취소하기
  u Undo, 이전으로 취소하기
<CTRL> + r Redo, 취소한 것을 다시 되돌리기
검색하기
  /exp + Enter
현재 커서 위치에서 아래 방향으로 'exp'와 같은 문자열을 검색
찾은 문자열이 여러 개 검색 되는 경우 'n' 을 누르면 다음 문자열로 이동함

기타


파일 불러오기
  : e <디렉토리명>
: e <파일명>
현재 창에서 파일탐색 모드로 전환하여 파일 불러오기
예) : e ./   현재 디렉토리 디렉토리/파일 리스트 보여줌
예) : e /    루트 디렉토리 디렉토리/파일 리스트 보여줌
예) : e test.txt -> test.txt 파일 불러오기
쉘 명령어 실행하기
  : <쉘명령어> 편집기에서 쉘 명령어 실행하기(예: ! ls -al)

기타



Vi 종료
  : q
수정한 내용이 없는  경우 빠져 나가기
: q!
수정한 내용이 있지만 저장하지 않고 강제 종료하기
: wq
수정한 내용 저장하고 종료하기
ZZ
(z는 대문자임) 수정한 내용 저장하고 종료하기 (단축키)


기본 동작 흐름에 따라 3가지(명령, 편집, Ex 명령) 모드를 갖습니다.

 

화면 분할하기

화면 분할은 명령모드와 ex명령모드에서 단축키와 명령어로 가능합니다.

기능 명령모드 Ex 명령모드 (:)
수평 분할 (복사) <CTRL>+w, s : sp or : split
수평 분할 (새창) <CTRL>+w, n : new
수직 분할 <CTRL>+w, v : vs or : vsplit
분할창에서 파일탐색 창 띄우기   : sp ./ or : vs ./
분할 창 이동 (다음 창) <CTRL>+w, w  
분할 창 이동 (이전 창) <CTRL>+w, W  
분할 창 이동 (←↓↑→) <CTRL>+w, [h, j, k, l]  
분할 창 크기 조정 (n:조정할 증감크기) <CTRL>+w, [n] : resize +/-[n]
분할 창 닫기 <CTRL>+w, c : close or : q!

- 창을 분할할때, 특정 파일명으로 열고 싶을 경우에는 ": sp filename" or ": vs filename" 명령어를 입력합니다.

- 창 크기를 지정해서 분할하고 싶다면 ": 10sp" 혹은 ": 10vs" 처럼 줄수(수평)나 글자수(수직)를 함께 입력하면 됩니다.

 

Vi 에디터에서 쉘로 이동 후 복귀 방법

  쉘로 이동(VI->SHELL) Vi 로 복귀 (SHELL->VI)
방법 #1 : sh or : shell $ <CTRL>+d
방법 #2 <CTRL>+z (명령모드에서) $ fg

 

clang-format 코딩 스타일

주로 사용하는 Vi 플러그인 목록은 아래와 같습니다.

Plugin Description
vundle Vim Plugin Manager 역할을 수행합니다.
.vimrc에 설치할 Vim Plugin을 넣어두면 vundle을 통해서 손쉽게 플로그인을 설치할 수 있습니다.
nerdtree 파일 탐색기 역할을 수행합니다.
tagbar Code의 Tag 목록을 보여줍니다.
YouCompleteMe Code 자동완성 기능 (Code Autocomplete)을 수행합니다.
vim-gutentags Ctag 파일을 자동으로 관리합니다.
vim-airline Vi의 Status Line의 가독성을 높여줍니다.
vim-clang-format clang-format을 이용하여 Code Align을 수행합니다.
vim-go golang을 위한 환경을 구성합니다.
$ sudo apt update
$ sudo apt install ctags
$ sudo apt install cscope
$ sudo apt install clang-format

clang-format 은 C, C++, Objective-C 코드 스타일을 자동으로 형식을 맞춰주는 도구로 개발자는 코드 리뷰를 하면서 코드 스타일에 신경쓰지 않아도 됩니다.

 

자동 코드 스타일링을 위한 유틸리티: codefmt

1) 설치

$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

2) .vimrc 수정 (vi ~/.vimrc)

augroup autoformat_settings
    autocmd FileType bzl AutoFormatBuffer buildifier
    autocmd FileType c,cpp,proto,javascript,arduino AutoFormatBuffer clang-format
    autocmd FileType dart AutoFormatBuffer dartfmt
    autocmd FileType go AutoFormatBuffer gofmt
    autocmd FileType gn AutoFormatBuffer gn
    autocmd FileType html,css,sass,scss,less,json AutoFormatBuffer js-beautify
    autocmd FileType java AutoFormatBuffer google-java-format
    autocmd FileType python AutoFormatBuffer yapf
    " Alternative: autocmd FileType python AutoFormatBuffer autopep8
    autocmd FileType rust AutoFormatBuffer rustfmt
    autocmd FileType vue AutoFormatBuffer prettier
augroup END
	
call plug#begin()
    Plug 'google/vim-maktaba'
    Plug 'google/vim-codefmt'
    Plug 'google/vim-glaive'
call plug#end()

3) vi 실행 후 <EX 명령 모드>에서 ": PlugInstall" 입력하면 플러그인이 설치됩니다.

편집할 때 자동으로 스타일이 적용되지 않고 파일을 저장해야 적용됩니다.