Comment puis-je créer un pseudo mode d'insertion avec une autre carte de touches?

9

Je suis dans la position légèrement inhabituelle d'utiliser régulièrement deux dispositions de clavier différentes ( Programmers-Dvorak et Turkish-F ). Ces dispositions sont assez différentes les unes des autres et je ne suis capable de maîtriser le vim qu'avec un seul ensemble de souvenirs musculaires. Je suis assez compétent avec les commandes vim dans la disposition Dvorak, mais il est presque impossible à utiliser si mon clavier est dans la disposition Turkish-F. Malheureusement, j'édite régulièrement des fichiers en anglais et en turc et même en plusieurs langues. Ma compétence est telle que je peux assez bien taper l'une ou l'autre langue dans sa disposition de clavier respective, mais mon cerveau refuse de les croiser et de taper même quelques lettres d'un mot en turc à partir de la disposition Dvorak ou vice versa.

J'ai des liaisons de salut à deux touches pour changer la disposition dans Xorg, mais même cela me laisse un flux de travail maladroit dans vim lors de l'édition de fichiers en langues mixtes:

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

J'aimerais pouvoir raccourcir ceci en quelque chose comme:

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

... telle que l'utilisation <leader>idéfinit un ensemble de :imapvaleurs pour émuler la disposition turque sans modifier la disposition du clavier système. Dans le même temps, ipasserait en mode insertion mais sans les :imapvaleurs supplémentaires . Les valeurs elles-mêmes sont faciles, j'ai juste besoin des mappages alphabétiques quelque chose comme ça:

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

La question est, comment configurer deux modes d'insertion, un mode d'insertion normal et un pseudo insert mode qui est identique , sauf pour un groupe d'applications, et comment puis - je déclencher ces modes avec <leader>i, <leader>aetc.?

Caleb
la source
1
Voici une idée différente: vous disposez des InsertEnteret InsertLeaveautocmds, que vous pouvez utiliser pour changer automatiquement de disposition. Plus précisément, sur le, InsertLeavevous pouvez vérifier s'il est turc, si c'est le cas, basculez vers Dvorak, définissez un indicateur et lorsque vous entrez à nouveau dans l'insertion, revenez au turc si tel était le cas la dernière fois que vous avez quitté le mode d'insertion.
Martin Tournoij
@Carpetsmoker Je ne vois pas comment cela résout mes problèmes. Même s'il y avait quelque chose à "vérifier" (je ne suis pas sûr de ce que vous pensez que je vérifierais là-bas ... une partie du problème est que je fais des allers-retours mot par mot), l'une des raisons pour lesquelles je pensait le long des lignes de :imapest que cela fonctionnerait même dans une session ssh à distance ou quand il $DISPLAYn'est pas défini autrement.
Caleb

Réponses:

7

Vim a quelque chose comme ça sous la forme de keymaps . 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.

Seul le verrouillage des majuscules en mode insertion décrit un tel mappage pour l'émulation de la majuscule; comme vous pouvez le voir, le fichier de mappages est similaire à ce que vous décrivez dans votre question.

Vous activez ce paramètre via :set iminsert=1ou dynamiquement via i_CTRL-^. Cela fonctionne également /searchavec l' 'imsearch'option.

Ingo Karkat
la source
3

La réponse d'Ingo Karkat semble être exactement la bonne solution et a résolu ma situation. Cependant, voici des instructions un peu plus détaillées pour quiconque vient de commencer avec les fonctions de mappage de langue de vim.

Tout d'abord, vous avez besoin d'un fichier de mappage de langue. Comme dans l'exemple de verrouillage des majuscules, vous voudrez mettre quelque chose comme ceci dans ~/.vim/keymap/dvorak2turkishf.vim(télécharger mon mappage complet depuis Githu b):

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

Avec cela en place, il reste à configurer des liaisons pour l'activer dans certains cas mais pas dans d'autres. Vous voudrez ajouter quelque chose à votre ~/.vimrcfichier.

Tout d'abord, liez le clavier de recherche à celui d'entrée:

set imsearch=-1

Définissez ensuite le clavier qui sera utilisé pour le mode de saisie dans une autre langue:

set keymap=dvorak2turkishf

Désactivez le mode de saisie alternatif afin que par défaut, il n'y ait aucun changement:

set iminsert=0

Configurez une commande automatique à exécuter chaque fois que vous quittez le mode d'insertion pour désactiver le commutateur de langue alternative:

autocmd InsertLeave * set iminsert=0

Ajoutez des liaisons pour toutes les différentes manières dont vous pourriez vous retrouver dans le mode de saisie dans une autre langue afin que l'utilisation <leader>(généralement \) avant eux active le swtich de la carte de langue avant de basculer:

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

Définissez une couleur de curseur différente lorsque la carte est activée:

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

Tous ensemble, voici ce qui a changé dans ma config . Enfin, vous êtes en mode insertion, vous pouvez activer et désactiver l'option de carte de langue à l'aide <ctrl>+^.

Caleb
la source