neovim の <Home> をスマートにしたい
「HOMEキーなんて僻地すぎて使わねーよ」というご指摘はさておいて、スマートな <Home>
とは vscode での homeキー(cursorHome)
と同じカーソルの動作のことです。
目次
動作の定義
- 行の途中にカーソルがある場合に
<Home>
を押すとインデントを考慮した行頭にカーソルを移動する(vim の^
と同じ) - インデントを考慮した行頭にカーソルがある場合は完全な行頭に移動する(vim の
0
と同じ) - 完全な行頭にカーソルがある場合に
<Home>
を押すとインデントを考慮した行頭にカーソルを移動する(vim の^
と同じ)
1~3のカーソル動作を <Home>
キーのみで行う。
GIF
Homeキーを4回押してます。
キーマップの設定
vim.api.nvim_set_keymap
のオプション callback
に関数を渡す。
local function smart_home() -- カーソルがある行を文字列で取得 local line = vim.api.nvim_get_current_line() -- 現在のカーソル位置を取得 local row, col = unpack(vim.api.nvim_win_get_cursor(0)) -- 先頭にある空白と制御文字(タブ)にマッチさせる。戻り値はマッチした文字列または nil local m = line:match('^[%s%c]+') -- カーソルを移動させる(三項演算子で読みづらいけどluaでよく見るので) vim.api.nvim_win_set_cursor(0, (m ~= nil and (col == 0 or m:len() < col)) and { row, m:len() } or { row, 0 }) end vim.api.nvim_set_keymap('n', '<Home>', '', { callback = smart_home }) vim.api.nvim_set_keymap('i', '<Home>', '', { callback = smart_home }) vim.api.nvim_set_keymap('v', '<Home>', '', { callback = smart_home })