Wie kann ich einen Pseudo-Einfügemodus mit einer anderen Keymap erstellen?

9

Ich bin in der etwas ungewöhnlichen Position, regelmäßig zwei verschiedene Tastaturlayouts zu verwenden ( Programmierer-Dvorak und Türkisch-F ). Diese Layouts sind sehr unterschiedlich und ich kann nur mit einem Satz Muskelerinnerungen Vim beherrschen. Ich beherrsche vim-Befehle im Dvorak-Layout ziemlich gut, aber es ist fast unmöglich, sie zu verwenden, wenn sich meine Tastatur im Türkisch-F-Layout befindet. Leider bearbeite ich regelmäßig Dateien in Englisch und Türkisch und sogar in gemischten Sprachen. Meine Kenntnisse sind so, dass ich jede Sprache in ihrem jeweiligen Tastaturlayout ziemlich gut eingeben kann, aber mein Gehirn weigert sich, sie zu verkabeln und sogar einige Buchstaben eines Wortes auf Türkisch aus dem Dvorak-Layout einzugeben oder umgekehrt.

Ich habe Zwei-Tasten-Gruß-Bindungen zum Ändern des Layouts in Xorg, aber selbst dies führt zu einem umständlichen Workflow in vim beim Bearbeiten von Dateien in gemischten Sprachen:

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

Ich möchte dies auf etwas verkürzen können wie:

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

... so dass mit using <leader>ieine Reihe von :imapWerten festgelegt wird, um das türkische Layout zu emulieren, ohne das Systemtastaturlayout zu ändern. Gleichzeitig iwürde in den Einfügemodus wechseln, jedoch ohne die zusätzlichen :imapWerte. Die Werte selbst sind einfach, ich brauche nur die Alphabet-Zuordnungen wie diese:

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

Die Frage ist, wie die Einrichtung zwei Einsatzarten, eine normale Insert - Modus und ein Pseudo-Insert - Modus, mit Ausnahme einer Reihe von Zuordnungen identisch ist, und wie kann ich auslösen diese Modi mit <leader>i, <leader>ausw.?

Caleb
quelle
1
Hier ist eine andere Idee: Sie haben InsertEnterund InsertLeaveautocmds, die Sie automatisch auf Schalter - Layout. Insbesondere können Sie auf dem InsertLeaveFeld überprüfen, ob es türkisch ist. Wenn dies der Fall ist, wechseln Sie zu Dvorak, setzen Sie ein Flag, und wechseln Sie bei erneuter Eingabe von Einfügen wieder zu Türkisch, wenn dies beim letzten Verlassen des Einfügemodus der Fall war.
Martin Tournoij
@Carpetsmoker Ich sehe nicht, wie das meine Probleme behebt. Selbst wenn es etwas zu "überprüfen" gab (ich bin nicht sicher, was ich denke, dass ich dort überprüfen würde ... ein Teil des Problems ist, dass ich Wort für Wort hin und her gehe), einer der Gründe, warum ich Ich dachte nach dem Motto, :imapdass es auch in einer Remote-SSH-Sitzung funktionieren würde oder wenn $DISPLAYes nicht anders eingestellt ist.
Caleb

Antworten:

7

Vim hat so etwas in Form von Keymaps . Von :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.

Nur Caps Lock im Einfügemodus beschreibt eine solche Zuordnung zur Emulation von Caps Lock. Wie Sie dort sehen können, ähnelt die Zuordnungsdatei dem, was Sie in Ihrer Frage skizzieren.

Sie aktivieren diese Einstellung über :set iminsert=1oder dynamisch über i_CTRL-^. Es funktioniert auch /searchmit der 'imsearch'Option.

Ingo Karkat
quelle
3

Ingo Karkats Antwort scheint genau die richtige Lösung zu sein und hat meine Situation gelöst. Hier finden Sie jedoch etwas ausführlichere Anweisungen für alle anderen, die gerade erst mit den Sprachkartenfunktionen von vim beginnen.

Zunächst benötigen Sie eine Sprachzuordnungsdatei. Wie im Beispiel für die Feststelltaste möchten Sie Folgendes einfügen~/.vim/keymap/dvorak2turkishf.vim (laden Sie meine vollständige Zuordnung von Githu b herunter ):

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

Wenn dies vorhanden ist, müssen noch Bindungen eingerichtet werden, um sie in einigen Fällen zu aktivieren, in anderen jedoch nicht. Sie möchten Ihrer ~/.vimrcDatei etwas hinzufügen .

Binden Sie zuerst die Such-Keymap an die eingegebene:

set imsearch=-1

Stellen Sie dann ein, welche Keymap für den Eingabemodus in einer anderen Sprache verwendet wird:

set keymap=dvorak2turkishf

Schalten Sie den alternativen Eingabemodus aus, damit sich standardmäßig nichts ändert:

set iminsert=0

Richten Sie einen automatischen Befehl ein, der ausgeführt wird, wenn Sie den Einfügemodus verlassen, um den Schalter für die alternative Sprache auszuschalten:

autocmd InsertLeave * set iminsert=0

Fügen Sie Bindungen für all die verschiedenen Arten hinzu, wie Sie möglicherweise in den Eingabemodus für alternative Sprachen gelangen, sodass bei Verwendung von <leader>(Normalerweise \) vor ihnen die Sprachzuordnung vor dem Umschalten aktiviert wird:

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

Stellen Sie eine andere Cursorfarbe ein, wenn die Karte aktiviert ist:

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

Alles in allem hat sich Folgendes in meiner Konfiguration geändert . Abschließend können Sie im Einfügemodus die Sprachzuordnungsoption ein- und ausschalten <ctrl>+^.

Caleb
quelle