Apa cara paling nyaman untuk bekerja dengan keyboard yang berbeda di vim?

18

Saya kadang-kadang perlu menulis kata-kata Yunani, tetapi ketika saya menggunakan keyboard Yunani, memukul, mengatakan, <C-p>akan dipahami sebagai <C-π>dan bukan sebagai perintah yang saya maksudkan. Ini bisa diperbaiki dengan :map <C-p> <C-π>. Bisakah saya melakukan ini untuk semua surat tanpa membuat daftar semua?

PS. Membuat daftar semua tidak menghasilkan hasil yang sempurna. Misalnya, qada ;di Gr. keyboard, tetapi kami tidak ingin memetakan; untuk q. Juga, untuk beberapa alasan, ΖΖ (zeta zeta) tidak berfungsi setelahnya :map Ζ Z. Dan perintah yang saya definisikan,, \lwtidak berfungsi sebagai \λς.

Toothrot
sumber
2
Saya pikir pemetaan bukanlah cara yang baik untuk dilakukan: mungkin yang Anda cari adalah langmapopsi (lihat dokumen yang menyertakan contoh tata letak yunani). Opsi ini sebenarnya dibuat untuk membantu berurusan dengan keyboard non latin seperti yunani atau cyril. Ini memungkinkan Anda untuk menentukan pasangan simbol yang akan ditafsirkan secara normal dalam mode insert tetapi akan diganti dalam mode lain, mungkin ini akan membantu Anda.
statox
@statox: Terima kasih! Saya mencoba menggunakan mantan. tetapi tidak ada yang terjadi. Bantuan mengatakan vim harus dipenuhi dengan opsi + langmap. Apakah ada cara mudah untuk memeriksa apakah itu benar? Saya menggunakan versi yang menyertai Mac OS.
Toothrot
1
Anda dapat menggunakan :echo has('langmap')jika Anda 1memilikinya, jika Anda mendapatkannya, 0Anda tidak memilikinya.
statox
@statox: Terima kasih! Saya memperbarui dengan brew install vim --override-system-vidan :echo has &csekarang mengembalikan 1. ZZ berfungsi. Masalah dengan \lv& c tetap ada.
Toothrot
Saya tidak mengerti :echo has &cbagian itu, saya tidak melihat bagaimana hal itu terkait langmapjuga begitu Anda telah vim dikompilasi dengan langmapAnda harus menentukan pemetaan dengan :set langmap=ΑA,ΒB,ΨC [...]di vimrc Anda.
statox

Jawaban:

6

Saya akan merekomendasikan keymap, yang dapat memecahkan masalah Anda. Letakkan ini di vimrc Anda

" set keymap=greek_utf-8
set iminsert=0
set imsearch=-1

untuk menonaktifkan bahasa Yunani sebagai default. Anda dapat mengaktifkan opsi pada (Bahasa Yunani) dan mematikan (Bahasa Inggris) menggunakan <ctrl>+^(Anda juga dapat menggunakan <ctrl>+6, itu dipetakan pada tombol, bukan pada simbol) dalam mode insert dan Ganti mode (tidak bekerja di Mode normal). Untuk menonaktifkan secara otomatis ketika meninggalkan mode penyisipan, Anda dapat menggunakan

inoremap <ESC> <ESC>:set iminsert=0<CR>

Lebih lanjut tentang ini

:h iminsert :h keymap :h imsearch :h i_CTRL-^


Sunting ke komentar kedua:

Anda dapat mencoba ini untuk mengaktifkan bahasa Yunani secara otomatis, jika memasuki mode penyisipan (dan mengganti mode), dan untuk mematikan secara otomatis, jika meninggalkan (maka Anda tidak perlu pemetaan yang disebutkan sebelumnya).

augroup Greek
    au InsertEnter * set iminsert=1
    au InsertLeave * set iminsert=0
augroup END
Ryichiro
sumber
Apakah benar-benar perlu menggunakan bahasa Yunani poltonik? Sepertinya saya bahwa hanya pengkodean yang benar diperlukan, dan kemudian menggunakan input MacOS X bawaan. Tapi ini mungkin kesan salahku. Anda juga dapat beralih ke keyboard Yunani polytonic di MacOS X (dan mempelajarinya, tapi saya kira itu bukan yang Anda cari :-) Tentang lag of, mungkin ada pemetaan, coba cari tahu :map >a, dan jika ada , hapus peta dengan :unmap >a. Sebagai pengguna non-Yunani dan non-MacO, saya sudah kehabisan akal. Maaf dan semoga berhasil!
ryuichiro
10

