วิธีที่สะดวกที่สุดในการทำงานกับแป้นพิมพ์ที่แตกต่างกันในกลุ่มคืออะไร?


18

บางครั้งฉันต้องเขียนคำภาษากรีก แต่เมื่อฉันใช้แป้นพิมพ์ภาษากรีกการกดปุ่มการพูดการพูด<C-p>จะถูกเข้าใจ<C-π>และไม่ใช่คำสั่งที่ฉันตั้งใจ :map <C-p> <C-π>นี้สามารถแก้ไขด้วย ฉันสามารถทำสิ่งนี้กับตัวอักษรทั้งหมดโดยไม่ทำรายการทั้งหมดได้หรือไม่?

PS การทำรายการทั้งหมดไม่ได้ผลลัพธ์ที่สมบูรณ์แบบ เช่นqอยู่;บน Gr แป้นพิมพ์ แต่เราไม่ต้องการแมป ถึง q นอกจากนี้ด้วยเหตุผลบางอย่างΖΖ (ซีตาซีตา) ไม่ทำงานหลังจาก:map Ζ Zนั้น และคำสั่งที่ฉันกำหนด\lwไม่สามารถใช้งาน\λςได้


2
ฉันคิดว่าการทำแผนที่ไม่ใช่วิธีที่ดีที่จะไป: บางทีสิ่งที่คุณกำลังมองหาคือlangmapตัวเลือก (ดูเอกสารที่มีตัวอย่างสำหรับรูปแบบกรีก) ตัวเลือกนี้ถูกสร้างขึ้นมาเพื่อช่วยจัดการกับแป้นพิมพ์ที่ไม่ใช่ละตินเช่นกรีกหรือไซริลลิก อนุญาตให้คุณกำหนดสัญลักษณ์คู่ซึ่งจะตีความตามปกติในโหมดแทรก แต่จะถูกแทนที่ในโหมดอื่นบางทีนี่อาจช่วยคุณได้
statox

@statox: ขอบคุณ! ฉันลองใช้แฟนเก่า แต่ไม่มีอะไรเกิดขึ้น ช่วยบอกว่าเป็นกลุ่มจะต้องปฏิบัติตามตัวเลือก + langmap มีวิธีง่าย ๆ ในการตรวจสอบว่าเป็นหรือไม่? ฉันใช้เวอร์ชั่นที่มาพร้อมกับ Mac OS
Toothrot

1
คุณสามารถใช้:echo has('langmap')ถ้าคุณได้รับ1คุณมีมันถ้าคุณได้รับ0คุณไม่ได้
statox

@statox: ขอบคุณ! ฉันอัปเดตด้วยbrew install vim --override-system-viและ:echo has &cตอนนี้ส่งคืน 1 ZZ ใช้งานได้ \lvยังคงมีปัญหากับ& c
Toothrot

ฉันไม่เข้าใจ:echo has &cส่วนฉันไม่เห็นว่ามันเกี่ยวข้องกับlangmapยังเมื่อคุณได้เป็นกลุ่มที่รวบรวมกับlangmapคุณต้องระบุการแมปด้วย:set langmap=ΑA,ΒB,ΨC [...]ใน vimrc ของคุณ
statox

คำตอบ:


6

ฉันอยากจะแนะนำkeymapซึ่งสามารถแก้ปัญหาของคุณ ใส่สิ่งเหล่านี้ใน vimrc ของคุณ

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

เพื่อปิดการใช้งานภาษากรีกเป็นค่าเริ่มต้นคุณสามารถสลับตัวเลือกเปิด (กรีก) และปิด (ภาษาอังกฤษ) โดยใช้<ctrl>+^(คุณยังสามารถใช้<ctrl>+6มันจะถูกแมปบนปุ่มไม่ใช้สัญลักษณ์) ในโหมดแทรกและโหมดแทนที่ (ไม่ทำงานใน โหมดปกติ). หากต้องการปิดใช้งานโดยอัตโนมัติเมื่อออกจากโหมดแทรกคุณสามารถใช้

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

