Skip to main content

H/LとPageUp/PageDownを共存させる設定

s-show
s-show

20 days前に投稿

0
License: MIT

LUA
vim.keymap.set('n', 'H',
  function()
    if vim.fn.line('.') == vim.fn.line('w0') then
      return '<PageUp>H'
    else
      return 'H'
    end
  end,
  {
    expr = true,
    desc = 'H to H and PageUp'
  }
)
-- Lのマッピング(条件分岐あり)
vim.keymap.set('n', 'L',
  function()
    if vim.fn.line('.') == vim.fn.line('w$') then
      return '<PageDown>Lzb'
    else
      return 'L'
    end
  end,
  {
    expr = true,
    desc = 'L to L and PageDown'
  }
)

H/LとPageUp/PageDownを共存させる設定 (submode編) | Atusy's blog を少し改造した設定です。

この設定で実現できる動作は次のとおりです。

  • カーソルがバッファの最上部以外にあるときに H をタイプすると通常の H を発行し、カーソルがバッファの最上部にあるときに H をタイプすると PageUp を発行してから H を発行してカーソルを PageUp 後のバッファの最上部に移動します。
  • カーソルがバッファの最下部以外にあるときに L をタイプすると通常の L を発行し、カーソルがバッファの最下部にあるときに L をタイプすると PageDown を発行してから Lzb を発行してカーソルを PageDown 後のバッファの最下部に移動します。

コードの簡単な説明

  • expr = true を指定した「式マッピング」を使用。関数が返す文字列を Vim コマンドとして実行します。
  • vim.fn.line('.'):現在のカーソル行番号
  • vim.fn.line('w0') / 'w$':画面(ウィンドウ)の最上部/最下部の表示行番号
  • 条件分岐で「既に端にいるか」を判定し、必要に応じて <PageUp><PageDown> を先頭に追加して返します。
  • L の場合のみ zb を付与。スクロール後にカーソルが下端中央に固定され、視認性が向上します。

メリット・特徴

  1. プラグイン不要:純粋な Neovim Lua API と Vim 組み込みコマンドのみで動作。設定ファイルの依存関係を増やしません。
  2. 連打対応:H / L を素早く連打してもカーソルがはみ出さず、ページ送り+端ジャンプが自動で連鎖します。
  3. 視認性維持:zb により下端へのジャンプ後もカーソル位置が安定し、次の編集に迷いません。
  4. 標準 H/L との互換性:Vim の H/L は元々「ファイル先頭/末尾」ではなく「画面端」を指すため、直感的な挙動と完全に一致します。

コメントを投稿するにはログインが必要です