BETA

Neovimでイケイケなエディター環境を!

投稿日:2019-01-28
最終更新:2019-01-28

はじめに

ここ数日、init.vimと格闘していました。
ちょっと落ち着いたのでメモします。

なお、使っているのはNeovimでデフォルトの設定が異なるため、Vimにこの設定を読み込ませても同じ環境にはなりません。
あと、プラグインは入れていません(よくわからないので)。

全体像

"表示系----------------------------------  
"カーソルの行をハイライト  
set cursorline  
"行番号を表示  
set number  

"操作系----------------------------------  
"クリップボードと連携  
set clipboard=unnamedplus  
"wrapした行を移動するために  
nnoremap j gj  
nnoremap k gk  
nnoremap gj j  
nnoremap gk k  

"検索系----------------------------------  
"最後まで検索したらそこで止める  
set nowrapscan  
"大文字小文字を区別せずに検索する  
set ignorecase  
"置換時にプレビューする  
set inccommand=split  
"<C-c>連打でハイライト解除  
nnoremap <C-c><C-c> :nohlsearch<CR><C-c>  

"タブ系----------------------------------  
"タブ文字を半角スペースに  
set expandtab  
"行頭でのタブ幅  
set shiftwidth=4  
"行頭以外でのタブ幅  
set tabstop=4  
"インデント変更時にshiftwidthの倍数に丸める  
set shiftround  
"インデントを賢く  
set smartindent  

"補完系----------------------------------  
"候補が1つの場合でも補完ウィンドウを表示する  
set completeopt+=menuone  
"辞書  
set dictionary+=$XDG_CONFIG_HOME/nvim/dict/master.txt  
"FileTypeごとの辞書  
"http://vim.wikia.com/wiki/Dictionary_completions  
autocmd FileType * execute 'setlocal dict+=$XDG_CONFIG_HOME/nvim/dict/' . &filetype . '.txt'  
"辞書での補完も<C-n>や<C-p>でできるように  
set complete+=k  
"補完ウィンドウを常にだす  
"http://io-fia.blogspot.com/2012/11/vimvimrc.html  
for alfabet in split("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_", '\zs')  
    exec "inoremap <expr> " . alfabet . " pumvisible() ? '" . alfabet . "' : '" . alfabet . "\<C-n>\<C-p>'"  
endfor  

"画面分割系------------------------------  
"画面分割時の移動  
"https://qiita.com/delphinus/items/aea16e82de2145d2a6b7  
nnoremap ˙ <C-w>h  
inoremap ˙ <Esc><C-w>h  
tnoremap ˙ <C-\><C-n><C-w>h  
nnoremap Ó <C-w>H  
inoremap Ó <Esc><C-w>H  
tnoremap Ó <C-\><C-n><C-w>H  
nnoremap ∆ <C-w>j  
inoremap ∆ <Esc><C-w>j  
tnoremap ∆ <C-\><C-n><C-w>j  
nnoremap Ô <C-w>J  
inoremap Ô <Esc><C-w>J  
tnoremap Ô <C-\><C-n><C-w>J  
nnoremap ˚ <C-w>k  
inoremap ˚ <Esc><C-w>k  
tnoremap ˚ <C-\><C-n><C-w>k  
nnoremap  <C-w>K  
inoremap  <Esc><C-w>K  
tnoremap  <C-\><C-n><C-w>K  
nnoremap ¬ <C-w>l  
inoremap ¬ <Esc><C-w>l  
tnoremap ¬ <C-\><C-n><C-w>l  
nnoremap Ò <C-w>L  
inoremap Ò <Esc><C-w>L  
tnoremap Ò <C-\><C-n><C-w>L  
"ターミナル画面への移動時に自動でインサートモードに  
autocmd WinEnter * if &buftype ==# 'terminal' | startinsert | endif  

"Space系---------------------------------  
nnoremap <Space><CR> :  
vnoremap <Space><CR> :  
nnoremap <Space><Space> zz  
vnoremap <Space><Space> zz  
nnoremap <Space>h 0  
vnoremap <Space>h 0  
nnoremap <Space>j G  
vnoremap <Space>j G  
nnoremap <Space>k gg  
vnoremap <Space>k gg  
nnoremap <Space>l $  
vnoremap <Space>l $  
nnoremap <Space>q :q<CR>  
nnoremap <Space>ts :sp<CR>:te<CR>i  
nnoremap <Space>tv :vs<CR>:te<CR>i  
nnoremap <Space>w :w<CR>  

"その他----------------------------------  

"<C-c>時に保存  
"iminsertはなんとなく  
inoremap <C-c> <C-c>:w<CR>  

