gnome-terminal の vim では Ctrl+TAB が機能しない

gnome-terminal の vim では Ctrl+TAB が機能しない

深刻な問題があります。通常、使用するエディターは vim ですが、ctrl+tab アクションをマップできません。ctrl+tab (ctrl + shift + tab) でタブを切り替えたいのですが、xterm ではこのマッピングが有効になっており、アクションが使用されます。しかし、gnome-terminal では、tab はエスケープ シーケンスとして登場しました。gnome-terminal を使用して vim でタブを切り替える方法を教えてください。

答え1

キーボード入力が内部的に処理される方法により、残念ながら、GVIMでも、今日では一般的には不可能です。一部のキーの組み合わせ、たとえば、Ctrl+非アルファベットはマッピングできず、Ctrl+文字とCtrl+ Shift+文字は区別できません。(端末が明確なタームキャップほとんどの人はそれをコード化していません。) 挿入モードまたはコマンドラインモードで、キーの組み合わせを入力してみます。何も起こらない場合は / が挿入されますが、そのキーの組み合わせは使用できません。これは<Tab>/ <C-I><CR>/ <C-M>/ <Esc>/<C-[>などにも適用されます (唯一の例外は<BS>/です<C-H>)。これは既知の問題点であり、vim_dev および #vim IRC チャネルでさまざまな議論の対象となっています。

一部の人々 (主に Paul LeoNerd Evans) は、これを修正したいと考えており (これをサポートする端末のコンソール Vim でも)、さまざまな提案を出しています。http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8

しかし、今日の時点では、パッチやボランティアはまだ現れていませんが、多くの人が将来の Vim 8 メジャー リリースでこれを実装することを望んでいることを表明しています。

答え2

問題は、ターミナルではTab文字が^I( Control- I) であることです。つまり、タブを押しながらコントロールを押しても、ターミナルは Vim に渡されません。[1]通常のタブ文字が送信されるだけです。

GVim は、どのキーがどのような組み合わせで押されているかを端末に伝える必要がないため、これをサポートできます。キーボード イベントに直接アクセスできるため、変更された特殊キーを問題なく確認できます。

一貫性を保つために、マップする別のキーを見つけることをお勧めします。

[1] 「現代の」端末エミュレータではこれはもはや当てはまらないと私は理解しているが、だったこれは長い間真実であり、Vim が使用するターミナル ライブラリ (Ncurses) はこのイベントを処理できないため、克服すべき大きなレガシー ハードルがあります。そのため、ターミナルが技術的にサポートしている場合でも、依存するライブラリ API がサポートしていないため、Vim はサポートできません。約 1 年に 1 回、Vim 開発者リストで、より機能的な API への切り替えを含むさまざまな方法でこの問題を修正することについて真剣な議論が行われていますが、何も成果は上がっていません。

答え3

これに対する私の一番近い答えは、Leader+TabLeader+ Shift+を作成することですTab

map <leader><Tab> :bnext<cr>
map <leader><S-Tab> :bprevious<cr>

私は(カンマ)Leaderにマッピングしたので、 +,と入力します,Tab

しかし、それらはあまりうまく機能しません。Leader押したまま押し続けてTabタブをスクロールすることはできません。これは MRU (最近使用した) 動作でもありません。

説明を明確にするために、「タブ ページ」ではなく「バッファ」を使用しています。これは、他のエディターがタブを使用する目的の概念に、これらがよりよく対応していると思うからです。

代わりに、次の方法を試すことができます。

map <leader><Tab> :b<Space>

これにより ex コマンドが開き、 を押すとTabバッファのスクロールを開始できます。 また、 とを使用して前後に移動することもできます。

この方法を使用すると、開いているバッファの一部を入力し始めることもできます。Tabその後、 を押すと、フィルタリングされた開いているバッファのリストが循環表示されます。

ただし、個人的には、基本的な MRU 動作を実現するために、Leader+ をマップするだけです。Tab

map <leader><Tab> :b#<cr>

関連情報