こちらの記事で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>
設定方法の詳細は以下参照。
設定例
以下、設定例。
設定ファイル(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:>_ |
より詳しい情報は以下を参照。
設定例
以下、設定例。
設定ファイル(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で日本語を扱う予定の人は、以下の記事を参考に日本語環境を整えて下さいまし。
- 【FreeBSD】仮想コンソールで日本語を表示したい - HacoLab
- 【FreeBSD】仮想コンソールで日本語入力したい(uim-fep+mozc) - HacoLab
- 【FreeBSD】vim/neovimのノーマルモード遷移時に日本語入力をOFFする(uim-fep/fcitx) - HacoLab
- 【FreeBSD】Vim/Neovimで挿入モード遷移時に前回のIME状態をセットする(uim-fep/fcitx) - HacoLab
最後に
Vim/Neovimの設定は奥深い。
設定ファイルをいじり始めると、エディタを使う当初の目的を忘れる危険性がある。
特に、いきなり「完璧な理想の挙動」を目指すのはとても危険。
森に迷い込み、ときには沼にハマリ込み、想定以上の時間を浪費する可能性が高い。
焦らずに、自分好みの設定をじっくりコトコト煮詰めていこう。
以上。