私はgnome端末でVimを実行しています。しかし、Altキーのマッピングが機能していません。
例(これは単なる例です):
:imap <A-i> <Esc>
GVimでは問題なく動作します。しかし、gnomeターミナルでVimを使用して同じコマンドを実行すると、動作しません。
だから問題は端末にあると思いますよね?
どうすれば修正できますか?
ありがとう
編集:同じマシンにWindows 7をインストールしていますが、Windowsターミナルでも問題なく動作します。
端末エミュレータが送信する方法は2つあります。 Alt キー(実際の端末にはAltがなかったため、通常はメタキーと呼ばれます)。 Altの使用時に8ビット文字を送信してハイビットを設定するか、エスケープシーケンスを使用して送信することができます。 Alt-a <Esc>a
として。 Vimは、エスケープシーケンスではなく8ビットエンコーディングを想定しています。
xtermなどの一部の端末エミュレータはどちらのモードを使用するようにも設定できますが、-Gnome terminalにはそのような設定はありません。最近のUnicode編集で正直に言うと、8ビットエンコーディングはとにかくそれほど良い考えではありません。ただし、エスケープシーケンスにも問題はありません。 <Esc>j
の意味を区別する方法はありません Alt-j 対プレス Esc に続く j。
以前のターミナルの使用では、入力 Escj なしでキーボードでメタを送信する別の方法でした Meta キーですが、これはviがEscを使用して挿入モードを終了するのに適していません。
エスケープシーケンスをAltの組み合わせにマップするようにvimを構成することで、この問題を回避できます。
これを.vimrcに追加します。
let c='a'
while c <= 'z'
exec "set <A-".c.">=\e".c
exec "imap \e".c." <A-".c.">"
let c = nr2char(1+char2nr(c))
endw
set timeout ttimeoutlen=50
Alt-letterがターミナルのviとgvimで認識されるようになりました。 timeout
設定は、エスケープシーケンスのあいまいさを回避するために使用されます。 Esc そして j 50ミリ秒以内に送信された場合は<A-j>
にマッピングされ、50ミリ秒を超えると個別のキーとしてカウントされます。これは、メタエンコーディングと2つのキーのヒットを区別するのに十分な時間です。
他のマップされたキーシーケンス(デフォルトでは1秒後)でタイムアウトするtimoutを設定したくない場合は、代わりにttimeout
を使用できます。 ttimeoutはキーコードにのみ適用され、他のマッピングには適用されません。
set ttimeout ttimeoutlen=50
Gnome-terminal
の場合は、代わりに次を使用します。
imap ^[i <Esc>
^[i
は、Ctrl-v
Alt-i
を押して入力する必要があります
注意:他の場所にコピーする場合は、yank
およびput
をVim
に含める必要があります。 gedit
のようなエディターでマッピングをコピーするだけの場合、マッピングはおそらく壊れます。
[〜#〜] edit [〜#〜]は、Alt-k
がカーソルの上に空の行を追加し、Alt-j
が現在の行の後に空の行を追加する例ですライン。
" Alt-j/k to add a blank line
if has('gui_running')
" the following two lines do not work in vim, but work in Gvim
nnoremap <silent><A-j> :set paste<CR>m`o<Esc>``:set nopaste<CR>
nnoremap <silent><A-k> :set paste<CR>m`O<Esc>``:set nopaste<CR>
else
" these two work in vim
" shrtcut with alt key: press Ctrl-v then Alt-k
" ATTENTION: the following two lines should not be
" edited under other editors like gedit. ^[k and ^[j will be broken!
nnoremap ^[k :set paste<CR>m`O<Esc>``:set nopaste<CR>
nnoremap ^[j :set paste<CR>m`o<Esc>``:set nopaste<CR>
endif
同じことが私にも起こります。 「gnome terminal alt key」でGoogleを検索したところ、最初に見つかったリンクに「 gnome terminalでのalt-hotkeyの動作を無効にする方法 」とほぼ同じ質問が寄せられることがわかりました。 (2番目のリンクはこの質問のみです)
だから、多分あなたはそれを試すことができます:
Edit > Keyboard Shortcuts, and uncheck "Enable menu access keys"
試す
<m-i>
または、入力する場合 alti 文字を挿入します(私の場合と同様に、キャレットを挿入します:ˆ
)その文字にマップするだけです:
:inoremap ˆ <esc>
これは機能しないので注意してください(少なくとも私のシステムでは、MacOS 10.6)。キャレットは正確にキャレットではないため、文字を待ちます サーカムフレックス です。
http://vimdoc.sourceforge.net/htmldoc/map.html のセクション1.10をご覧ください。これはgnome-terminalが自動的にAlt修飾子をエスケープしているため、Vimが期待する方法で送信されたバイトを切り替えないことを示しているようです。このドキュメントは、別の端末(xtermなど)を使用する以外に、これを回避する方法は実際にはないことを示しているようです。
LinuxマシンもD(MacのコマンドまたはLinuxのスーパー)バインディングを使用できないことを確認できる限り、これは確かにイライラします。そのため、少なくともターミナルに関しては、ShiftおよびCtrl修飾子に制限されています。ターミナルVimでGvimで使用するすべてのコマンドを確実に使用できるようにしたい場合はイライラします(少なくともターミナルを切り替えずに、おそらく私は過度に頑固です-gnome-terminalは非常にきれいです)。私はこれを回避する方法を探していましたが、何も見つけることができませんでした。
ショートカットが実際にはGnomeデスクトップからのものである可能性があります。 Gnomeデスクトップで定義されたショートカットを表示および変更できるGnomeキーボードショートカットツール([システム]メニュー、[設定]、[キーボードショートカット])を見てください。キーの組み合わせがGnomeデスクトップの機能に割り当てられている場合は、それを削除すると、そのキーの組み合わせはVimに適切にフィルター処理されます。
または、端末の問題だと思うかもしれません。すべての端末がすべての主要なコンボをサポートするわけではありません。あなたの問題は、:h map-alt-keys
のVimヘルプドキュメントで説明されている問題である可能性があります。ドキュメントは回避策を提供しますが、非常に良いものではありません。