55

gnomeターミナルでVimを実行しています。ただし、Altキーのマッピングは機能していません。
例(これは単なる例です):

:imap <A-i> <Esc>

GVimでは正常に動作します。しかし、gnomeターミナルでVimを使用して同じコマンドを実行すると、機能しません。
ですから、問題は端末にあると思いますよね?
どうすれば修正できますか?

ありがとう

編集:同じマシンにWindows 7をインストールしていますが、Windowsターミナルでも問題なく動作します。

4

6 に答える 6

101

問題

端末エミュレーターがAltキーを送信する方法は2つあります(実際の端末にはAltがないため、通常はメタキーと呼ばれます)。Altを使用する場合は、8ビット文字を送信して上位ビットを設定するか、エスケープシーケンスを使用して。Alt-aとして送信することができます<Esc>a。Vimは、エスケープシーケンスではなく、8ビットエンコーディングを期待しています。

xtermなどの一部のターミナルエミュレータはどちらのモードも使用するように設定できますが、Gnomeターミナルはそのような設定を提供していません。最近のUnicode編集で正直に言うと、8ビットエンコーディングはとにかくあまり良い考えではありません。しかし、エスケープシーケンスも問題がないわけではありません。<Esc>jそれらは、意味Alt-jとプレスの後に。Escが続くことを区別する方法を提供しませんj

以前のターミナルの使用では、入力Escjはキーなしでキーボードにメタを送信する別の方法でしたが、これはviが挿入モードを終了するMetaために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エスケープシーケンスのあいまいさを回避するために使用されます。 Esc50ms以内にj送信されたものはにマップされ<A-j>、50msを超えると個別のキーとしてカウントされます。これは、メタエンコーディングと2つのキーを押すことを区別するのに十分な時間です。

他のマップされたキーシーケンスに対してタイムアウトするtimoutセット(デフォルトでは1秒後)が気に入らない場合は、ttimeout代わりに使用できます。ttimeoutはキーコードにのみ適用され、他のマッピングには適用されません。

set ttimeout ttimeoutlen=50
于 2012-04-18T19:23:36.570 に答える
8

の場合Gnome-terminalは、代わりに次を使用してください。

imap ^[i <Esc>

^[iを押して入力する必要がありますCtrl-v Alt-i

注意:他の場所にコピーしたい場合は、その必要がyankあります。のようなエディタでマッピングをコピーするだけでは、マッピングが壊れている可能性があります。putVimgedit

ここでのEDITAlt-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
于 2012-05-17T09:32:34.060 に答える
2

試す

<m-i>

または、入力altiすると文字が挿入されます(私の場合のように、キャレットが挿入されます:)。ˆその文字にマップするだけです。

:inoremap ˆ <esc>

これは機能しないので注意してください(少なくとも私のシステムでは、MacOS 10.6)。カレットは手紙を待ちます。それは正確にはカレットではないので、曲折アクセント記号です。

于 2011-07-21T16:00:14.470 に答える
2

同じことが私にも起こります。Googleで「gnometerminalaltkey」を検索したところ、最初のリンクで「gnometerminalでalt-hotkeyの動作を無効にするにはどうすればよいですか」という質問がほぼ同じであることがわかりました。(2番目のリンクはこの質問です)

だから、多分あなたはそれを試すことができます:

Edit > Keyboard Shortcuts, and uncheck "Enable menu access keys"
于 2012-06-23T00:54:55.437 に答える
1

ショートカットは実際にはGnomeデスクトップからのものである可能性があります。Gnomeデスクトップで定義されたショートカットを表示および変更できるGnomeキーボードショートカットツール([システム]メニュー、[設定]、[キーボードショートカット])を見てみてください。キーの組み合わせがGnomeDesktopの機能に割り当てられている場合は、それを削除すると、そのキーの組み合わせがVimに適切にフィルターされます。

または、それが端末の問題であるというのは正しいかもしれません。すべての端末がすべてのキーコンボをサポートしているわけではありません。問題は、のVimヘルプドキュメントに記載されている問題である可能性があります:h map-alt-keys。ドキュメントは回避策を提供しますが、あまり良いものではありません。

于 2011-07-21T18:00:49.177 に答える
1

http://vimdoc.sourceforge.net/htmldoc/map.htmlのセクション1.10をご覧ください。gnome-terminalがAlt修飾子を自動的にエスケープすることを示しているようです。そのため、Vimが期待する方法で送信されたバイトを切り替えません。このドキュメントは、別の端末(xtermなど)を使用する以外に、これを回避する方法が実際にはないことを示しているようです。

LinuxマシンもD(MacのコマンドまたはLinuxのスーパー)バインディングを使用できないため、これは確かに苛立たしいことです。少なくともターミナルに関しては、ShiftおよびCtrl修飾子に制限されています。ターミナルVimでGvimで使用するすべてのコマンドを確実に使用できるようにしたい場合はイライラします(少なくともターミナルを切り替えることなく、私はおそらく過度に頑固です-gnome-terminalは非常にきれいです)。私はこれを回避する方法を探していましたが、何も見つかりませんでした。

于 2012-01-23T02:50:22.137 に答える