web-dev-qa-db-ja.com

AltキーのショートカットがVimのgnome端末で機能しない

私はgnome端末でVimを実行しています。しかし、Altキーのマッピングが機能していません。
例(これは単なる例です):

:imap <A-i> <Esc>

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

ありがとう

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

49
Jesse

問題

端末エミュレータが送信する方法は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
86
jpnp

Gnome-terminalの場合は、代わりに次を使用します。

imap ^[i <Esc>

^[iは、Ctrl-vAlt-iを押して入力する必要があります

注意:他の場所にコピーする場合は、yankおよびputVimに含める必要があります。 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
6
ying17zi

同じことが私にも起こります。 「gnome terminal alt key」でGoogleを検索したところ、最初に見つかったリンクに「 gnome terminalでのalt-hotkeyの動作を無効にする方法 」とほぼ同じ質問が寄せられることがわかりました。 (2番目のリンクはこの質問のみです)

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

Edit > Keyboard Shortcuts, and uncheck "Enable menu access keys"
2
aptx4869

試す

<m-i>

または、入力する場合 alti 文字を挿入します(私の場合と同様に、キャレットを挿入します:ˆ)その文字にマップするだけです:

:inoremap ˆ <esc>

これは機能しないので注意してください(少なくとも私のシステムでは、MacOS 10.6)。キャレットは正確にキャレットではないため、文字を待ちます サーカムフレックス です。

2
sidyll

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

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

1
metasoarous

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

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

1
Herbert Sitz