linux를 사용하면서 vim은 가장 간편한 텍스트 에디터이다. 찐 개발자들은 이걸 복잡한 플러그인들을 많이 설치해서 개발툴로 쓰기도 하지만, 라이트 유저인 나도 홈페이지 관리 등등을 위해 여기저기 터미널 접속을 하는 경우 이것만큼 유용한게 없다. 일단, 손에 익숙해지면 다른 어떤 IDE나 텍스트 에디터보다 빠른 편집이 가능하고, 너무나도 가볍고, 터미널 어디에 접속하든 이미 존재하기에 설치없이 사용가능하다.
vim은 역사가 깊고 광범위하게 수많은 사람들이 사용해온 툴이라 설정과 기능도 엄청나게 많아서 설정과 플러그인을 하나씩 추가하다보면 텍스트 기반이지만 UI도 멋져지고 점점 더 간편해지는데, 여기에 익숙해지다가 새로운 터미널이나 컴퓨터를 만났을 때 그 설정들을 다시해야하는 난감한 상황에 처하게 된다. 다른 IDE들도 그렇고 VS Code등 가벼운 에디터들도 플러그인들은 새로 설치해야 한다. 다행히도, VIM에서는 이를 해결할 아름다운 dotfiles 라는 관리방법이 존재한다. 주어진 툴이나 그런건 아니고 내가 직접 해야하는 방법이지만, 한 번 설정해놓으면 더이상 신경쓸 필요가 없이 어디서든 간편하게 평소 사용하던 환경을 구축할 수 있다.
dotfiles 관리방법
dotfiles 관리방법은 사실, vim에만 해당하는게 아니고 이름에서 연상할 수 있듯이 linux 설정파일들인 숨김파일, ‘.'(dot)으로 시작하는 파일들을 관리하는 방법이다. 당신이 사용하는 shell의 설정파일인 .bashrc 라던지, .zshrc등 평소 커스터마이즈해서 사용하는 터미널 환경설정들을 관리하는 방법이다.
아이디어는 단순하다. 관리해야하는 dot files(.vimrc, .bashrc, 등등)들을 하나의 디렉토리에 잘 정리해서 모아놓고, 이 디렉토리를 git hub과 같은 리모트 git server에 올려놓는 것이다. git을 사용하면 텍스트 파일들이기 때문에 히스토리 관리나 업데이트도 간편해지고, 어디서나 git clone을 이용해서 받아올 수 있다. 이러한 방법과 관련해서 모든 정보를 모아놓은 곳으로 https://dotfiles.github.io 사이트가 존재한다. 여기에서는 심화내용까지 다루면서 여러가지 환경들에 대해 다루고 여기에 도움이 되는 툴들도 소개를 한다. 나같은 경우, 이렇게 깊게 들어갈건 아니고 vim설정 백업정도만 할 것이다. 이렇게 가벼운 단계에서 쉽게 읽힐만한 글로 Using Git and Github to Manage Your Dotfiles 블로그 포스팅을 읽어보면 도움이 될 것이다.
아이디어를 그림으로 설명해보면 다음과 같다.