เพิ่มเติมเกี่ยวกับสิ่งเหล่านี้

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


แก้ไขความคิดเห็นที่สอง:

คุณสามารถลองใช้วิธีนี้เพื่อเปิดกรีกโดยอัตโนมัติหากเข้าสู่โหมดแทรก (และโหมดแทนที่) และปิดโดยอัตโนมัติหากออก (จากนั้นคุณไม่จำเป็นต้องทำแผนที่ดังกล่าวมาก่อน)

augroup Greek
    au InsertEnter * set iminsert=1
    au InsertLeave * set iminsert=0
augroup END

จำเป็นหรือไม่ที่จะต้องใช้ภาษากรีกแบบ polytonic สำหรับฉันแล้วดูเหมือนว่าต้องการการเข้ารหัสที่ถูกต้องเท่านั้นจากนั้นจึงใช้อินพุต MacOS X ในตัว แต่นี่อาจเป็นเพียงความประทับใจที่ผิดของฉัน คุณยังสามารถเปลี่ยนไปใช้แป้นพิมพ์แบบ polytonic Greek ใน MacOS X (และเรียนรู้ได้ แต่ฉันคิดว่ามันไม่ใช่สิ่งที่คุณต้องการ :-) เกี่ยวกับความล่าช้าของἀอาจมีการทำแผนที่ลองค้นหา:map >aและถ้ามี , unmap :unmap >aมันด้วย ในฐานะผู้ใช้ที่ไม่ใช่ชาวกรีกและไม่ใช่ชาว MacOs ฉันอยู่ในจุดสิ้นสุดแล้ว ขออภัยและโชคดี!
ryuichiro

10

ดังที่ฉันได้กล่าวไว้ในความคิดเห็นการแม็พในไม่ได้ออกแบบมาเพื่อทำสิ่งที่คุณต้องการจะทำ langmapเป็นตัวเลือกที่น่าสนใจสำหรับใช้กรณีนี้คือ

ตัวเลือกนี้ช่วยให้การทำงานหรือแป้นพิมพ์ของคุณอยู่ในโหมดแทรกและเปลี่ยนการทำงานในโหมดอื่น ๆ

หากต้องการใช้งาน Vim จะต้องคอมไพล์ด้วย+langmapคุณสามารถตรวจสอบว่าตัวเลือกนี้เปิดใช้งานด้วยecho has('langmap'): หากคำสั่งส่งคืน1ตัวเลือกถูกเปิดใช้งานมิฉะนั้นคุณจะต้องตั้งค่าด้วยตัวเลือกนี้ที่เปิดใช้งาน (เพื่อทราบวิธีการทำ เป็นคำถามอื่น)

เมื่อเปิดใช้งานตัวเลือกใช้คู่ของตัวละครตัวอย่างเช่นset langmap += à@จะช่วยให้คุณเพิ่มàในบัฟเฟอร์ของคุณเมื่อคุณอยู่ในโหมดแทรกและคุณพิมพ์àแต่การพิมพ์àในโหมดปกติจริงจะก่อให้เกิด@(ตัวอย่างนี้จะมีประโยชน์กับ azerty แป้นพิมพ์เพื่อความสะดวกในการทำงานกับมาโคร)

หากต้องการใช้ langmap ในภาษากรีกคุณสามารถทำตามตัวอย่างที่ให้ไว้ใน:h 'langmap'การเพิ่มบรรทัดนี้ในของคุณvimrc (การคัดลอกบรรทัดนี้จากที่นี่อาจไม่เป็นความคิดที่ดีเนื่องจากฉันไม่แน่ใจเกี่ยวกับการเข้ารหัสจริงๆปลอดภัยกว่า) :

: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

ตอนนี้จากสิ่งที่ฉันเข้าใจในความคิดเห็นของคุณมันยังคงเป็นปัญหาเมื่อคุณพยายามใช้คำสั่งที่กำหนดไว้ล่วงหน้า: เมื่อคุณพิมพ์คำสั่งลักษณะการทำงานของโหมดแทรกจะถูกทริกเกอร์แทน langmap ที่กำหนดไว้ น่าเสียดายที่ฉันไม่แน่ใจว่าฉันมีทางออกที่ดีสำหรับสิ่งนั้น แนวคิดหนึ่งที่สามารถกำหนดคำสั่งใหม่ได้เช่น:

