【FreeBSD】Neovimで最初にやっておきたい基本設定

こちらの記事でNeovimのインストール方法と設定ファイルについて説明した。

今回は、僕がひとまず最低限やっておきたいNeovimの設定を紹介する。
実際に使ってみて良さげだったら適用して下さいな。

主な内容は以下で、いずれもプラグインは使わない。

- よく使う操作をキーに割り当てる (設定ファイルのOpen/Reloadなど)
- 割り当てられているキーの確認方法
- ファイル未保存状態でも他のバッファへ切替可能にする
- 行番号表示/カーソル行強調表示
- 全角空白、タブ文字、行末の空白文字を可視化
- インデント設定
- コマンドウィンドウでの補完
- 行末行頭から前後の行へ移動できるキー設定
- ウィンドウ分割時の新規ウィンドウ作成位置指定
- 検索時のデフォルト挙動をいい感じにする
- 置換時にプレビューを表示する
- シンタックスハイライトON

 

確認環境

   
PC Thinkpad X1 Carbon 2nd Gen
OS FreeBSD 12.1-RELEASE-p1
Neovim NVIM v0.4.3

最初に最低限やっておきたい設定

よく使う操作をキーに割り当てよう

まずは、よく行う操作をキーに割り当てておこう。

設定方法

*noremapを使って、Neovimの各モードでキーを押したときの動作を定義していく。
ひとまず下のコマンドを覚えておけば大丈夫かと思う。

設定コマンド 対象モード
inoremap Insertモード
nnoremap Normalモード
cnoremap Commandモード
vnoremap Visual/Selectモード
xnoremap Visualモード

例えば、以下のようにすればNormalモードで<Esc>を2回連続で押した時に、:<C-u>noh<CR>を実行するようになる。

nnoremap <silent> <ESC><ESC> :<C-u>noh<CR>

設定方法の詳細は以下参照。

map - Vim日本語ドキュメント

設定例

以下、設定例。
設定ファイル(init.vim)を変更して保存したら、Neovimを再起動して試してみてね。

" Leaderキーを\から押しやすい<Space>に変更
nnoremap <Space> <nop>
let mapleader="\<Space>"

" 設定ファイルを開く、反映する
" パスは自分の環境に合わせて置き換えてね
nnoremap <silent> <Leader>cc :<C-u>e ~/.config/nvim/init.vim<CR>
nnoremap <silent> <Leader>cr :<C-u>source ~/.config/nvim/init.vim<CR>

" カーソル位置/選択中の単語のVimヘルプを開く
" zレジスタ使用に注意。'z'を普段使わないレジスタに置き換えてね
nnoremap <F1> "zyiw:<C-u>help <C-r>z<CR>
vnoremap <F1> "zy:<C-u>help <C-r>z<CR>

" ヘルプ画面をqだけで閉じる
autocmd FileType help nnoremap <buffer> q <C-w>c

" 折返し有効無効切替
nnoremap <Leader><Leader>l :<C-u>setlocal wrap!<CR>

" 検索でマッチした単語のハイライトをOFF
nnoremap <silent> <ESC><ESC> :<C-u>noh<CR>

