ฉันจะสร้างโหมดการแทรกหลอกด้วยคีย์แมปอื่นได้อย่างไร


9

ฉันอยู่ในตำแหน่งที่ผิดปกติเล็กน้อยเมื่อใช้รูปแบบแป้นพิมพ์สองแบบที่แตกต่างกันเป็นประจำ ( โปรแกรมเมอร์ - DvorakและTurkish-F ) เลย์เอาต์เหล่านี้ค่อนข้างจะแตกต่างจากกันและฉันสามารถมีความเชี่ยวชาญเป็นกลุ่มด้วยความทรงจำของกล้ามเนื้อหนึ่งชุด ฉันค่อนข้างชำนาญในการใช้คำสั่ง vim ในเค้าโครง Dvorak แต่แทบจะเป็นไปไม่ได้เลยที่จะใช้ถ้าแป้นพิมพ์ของฉันอยู่ในรูปแบบ Turkish-F น่าเสียดายที่ฉันแก้ไขไฟล์เป็นประจำทั้งภาษาอังกฤษและตุรกีและแม้แต่ภาษาผสม ความสามารถของฉันเป็นเช่นนั้นฉันสามารถพิมพ์ภาษาใดก็ได้ในรูปแบบแป้นพิมพ์ตามลำดับ แต่สมองของฉันปฏิเสธที่จะไขว้พวกเขาและพิมพ์แม้แต่ตัวอักษรสองสามคำในภาษาตุรกีจากเค้าโครง Dvorak หรือในทางกลับกัน

ฉันมีการผูกสองปุ่มเพื่อแสดงความยินดีสำหรับการเปลี่ยนเลย์เอาต์ใน Xorg แต่สิ่งนี้ทำให้ฉันมีเวิร์กโฟลว์ที่น่าอึดอัดใจในกลุ่มเมื่อแก้ไขไฟล์ภาษาแบบผสม:

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

ฉันอยากจะตัดทอนสิ่งนี้ให้สั้นลงเช่น:

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

... เช่นการใช้<leader>iชุดของ:imapค่าเพื่อเลียนแบบเค้าโครงภาษาตุรกีโดยไม่เปลี่ยนเค้าโครงแป้นพิมพ์ของระบบ ในเวลาเดียวกันiจะเปลี่ยนเป็นโหมดแทรก แต่ไม่มี:imapค่าเพิ่มเติม คุณค่าของตัวเองนั้นง่ายฉันแค่ต้องการการแมปตัวอักษรแบบนี้:

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

คำถามคือวิธีการที่จะติดตั้งสองโหมดแทรกโหมดแทรกหนึ่งปกติและหนึ่งหลอกแทรกโหมดที่เหมือนกันยกเว้นสำหรับพวงของแมปและวิธีการที่ฉันสามารถเรียกโหมดเหล่านี้ด้วย<leader>i, <leader>aฯลฯ ?


1
นี่คือแนวคิดที่แตกต่าง: คุณมีInsertEnterและInsertLeaveautocmds ซึ่งคุณสามารถใช้เพื่อสลับเค้าโครงโดยอัตโนมัติ โดยเฉพาะอย่างยิ่งInsertLeaveคุณสามารถตรวจสอบว่าเป็นภาษาตุรกีได้หรือไม่ให้เปลี่ยนเป็น Dvorak ตั้งค่าสถานะและเมื่อคุณใส่ส่วนแทรกอีกครั้งให้เปลี่ยนกลับเป็นภาษาตุรกีหากเป็นกรณีล่าสุดที่คุณออกจากโหมดแทรก
Martin Tournoij

@Carpetsmoker ฉันไม่เห็นว่าวิธีการแก้ไขปัญหาของฉัน แม้ว่าจะมีบางสิ่งที่ "ตรวจสอบ" (ฉันไม่แน่ใจว่าสิ่งที่คุณคิดว่าฉันกำลังตรวจสอบที่นั่น ... ส่วนหนึ่งของปัญหาคือฉันกลับไปมาโดยใช้คำต่อคำ) เป็นหนึ่งในเหตุผลที่ฉัน กำลังคิดตามสายของ:imapมันคือว่ามันจะทำงานได้แม้ในเซสชั่น ssh ระยะไกลหรือเมื่อ$DISPLAYไม่ได้กำหนดไว้
Caleb

คำตอบ:


7

เป็นกลุ่มมีบางสิ่งบางอย่างเช่นนี้ในรูปแบบของkeymaps จาก: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อธิบายการทำแผนที่ดังกล่าวสำหรับการจำลอง Caps Lock; อย่างที่คุณเห็นมีไฟล์การแมปคล้ายกับที่คุณเขียนไว้ในคำถามของคุณ

คุณเปิดใช้งานการตั้งค่านี้ผ่านหรือผ่านทางแบบไดนามิก:set iminsert=1 i_CTRL-^นอกจากนี้ยังใช้งานได้/searchกับ'imsearch'ตัวเลือก


3

คำตอบของ Ingo Karkatดูเหมือนจะเป็นทางออกที่ถูกต้องและแก้ไขสถานการณ์ของฉันได้ อย่างไรก็ตามนี่เป็นคำแนะนำที่ละเอียดมากขึ้นสำหรับผู้อื่นที่เพิ่งเริ่มต้นด้วยฟังก์ชั่นแผนที่ภาษาของ vim

ก่อนอื่นคุณต้องมีไฟล์แผนที่ภาษา ดังในตัวอย่าง Caps Lock คุณจะต้องใส่สิ่งต่อไปนี้ใน~/.vim/keymap/dvorak2turkishf.vim(ดาวน์โหลดการแมปแบบเต็มจาก Githu b):

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

เมื่อถึงตอนนั้นการตั้งค่าการเชื่อมโยงยังคงเป็นการเปิดใช้งานในบางกรณี คุณจะต้องเพิ่มบางสิ่งลงใน~/.vimrcไฟล์ของคุณ

ก่อนอื่นให้ผูกคีย์การค้นหากับอินพุตหนึ่ง:

set imsearch=-1

จากนั้นตั้งค่าว่าจะใช้คีย์แมปใดในโหมดป้อนข้อมูลภาษาอื่น:

set keymap=dvorak2turkishf

ปิดโหมดอินพุตทางเลือกดังนั้นโดยค่าเริ่มต้นจะไม่มีการเปลี่ยนแปลง:

set iminsert=0

ตั้งค่าคำสั่งอัตโนมัติเพื่อให้ทำงานเมื่อใดก็ตามที่ออกจากโหมดแทรกเพื่อปิดสวิตช์ภาษาอื่น:

autocmd InsertLeave * set iminsert=0

เพิ่มการโยงสำหรับวิธีการต่าง ๆ ที่คุณอาจท้ายในโหมดป้อนข้อมูลภาษาอื่นเพื่อให้ใช้<leader>(โดยปกติ\) ก่อนที่พวกเขาจะตั้งแผนที่ภาษา swtich เป็นเปิดก่อนที่จะเปลี่ยน:

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

ตั้งค่าสีเคอร์เซอร์ที่แตกต่างกันเมื่อเปิดใช้งานแผนที่:

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

รวมกันทั้งหมดนี่คือสิ่งที่เปลี่ยนแปลงได้ในการตั้งค่าของฉัน <ctrl>+^ในฐานะที่เป็นบันทึกสุดท้ายหนึ่งคุณอยู่ในโหมดแทรกคุณสามารถสลับตัวเลือกแผนที่ภาษาและปิดใช้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.