command λς lw

ด้วยวิธีนี้เมื่อคุณจะพิมพ์คำสั่งเป็นλςกลุ่มจะทำงานlwแต่ฉันเห็นข้อเสียเปรียบหลายวิธีนี้

  • มันอาจเป็นความเจ็บปวดครั้งใหญ่ในก้นเพื่อกำหนดคำสั่งทั้งหมดที่คุณต้องการใช้ใหม่
  • คำสั่งที่ผู้ใช้กำหนดต้องเริ่มต้นด้วยตัวพิมพ์ใหญ่และตอนนี้ฉันคิดว่ามันสะดวกแค่ไหนในภาษากรีก

ดังนั้นบางทีปลั๊กอินที่แนะนำโดย @Alexander Myshov ในคำตอบของเขาสำหรับคำถามนี้อาจมีประโยชน์ (เพราะฉันไม่เคยลองสิ่งเหล่านี้เลยฉันไม่รู้ว่าพวกเขาแก้ปัญหาได้หรือไม่ แต่ดูเหมือนว่าพวกเขาทำ)


1

ฉันพิมพ์เป็นภาษาอังกฤษและสวีเดนเป็นประจำ ภาษาสวีเดนเป็นปัญหาเล็ก ๆ ในการแก้ปัญหามากกว่าภาษากรีกเพราะมันจะขยายตัวอักษรภาษาอังกฤษด้วยตัวละครเพียงไม่กี่ตัว แต่ฉันคิดว่าวิธีแก้ปัญหาของฉันสามารถถ่ายโอนเป็นภาษากรีกได้

ฉันเคยเปลี่ยนโดยใช้สวิตช์แป้นพิมพ์ของระบบปฏิบัติการ ปัญหาเกี่ยวกับสิ่งนี้คือเมื่อ OP ระบุไว้ว่ามันแบ่งคำสั่งทั้งหมดตั้งแต่ในโหมดปกติแต่ละคีย์จะส่งสัญญาณอื่นไปยัง Vim ด้วยแป้นพิมพ์ที่ไม่ใช่ภาษาอังกฤษ ในแป้นพิมพ์สวีเดนรูปแบบนอกจากนี้ทั้งกลุ่มของอักขระที่ไม่ใช่ตัวอักษรจะถูกย้ายไปเพื่อเปิดทางให้ตัวละครใหม่å, และä öตัวอย่างเช่น}พิมพ์ด้วย Alt-Shift-9 (จับคู่วงเล็บเปิดบนแป้นพิมพ์ภาษาอังกฤษ) และแบ็กสแลชพิมพ์ด้วย Alt-Shift-7 การสลับไปใช้เค้าโครงแป้นพิมพ์ภาษาวานิลลาสวีดิชสำหรับโหมดแทรกจึงทำให้เกิดอาการปวดหัวทั้งหมด

