Jak mogę utworzyć tryb pseudo wstawiania z inną mapą klawiszy?


9

Jestem w nieco nietypowej sytuacji, gdy regularnie używam dwóch różnych układów klawiatury ( Programmers-Dvorak i Turkish-F ). Te układy różnią się od siebie i jestem w stanie posługiwać się tylko jednym zestawem wspomnień mięśniowych. Jestem dość biegły w posługiwaniu się poleceniami vim w układzie Dvorak, ale prawie niemożliwe jest użycie, jeśli moja klawiatura jest w układzie tureckim-F. Niestety regularnie edytuję pliki w języku angielskim i tureckim, a nawet mieszanym. Moja biegłość jest taka, że ​​potrafię dość dobrze pisać dowolny język w odpowiednim układzie klawiatury, ale mój mózg nie chce ich krzyżować i pisać nawet kilka liter słowa po turecku z układu Dvorak lub odwrotnie.

Mam powiązania z dwoma kluczami-pozdrowienia do zmiany układu w Xorg, ale nawet to pozostawia mi niezręczny przepływ pracy w vimie podczas edycji plików mieszanych języków:

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

Chciałbym móc to skrócić do czegoś takiego jak:

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

... takie, że użycie <leader>iustawia wiązkę :imapwartości do emulacji układu tureckiego bez zmiany układu klawiatury systemowej. Jednocześnie iprzełącza się na tryb wstawiania, ale bez dodatkowych :imapwartości. Same wartości są łatwe, potrzebuję tylko mapowania alfabetu czegoś takiego:

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

Chodzi o to, w jaki sposób skonfigurować dwoma trybami wstawiania, jeden normalny tryb wstawiania i jeden pseudo wkładka trybie, który jest identyczny z wyjątkiem grupą odwzorowań, iw jaki sposób można wywołać z tych trybów <leader>i, <leader>aitp?


1
Oto inny pomysł: masz InsertEnteri InsertLeaveautocmds, których możesz użyć do automatycznego przełączania układów. W szczególności InsertLeavemożesz sprawdzić, czy jest to turecki, jeśli tak, przełącz się na Dvorak, ustaw flagę, a po ponownym wprowadzeniu wstawiania przełącz się z powrotem na turecki, jeśli tak było w przypadku ostatniego wyjścia z trybu wstawiania.
Martin Tournoij

@Carpetsmoker Nie widzę, jak to rozwiązuje moje problemy. Nawet jeśli było coś do „sprawdzenia” (nie jestem pewien, co myślisz, że bym tam sprawdził ... część problemu polega na tym, że chodzę tam i z powrotem po słowach po słowie), jednym z powodów, dla których myślał w :imapten sposób, że działałby nawet w zdalnej sesji ssh lub gdy $DISPLAYinaczej nie jest ustawiony.
Caleb

Odpowiedzi:


7

Vim ma coś takiego w postaci map klawiszy . Od :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.

Tylko tryb wstawiania Caps Lock opisuje takie odwzorowanie do emulacji Caps Lock; jak widać, plik mapowań jest podobny do tego, co zarysujesz w swoim pytaniu.

Możesz włączyć to ustawienie za pomocą :set iminsert=1lub dynamicznie za pomocą i_CTRL-^. Działa również /searchz 'imsearch'opcją.


3

Odpowiedź Ingo Karkata wydaje się, że było to właściwe rozwiązanie i rozwiązało moją sytuację. Oto jednak trochę bardziej szczegółowe instrukcje dla każdego, kto dopiero zaczyna korzystać z funkcji mapowania języka vima.

Najpierw potrzebujesz pliku mapy językowej. Tak jak w przykładzie Caps Lock, będziesz chciał umieścić coś takiego jak poniżej ~/.vim/keymap/dvorak2turkishf.vim(pobierz moje pełne mapowanie z Githu b):

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

Mając to na swoim miejscu, pozostaje ustawienie powiązań, aby aktywować go w niektórych przypadkach, ale nie w innych. Będziesz chciał dodać coś do swojego ~/.vimrcpliku.

Najpierw powiąż mapę kluczową wyszukiwania z wejściową:

set imsearch=-1

Następnie ustaw mapę klawiszy, która będzie używana w trybie wprowadzania w języku alternatywnym:

set keymap=dvorak2turkishf

Wyłącz alternatywny tryb wprowadzania, aby domyślnie nie było zmian:

set iminsert=0

Skonfiguruj automatyczne polecenie, aby było uruchamiane za każdym razem, gdy opuszczasz tryb wstawiania, aby wyłączyć przełącznik języka alternatywnego:

autocmd InsertLeave * set iminsert=0

Dodaj wiązania dla wszystkich różnych sposobów, w jakie możesz skończyć w trybie wprowadzania w języku alternatywnym, aby użycie <leader>(Zwykle \) przed nimi ustawiło przełącznik języka na włączony przed przełączeniem:

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

Ustaw inny kolor kursora, gdy mapa jest włączona:

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

Wszystko razem, oto co zmieniło się w mojej konfiguracji . Na koniec, w trybie wstawiania możesz włączać i wyłączać opcję mapy językowej za pomocą <ctrl>+^.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.