golangの日記

Go言語を中心にプログラミングについてのブログ

neovim の <Home> をスマートにしたい

vim.png


「HOMEキーなんて僻地すぎて使わねーよ」というご指摘はさておいて、スマートな <Home> とは vscode での homeキー(cursorHome) と同じカーソルの動作のことです。





目次



動作の定義


  1. 行の途中にカーソルがある場合に <Home> を押すとインデントを考慮した行頭にカーソルを移動する(vim の ^ と同じ)
  2. インデントを考慮した行頭にカーソルがある場合は完全な行頭に移動する(vim の 0 と同じ)
  3. 完全な行頭にカーソルがある場合に <Home> を押すとインデントを考慮した行頭にカーソルを移動する(vim の ^ と同じ)


1~3のカーソル動作を <Home> キーのみで行う。



GIF


Homeキーを4回押してます。


smart home



キーマップの設定


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 })