¿Cómo puedo crear un modo de pseudoinserción con un mapa de teclas diferente?

9

Estoy en la posición ligeramente inusual de usar dos diseños de teclado diferentes de forma regular ( Programmers-Dvorak y Turkish-F ). Estos diseños son bastante diferentes entre sí y solo soy capaz de dominar vim con un conjunto de recuerdos musculares. Soy bastante competente con los comandos vim en el diseño Dvorak, pero es casi imposible de usar si mi teclado está en el diseño turco-F. Desafortunadamente, edito regularmente archivos en inglés y turco e incluso en idiomas mixtos. Mi dominio es tal que puedo escribir bien cualquier idioma en su respectivo diseño de teclado, pero mi cerebro se niega a conectarlos y escribir incluso algunas letras de una palabra en turco desde el diseño de Dvorak o viceversa.

Tengo enlaces de saludo de dos teclas para cambiar el diseño en Xorg, pero incluso esto me deja con un flujo de trabajo incómodo en vim cuando edito archivos de idiomas mixtos:

<vim commands…>i<switch to tr>…content…<escape><switch to en><vim commands…>

Me gustaría poder acortar esto a algo como:

<vim commands…><leader>i…content…<escape><vim commands…>

... de modo que el uso <leader>iestablece un conjunto de :imapvalores para emular el diseño turco sin cambiar el diseño del teclado del sistema. Al mismo tiempo, icambiaría al modo de inserción pero sin los :imapvalores adicionales . Los valores en sí mismos son fáciles, solo necesito las asignaciones del alfabeto como estas:

:imap a u
:imap A U
:imap o i
:imap O İ
"etc.

La pregunta es, ¿Cómo configurar dos modos de inserción, un modo de inserción normal y un seudo modo de inserción que es idéntica a excepción de un grupo de asignaciones, y cómo puedo activar estos modos con <leader>i, <leader>a, etc.?

Caleb
fuente
1
Aquí hay una idea diferente: tiene los autocmds InsertEntery InsertLeave, que puede usar para cambiar diseños automáticamente. Específicamente, en el InsertLeavepuede verificar si es turco, si es así, cambie a Dvorak, establezca una bandera, y cuando ingrese insertar nuevamente, vuelva a cambiar a turco si ese fue el caso la última vez que dejó el modo de inserción.
Martin Tournoij
@Carpetsmoker No veo cómo eso soluciona mis problemas. Incluso si hubiera algo que "verificar" (no estoy seguro de lo que crees que estaría revisando allí ... parte del problema es que voy de ida y vuelta palabra por palabra), una de las razones por las que estaba pensando en la línea de :imapque funcionaría incluso en una sesión ssh remota o cuando $DISPLAYno está configurado de otra manera.
Caleb

Respuestas:

7

Vim tiene algo como esto en forma de mapas de teclas . De :help mbyte-keymap:

When the keyboard doesn't produce the characters you want to enter in your
text, you can use the 'keymap' option.  This will translate one or more
(English) characters to another (non-English) character.  This only happens
when typing text, not when typing Vim commands.  This avoids having to switch
between two keyboard settings.

El bloqueo de mayúsculas solo en modo de inserción describe dicha asignación para la emulación de bloqueo de mayúsculas; Como puede ver allí, el archivo de asignaciones es similar a lo que describe en su pregunta.

Habilita esta configuración vía :set iminsert=1o dinámicamente vía i_CTRL-^. También funciona /searchcon la 'imsearch'opción.

Ingo Karkat
fuente
3

La respuesta de Ingo Karkat parece que fue exactamente la solución correcta y ha resuelto mi situación. Sin embargo, aquí hay un poco más de instrucciones detalladas para cualquier persona que recién esté comenzando con las funciones del mapa de idiomas de vim.

Primero, necesita un archivo de mapa de idiomas. Como en el ejemplo de Bloqueo de mayúsculas, querrás poner algo como lo siguiente ~/.vim/keymap/dvorak2turkishf.vim(descarga mi mapeo completo de Githu b):

let b:keymap_name = "dvorak2turkishf"
loadkeymap
; f
, g
. ğ
p ı
y o
f d
g r
" etc...

Con eso en su lugar, queda por configurar enlaces para activarlo en algunos casos, pero no en otros. Querrás agregar algo a tu ~/.vimrcarchivo.

Primero, vincule el mapa de teclas de búsqueda al de entrada:

set imsearch=-1

Luego establezca qué mapa de teclas se usará para el modo de entrada en otro idioma:

set keymap=dvorak2turkishf

Desactive el modo de entrada alternativo para que, por defecto, no haya cambios:

set iminsert=0

Configure un comando automático para que se ejecute siempre que salga del modo de inserción para desactivar el interruptor de idioma alternativo:

autocmd InsertLeave * set iminsert=0

Agregue enlaces para todas las diversas formas en que puede terminar en el modo de entrada de idioma alternativo para que al usar <leader>(Generalmente \) antes de ellos, active el mapa de idioma antes de cambiar:

nnoremap <leader>i :set iminsert=1<Cr>i
nnoremap <leader>I :set iminsert=1<Cr>I
nnoremap <leader>a :set iminsert=1<Cr>a
nnoremap <leader>A :set iminsert=1<Cr>A
nnoremap <leader>c :set iminsert=1<Cr>c
nnoremap <leader>C :set iminsert=1<Cr>C
nnoremap <leader>r :set iminsert=1<Cr>r
nnoremap <leader>R :set iminsert=1<Cr>R
nnoremap <leader>o :set iminsert=1<Cr>o
nnoremap <leader>O :set iminsert=1<Cr>O

Establezca un color de cursor diferente para cuando el mapa esté habilitado:

:highlight Cursor guifg=NONE guibg=Green
:highlight lCursor guifg=NONE guibg=Cyan

Todos juntos, esto es lo que cambió en mi configuración . Como nota final, una vez que esté en modo de inserción puede activar y desactivar la opción de mapa de idioma usando <ctrl>+^.

Caleb
fuente