Ctrl + AとCtrl + Shift + Aを異なるようにマッピングする方法は?


92

端末ではCtrl+ ACtrl+ Shift+ Aを区別できません。どちらも同じキーコードを発行するため、Vimがそれを実行できない理由がわかります。しかし、gVimはXアプリケーションであるため、Ctrl+ ACtrl+ Shift+を区別できますA。これら2つを異なる方法でマッピングする方法はありますか?

手始めに、私は次のようなことをしたいと思います:Ctrl+ Vをビジュアルモードに保ちながら、「クリップボードから貼り付け」をGnomeターミナルのように機能させます。

:nmap <C-S-V> "+gP


3
@vivoconunxinoこのリンクでは、ctrl-aにシフト修飾子を追加することについて言及されていません。
graywh 2014年

回答:


46

vimは(通常の状況では)実行できないため、Gvimは実行しません。申し訳ありませんが、それだけです。


しかしながら...

一部の端末(xtermやiterm2など)は、キーの任意の組み合わせに対して任意のエスケープシーケンスを送信するように構成できます。

たとえば、次のようにを追加.Xresources送信するためのxtermのため<Esc>[65;5uのためにCtrlShiftA。次に、Vimでそれをにマッピングでき<C-S-a>ます。(65はshift-aの10進数のUnicode値で、5はctrl修飾子のビットです。この場合のuは「unicode」を表します。)

! .Xresources
XTerm*vt100.translations: #override Ctrl ~Meta Shift <Key>a: string(0x1b) string("[65;5u")

iTermおよび[u] rxvtは、これを行うように構成することもできます(例は提供されていません)。

詳細:http : //www.leonerd.org.uk/hacks/fixterms/


複数のキーを再マッピングするには、次のドキュメントを参照しください:キーエントリをで区切ります\n。行を分割するにはバックスラッシュを使用します。例えばまた、マップする<KBD> CSB </ KBD>および<KBD> CSF </ KBD>この使用:XTerm*vt100.translations: #override Ctrl ~Meta Shift <Key>a: string(0x1b) string("[65;5u") \n Ctrl ~Meta Shift <Key>b: string(0x1b) string("[66;5u") \n Ctrl ~Meta Shift <Key>f: string(0x1b) string("[70;5u")
CFI

完全を期すために、多分これをviにマッピングする方法も答えに追加しますか?たとえばmap <ESC>[66;5u :echo "ctrl-shift-b received"<CR>、ステータス行にメッセージを出力するためにctrl-shift-bをマップします。AskUbuntuにも同様のQがあり、私はこれを要約しました。
cfi、2015

必要なのは新しいターミナル仕様です!xterm-256color(最新)には、多くの制限があります。
ジェローム・Pouiller

@Jezz制限はのtermcapファイルではなく、termcap自体にありますxterm-256color
graywh 16

確かに@graywh、termcapのに新機能が必要であろう
ジェローム・Pouiller

9

すでに指摘したように、<C-S-A>と異なるマッピングを行う方法はありません<C-A>

ただし、autokey(LinuxおよびWindowsの場合)またはautohotkey(Windowsの場合)などのツールを使用して<C-S-A>、特定のアプリケーションに異なるキーストロークを送信するように再マッピングできます。

例えば私のシステムでは、私はこの設定を持っていますautokey

$ cat ~/.config/autokey/data/gnome-terminal/ctrlshifta-gnome-terminal.py
#ctrl+shift+a sends '<S-F1>a'
keyboard.send_keys("<shift>+<f1>a") # Note that `f` in `f1` needs to be in lower case.

次のプロパティを割り当てます。

  1. キーボードショートカットとして ctrl+shift+a
  2. ウィンドウクラス: gnome-terminal-server.Gnome-terminal

次に、~/.vimrcマッピングを作成<S-F1>aして、好きなことを行うことができます。


ノート:

  1. 私は<S-F1>検出のための一種のリーダーキーとして使用しました<C-S>。これは、私の端末が<F13>- <F37>などのキーを受け入れなかったためです。アプリケーションがそれをサポートしている場合、(gvim私はそう思います)それらのキーを使用することをお勧めします。
  2. 私は主vimgnome-terminalwindow class = gnome-terminal-server.Gnome-terminalフィルターとして使用しました。必要にgvim応じて変更してください。autokeyクラス/タイトルのような他のウィンドウのプロパティをキャプチャするためのボタンをサポートします。

どうもありがとう。Autokeyを使用してキーの再マッピングを行う方法はたくさんありますが、実際の手順はありません。最後にあなたの答えはそれを行います。他の誰もあなたを賛成していないなんて信じられない。
pickle323 2017

1
くそったれオートキー!できる限りのことはしましたが、ubuntu 16.04にインストールできませんでした。
yukashima huksay 2017

apt install autokey-gtk
anishsane 2017

1
追加のソフトウェアをインストールする前に、ウィンドウマネージャーが直接これを処理するかどうかを確認する必要があります。例えば、i3は私の.configでこれがありますbindsym --release Control+Shift+h exec --no-startup-id xdotool key --clearmodifiers comma w m h、そのプレス,wmh私が押したときに<C-S-h>、その後、Vimはどのように処理するかを知っている,wmh
MatrixManAtYrService

^^これも良いです。ただし、キー変換をgnome-terminalまたはgvimのみに制限したかったのです。他のアプリではありません。他のアプリケーションは<C-S-H>、それを押しても受信し続けるはずです。
anishsane 2018年


3

NeoVimは現在、ターミナルとGUIクライアントの両方にこの機能を提供しています。:h nvim-features-newを参照してください


3
端末でCSIコードを有効にしない限り、不正解です。Neovim 最初からサポートしているCTRL-SHIFTバリアントは、ほとんどが印刷不可能な文字です(例はneovim.org/doc/user/vim_diff.html#nvim-features-newにリストされています)。しかし、メタ(含む和音<m-s-...>変種)がない、ほとんど箱の外に完全に動作します。
Justin M. Keyes、2015

その文書はALT (|META|) chords always work (even in the |TUI|). Map |<M-| with any key: <M-1>, <M-BS>, <M-Del>, <M-Ins>, <M-/>, <M-\>, <M-Space>, <M-Enter>, etc. Case-sensitive: <M-a> and <M-A> are two different keycodes.、「Case-sensitive:」の前に改行があるため、これがあいまいになっていると述べています。修正をありがとう、@ JustinM.Keyes。また、区別するためにVIM 8.1が現れる<M-a><M-A>同様。
Adam Katz

@ justin-m-keyes <c-s-l>は、特別な手間<c-l>をかけKonsoleずに完全に区別されます
スラバ

3

キーボード入力が内部的に処理される方法のため、これは残念ながら、GVIMでさえ今日は一般的に不可能です。Ctrl+非アルファベットのようないくつかのキーの組み合わせはマッピングできず、Ctrl+文字とCtrl+ Shift+文字を区別できません。(端末がそのための明確なtermcapコードを送信しない限り、ほとんどはそれを行いません。)挿入モードまたはコマンドラインモードで、キーの組み合わせを入力してみてください。何も起こらない、または挿入された場合、そのキーの組み合わせは使用できません。これは<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の将来のリリースで使用したいという要望を表明しています。


1

お気づきのように、同じキーコードを取得します。したがって、それらを区別する唯一の方法Shiftは、イベント処理関数でキーの状態を確認することです。もちろん、キーを押してから処理するまでに0.5秒を超える遅延があると、一部のヒットが失われます。


1
私の質問のポイントは、gvimがそのような区別を行うことができることを考えると(プレーンvimはできないとしても)、Ctrl + Shift + VとCtrl + Vを区別するために信頼できるgvim固有の拡張があるかどうかです。
河口浩輔

9
たわごとのキーの状態を確認する方法?私は検索しましたが、リモートで役立つものは何も見つかりませんでした。
bolov 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.