Seperti yang saya katakan di komentar, pemetaan di tidak dirancang untuk melakukan apa yang ingin Anda lakukan. Opsi yang menarik untuk use case ini adalah langmap.

Opsi ini memungkinkan untuk menjaga perilaku atau keyboard Anda dalam mode sisipkan dan mengubah perilaku di mode lain.

Untuk menggunakannya, Vim harus dikompilasi +langmap, Anda dapat memeriksa apakah opsi ini diaktifkan echo has('langmap'): jika perintah mengembalikan 1opsi diaktifkan, Anda harus menyiapkan pengaturan dengan opsi ini (untuk mengetahui bagaimana melakukannya, itu adalah pertanyaan lain).

Ketika diaktifkan, opsi mengambil pasangan karakter misalnya set langmap += à@akan memungkinkan Anda untuk menambahkan àdi buffer Anda ketika Anda berada dalam mode insert dan Anda mengetik a àtetapi mengetik àdalam mode normal benar-benar akan memicu a @(contoh ini dapat berguna pada azerty keyboard untuk mempermudah pekerjaan dengan makro).

Untuk menggunakan langmap di yunani Anda dapat mengikuti contoh yang diberikan dalam :h 'langmap'menambahkan baris ini ke Anda vimrc (Menyalin baris ini dari sini mungkin bukan ide yang baik karena saya benar - benar tidak yakin dengan pengkodean, mungkin menarik garis langsung dari file bantuan mungkin lebih aman) :

:set langmap=ΑA,ΒB,ΨC,ΔD,ΕE,ΦF,ΓG,ΗH,ΙI,ΞJ,ΚK,ΛL,ΜM,ΝN,ΟO,ΠP,QQ,ΡR,ΣS,ΤT,ΘU,ΩV,WW,ΧX,ΥY,ΖZ,αa,βb,ψc,δd,εe,φf,γg,ηh,ιi,ξj,κk,λl,μm,νn,οo,πp,qq,ρr,σs,τt,θu,ωv,ςw,χx,υy,ζz

Sekarang dari apa yang saya mengerti dalam komentar Anda itu tetap menjadi masalah ketika Anda mencoba menggunakan perintah yang telah ditentukan: ketika Anda mengetik perintah, perilaku mode penyisipan akan dipicu alih-alih perilaku langmap yang ditentukan. Sayangnya saya tidak yakin saya punya solusi yang bagus untuk itu. Satu ide bisa jadi untuk mendefinisikan kembali perintah misalnya seperti itu:

command λς lw

Dengan cara ini ketika Anda akan mengetik perintah λςVim akan mengeksekusi lwtetapi saya melihat beberapa kelemahan untuk metode ini:

  • Mungkin sangat menyakitkan di pantat untuk mendefinisikan ulang semua perintah yang ingin Anda gunakan.
  • Perintah yang ditentukan pengguna harus dimulai dengan huruf kapital, dan sekarang saya tahu betapa nyamannya melakukannya di Yunani.

Jadi mungkin sebuah plugin yang disarankan oleh @Alexander Myshov dalam jawabannya untuk pertanyaan ini bisa berguna (karena saya tidak pernah mencoba semua ini, saya tidak tahu apakah mereka menyelesaikan masalah tetapi sepertinya mereka melakukannya).

statox
sumber
1

Saya mengetik secara teratur dalam bahasa Inggris dan Swedia. Bahasa Swedia adalah masalah yang lebih kecil untuk diselesaikan daripada bahasa Yunani karena hanya memperluas alfabet bahasa Inggris dengan beberapa karakter, tetapi saya pikir solusi saya dapat ditransfer ke bahasa Yunani.

Saya biasa beralih menggunakan switch keyboard sistem OS saya. Masalahnya adalah, seperti yang dicatat OP, bahwa itu memecah sejumlah besar perintah, karena dalam mode normal, setiap tombol mengirimkan sinyal lain ke Vim dengan keyboard non-Inggris. Dalam layout keyboard Swedia, apalagi, sejumlah besar karakter non-abjad dipindahkan untuk membuat jalan bagi karakter baru å, ädan ö. Misalnya, }diketik dengan Alt-Shift-9 (cocok dengan tanda kurung buka pada keyboard Inggris), dan backslash diketik dengan Alt-Shift-7. Beralih ke tata letak keyboard vanilla Swedia untuk memasukkanmode sehingga menyebabkan sejumlah besar sakit kepala.