" Visualモードで選択中の単語を検索
vnoremap * :<C-u>call <SID>VSetSearch()<CR>/<C-R>=@/<CR><CR>
vnoremap # :<C-u>call <SID>VSetSearch()<CR>?<C-R>=@/<CR><CR>
function! s:VSetSearch()
    let temp=@s
    norm! gv"sy
    let @/='\V' . substitute(escape(@s, '/\'), '\n', '\\n', 'g')
    let @s=temp
endfunction

" コマンドウィンドウでシェルっぽい操作感
cnoremap <C-q> <C-f>
cnoremap <C-a> <Home>
cnoremap <C-e> <End>
cnoremap <C-f> <Right>
cnoremap <C-b> <Left>
cnoremap <C-p> <Up>
cnoremap <C-n> <Down>
cnoremap <Up> <C-p>
cnoremap <Down> <C-n>

" クリップボードから貼り付ける、クリップボードにコピー、ヤンクする
" この設定の代わりにclipboardオプションも検討してみてね
nnoremap <Leader>p   "+p
nnoremap <Leader>P   "+P
nnoremap <Leader>y   "+y
nnoremap <Leader>yiw "+yiw
nnoremap <Leader>yaw "+yaw
nnoremap <Leader>yy  "+yy
nnoremap <Leader>ygg :0,.yank +<CR>
nnoremap <Leader>yG  :.,$yank +<CR>
nnoremap <Leader>yA  :0,$yank +<CR>
nnoremap <Leader>d   "+diw
nnoremap <Leader>D   "+d$
nnoremap <Leader>dd  "+dd
nnoremap <Leader>diw "+diw
nnoremap <Leader>daw "+daw
nnoremap <Leader>dgg :0,.delete +<CR>
nnoremap <Leader>dG  :.,$delete +<CR>
nnoremap <Leader>dA  :0,$delete +<CR>

vnoremap <Leader>y   "+y
vnoremap <Leader>d   "+d

現在のキー割当確認方法

現在のキー割当が知りたい場合は、下のコマンドを使おう。

コマンド キー割当を表示したいモード
:map 全モード
:imap Insertモード
:nmap Normalモード
:cmmp Commandモード
:vmap Visual/Selectモード
:xmap Visualモード
:smap Selectモード

ちなみに、:verbose mapのようにすれば、定義元ファイルまで表示してくれるよ。

共通でマッピングされるキーに注意

下のキーは、同じキー扱いになる。

つまり片方を指定すると、もう片方にも同じコマンドがマッピングされちゃう点に注意。

キー 共通扱いのキー
<Enter> <C-m>
<Esc> <C-[>
<Tab> <C-i>

デフォルトの挙動を変更する

ここでは、設定しておかないと使いにくいと感じそうなものを中心にご紹介。

設定方法

Neovimの挙動を変更するには用意されているオプション値を変更すれば良い。
(nvim -u NONEでデフォルト設定のNeovimを起動できるよ)

オプションはset オプション名set オプション名=設定値などで設定できる。

オプションには、ざっくり以下の種類がある。

種類 説明 オプション設定例
boolean オンかオフかのどちらかの値をとる(設定に値が不要) set hidden
number 数値の値を取る set tabstop=4
string 文字列の値を取る set listchars=tab:>_

より詳しい情報は以下を参照。

options - Vim日本語ドキュメント

設定例

以下、設定例。
設定ファイル(init.vim)を変更して保存したら、Neovimを再起動して試してみてね。

set hidden         " ファイル未保存状態でも他のバッファへ切替可能にする
set number         " 行番号を表示
set cursorline     " カーソル位置の行を強調表示
set ambiwidth=double   " 一部の全角記号文字幅が半角1文字分になる問題対策
set list listchars=tab:>_,trail:_   " タブ文字と行末の空白文字を可視化
set showbreak=\>>\      " 1行折返し表示時の行頭文字
" 全角空白を可視化
if has('syntax')
    function! ZenkakuSpace()
        highlight ZenkakuSpace cterm=reverse ctermfg=darkgray gui=reverse guifg=darkgray
    endfunction
    augroup ZenkakuSpace
        autocmd!
        autocmd ColorScheme       * call ZenkakuSpace()
        autocmd VimEnter,WinEnter * match ZenkakuSpace / /
    augroup END
    call ZenkakuSpace()
endif

" インデント設定
" タブ幅は4文字。インデント時はタブ文字ではなく空白4つを挿入
" filetypeごとの設定は、$XDG_CONFIG_HOME/nvim/indent/*.vimでsetlocalを使って設定すればOK
" 例えばfiletypeが`go`のインデント設定は、$XDG_CONFIG_HOME/nvim/indent/go.vimに記述
set tabstop=4
set softtabstop=0
set shiftwidth=4
set expandtab
set smarttab
set shiftround

" コマンドウィンドウで<Tab>キーを押した際、複数の補完候補の最長共通部分まで補完
" fullだけの指定も試してみてね
set wildmode=longest:full

" 行末行頭から前後の行へ移動できるキー設定(<BS>,<Space>,h,l,<Left>,<Right>)
set whichwrap=b,s,h,l,<,>,[,]

set splitbelow     " ウィンドウ水平分割時、新規ウィンドウは下に作る
set splitright     " ウィンドウ垂直分割時、新規ウィンドウは右に作る

set incsearch      " /や#でインクリメンタル検索有効
set ignorecase     " 検索時、小文字だけの場合は大文字小文字区別しない
set smartcase      " 検索時、大文字を含めたら大文字小文字区別する

" neovimオリジナルオプション
if has('nvim')
    set inccommand=split " %で置換時にプレビューを表示
endif

syntax enable      " シンタックスハイライトを有効

なお、ambiwidthについては僕のコンソール環境では効いて無さげ。

Neovimデフォルト値でいい感じのオプション達

Vimでよく設定する以下のオプションは、Neovimデフォルト値として設定されてるっぽい。
Vimと設定ファイルを共通化するなら設定した方が良いかもかも。

set nobackup                        " バックアップファイルを作らない
set backspace=indent,eol,start      " <BS>などでインデントや改行を削除
set history=10000                   " コマンド履歴数設定
set novisualbell                    " ビジュアルベルoFF
set undolevels=1000                 " undo履歴数
set hlsearch                        " 検索時のハイライトON
set wrapscan                        " 検索時にファイル末尾まで到達時、ファイル先頭から検索
set wildmenu                        " コマンドラインのいい感じの補完
set laststatus=2                    " ステータスライン常時表示

日本語入力設定

Vim/Neovimはデフォルトだと、日本語入力との相性が抜群に悪い。

FreeBSDで日本語を扱う予定の人は、以下の記事を参考に日本語環境を整えて下さいまし。

最後に

Vim/Neovimの設定は奥深い。

設定ファイルをいじり始めると、エディタを使う当初の目的を忘れる危険性がある。

特に、いきなり「完璧な理想の挙動」を目指すのはとても危険。

森に迷い込み、ときには沼にハマリ込み、想定以上の時間を浪費する可能性が高い。

焦らずに、自分好みの設定をじっくりコトコト煮詰めていこう。

以上。

参考