Open1
nvim-cmpと挿入ノーマルモード(C-o)の問題
環境
システム
- OS: macOS 14.5 Sonoma (Build 23F79)
- Architecture: ARM64 (Apple M1 Max)
- Kernel: Darwin 23.5.0
Neovim
- Version: v0.10.3
- Build type: Release
- LuaJIT: 2.1.1736781742
関連プラグイン
- nvim-cmp: b5311ab (2025-04-13)
その他
- プラグインマネージャー: lazy.nvim
- テスト日: 2025年8月31日
問題の症状
現象
- 挿入モードで
C-o
を押すと正常に挿入ノーマルモード(-- insert --
)に入る - しかし、その後の2文字コマンド(
zz
、dd
、gg
など)が実行されず、文字として挿入される - 1文字コマンド(
j
、k
、x
など)は正常動作
影響を受けるコマンド例
-
C-o zz
- 画面中央へのスクロール(動作せず、"zz"が挿入される) -
C-o dd
- 行削除(動作せず、"dd"が挿入される) -
C-o gg
- ファイル先頭への移動(動作せず、"gg"が挿入される)
調査過程
1. 切り分けテスト
テスト1: 最小構成(プラグインなし)
nvim -u test_minimal_long.vim
結果: C-o zz
が正常動作 ✓
テスト2: nvim-cmpのみ
nvim -u test_cmp_only.lua test_minimal_long.vim
結果: zz
が文字として挿入される ✗
テスト3: nvim-cmpを除外した設定
nvim -u test_without_cmp.lua test_minimal_long.vim
結果: C-o zz
が正常動作 ✓
2. 原因の特定
- 確定: nvim-cmpが原因
- パターン: 1文字コマンドは動作、2文字コマンドは動作しない
試した解決策と結果
mapping.preset.insert()
をcmp.mapping()
に置き換え
1. cmp.setup({
mapping = cmp.mapping({
["<C-Space>"] = cmp.mapping.complete(),
["<C-e>"] = cmp.mapping.abort(),
["<CR>"] = cmp.mapping.confirm({ select = true }),
["<Tab>"] = cmp.mapping.select_next_item(),
["<S-Tab>"] = cmp.mapping.select_prev_item(),
}),
})
結果: 効果なし ✗
2. 挿入ノーマルモードでnvim-cmpを無効化
enabled = function()
local mode = vim.api.nvim_get_mode().mode
if mode:match('^ni') then
return false
end
return true
end,
結果: 効果なし ✗
3. 自動補完を無効化
completion = {
autocomplete = false,
},
結果: 効果なし ✗
4. パフォーマンス設定の調整
performance = {
debounce = 0,
throttle = 0,
fetching_timeout = 200,
},
結果: 効果なし ✗
根本原因
わかっていること
- nvim-cmpが挿入ノーマルモードでの2文字コマンドを妨害している
- プラグインを除外すれば正常動作する
- 設定変更では解決できない
わかっていないこと
- なぜnvim-cmpが2文字コマンドを妨害するのか
- どのコードが実際に干渉しているのか
- なぜ設定変更が効果がないのか
推測(未確認)
-
mapping.preset.insert()
の隠れたキーマッピングが原因? -
TextChangedI
イベント処理が干渉? - nvim-cmpの内部的なキー入力処理メカニズムの問題?
関連情報
参考にしたGitHub Issues
- Issue #895: Discussion: why removing default mappings?
- Issue #463: Custom key mappings not merged with default mappings
- Issue #459: <Plug>(cmp.utils.keymap.recursive: ) is written on <Tab>
- LazyVim Discussion #3744: Keybindings for nvim-cmp automatically added?
注: C-o zz
の具体的な問題を扱ったissueは見つからなかった
web上の情報
-
Do you know Vim can execute normal mode command while in insert mode?
- この記事では
C-o zz
が動作すると記載されている(素のVimでは正常動作することを示唆)
- この記事では
代替プラグインの選択肢
nvim-cmpの代わりに検討できる補完プラグイン:
- mini.completion - ミニマルで軽量、設定がシンプル
- coq_nvim - 高機能だがPython依存
- ddc.vim - Denoベース、日本製
- coc.nvim - VSCode風だが重い
- YouCompleteMe - 老舗だがインストールが複雑
現在の状況
2024年8月31日時点で、この問題は未解決。nvim-cmpを使い続ける場合は、挿入ノーマルモードでの2文字コマンドが使えないことを受け入れるか、代替プラグインへの移行を検討する必要がある。
回避策
現時点での回避策:
-
Esc
でノーマルモードに完全に戻ってからコマンドを実行 - 2文字コマンドの代わりに別のキーマッピングを定義
- nvim-cmpを他の補完プラグインに置き換える