¿Cuál es la forma más conveniente de trabajar con diferentes teclados en vim?

18

A veces necesito escribir palabras griegas, pero cuando estoy usando el teclado griego, presionar, digamos, <C-p>se entenderá como <C-π>y no como el comando que pretendo. Esto se puede solucionar con :map <C-p> <C-π>. ¿Puedo hacer esto para todas las letras sin hacer una lista de todas?

PD. Hacer una lista de todos no produce un resultado perfecto. Por ejemplo, qestá ;en el Gr. teclado, pero no queremos mapear; a q. Además, por alguna razón, ΖΖ (zeta zeta) no funciona después :map Ζ Z. Y un comando que definí, \lwno funciona como \λς.

Toothrot
fuente
2
Creo que el mapeo no es el mejor camino a seguir: tal vez lo que estás buscando es la langmapopción (ver el documento que incluye un ejemplo de diseño griego). Esta opción fue hecha para ayudar a tratar con teclados no latinos como el griego o el cirílico. Le permite definir pares de símbolos que se interpretarán normalmente en el modo de inserción pero se reemplazarán en otros modos, tal vez esto lo ayude.
statox
@statox: ¡Gracias! Traté de usar el ex. Pero nada pasó. La ayuda dice que vim tuvo que cumplirse con la opción + langmap. ¿Hay una manera fácil de verificar si fue así? Estoy usando la versión que viene con Mac OS.
Toothrot
1
Puedes usar :echo has('langmap')si obtienes un, 1lo tienes si obtienes uno 0que no.
statox
@statox: ¡Gracias! Actualicé brew install vim --override-system-viy :echo has &cahora devuelve 1. ZZ funciona. El problema con \lv& c persiste.
Toothrot
No entiendo la :echo has &cparte, no veo cómo está relacionada langmaptambién una vez que ha compilado vim con langmapusted, debe especificar las asignaciones :set langmap=ΑA,ΒB,ΨC [...]en su vimrc.
statox

Respuestas:

6

Lo recomendaría keymap, lo que puede resolver su problema. Pon estos en tu vimrc

" set keymap=greek_utf-8
set iminsert=0
set imsearch=-1

para deshabilitar el griego por defecto. Puede alternar la opción en (Griego) y en (Inglés) usando <ctrl>+^(también puede usar <ctrl>+6, se asigna en la tecla, no en el símbolo) en el modo de inserción y el modo Reemplazar (no funciona en Modo normal). Para deshabilitar automáticamente al salir del modo de inserción, puede usar

inoremap <ESC> <ESC>:set iminsert=0<CR>

Más sobre estos

:h iminsert :h keymap :h imsearch :h i_CTRL-^


EDITAR al segundo comentario:

Puede intentar esto para activar el griego automáticamente, si ingresa al modo de inserción (y al modo de reemplazo), y para desactivar automáticamente, si se va (entonces no necesita la asignación mencionada anteriormente).

augroup Greek
    au InsertEnter * set iminsert=1
    au InsertLeave * set iminsert=0
augroup END
ryuichiro
fuente
¿Es realmente necesario usar griego politónico? Me parece que solo se necesita la codificación correcta, y luego usar la entrada incorporada de MacOS X. Pero esta es probablemente mi impresión equivocada. También puede cambiar al teclado griego politónico en MacOS X (y aprenderlo, pero supongo que no es lo que busca :-) Sobre el retraso de ἀ, puede haber algún mapeo, intente averiguarlo :map >a, y si hay , desasignarlo por :unmap >a. Como usuario no griego y no MacOs, ya estoy al límite. Lo siento y buena suerte!
ryuichiro
10

Como dije en los comentarios, las asignaciones no están diseñadas para hacer lo que quieres hacer. Una opción interesante para este caso de uso es langmap.

Esta opción permite mantener el comportamiento de su teclado en modo de inserción y cambiar su comportamiento en los otros modos.

Para usarlo, se debe compilar con Vim +langmap, puede verificar que esta opción esté habilitada con echo has('langmap'): si el comando devuelve 1la opción está habilitada, de lo contrario, tendrá que configurarla con esta opción habilitada (para saber cómo hacerlo, se Es otra pregunta).

Cuando está habilitada, la opción toma pares de caracteres, por ejemplo, set langmap += à@le permitirá agregar un àen su búfer cuando esté en modo de inserción y escriba a, àpero escribir àen modo normal en realidad activará un @(este ejemplo puede ser útil en azerty teclados para facilitar el trabajo con macros).

Para usar langmap en griego, puede seguir el ejemplo dado al :h 'langmap'agregar esta línea a su vimrc (Copiar esta línea desde aquí puede no ser una buena idea ya que realmente no estoy seguro de la codificación, es probable que extraer la línea directamente del archivo de ayuda más seguro) :

:set langmap=ΑA,ΒB,ΨC,ΔD,ΕE,ΦF,ΓG,ΗH,ΙI,ΞJ,ΚK,ΛL,ΜM,ΝN,ΟO,ΠP,QQ,ΡR,ΣS,ΤT,ΘU,ΩV,WW,ΧX,ΥY,ΖZ,αa,βb,ψc,δd,εe,φf,γg,ηh,ιi,ξj,κk,λl,μm,νn,οo,πp,qq,ρr,σs,τt,θu,ωv,ςw,χx,υy,ζz

