2009-10-01 17 views
57

En un terminal, no se puede distinguir Ctrl +Un y Ctrl +Shift +Un, ya que ambos emiten el mismo código de la llave, por lo que puedo ver por qué Vim no puede hacerlo. Pero gVim, siendo una aplicación X, puede diferenciar Ctrl +Un y Ctrl +Shift +Un. ¿Hay alguna manera de mapear esas dos cosas de manera diferente?Cómo asignar Ctrl + A y Ctrl + Shift + A de manera diferente?

Para empezar, me gustaría hacer algo como lo siguiente: Marca "pegar desde el portapapeles" obra como terminal de Gnome, manteniendo Ctrl +V al modo visual.

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

No tengo la respuesta a su pregunta, pero me gustaría mencionar que AMO el Hudson. –

+0

¡Gracias por usar Hudson! –

+1

Es posible: http://vim.wikia.com/wiki/Mapping_fast_keycodes_in_terminal_Vim – vivoconunxino

Respuesta

29

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


Sin embargo ...

Algunos terminales (por ejemplo, xterm y iterm2) se puede configurar para enviar una secuencia de escape arbitrario para cualquier combinación de teclas.

Por ejemplo, añada lo siguiente a .Xresources para xterm para enviar <Esc>[65;5u para CtrlShiftUn. A continuación, puede asignarlo en Vim al <C-S-a>. (65 es el valor Unicode decimal para cambio-a y 5 es el bit para el modificador ctrl. La T 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 puede configurar para hacer esto (ejemplos no proporcionados).

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

+0

Para reasignar varias claves, consulte [este documento] (http: //www.in-ulm.de/~ mascheck/X11/xterm/XTerm): entradas clave separadas con '\ n'. Use barra diagonal inversa para dividir líneas. P.ej. también mapear CSB y CSF uso esto: 'XTerm * vt100.translations: #override Ctrl ~ Meta Shift a: String (0x1b) cadena ("[65; 5u") \ n Ctrl ~ Meta Shift b : string (0x1b) cadena ("[66; 5U") \ n Ctrl ~ Shift Meta f: string (0x1b) cadena ("[70; 5U") ' – cfi

+0

para completarlo, tal vez añadir a la respuesta también cómo mapa esto en vi? P.ej. 'Mapa [66; 5u: echo "Ctrl-Shift-b recibido" ' para asignar Ctrl-Shift-b para imprimir un mensaje en la línea de estado. En AskUbuntu hubo una Q similar y he [resumido] (http://askubuntu.com/a/677070/28323) esto. – cfi

+0

¡Lo que necesitamos es una nueva especificación de terminal! 'xterm-256color' (el más reciente) sufre de tantas limitaciones. – Jezz

1

Como has notado, obtienes el mismo código de tecla. Entonces, la única forma de distinguirlos es verificar el estado de la tecla Shift 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 hits.

+1

Supongo que el punto de mi pregunta es que, dado que gvim es capaz de hacer esa distinción (aunque plain vim no puede), ¿hay alguna extensión específica de gvim en la que pueda confiar para diferenciar Ctrl + Shift + V frente a Ctrl + V. –

+6

cómo verificar el estado de la tecla Mierda? Busqué, pero no encontré nada remotamente útil. – bolov

4

Si lo que le molesta es perder funcionalidad C-V existente, se puede utilizar C-Q en su lugar. Ver,: ayuda CTRL-V-alternativa.

0

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

+2

No del todo, a menos que active los códigos de CSI en su terminal. El CTRL-SHIFT variantes que el apoyo Neovim _does_ fuera de la caja son en su mayoría caracteres no imprimibles (ejemplos enumerados en http://neovim.org/doc/user/vim_diff.html#nvim-features-new). Sin embargo, los meta * * acordes (incluyendo '' variantes) * * no funcionan en su mayoría completamente fuera de la caja. –

+0

gracias por aclarar y sigan el buen trabajo :) – OliverUv

1

Como ya se ha señalado, no hay formas de asignar <C-S-A> diferente a <C-A>.

Sin embargo, utilizando herramientas como autokey (para Linux & ventanas) o autohotkey (para Windows), puede volver a asignar <C-S-A> para enviar una clave de carrera (s) diferente para aplicaciones específicas.

p. Ej.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. 

asignarle estas propiedades:

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

Luego, su ~/.vimrc puede crear una asignación para <S-F1>a para hacer lo que quiera.


Notas:

  1. he utilizado <S-F1> como una especie de líder clave para detectar <C-S>. Esto fue porque mi terminal no aceptaba las claves <F13> - <F37> etc. Si su aplicación lo admite, (gvim creo) se recomienda usar esas claves.
  2. Principalmente vim en gnome-terminal. Entonces usé window class = gnome-terminal-server.Gnome-terminal como filtro. Modifíquelo para usar gvim si lo desea. autokey admite un botón para capturar las propiedades de cualquier otra ventana como clase/título.
+0

Gracias montones. Hay muchas cosas sobre el uso de Autokey para la reasignación de teclas, pero no hay instrucciones reales sobre cómo hacerlo. Finalmente tu respuesta hace eso. No puedo creer que nadie más te haya votado. – pickle323

+0

Dios maldito autokey! Hice todo lo que pude, pero no pude instalarlo en mi ubuntu 16.04. –

+0

'apt install autokey-gtk'? – anishsane

0

Debido a la forma en que se maneja la entrada del teclado internamente, esto por desgracia no es posible hoy en día, incluso en GVIM. Algunas combinaciones de teclas, como Ctrl + no alfabético no pueden ser mapeados y Ctrl + letra vs Ctrl +Shift + carta no se pueden distinguir. (A menos que su terminal envíe un código distintivo termcap, que la mayoría no). En el modo de inserción o línea de comando, intente escribir la combinación de teclas. Si no ocurre nada/está insertado, no puede usar esa combinación de teclas. Esto también se aplica a <Tab>/<C-I>, <CR>/<C-M>/<Esc>/<C-[> etc. (única excepción es <BS>/<C-H>.) Este es un punto de dolor conocido, y el objeto de diversos debates sobre vim_dev y el canal #vim IRC.

Algunas personas (especialmente Paul LeoNerd Evans) quieren arreglar eso (incluso para la consola Vim en terminales que lo soportan), y han publicado 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 o voluntarios, aunque muchos han expresado su deseo de tener esto en una futura versión de Vim.

Cuestiones relacionadas