Em um terminal, não é possível distinguir Ctrl+ Ae Ctrl+ Shift+ A, pois ambos emitem o mesmo código de tecla, então posso ver porque o Vim não pode fazer isso. Mas o gVim, sendo um aplicativo X, pode diferenciar Ctrl+ Ae Ctrl+ Shift+ A. Existe alguma maneira de mapear essas duas coisas de forma diferente?
Para começar, gostaria de fazer algo como o seguinte: Fazer "colar da área de transferência" funcionar como o terminal Gnome, mantendo Ctrl+ Vno modo visual.
:nmap <C-S-V> "+gP
vim
key-bindings
Kohsuke Kawaguchi
fonte
fonte
Respostas:
Gvim não faz isso porque vim não pode fazer isso (em circunstâncias normais). Desculpe, mas é assim que é.
Contudo...
Alguns terminais (por exemplo, xterm e iterm2) podem ser configurados para enviar uma sequência de escape arbitrária para qualquer combinação de chaves.
Por exemplo, adicione o seguinte
.Xresources
para xterm enviar<Esc>[65;5u
para CtrlShiftA. Você pode então mapear isso no Vim para<C-S-a>
. (65 é o valor decimal Unicode para shift-a e 5 é o bit para o modificador ctrl. O u neste caso significa "unicode".)iTerm e [u] rxvt também podem ser configurados para fazer isso (exemplos não fornecidos).
Mais informações: http://www.leonerd.org.uk/hacks/fixterms/
fonte
\n
. Use a barra invertida para dividir as linhas. Por exemplo, para mapear também <kbd> CSB </kbd> e <kbd> CSF </kbd>, use isto: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")
map <ESC>[66;5u :echo "ctrl-shift-b received"<CR>
para mapear ctrl-shift-b para imprimir uma mensagem na linha de status. No AskUbuntu havia um Q semelhante e eu resumi isso.xterm-256color
(os mais recentes) sofrem tantas limitações.xterm-256color
.Como já apontado, não há maneiras de mapear de forma
<C-S-A>
diferente de<C-A>
.No entanto, usando ferramentas como
autokey
(para linux e windows) ouautohotkey
(para windows), você pode remapear<C-S-A>
para enviar um toque de tecla diferente para aplicativos específicos.Por exemplo, no meu sistema, tenho esta configuração em
autokey
:Atribua a ele estas propriedades:
ctrl+shift+a
gnome-terminal-server.Gnome-terminal
Em seguida, você
~/.vimrc
pode criar um mapeamento para<S-F1>a
fazer o que quiser.Notas:
<S-F1>
como uma espécie de chave de líder para detecção<C-S>
. Isso acontecia porque meu terminal não aceitava chaves<F13>
-<F37>
etc. Se seu aplicativo for compatível, (gvim
eu acho) o uso dessas chaves é recomendado.vim
emgnome-terminal
. Então useiwindow class = gnome-terminal-server.Gnome-terminal
como filtro. Modifique-o para usargvim
se quiser.autokey
suporta um botão para capturar as propriedades de qualquer outra janela, como classe / título.fonte
apt install autokey-gtk
?bindsym --release Control+Shift+h exec --no-startup-id xdotool key --clearmodifiers comma w m h
que pressiona,wmh
quando eu pressiono<C-S-h>
, e então o vim sabe como lidar,wmh
<C-S-H>
quando pressiono isso.Se o que o incomoda é a perda da funcionalidade do CV existente, você pode usar o CQ. Veja: help CTRL-V-alternativo.
fonte
NeoVim agora oferece essa funcionalidade para seus clientes de terminal e gui. Veja : h nvim-features-new
fonte
<m-s-...>
variantes) que trabalham principalmente completamente fora da caixa.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.
há uma quebra de linha antes da parte "Diferenciar maiúsculas de minúsculas:", tornando isso ambíguo. Obrigado pela correção, @ JustinM.Keyes. Além disso, o vim 8.1 parece diferenciar entre<M-a>
e<M-A>
também.<c-s-l>
é perfeitamente diferenciado de<c-l>
inKonsole
sem nenhum incômodo extraDevido à maneira como a entrada do teclado é tratada internamente, isso infelizmente geralmente não é possível hoje, mesmo no GVIM. Algumas combinações de teclas, como Ctrl+ não alfabético, não podem ser mapeadas e Ctrl+ letra vs. Ctrl+ Shift+ letra não podem ser distinguidos. (A menos que seu terminal envie um código termcap distinto para ele, o que a maioria não faz.) No modo de inserção ou linha de comando, tente digitar a combinação de teclas. Se nada acontecer / for inserido, você não poderá usar essa combinação de teclas. Isso também se aplica a
<Tab>
/<C-I>
,<CR>
/<C-M>
/<Esc>
/<C-[>
etc. (a única exceção é<BS>
/<C-H>
.) Este é um ponto problemático conhecido e o assunto de várias discussões no vim_dev e no canal de IRC #vim.Algumas pessoas (principalmente Paul LeoNerd Evans) querem consertar isso (até mesmo para o console Vim em terminais que suportam isso) e lançaram várias propostas, cp. http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8
Mas até hoje, nenhum patch ou voluntário foi apresentado, embora muitos tenham expressado o desejo de tê-lo em uma versão futura do Vim.
fonte
Como você observou, você obtém o mesmo código de acesso. Portanto, a única maneira de distingui-los é verificar o estado da Shiftchave em sua função de tratamento de eventos. Obviamente, se houver mais de 0,5 segundo de atraso entre o pressionamento de tecla e o processamento, você perderá alguns acertos.
fonte