Solusi saya adalah untuk memetakan kembali kunci yang relevan hanya di insertmode dan membungkus pemetaan ini dalam suatu fungsi sehingga saya dapat beralih dengan mudah bolak-balik. Kode di bawah ini adalah bagaimana saya melakukan ini di blog saya .vimrc. Ini hanya menambahkan karakter yang saya butuhkan ke posisi yang mereka miliki di tata letak keyboard Swedia, meninggalkan yang lainnya. Untuk mengetik karakter yang tertutup oleh mereka ( ;, :, [, {, ", dan '), saya hanya menekan tombol dua kali. Untungnya, hanya orang bodoh yang perlu mengetik duaäs berturut-turut. (Jika pemukulan ganda ini tidak cocok, Anda dapat memetakannya ke Ctrl atau sesuatu seperti itu. Prinsip dasarnya adalah bahwa karakter yang bertopeng tetap berada di tempatnya pada keyboard tetapi satu penekanan tombol dilepas dari realisasi. Saya menemukan ini jauh lebih mudah daripada memindahkannya.) Apa artinya ketika saya ingin mengetik dalam bahasa Swedia, saya menekan <Leader>s, yang beralih ke pemetaan ini dan menerapkan pemeriksaan ejaan Swedia. Untuk beralih kembali saya lakukan <Leader>e.

Sekarang, untuk bahasa Yunani, ini akan melibatkan pembuatan pemetaan untuk seluruh alfabet, yang sebenarnya tidak terlalu merepotkan daripada kedengarannya begitu Anda menurunkan prinsipnya. Bagian yang sulit adalah menghapus peta semua perubahan itu saat beralih ke bahasa Inggris. Mungkin seseorang dapat menemukan cara bagus untuk melakukan itu.

Saya berencana melakukan fungsi penyisipan seperti yang di bawah ini untuk bahasa Arab, bahasa lain yang sering saya ketik. Saya mungkin kembali ke sini untuk melaporkan prosesnya.

" Switch to Swedish
function! SweType()
  set spelllang=sv
  inoremap ; ö
  inoremap ;; ;
  inoremap : Ö
  inoremap :: :
  inoremap [ å
  inoremap { Å
  inoremap ' ä
  inoremap '' '
  inoremap " Ä
  inoremap "" "
  inoremap [[ [
  inoremap {{ {
endfunction
nmap <Leader>s :<C-U>call SweType()<CR>


" Switch to English
function! EngType()
  set spelllang=en_us
  inoremap ; ;
  iunmap ;;
  inoremap : :
  iunmap ::
  inoremap [ [
  iunmap [[
  inoremap { {
  iunmap {{
  inoremap ' '
  iunmap ''
  inoremap " "
  iunmap ""
endfunction
nmap <Leader>e :<C-U>call EngType()<CR>
Andreas
sumber
1
Saya mungkin salah tetapi saya pikir jawaban Anda memungkinkan untuk dengan mudah mendapatkan karakter non-Inggris dalam mode sisipkan sementara masalah OP adalah dengan mudah mendapatkan karakter bahasa Inggris dalam mode lain daripada mode sisipkan. Saya tidak yakin jawaban Anda mendukung masalah awal. Masih gagasan fungsi mengaktifkan / menonaktifkan pemetaan cukup menarik.
statox
@statox Yah, saya mungkin telah salah paham pertanyaannya, tetapi jika masalahnya adalah dengan mudah memasukkan karakter non-bahasa Inggris di insertmode sambil mempertahankan fungsi normalmode, saya yakin pertanyaan saya setidaknya berusaha untuk mengatasi masalah itu.
Andreas
Maaf saya tidak bermaksud menyinggung: saya menunjukkan bahwa mungkin ada kesenjangan antara pertanyaan dan jawaban Anda, tetapi tentu saja Anda mencoba untuk mengatasi masalah dan seperti yang saya katakan saya sangat menyukai ide fungsi yang memungkinkan dan menonaktifkan pemetaan. Saya benar-benar tidak menyangkal jawaban Anda dan saya benar-benar minta maaf atas bunyinya.
statox
1
@statox Jangan tersinggung. Dan jika Anda telah menolak jawaban saya, semuanya akan dalam keadaan baik.
Andreas