¿Cómo mapear Ctrl + A y Ctrl + Shift + A de manera diferente?

92

En una terminal, uno no puede distinguir Ctrl+ Ay Ctrl+ Shift+ Aya que ambos emiten el mismo código clave, entonces puedo ver por qué Vim no puede hacerlo. Pero gVim, al ser una aplicación X, puede diferenciar Ctrl+ Ay Ctrl+ Shift+ A. ¿Hay alguna forma de mapear esas dos cosas de manera diferente?

Para empezar, me gustaría hacer algo como lo siguiente: Hacer que "pegar desde el portapapeles" funcione como la terminal de Gnome, manteniendo Ctrl+ Ven el modo visual.

:nmap <C-S-V> "+gP
Kohsuke Kawaguchi
fuente
3
@vivoconunxino Ese enlace no menciona la adición de un modificador de cambio a ctrl-a.
graywh

Respuestas:

47

Gvim no lo hace porque vim no puede hacerlo (en circunstancias normales). Lo siento, pero así es.


Sin embargo...

Algunos terminales (por ejemplo, xterm e iterm2) se pueden configurar para enviar una secuencia de escape arbitraria para cualquier combinación de teclas.

Por ejemplo, añada lo siguiente al .Xresourcesde xterm para enviar <Esc>[65;5ua CtrlShiftA. Luego puede mapear eso en Vim a <C-S-a>. (65 es el valor decimal Unicode para shift-ay 5 es el bit para el modificador ctrl. La u en este caso significa "unicode").

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

iTerm y [u] rxvt también se pueden configurar para hacer esto (no se proporcionan ejemplos).

Más información: http://www.leonerd.org.uk/hacks/fixterms/

graywh
fuente
Para reasignar varias claves, consulte este documento : Separe las entradas de clave con \n. Use barra invertida para dividir líneas. Por ejemplo, para mapear también <kbd> CSB </kbd> y <kbd> CSF </kbd> use esto: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
En aras de la integridad, tal vez agregue a la respuesta también cómo mapear esto en vi. Por ejemplo, map <ESC>[66;5u :echo "ctrl-shift-b received"<CR>asignar ctrl-shift-b para imprimir un mensaje en la línea de estado. En AskUbuntu había una Q similar y he resumido esto.
cfi
¡Lo que necesitamos es una nueva especificación de terminal! xterm-256color(los más recientes) sufren de tantas limitaciones.
Jérôme Pouiller
@Jezz Las limitaciones son con termcap en sí, no con el archivo termcap para xterm-256color.
graywh
@graywh Claro, serían necesarias nuevas funciones para termcap
Jérôme Pouiller
9

Como ya se señaló, no hay formas de mapear de manera <C-S-A>diferente a <C-A>.

Sin embargo, al usar herramientas como autokey(para Linux y Windows) o autohotkey(para Windows), puede reasignar <C-S-A>para enviar una pulsación de tecla diferente para aplicaciones específicas.

por ejemplo, en mi sistema, tengo esta configuración en 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.

Asígnele estas propiedades:

  1. atajo de teclado como ctrl+shift+a
  2. clase de ventana: gnome-terminal-server.Gnome-terminal

Entonces ~/.vimrcpuedes crear mapas para <S-F1>ahacer lo que quieras.


Notas:

  1. La he utilizado <S-F1>como una especie de clave líder para la detección <C-S>. Esto fue debido a mi terminal no aceptó <F13>- <F37>etc llaves. Si su aplicación lo admite, ( gvimcreo que) se recomienda usar esas teclas.
  2. Yo principalmente vimen gnome-terminal. Entonces lo usé window class = gnome-terminal-server.Gnome-terminalcomo filtro. Modifíquelo para usarlo gvimsi lo desea. autokeyadmite un botón para capturar las propiedades de cualquier otra ventana como clase / título.
anishsane
fuente
Montones de gracias. Hay muchas cosas sobre el uso de Autokey para la reasignación de claves, pero no hay instrucciones reales sobre cómo hacerlo. Finalmente tu respuesta hace eso. No puedo creer que nadie más te haya votado a favor.
pickle323
1
¡Maldito autokey! Hice todo lo que pude, pero no pude instalarlo en mi ubuntu 16.04.
yukashima huksay
apt install autokey-gtk?
anishsane
1
Antes de instalar software adicional, puede verificar si su administrador de ventanas maneja esto directamente. Por ejemplo, en i3 mi .config tiene esto:, bindsym --release Control+Shift+h exec --no-startup-id xdotool key --clearmodifiers comma w m hque presiona ,wmhcuando presiono <C-S-h>, y luego vim sabe cómo manejar,wmh
MatrixManAtYrService
^^ Esto también es bueno. Sin embargo, quería limitar la traducción de claves a solo gnome-terminal o gvim. No otras aplicaciones. Otras aplicaciones deberían continuar recibiendo <C-S-H>cuando presione eso.
anishsane
5

Si lo que le molesta es perder la funcionalidad de CV existente, puede usar CQ en su lugar. Ver,: ayuda CTRL-V-alternativa.

Anurag Priyam
fuente
3

NeoVim ahora ofrece esta funcionalidad tanto para su terminal como para sus clientes gui. Ver : h nvim-features-new

OliverUv
fuente
3
No del todo, a menos que habilite los códigos CSI en su terminal. El CTRL-SHIFT variantes que Neovim no admite fuera de la caja son en su mayoría caracteres no imprimibles (ejemplos enumerados en neovim.org/doc/user/vim_diff.html#nvim-features-new ). Sin embargo, los meta acordes (incluyendo <m-s-...>variantes) no trabajan sobre todo por completo fuera de la caja.
Justin M. Keyes
Ese documento dice 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.Hay un salto de línea antes de la parte "Sensible a mayúsculas y minúsculas:", lo que hace que esto sea ambiguo. Gracias por la corrección, @ JustinM.Keyes. Además, vim 8.1 parece diferenciar entre <M-a>y <M-A>también.
Adam Katz
@ justin-m-keyes <c-s-l>se distingue perfectamente de <c-l>adentro Konsolesin ningún problema adicional
Slava
3

Debido a la forma en que la entrada del teclado se maneja internamente, desafortunadamente esto no es posible hoy en día, incluso en GVIM. Algunas combinaciones de teclas, como Ctrl+ no alfabético, no se pueden asignar y no se pueden distinguir Ctrl+ letra frente a Ctrl+ Shift+ letra. (A menos que su terminal envíe un código termcap distinto , que la mayoría no lo hace). En el modo de inserción o de línea de comandos, intente escribir la combinación de teclas. Si no pasa nada / no se inserta, no puede usar esa combinación de teclas. Esto también se aplica a <Tab>/ <C-I>, <CR>/ <C-M>/ <Esc>/ <C-[>etc. (La única excepción es <BS>/ <C-H>.) Este es un punto débil conocido y es objeto de varias discusiones sobre vim_dev y el canal de IRC #vim.

Algunas personas (sobre todo Paul LeoNerd Evans) quieren arreglar eso (incluso para la consola Vim en terminales que lo admitan), y han presentado varias propuestas, cp. http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8

Pero a partir de hoy, aún no se han presentado parches ni voluntarios, aunque muchos han expresado el deseo de tener esto en un futuro lanzamiento de Vim.

Ingo Karkat
fuente
1

Como ha notado, obtiene el mismo código clave. Entonces, la única forma de distinguirlos es verificar el estado de la Shiftclave en su función de manejo de eventos. Por supuesto, si tiene más de 0,5 segundos de retraso entre la pulsación de tecla y el procesamiento, perderá algunos golpes.

Javier
fuente
1
Supongo que el punto de mi pregunta fue que dado que gvim es capaz de hacer tal distinción (aunque vim simple no puede), ¿existe alguna extensión específica de gvim en la que pueda confiar para diferenciar Ctrl + Shift + V vs Ctrl + V .
Kohsuke Kawaguchi
9
¿Cómo comprobar el estado de la llave Shit? Busqué, pero no encontré nada ni remotamente útil.
bolov