- 생성
- 먼저 계정의 홈 폴더에 dotfiles 디렉토리를 만든다. 그리고 그 아래에 위 그림의 왼쪽과 같이 폴더구조를 만들어 사용하는 dot files, 그러니까 .vimrc, .bashrc, .zshrc등을 각각 폴더구조를 만들어 추가한다.
- 다른 작업 컴퓨터에서 사용시, 사용을 편하게 하기 위해 이 dot file들을 원래 사용하던 위치에서 참조가 가능하도록 install.sh 스크립트 파일을 만들어 넣는다. 쉘 스크립트는 실행권한을 줘야 한다. 이건 뒤에 다시 다루겠다.
- dotfiles내에 git init로 local git을 생성한다.
- github이나 gitLab 등에 repository를 만들고 git remote 명령어로 remote repository로 지정한다. 이제, git push 를 이용해 remote git repository에 파일들을 올린다.
- 사용
- git clone 을 이용하여 remote git repository로부터 docfiles 디렉토리를 가져온다.
- install.sh를 실행하면, 계정의 루트에 .vimrc, .bashrc등을 심볼릭 링크로 생성하고, dotfiles 아래에 있는 파일들을 참조하도록 해준다.
- 추가나 수정사항이 있는 경우, git에 반영하고 remote git repository에 push하면 지속적인 업데이트가 가능하다.
자세한 과정을 한 번 살펴보자.
생성
먼저, dotfiles 디렉토리를 만들고, 사용하는 .vimrc를 복사해 넣었다.
mkdir dotfiles
cd dotfiles
mkdir vim
cp ~/.vimrc ~/dotfiles/vim/다음에 다운받아 실행할 install.sh를 만들었다. 스크립트의 내용은 다음과 같다.
#!/usr/bin/env bash
set -e
DOTFILES="$HOME/dotfiles"
link() {
src="$1"
dest="$2"
if [ -e "$dest" ] && [ ! -L "$dest" ] ; then
mv "$dest" "$dest.bak"
echo "backup: $dest -> $dest.bak"
fi
ln -sfn "$src" "$dest"
echo "link: $dest -> $src"
}
link "$DOTFILES/vim/vimrc" "$HOME/.vimrc"link() 함수의 내용은 기존에 있던 파일을 .bak 를 붙여 백업하고, “ln -sfn” 명령을 이용하여 dotfiles 안에 있는 vimrc의 심볼릭 링크로 만드는 기능을 한다. 마지막줄에 이 함수를 이용하여, ~/.vimrc 를 dotfiles/vim/vimrc 의 심볼릭 링크로 교체하도록하여, .vimrc에 대해 작동하도록 만들었다.
쉘 스크립트 파일에는 실행 권한을 부여해야 한다. chmod를 이용해 실행권한을 부여한다.
chmod +x install.sh이제, dotfiles 디렉토리에서 local git을 생성한다. 생성하기 전에, 간단하게 .gitignore 파일과 README.md 파일을 만들었다.
#.gitignore
#vim
vim/plugged/
vim/.netrwhist
vim/swap//
vim/undo//
#Shell
.zsh_history
.bash_history
#OS
.DS_Store
#Secrets
*.env
git 에 올리지 말아야 할 파일들을 나열했다. 다른데서 따온거라 정확히는 모르겠지만, vim 에서 올라가면 안되는 것들, shell history, DS_Store 파일, 그리고 민감한 정보가 들어가 있을 수 있는 *.env 파일들이다.
README.md 는 github에서 보여줄 간단한 사용법을 기술했다.
this is my dotfiles
## Installation
```bash
git clone https://github.com/batmask77/dotfiles.git ~/dotfiles
cd ~dotfiles
./install.sh
이제 local git을 생성해보자.
~/dotfiles>git init
~/dotfiles>git add .
~/dotfiles>git status
~/dotfiles>git commit -m "initial dotfiles"dotfiles 폴더내에서 git init를 실행하여 git을 생성하고, 폴더내 모든 내용을 git add . 로 추가후 커밋을 수행했다.
이제 remote git repository에 올려야 하는데, 먼저 remote git repository를 생성하자. 여기서는 github을 이용했다. github에서 new를 눌러 repository를 생성한다.

dotfiles로 생성했는데, 이미 만들어 놓은거라 위 이미지에서는 존재한다고 빨갛게 떠있다. .gitignore랑 README.md까지 만들었으므로 다 추가하지 않는 기본을 선택한다.
repository가 생성되고 어떻게 remote로 사용할지 설명도 나온다. 설명을 지나쳤더라도 code부분을 클릭해보면, remote 주소가 뜬다.

이제 다시 dotfiles 디렉토리로 돌아와 생성했던 로컬 git에서 remote를 설정하고 push 해보자.
git branch -M main
git remote add origin https://github.com/계정명/dotfiles.git
git push -u origin maingit이 예전엔 branch 이름이 master였기 때문에 main을 사용하는 github과 이를 맞춰주기 위해 git branch -M main 명령을 이용해 main으로 바꿔줬다. git remote 를 이용해 origin으로 remote repository를 추가했으며, 마지막으로 git push 를 이용해 remote에 업로드 했다.
아마도 문제가 있을 것이다. github같은 경우, 더이상 password로 인증이 되지 않고 토큰을 생성해서 사용해야 한다. 관련해서 https://wikidocs.net/286156 를 참조하자.
자신의 계정에서 settings에 들어가 Developer settings 를 선택한다.

또는 직접 토큰 셋팅 url을 이용해도 된다. https://github.com/settings/tokens
Generate new token 을 선택한 후, classic token을 선택한다. Fine-grained token에 대한 정보는 아직 부족해서 모르겠다. 화면에 많은 정보가 나오는데 일단, Note에 사용목적을 적고, expiration을 설정한다. 위험하다고 하지만, “no expiration”을 선택해서 기한 없이 사용도 가능하다. 그 밑으로는 각종 권한들이 쭉 나열되는데, github의 다양한 기능을 사용할게 아니고 그냥 repo만 이용할 것이기 때문에 repo만 선택해준다. 다음은 내가 선택한 예이다.

이렇게 설정해주면 토큰을 만들어 주는데, 사람이 외울수 있는 값은 아니다. 일단 잘 복사해 놓자.
git push를 할 때, 이 계정명과 이 토큰을 물어본다. password란에 이 토큰을 입력하면 된다.
복잡한 토큰을 매번 입력하기 어려울 것이다. 이 때, git의 “credential.helper” 를 이용해 저장해둔다.
git config --global credential.helper storestore 를 사용하면 저장이 된다. 다시 push를 하면, 처음에는 username과 token을 물어보지만, 그 다음부턴 이 과정없이 진행되는걸 확인 할 수 있다. 이렇게 저장된 토큰은 자신의 계정에 .git-credentials 에 https://<username>:<token>@github.com 과 같은 형태로 저장되니 직접 확인해 볼 수도 있다.
이제 github에 들어가면 올라간 내용을 확인할 수 있을 것이다.
사용
사용은 어렵지 않다. 계정의 루트계정에서 다음을 실행한다.
git clone https://github.com/<username>/dotfiles.git ~/dotfiles<username> 부분에는 본인계정이 들어가야 한다. 이렇게 하면, 본인 계정에 dotfiles 디렉토리가 생성되고 그안에 파일들이 들어오게 된다. 이제 dotfiles로 들어가서 install.sh를 실행한다.
cd dotfiles
./install.sh이렇게 하면 본인의 계정 루트에 .vimrc 심볼릭 링크가 생성된걸 확인 할 수 있다.

vim plugin들도 같이 관리해보자
vim은 확장 기능들을 plugin들로 만들수 있게 해놓았다. 진짜 좋은 기능들은 그래서 plugin들의 사용이 필요하다.
vim-plug
우선, 많은 plugin들을 사용하기 위해 보통 plugin manager를 이용한다. 유명한 것으로는 Vundle이 존재하지만, 더이상 관리가 안된다고 하여 vim-plug 를 많이 사용한다. 먼저, 간단하게 vim-plug의 사용법을 알아보자.
제일먼저 할 일은 vim-plug 에 대한 plug.vim 파일을 다운로드 받는 것이다. 다음 명령어를 이용한다.
curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vimcurl을 이용하여 github에 있는 해당 파일을 ~/.vim/autoload/plug.vim 으로 다운받게된다.
그 다음은, .vimrc를 수정하여 다음을 추가한다.
...
call plug#begin("~/.vim/plugged")
" List your plugins here
Plug 'tpope/vim-sensible'
call plug#end()
...
call plug#begin()과 end() 사이에 추가할 plugin을 적어주면 되며, begin()의 인자로 넘어가는 “~/.vim/plugged”는 플러그인이 저장될 위치가 된다.
이렇게 해주고나서 플러그인이 바로 설치되는건 아니고, vim에 들어가 “:PlugInstall” 명령어를 입력해야 설치가 된다. 관련된 명령어는 다음과 같다.
:PlugInstallto install the plugins:PlugUpdateto install or update the plugins:PlugDiffto review the changes from the last update:PlugCleanto remove plugins no longer in the list
dotfiles에 vim-plug 통합
이제 생각해볼 문제는 “이걸 어떻게 dotfiles에 포함시킬까?” 이다. 첫번째로 생각해 볼 수 있는건, .vim/ 아래의 plugin관련 파일들을 전부 git에 올리는 것이다. 하지만, 덩치가 큰 plugin들 본체까지 다 git에 올리는건 가능은 하겠지만, 좋은 시도는 아니다.
두번째는 vim-plug의 본체인 plug.vim만 git에 올리는걸 생각해 볼 수 있다. 하지만, vim-plug도 계속 업데이트가 될테니, 차라리 install 시에 vim-plug git 저장소로부터 직접 다운로드 되도록 만드는게 더 좋아보인다. 이건, vimrc에 다음의 코드를 추가해주면 가능해진다.
"automatic install vim-plug
let data_dir = '~/.vim'
if empty(glob(data_dir . '/autoload/plug.vim'))
silent execute '!curl -fLo '.data_dir.'/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
endif 위 코드는 vimrc에 들어가 있으므로 vim이 실행될 때 실행된다. .vim/autoload/plug.vim 이 없을 경우, plug.vim을 다운로드받고, autocmd 를 이용해서 vim화면이 떳을 때(VimEnter), PlugInstall 을 실행하는 커맨드이다. –sync는 PlugInstall이 종료될 때까지 진행되지 않게하며, 다 진행되면 source $MYVIMRC를 통해 vimrc를 다시 로드하게 만들어 plugin들이 보이도록 한다.
마지막으로 vimrc에 추가한 plugin들을 관리가 쉽게 별도 파일로 뺄 수도 있다.
"vim-plug
call plug#begin("~/.vim/plugged")
source ~/dotfiles/vim/plugins.vim
call plug#end()
위 코드를 보면, 원래 plugin들을 나열한 부분에 “source ~/dotfiles/vim/plugins.vim”으로 대체된걸 볼 수 있다. 해당 부분을 plugins.vim을 읽어와 채우라는 내용이다.
plugins.vim 은 다음과 같다.
Plug 'preservim/nerdtree'
Plug 'vim-airline/vim-airline'
현재 내가 추가한 플러그인이 아직 두 개밖에 없다. 여기에 더 필요한 플러그인들을 추가하면 된다.
다만, 위와같이 사용할 때 주의할 점은 정확한 이유를 모르겠는데, source ~/dotfiles/vim/plugins.vim 이 제대로 읽어오지 못하는 경우가 있었다. plugins.vim을 여러차례 수정하다가 되긴 했지만, 잘못 사용하는 경우 이런일이 생길 수 있으니, 문제가 생긴다면 plugins.vim을 별도로 두지말고 그냥 vimrc에 플러그인들을 직접 나열하는게 나을 수도 있다.
마무리
글 내용을 잘 따라왔다면, 이제 처음에 본 그림이 이해가 될 것이다.

여기서 보여준건 vimrc 하나였지만, 여기에 다른 자신의 dot file들을 추가하는건 어렵지 않다. 심화된 내용을 다루게 된다면, https://dotfiles.github.io/ 를 참고해서 공부하기 바란다. 그럼 이만.