"コピペ時にコピペした文字列の最後へ移動  
"https://postd.cc/how-to-boost-your-vim-productivity/  
nnoremap p p`]  
vnoremap p p`]  
vnoremap y y`]  

"インサートモードでもカーソル移動がしたい!  
inoremap <C-h> <Left>  
inoremap <C-j> <Down>  
inoremap <C-k> <Up>  
inoremap <C-l> <Right>  

"xonsh設定ファイルのPythonシンタックス  
autocmd BufRead,BufNew *.xsh exec "setlocal filetype=python"

解説していきます。

表示系

set cursorlineでカーソルの行をハイライトしています。
set numberで行番号を表示しています。

ここらへんは有名ですね。

操作系

set clipboard=unnamedplusとすることで、yyした内容などがクリップボードに入ります。
:help clipboardしたら書いてありました。

nnoremap j gj  
nnoremap k gk  
nnoremap gj j  
nnoremap gk k

長すぎて折り返されたテキストがあるときの移動を直感的にするためです。

検索系

set nowrapscanで、最後まで検索したらそこで止めます。個人的な感覚の問題です。

set ignorecaseで、大文字小文字を区別せずに検索します。

set inccommand=splitでは、テキストの置換時にリアルタイムで結果をプレビューします。
かっこいい。

nnoremap <C-c><C-c> :nohlsearch<CR><C-c>とすることで、<C-c>連打でハイライトを解除できます。
有名。

タブ系

set expandtabでタブ文字を半角スペースにします。
TSVファイルいじるときは、<C-v>を押してからtabキーを押して入力しています。

set shiftwidth=4  
set tabstop=4

タブ幅です。
デフォルトは8文字分。でっかい。

set shiftroundでは、<<>>でのインデント変更時に半角スペースの数をshiftwidthの倍数に丸めます。

set smartindentでインデントを賢く。

補完系

Vim / Neovimには標準で高性能な補完機能が搭載されています。
<C-n><C-p>を押したら出てくるほか、<C-x>に続けてキーを押下して場面に応じた補完も可能です。

set completeopt+=menuoneで候補が1つの場合でも補完ウィンドウを表示します。

set dictionary+=$XDG_CONFIG_HOME/nvim/dict/master.txtで辞書を読み込んでしまいます。

さらに

autocmd FileType * execute 'setlocal dict+=$XDG_CONFIG_HOME/nvim/dict/' . &filetype . '.txt'

とすることでFileTypeごとに異なる辞書を読み込むことができます。
Dictionary completions | Vim Tips Wiki | FANDOM powered by Wikiaを参考にしました。

set complete+=kで辞書を用いたで補完も<C-n><C-p>でできるようにします。
デフォルトだと<C-x><C-k>というめんどくさいものなので。

チーズバーガー中毒: Vimで入力補完を常にオンにするvimrcを参考に、補完ウィンドウを常にだすように設定します。

for alfabet in split("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_", '\zs')  
    exec "inoremap <expr> " . alfabet . " pumvisible() ? '" . alfabet . "' : '" . alfabet . "\<C-n>\<C-p>'"  
endfor

画面分割系

【(Neo)Vim】terminal mode のマッピングについての闇とその解決法 - Qiitaを参考にしました。

altキーと同時押しするとよくわかんない記号がでてくるのでそれをmapしています。
あと、画面の移動も行えるようにしました。altとshiftの同時押しです。

nnoremap ˙ <C-w>h  
inoremap ˙ <Esc><C-w>h  
tnoremap ˙ <C-\><C-n><C-w>h  
nnoremap Ó <C-w>H  
inoremap Ó <Esc><C-w>H  
tnoremap Ó <C-\><C-n><C-w>H  
nnoremap ∆ <C-w>j  
inoremap ∆ <Esc><C-w>j  
tnoremap ∆ <C-\><C-n><C-w>j  
nnoremap Ô <C-w>J  
inoremap Ô <Esc><C-w>J  
tnoremap Ô <C-\><C-n><C-w>J  
nnoremap ˚ <C-w>k  
inoremap ˚ <Esc><C-w>k  
tnoremap ˚ <C-\><C-n><C-w>k  
nnoremap  <C-w>K  
inoremap  <Esc><C-w>K  
tnoremap  <C-\><C-n><C-w>K  
nnoremap ¬ <C-w>l  
inoremap ¬ <Esc><C-w>l  
tnoremap ¬ <C-\><C-n><C-w>l  
nnoremap Ò <C-w>L  
inoremap Ò <Esc><C-w>L  
tnoremap Ò <C-\><C-n><C-w>L  

"ターミナル画面への移動時に自動でインサートモードに  
autocmd WinEnter * if &buftype ==# 'terminal' | startinsert | endif

Space系

スペースキーを使わないだなんてもったいない!

nnoremap <Space><CR> :  
vnoremap <Space><CR> :

:が押しづらくてたまらないので。

nnoremap <Space><Space> zz  
vnoremap <Space><Space> zz

よく使うので。

nnoremap <Space>h 0  
vnoremap <Space>h 0  
nnoremap <Space>j G  
vnoremap <Space>j G  
nnoremap <Space>k gg  
vnoremap <Space>k gg  
nnoremap <Space>l $  
vnoremap <Space>l $

なんとなく。

nnoremap <Space>q :q<CR>  
nnoremap <Space>ts :sp<CR>:te<CR>i  
nnoremap <Space>tv :vs<CR>:te<CR>i  
nnoremap <Space>w :w<CR>

:が押しづらくてたまらないので。

その他

inoremap <C-c> <C-c>:w<CR><C-c>時に保存します。

Vimの生産性を高める12の方法 | POSTDを参考に、コピペ時にコピペした文字列の最後へ移動するようにしました。

nnoremap p p`]  
vnoremap p p`]  
vnoremap y y`]

インサートモードでもカーソル移動がしたい!

inoremap <C-h> <Left>  
inoremap <C-j> <Down>  
inoremap <C-k> <Up>  
inoremap <C-l> <Right>

xonsh設定ファイルにPythonのシンタックスハイライトを適用します。

autocmd BufRead,BufNew *.xsh exec "setlocal filetype=python"

おわりに

結構いい感じになった気がします。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

おかゆりぞっとのさほど技術的ではないブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう