2009-10-01 156 views
57

在一個終端,一個不能區分Ctrl鍵 + Ctrl鍵 + + ,因爲它們都發射相同的鍵碼,所以可以看到爲什麼Vim可以不這樣做。但是gVim的,作爲一個X應用程序,可以分化Ctrl鍵 + Ctrl鍵 + + 。有什麼辦法以不同的方式映射這兩種東西嗎?如何以不同方式映射Ctrl + A和Ctrl + Shift + A?

對於初學者來說,我想這樣做如下:請「從剪貼板粘貼」像GNOME終端工作,同時保持按Ctrl +V視覺模式。

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

我沒有你的問題的答案,但我想提一提,我愛哈德森。 – 2009-10-01 22:21:02

+0

感謝您使用哈德森! – 2009-10-04 00:48:18

+1

這是可能的:http://vim.wikia.com/wiki/Mapping_fast_keycodes_in_terminal_Vim – vivoconunxino 2013-12-27 15:43:24

回答

29

Gvim不這樣做,因爲vim不能這樣做(在正常情況下)。對不起,但那只是它。


然而...

某些終端(例如,xterm和iterm2)可以被配置爲發送一個任意轉義序列爲鍵的任意組合。

例如,添加以下.Xresources xterm的發送<Esc>[65;5uCtrl鍵移位。然後你可以將它映射到Vim中<C-S-a>。 (65是用於移位一十進制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/

+0

要重新映射多個密鑰,請查看[本文檔](http://www.in-ulm。de /〜mascheck/X11/xterm/XTerm):用'\ n'分隔鍵入。使用反斜槓來分割線條。例如。也映射CSBCSF使用這樣的:'的XTerm * vt100.translations:#override Ctrl鍵〜元移位一個:字符串(0x1b)字符串( 「[65; 5U」)\ n Ctrl鍵〜元移位 b :string(0x1b)string(「[66; 5u」)\ n Ctrl〜Meta Shift f:string(0x1b)string(「[70; 5u」)' – cfi 2015-09-22 12:47:13

+0

爲了完整起見,在vi中映射這個?例如。 'map [66; 5u:echo'ctrl-shift-b received''映射ctrl-shift-b在狀態行中打印消息。在AskUbuntu上有類似的問題,我已經總結了這個(http://askubuntu.com/a/677070/28323)。 – cfi 2015-09-22 13:08:33

+0

我們需要的是一個新的終端規格! 'xterm-256color'(最近的)受到如此多的限制。 – Jezz 2016-12-14 10:36:54

1

正如您所指出的,您將獲得相同的密鑰代碼。因此,區分它們的唯一方法是檢查事件處理函數中的Shift鍵的狀態。當然,如果您在按鍵和處理之間的延遲超過0.5秒,您將錯過一些點擊。

+1

我猜我的問題是,鑑於gvim能夠做出這樣的區分(即使普通的vim不能),是否有任何gvim特定的擴展,我可以依靠區分Ctrl + Shift + V與Ctrl + V. – 2009-10-04 00:49:57

+6

如何檢查Shit鍵的狀態?我搜查了一下,但沒有發現任何有用的東西。 – bolov 2014-08-23 07:05:11

4

如果有什麼困擾你的是失去現有的C-V的功能,你可以使用C-Q代替。請參閱::幫助CTRL-V-alternative。

0

NeoVim現在爲其終端和gui客戶端提供此功能。請參閱:h nvim-features-new

+2

不完全,除非您在終端中啓用CSI代碼。 Neovim _does_支持的CTRL-SHIFT變體大部分是不可打印的字符(在http://neovim.org/doc/user/vim_diff.html#nvim-features-new上列出的例子)。然而,* meta *和絃(包括''變體)* do *主要完全開箱即用。 – 2015-04-14 22:59:50

+0

謝謝澄清和保持良好的工作:) – OliverUv 2015-04-16 12:51:11

1

正如已經指出的,沒有辦法映射<C-S-A><C-A>不同。

但是,使用工具,如autokey(對於Linux & Windows)或autohotkey(適用於Windows),您可以重新映射<C-S-A>發送針對特定應用不同的按鍵行程(S)。

例如在我的系統,我在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-terminal。所以我用window class = gnome-terminal-server.Gnome-terminal作爲過濾器。如果需要,修改它以使用gvimautokey支持一個按鈕來捕獲任何其他窗口的屬性,如類/標題。
+0

謝謝堆。 Theres有很多關於使用Autokey進行關鍵映射的東西,但沒有關於如何執行的實際說明。最後你的答案就是這樣。我不能相信沒有人贊成你。 – pickle323 2017-12-13 06:45:31

+0

上帝該死的自動鑰匙!我盡我所能,但我無法將它安裝在我的Ubuntu 16.04上。 – 2017-12-30 08:51:51

+0

'安裝autokey-gtk'? – anishsane 2017-12-30 12:07:58

0

由於鍵盤輸入在內部處理的方式,因此即使在GVIM中,今天這種情況通常也是不可能的。一些組合鍵,像按Ctrl +非字母不能被映射,並按Ctrl +信與按Ctrl ++信無法區分。 (除非你的終端發送了一個明確的termcap代碼,但大部分都沒有。)在插入或命令行模式下,嘗試輸入組合鍵。如果沒有任何事情發生/插入,則不能使用該組合鍵。這也適用於<Tab>/<C-I><CR>/<C-M>/<Esc>/<C-[>等(僅例外是<BS>/<C-H>)。這是一個已知的痛點,並在vim_dev各種討論和#vim IRC頻道的主題。

有些人(最重要的是保LeoNerd埃文斯)要解決這個問題(即使控制檯Vim的支持此終端),並已飄來各種建議,CP。 http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8

但是到了今天,還沒有補丁或者志願者尚未出面,儘管很多人都表達了在未來的Vim發佈中有這樣的願望。

相關問題