Come posso creare una modalità di inserimento pseudo con una keymap diversa?


9

Sono nella posizione leggermente insolita di utilizzare due diversi layout di tastiera su base regolare ( Programmers-Dvorak e Turkish-F ). Questi layout sono abbastanza diversi l'uno dall'altro e sono in grado di essere esperto solo con un set di memorie muscolari. Sono abbastanza abile con i comandi vim nel layout Dvorak, ma è quasi impossibile da usare se la mia tastiera è nel layout turco-F. Sfortunatamente modifico regolarmente i file in inglese e turco e anche in lingue miste. La mia competenza è tale che posso digitare abbastanza bene entrambe le lingue nel rispettivo layout di tastiera, ma il mio cervello si rifiuta di collegarle e digitare anche alcune lettere di una parola in turco dal layout Dvorak o viceversa.

Ho i vincoli di due tasti di saluto per cambiare il layout in Xorg, ma anche questo mi lascia con un flusso di lavoro scomodo in vim quando modifico file in lingua mista:

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

Vorrei essere in grado di abbreviare questo a qualcosa del tipo:

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

... tale che l'utilizzo <leader>iimposta un insieme di :imapvalori per emulare il layout turco senza modificare il layout della tastiera di sistema. Allo stesso tempo, ipasserebbe alla modalità di inserimento, ma senza i :imapvalori aggiuntivi . I valori stessi sono facili, ho solo bisogno dei mapping dell'alfabeto qualcosa del genere:

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

La domanda è, come impostare due modalità di inserimento, una normale modalità di inserimento e uno pseudo modalità di inserimento che è identico tranne per un gruppo di mapping, e come posso innescare queste modalità con <leader>i, <leader>aecc?


1
Ecco un'idea diversa: hai InsertEntere InsertLeaveautocmds, che puoi usare per cambiare layout automaticamente. In particolare, InsertLeavepuoi verificare se è turco, se lo è, passare a Dvorak, impostare un flag e, quando si inserisce di nuovo l'inserimento, tornare a turco se è stato il caso l'ultima volta che hai lasciato la modalità di inserimento.
Martin Tournoij,

@Carpetsmoker Non vedo come questo risolva i miei problemi. Anche se c'era qualcosa da "controllare" (non sono sicuro di cosa pensi che verificherei lì ... parte del problema è che vado avanti e indietro parola per parola), uno dei motivi per cui pensavo :imapche avrebbe funzionato anche in una sessione ssh remota o quando $DISPLAYaltrimenti non è impostato.
Caleb,

Risposte:


7

Vim ha qualcosa del genere sotto forma di keymap . Da :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.

Caps Lock in sola modalità di inserimento descrive tale mappatura per l'emulazione di Caps Lock; come puoi vedere lì, il file delle mappature è simile a quello che descrivi nella tua domanda.

Si attiva questa impostazione tramite :set iminsert=1o dinamicamente tramite i_CTRL-^. Funziona anche /searchcon l' 'imsearch'opzione.


3

La risposta di Ingo Karkat sembra che fosse esattamente la soluzione giusta e abbia risolto la mia situazione. Tuttavia, ecco alcune istruzioni più dettagliate per chiunque abbia appena iniziato a utilizzare le funzioni della mappa linguistica di Vim.

Innanzitutto, è necessario un file della mappa delle lingue. Come nell'esempio Caps Lock, ti ​​consigliamo di inserire qualcosa di simile al seguente ~/.vim/keymap/dvorak2turkishf.vim(scarica la mia mappatura completa da Githu b):

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

Con quello in atto, resta da configurare i binding per attivarlo in alcuni casi ma non in altri. Ti consigliamo di aggiungere qualcosa al tuo ~/.vimrcfile.

Innanzitutto, associa la keymap di ricerca a quella di input:

set imsearch=-1

Quindi imposta quale keymap verrà utilizzata per la modalità di input in lingua alternativa:

set keymap=dvorak2turkishf

Disattiva la modalità di input alternativo, quindi per impostazione predefinita non ci saranno cambiamenti:

set iminsert=0

Imposta un comando automatico da eseguire ogni volta che esci dalla modalità di inserimento per disattivare il cambio di lingua alternativo:

autocmd InsertLeave * set iminsert=0

Aggiungi i collegamenti per tutti i vari modi in cui potresti finire nella modalità di immissione in lingua alternativa in modo che l'utilizzo <leader>(di solito \) prima di essi imposti la mappa della lingua su ON prima di passare:

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

Imposta un colore del cursore diverso per quando la mappa è abilitata:

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

Tutti insieme, ecco cosa è cambiato nella mia configurazione . Come nota finale, quando sei in modalità inserimento puoi attivare o disattivare l'opzione della mappa della lingua usando <ctrl>+^.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.