วิธีแก้ปัญหาของฉันคือทำการแมปคีย์ที่เกี่ยวข้องในโหมดแทรกเท่านั้นและทำการแมปเหล่านี้ในฟังก์ชั่นเพื่อให้ฉันสามารถสลับไปมาได้อย่างง่ายดาย .vimrcโค้ดข้างล่างนี้เป็นวิธีที่ผมทำอย่างนี้ในของฉัน นี่เป็นการเพิ่มตัวละครที่ฉันต้องการให้อยู่ในตำแหน่งที่พวกเขามีในรูปแบบแป้นพิมพ์ภาษาสวีเดนเท่านั้น การพิมพ์ตัวอักษรที่มีการหลอกลวงโดยพวกเขา ( ;, :, [, {, "และ') ผมเพียงแค่กดปุ่มสองครั้ง โชคดีที่คนโง่เท่านั้นที่ต้องพิมพ์สองคนäs ในแถว (หากการกดปุ่มสองครั้งนี้ไม่เหมาะสมคุณสามารถแมปพวกเขากับ Ctrl หรืออะไรทำนองนั้นได้หลักการพื้นฐานคือตัวละครที่ถูกซ่อนอยู่ในที่ของพวกมันบนแป้นพิมพ์ กว่าที่จะขยับไปมา) เมื่อฉันต้องการพิมพ์ภาษาสวีเดนฉันหมายถึงอะไร<Leader>sซึ่งเปลี่ยนไปใช้การจับคู่เหล่านี้และใช้การตรวจการสะกดคำภาษาสวีเดน <Leader>eการเปลี่ยนกลับที่ฉันทำ

ทีนี้สำหรับชาวกรีกสิ่งนี้จะเกี่ยวข้องกับการทำแผนที่สำหรับตัวอักษรทั้งหมดซึ่งจริงๆแล้วเป็นเรื่องที่ยุ่งยากน้อยกว่าฟังดูเหมือนเมื่อคุณเอาหลักการลงไป ส่วนที่ยุ่งยากนั้นจะเป็นการยกเลิกการแมปการเปลี่ยนแปลงทั้งหมดเมื่อเปลี่ยนเป็นภาษาอังกฤษ บางทีบางคนอาจคิดวิธีที่ดีก็ได้

ฉันวางแผนที่จะทำฟังก์ชั่นแทรกเช่นที่อยู่ด้านล่างสำหรับภาษาอาหรับภาษาอื่นที่ฉันพิมพ์บ่อย ๆ ฉันอาจกลับมาที่นี่เพื่อรายงานเกี่ยวกับกระบวนการ

" 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>

1
ฉันอาจจะผิด แต่ฉันคิดว่าคำตอบของคุณอนุญาตให้ใช้ตัวอักษรที่ไม่ใช่ภาษาอังกฤษในโหมดแทรกได้อย่างง่ายดายในขณะที่ปัญหาของ OP คือการรับตัวอักษรภาษาอังกฤษในโหมดอื่นนอกเหนือจากโหมดแทรก ฉันไม่แน่ใจว่าคำตอบของคุณอยู่ที่ปัญหาเริ่มต้น ความคิดของฟังก์ชั่นการเปิด / ปิดการใช้งานการแมปยังน่าสนใจทีเดียว
statox

@ STATOX ดีฉันอาจเข้าใจผิดคำถาม แต่ถ้าปัญหาคือการแทรกตัวละครที่ไม่ใช่ภาษาอังกฤษได้อย่างง่ายดายใน insertmode ในขณะที่ยังคงฟังก์ชั่นโหมดปกติฉันเชื่อว่าคำถามของฉันอย่างน้อย attemps เพื่อแก้ไขปัญหานั้น
Andreas

ฉันขอโทษฉันไม่ได้ตั้งใจจะทำผิด: ฉันกำลังชี้ให้เห็นว่าอาจมีช่องว่างระหว่างคำถามและคำตอบของคุณ แต่แน่นอนว่าคุณพยายามที่จะแก้ไขปัญหาและอย่างที่ฉันบอกว่าฉันชอบความคิดของฟังก์ชั่นที่เปิดใช้งาน และปิดการใช้งานการแมป ฉันไม่ได้ปฏิเสธคำตอบของคุณและฉันขอโทษจริงๆที่มันฟังดูเหมือน
statox

1
@statox ไม่มีความผิด และถ้าคุณปฏิเสธคำตอบของฉันนั่นก็จะเป็นไปด้วยดี
Andreas

1

ฉันพิมพ์สองภาษาด้วย: รัสเซียและอังกฤษ และตอนนี้ผมใช้ปลั๊กอินนี้https://github.com/lyokha/vim-xkbswitch ปลั๊กอินนี้จะมีการพึ่งพาตัวสลับรูปแบบแป้นพิมพ์พื้นเมืองสำหรับ Mac OS X คุณสามารถใช้ระเบิดหนึ่งhttps://github.com/myshov/xkbswitch-macosx

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