本記事は Classi Advent Calendar 2020 14日目の記事です。
こんにちは。今年Classiに新卒入社した@youichiroです。
皆さんはエディタは何を使っていますか?
自分は普段VSCodeを使って開発を行なっていますが、vimをVSCodeのように使いたいと思いました。
ということで、vimをカスタマイズして見た目や機能をVSCodeライクにしていきます。
Before / After
vimの初期状態(何も設定していない状態)から、以下の変更を加えていきます
- プラグインを管理する (vim-plug)
- ステータスバーを表示する (vim-airline)
- カラースキームをVSCodeライクにする (vim-code-dark)
- ファイルツリーを表示する (fern.vim)
- gitの差分を表示する (vim-gitgutter)
- ファイル検索する (fzf.vim)
プラグインを管理する
VSCodeには拡張機能をインストール・管理する仕組みがありますが、vimでもvim-plugを使ってvimプラグインを管理することができます
次のコマンドを実行してインストールします
$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
vimの設定ファイルである~/.vimrc
に以下の記述を追加します
call plug#begin()
" ここにインストールしたいプラグインを列挙する
" Plug 'hoge/huga'
call plug#end()
plug#begin()
とplug#end()
の間にインストールしたいプラグインを記述し、vim上で:PlugInstall
コマンドを実行するとそのプラグインがインストールされます
プラグインを削除したい場合は、.vimrcから記述を削除して:PlugClean
コマンドを実行します
ステータスバーを表示する
初期のステータスバーは簡素すぎるので、いい感じのステータスバーを表示するためにvim-airlineをインストールします
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
タブラインも表示するために、.vimrcに次の設定を追加します
let g:airline#extensions#tabline#enabled = 1
ステータスラインとタブラインの余計な項目を除きたかったので、以下の設定を追加しました
例えば右下の表示項目を行数のみにしています
"" vim-airline
" ステータスラインに表示する項目を変更する
let g:airline#extensions#default#layout = [
\ [ 'a', 'b', 'c' ],
\ ['z']
\ ]
let g:airline_section_c = '%t %M'
let g:airline_section_z = get(g:, 'airline_linecolumn_prefix', '').'%3l:%-2v'
" 変更がなければdiffの行数を表示しない
let g:airline#extensions#hunks#non_zero_only = 1
" タブラインの表示を変更する
let g:airline#extensions#tabline#fnamemod = ':t'
let g:airline#extensions#tabline#show_buffers = 1
let g:airline#extensions#tabline#show_splits = 0
let g:airline#extensions#tabline#show_tabs = 1
let g:airline#extensions#tabline#show_tab_nr = 0
let g:airline#extensions#tabline#show_tab_type = 1
let g:airline#extensions#tabline#show_close_button = 0
ステータスラインの設定については vim-airlineの使い方と設定方法。Vimのステータスバーを最強に! 、タブラインの設定については Best airline settings が参考になりました
カラースキームをVSCodeライクにする
vimの色の付け方をVSCodeライクにするために、vim-code-darkをダウンロードします
$ git clone https://github.com/tomasiser/vim-code-dark.git ~/.vim/bundle/vim-code-dark.git
$ ln -s ~/.vim/bundle/vim-code-dark.git/colors/codedark.vim ~/.vim/colors/codedark.vim
.vimrcに次の設定を追加すると、VSCodeライクのカラースキームが適用されます
colorscheme codedark
vim-airline
も同じカラースキームのテーマを適用するために、プラグインをインストールし、テーマを指定します
Plug 'tomasiser/vim-code-dark'
let g:airline_theme = 'codedark'
ファイルツリーを表示する
vimのファイルツリーを表示するためのプラグインはNERDTreeが有名ですが、それよりもパフォーマンスが良いらしいfern.vimを使いました
2020秋 Vim のファイラー系プラグイン比較にプラグインの比較がまとめられています
Plug 'lambdalisue/fern.vim'
:Fern .
でウィンドウにファイルツリーを表示します
:Fern . -drawer
でサイドバーのように左側にファイルツリーを表示します
次のように設定し、Ctrl+n
で左側にファイルツリーを開くようにしました
" Ctrl+nでファイルツリーを表示/非表示する
nnoremap <C-n> :Fern . -reveal=% -drawer -toggle -width=40<CR>
-reveal=%
で現在開いているファイルにフォーカスし、-toggle
で表示/非表示を切り替えられるようにし、-width
で横幅を指定しています
ファイルツリー上でファイルの作成や削除などの操作が可能です
コマンド | 説明 |
---|---|
j, k | 上下に移動する |
l | フォルダを展開する、ファイルを開く |
h | フォルダを閉じる |
e | ファイルを開く |
E | 垂直分割してファイルを開く |
t | 新規タブでファイルを開く |
Ctrl+m | フォルダを開く |
Ctrl+h | 親ディレクトリに移動する |
N | ファイルを新規作成する |
K | ディレクトリを新規作成する |
D | ファイルを削除する |
m | ファイルを移動する |
R | ファイル名を変更する |
- | ファイルを選択する |
C | ファイルをコピーする |
P | ペーストする |
M | ファイルをコピーし、ペーストした時に元のファイルを削除する |
y | ファイルパスをコピーする |
z | ファイル名に合わせてウィンドウ幅を広げる |
! | 隠しファイルを表示/非表示する |
ファイルツリーにgitの差分を表示する
fern-git-status.vimをインストールすることで、ファイルツリーにgitの差分が表示されます
Plug 'lambdalisue/fern-git-status.vim'
ファイルツリーにファイルのアイコンを表示する
アイコンを表示するためには必要なフォントをインストールする必要があります
Nerd Fontsをインストールすれば良いのですが、今回は自分がVSCodeのフォントに設定していたMenlo
フォントを使いたかったので、font-menlo-extraからフォントをダウンロードします
- https://github.com/yumitsu/font-menlo-extra/blob/master/Menlo-Regular-Normal.ttf をダウンロード
- ダウンロードしたファイルを開き、フォントをインストール
- ターミナルのフォントを
Menlo Nerd Font
に変更
これでフォントの用意はできました
ファイルツリーにフォントを表示するためにnerdfont.vimとfern-renderer-nerdfont.vimをインストールします
Plug 'lambdalisue/nerdfont.vim'
Plug 'lambdalisue/fern-renderer-nerdfont.vim'
次の設定を追加してアイコン表示を有効化します
let g:fern#renderer = 'nerdfont'
ファイルツリーのアイコンに色をつける
アイコンの表示はできたのですが全てのファイルで同じ色だったので、色を変えます
glyph-palette.vimをインストールし、設定を追加します
Plug 'lambdalisue/glyph-palette.vim'
" アイコンに色をつける
augroup my-glyph-palette
autocmd! *
autocmd FileType fern call glyph_palette#apply()
autocmd FileType nerdtree,startify call glyph_palette#apply()
augroup END
gitの差分を表示する
VSCodeだと変更がある行に印が表示され、差分を確認することができます。vimでもできます。
vim-gitgutterをインストールすると差分のある行に印が表示されるようになります
Plug 'airblade/vim-gitgutter'
印を表示する以外にも変更箇所へ移動したり差分をハイライトしたりすることができます
以下の設定とキーマップの追加して使いやすくしました
"" git操作
" g]で前の変更箇所へ移動する
nnoremap g[ :GitGutterPrevHunk<CR>
" g[で次の変更箇所へ移動する
nnoremap g] :GitGutterNextHunk<CR>
" ghでdiffをハイライトする
nnoremap gh :GitGutterLineHighlightsToggle<CR>
" gpでカーソル行のdiffを表示する
nnoremap gp :GitGutterPreviewHunk<CR>
" 記号の色を変更する
highlight GitGutterAdd ctermfg=green
highlight GitGutterChange ctermfg=blue
highlight GitGutterDelete ctermfg=red
"" 反映時間を短くする(デフォルトは4000ms)
set updatetime=250
この他にもvim-fugitiveをインストールするとvimからgit操作を行えたり、vim-rhubarbをインストールすると対象のファイル/行をGitHubで開けたりすることができます
ファイル検索する
自分はVSCodeでファイル名によるファイルを検索するときはCommand+p
、文字列によるファイルを検索するときはCommand+Shift+f
をよく使います。vimでもできます。
fzf.vimをインストールすると便利な検索機能を使うことができます
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
次のパッケージを使うのでインストールしておきます
$ brew install bat
$ brew install ripgrep
こちらにあるように、:GFiles
でgit管理されているファイルのファイル名であいまい検索ができ、:Rg
でファイルの文字列でのあいまい検索ができるようになります
使いやすくなるように以下のキーマップを設定しました
Ctrl+p
を押すと検索プレビューが表示され、ファイル名によるファイルのあいまい検索を行うことができ、またCtrl+g
で文字列によるファイルのあいまい検索ができます
"" fzf.vim
" Ctrl+pでファイル検索を開く
" git管理されていれば:GFiles、そうでなければ:Filesを実行する
fun! FzfOmniFiles()
let is_git = system('git status')
if v:shell_error
:Files
else
:GFiles
endif
endfun
nnoremap <C-p> :call FzfOmniFiles()<CR>
" Ctrl+gで文字列検索を開く
" <S-?>でプレビューを表示/非表示する
command! -bang -nargs=* Rg
\ call fzf#vim#grep(
\ 'rg --column --line-number --hidden --ignore-case --no-heading --color=always '.shellescape(<q-args>), 1,
\ <bang>0 ? fzf#vim#with_preview({'options': '--delimiter : --nth 3..'}, 'up:60%')
\ : fzf#vim#with_preview({'options': '--exact --delimiter : --nth 3..'}, 'right:50%:hidden', '?'),
\ <bang>0)
nnoremap <C-g> :Rg<CR>
" frでカーソル位置の単語をファイル検索する
nnoremap fr vawy:Rg <C-R>"<CR>
" frで選択した単語をファイル検索する
xnoremap fr y:Rg <C-R>"<CR>
" fbでバッファ検索を開く
nnoremap fb :Buffers<CR>
" fpでバッファの中で1つ前に開いたファイルを開く
nnoremap fp :Buffers<CR><CR>
" flで開いているファイルの文字列検索を開く
nnoremap fl :BLines<CR>
" fmでマーク検索を開く
nnoremap fm :Marks<CR>
" fhでファイル閲覧履歴検索を開く
nnoremap fh :History<CR>
" fcでコミット履歴検索を開く
nnoremap fc :Commits<CR>
検索してファイルを選択した状態で、次のキーでファイルを開くことができます
キー | 動作 |
---|---|
Enter | 今のウィンドウで開く |
Ctrl+v | 垂直分割で開く |
Ctrl+x | 水平分割で開く |
Ctrl+t | 新規タブで開く |
おわりに
vimの初期状態からカスタマイズしていき、見た目や機能をVSCodeライクにしてみました。
最終的な.vimrcはこちらにあります。
明日は@tomoyanamekawaさんです!