Bagaimana saya bisa membuat mode insert pseudo dengan keymap yang berbeda?

9

Saya berada dalam posisi yang agak tidak biasa menggunakan dua tata letak keyboard yang berbeda secara teratur ( Programmers-Dvorak dan Turkish-F ). Layout ini sangat berbeda satu sama lain dan saya hanya bisa mahir dalam vim dengan satu set memori otot. Saya cukup mahir dengan perintah vim di tata letak Dvorak, tetapi hampir mustahil untuk digunakan jika keyboard saya ada di tata letak Turkish-F. Sayangnya saya secara teratur mengedit file dalam bahasa Inggris dan Turki dan bahkan bahasa campuran. Kemahiran saya sedemikian rupa sehingga saya bisa mengetik bahasa mana pun di tata letak keyboard masing-masing dengan cukup baik, tetapi otak saya menolak untuk menyilangkannya dan mengetikkan bahkan beberapa huruf kata dalam bahasa Turki dari tata letak Dvorak atau sebaliknya.

Saya memiliki binding dua kunci salut untuk mengubah tata letak di Xorg, tetapi bahkan ini membuat saya dengan alur kerja yang canggung dalam vim saat mengedit file bahasa campuran:

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

Saya ingin dapat mempersingkat ini menjadi sesuatu seperti:

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

... sedemikian rupa sehingga menggunakan <leader>iset :imapnilai untuk meniru tata letak Turki tanpa mengubah tata letak keyboard sistem. Pada saat yang sama, iakan beralih ke mode memasukkan tetapi tanpa nilai tambahan :imap. Nilai-nilai itu sendiri mudah, saya hanya perlu pemetaan alfabet seperti ini:

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

Pertanyaannya adalah, bagaimana menyiapkan dua mode insert, salah satu modus insert normal dan satu semu insert modus yang identik kecuali untuk sekelompok pemetaan, dan bagaimana saya bisa memicu mode ini dengan <leader>i, <leader>a, dll?

Caleb
sumber
1
Berikut ide yang berbeda: Anda memiliki InsertEnterdan InsertLeaveautocmds, yang dapat Anda gunakan untuk beralih tata letak secara otomatis. Khususnya, pada InsertLeaveAnda dapat memeriksa apakah itu Turki, jika ya, beralih ke Dvorak, atur bendera, dan ketika Anda memasukkan masukkan lagi beralih kembali ke Turki jika itu adalah kasus terakhir kali Anda meninggalkan mode memasukkan.
Martin Tournoij
@Carpetsmoker Saya tidak melihat bagaimana cara memperbaiki masalah saya. Bahkan jika ada sesuatu untuk "memeriksa" (saya tidak yakin apa yang Anda pikir saya akan memeriksa di sana ... bagian dari masalahnya adalah saya bolak-balik berdasarkan kata per kata), salah satu alasan saya berpikir sepanjang garis :imapadalah bahwa itu akan bekerja bahkan dalam sesi ssh jarak jauh atau ketika $DISPLAYtidak diatur.
Caleb

Jawaban:

7

Vim memiliki sesuatu seperti ini dalam bentuk keymaps . Dari :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.

Hanya mode insert Caps Lock yang menjelaskan pemetaan emulasi Caps Lock; seperti yang Anda lihat di sana, file pemetaan mirip dengan apa yang Anda uraikan dalam pertanyaan Anda.

Anda mengaktifkan pengaturan ini melalui :set iminsert=1atau via dinamis i_CTRL-^. Hal ini juga bekerja untuk /searchdengan 'imsearch'pilihan.

Ingo Karkat
sumber
3

Jawaban Ingo Karkat sepertinya itu solusi yang tepat dan telah menyelesaikan situasi saya. Namun di sini ada sedikit lebih banyak instruksi lisan untuk orang lain yang baru saja memulai dengan fungsi peta bahasa vim.

Pertama, Anda memerlukan file peta bahasa. Seperti pada contoh Caps Lock, Anda ingin memasukkan sesuatu seperti yang berikut ini ~/.vim/keymap/dvorak2turkishf.vim(unduh pemetaan lengkap saya dari Githu b):

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

Dengan itu, tetap ada pengaturan binding untuk mengaktifkannya dalam beberapa kasus tetapi tidak pada yang lain. Anda ingin menambahkan sesuatu ke ~/.vimrcfile Anda .

Pertama, ikat keymap pencarian ke input:

set imsearch=-1

Kemudian atur keymap mana yang akan digunakan untuk mode input bahasa alternatif:

set keymap=dvorak2turkishf

Matikan mode input alternatif sehingga secara default tidak akan ada perubahan:

set iminsert=0

Siapkan perintah-otomatis untuk dijalankan setiap kali meninggalkan mode sisipan untuk mematikan sakelar bahasa alternatif:

autocmd InsertLeave * set iminsert=0

Tambahkan binding untuk semua berbagai cara Anda mungkin berakhir dalam mode input bahasa alternatif sehingga menggunakan <leader>(Biasanya \) sebelum mereka mengatur peta bahasa swtich untuk diaktifkan sebelum beralih:

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

Tetapkan warna kursor berbeda untuk saat peta diaktifkan:

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

Secara keseluruhan, inilah yang diubah dalam konfigurasi saya . Sebagai catatan akhir, saat Anda berada dalam mode penyisipan, Anda dapat mengaktifkan dan menonaktifkan opsi peta bahasa menggunakan <ctrl>+^.

Caleb
sumber