Ahora, por lo que entiendo en sus comentarios, sigue siendo un problema cuando intenta usar comandos predefinidos: cuando escribe un comando, el comportamiento del modo de inserción se activará en lugar del comportamiento definido de langmap. Lamentablemente, no estoy seguro de tener una buena solución para eso. Una idea podría ser redefinir comandos, por ejemplo, así:

command λς lw

De esta manera, cuando escriba el comando, λςVim se ejecutará, lwpero veo varios inconvenientes en este método:

  • Puede ser un gran dolor en el trasero redefinir todos los comandos que desea utilizar.
  • Los comandos definidos por el usuario tienen que comenzar con una letra mayúscula, y ahora tengo idea de lo conveniente que es hacerlo en griego.

Entonces, tal vez un complemento sugerido por @Alexander Myshov en su respuesta a esta pregunta podría ser útil (como nunca probé ninguno de estos, no sé si resuelven el problema, pero parece que sí lo hacen).

statox
fuente
1

Escribo regularmente en inglés y sueco. El sueco es un problema menor de resolver que el griego porque solo expande el alfabeto inglés con unos pocos caracteres, pero creo que mi solución es transferible al griego.

Solía ​​cambiar usando el interruptor de teclado del sistema de mi sistema operativo. El problema con esto es, como señaló el OP, que rompe un montón de comandos, ya que en modo normal, cada tecla envía otra señal a Vim con el teclado que no está en inglés. En la disposición del teclado sueco, por otra parte, un montón de caracteres no alfabéticos se mueven para dar paso a los nuevos personajes å, äy ö. Por ejemplo, }se escribe con Alt-Shift-9 (que coincide con el paréntesis de apertura en el teclado en inglés), y la barra diagonal inversa se escribe con Alt-Shift-7. Cambiar a un diseño de teclado sueco de vainilla para insertmode causa así un montón de dolores de cabeza.

Mi solución fue reasignar las teclas relevantes solo en modo de inserción y ajustar estas asignaciones en una función para que pueda cambiar fácilmente de un lado a otro. El siguiente código es cómo hice esto en mi .vimrc. Esto solo agrega los caracteres que necesito a la posición que tienen en la distribución del teclado sueco, dejando todo lo demás. Para escribir los caracteres que están enmascarados por ellos ( ;, :, [, {, ", y '), que simplemente pulsar la tecla dos veces. Afortunadamente, solo las personas tontas incluso necesitan escribir dosäs en una fila. (Si este doble golpe no es adecuado, puede asignarlos a Ctrl o algo así. El principio básico es que los caracteres que están enmascarados permanecen en su lugar en el teclado, pero se elimina una pulsación de tecla. Me parece mucho más fácil que moverlos.) Lo que significa es que cuando quiero escribir en sueco, presiono <Leader>s, que cambia a estos mapeos y aplico el corrector ortográfico sueco. Para volver a cambiar lo hago <Leader>e.

Ahora, para el griego, esto implicaría hacer mapeos para todo el alfabeto, lo que en realidad es menos complicado de lo que parece una vez que entiendes el principio. La parte difícil sería eliminar todos los cambios al cambiar al inglés. Quizás alguien pueda encontrar una forma ingeniosa de hacer eso.

Estoy planeando hacer una función de inserción como las siguientes para el árabe, el otro idioma que escribo a menudo. Podría volver aquí para informar sobre el proceso.

" Switch to Swedish
function! SweType()
  set spelllang=sv
  inoremap ; ö
  inoremap ;; ;
  inoremap : Ö
  inoremap :: :
  inoremap [ å
  inoremap { Å
  inoremap ' ä
  inoremap '' '
  inoremap " Ä
  inoremap "" "
  inoremap [[ [
  inoremap {{ {
endfunction
nmap <Leader>s :<C-U>call SweType()<CR>


" Switch to English
function! EngType()
  set spelllang=en_us
  inoremap ; ;
  iunmap ;;
  inoremap : :
  iunmap ::
  inoremap [ [
  iunmap [[
  inoremap { {
  iunmap {{
  inoremap ' '
  iunmap ''
  inoremap " "
  iunmap ""
endfunction
nmap <Leader>e :<C-U>call EngType()<CR>
Andreas
fuente
1
Podría estar equivocado, pero creo que su respuesta permite obtener fácilmente caracteres que no están en inglés en el modo de inserción, mientras que el problema de OP era obtener fácilmente caracteres en inglés en otros modos que no sean el modo de inserción. No estoy seguro de que su respuesta aborde el problema inicial. Aún así, la idea de habilitar / deshabilitar las asignaciones de funciones es bastante interesante.
statox
@statox Bueno, podría haber entendido mal la pregunta, pero si el problema es insertar fácilmente caracteres que no están en inglés en insertmode mientras se mantienen las funciones de modo normal, creo que mi pregunta al menos intenta abordar ese problema.
Andreas
Lamento no haber querido ofender: estaba señalando que quizás había una brecha entre la pregunta y su respuesta, pero, por supuesto, intenta abordar el problema y, como dije, realmente me gusta la idea de que las funciones permitan y deshabilitar asignaciones. Realmente no negaba tu respuesta y siento mucho que así sonara.
statox
1
@statox Sin ofender. Y si hubieras negado mi respuesta, todo estaría en buen estado.
Andreas