ในระยะสั้น:
- รหัสเป็นวิธีการแทนกุญแจ
- ลำดับของคีย์ที่ถูกแมปคือการสืบทอดของรหัสที่เรียกการกระทำ
ตอนนี้ฉันคิดว่าคำถามของคุณเกี่ยวกับความแตกต่างระหว่างtimeoutlen
และttimeoutlen
แทนที่จะเป็นความแตกต่างระหว่างลำดับของคีย์ที่แมปและรหัสหลัก
คำตอบของฉันขึ้นอยู่กับบทความ wikia นี้ที่คุณควรอ่านจริง ๆ เพราะมันกล่าวถึงบางประเด็นที่ฉันไม่ได้พูดถึงที่นี่เพื่อให้คำตอบสั้นและชัดเจนที่สุดเท่าที่จะทำได้
ก่อนอื่นเรามาพูดถึงรหัสที่สำคัญ บทความกำหนดรหัสสองชนิด:
รหัสเทอร์มินัล:
นี่คือวิธีที่เทอร์มินัลแสดงถึงคีย์
รหัสเหล่านี้ที่เทอร์มินัลส่งไปยัง Vim
ในการรับรายการรหัสคีย์เหล่านี้คุณควรใช้เอกสารเทอร์มินัลของคุณ คุณยังสามารถดูพวกเขาได้โดยพิมพ์คำสั่งcat
ในเทอร์มินัลของคุณและพิมพ์รหัสที่คุณต้องการรู้รหัส ตัวอย่างเช่นใน terminal ของฉันรหัสสำคัญสำหรับShiftF1ดูเหมือนว่า:
^[[23~
รหัสเป็นกลุ่ม:
พวกเขาเป็นตัวแทนกลุ่มที่สำคัญ
Vim ต้องการวิธีที่สอดคล้องกันเพื่อแทนค่าคีย์เนื่องจากรหัสคีย์ของเทอร์มินัลเปลี่ยนจากเทอร์มินัลเป็นคีย์อื่น :h t_ku
รายชื่อของการพิมพ์ซ้ำเป็นกลุ่มสามารถเข้าถึงได้ คีย์โค้ด Vim สำหรับShiftF1ดูเหมือนว่า:
<S-F1>
ดังนั้นเมื่อผมกดบนแป้นพิมพ์ของฉันไดรเวอร์และระบบปฏิบัติการจะช่วยให้ขั้วรู้ว่าผมกดปุ่มเหล่านี้ว่ามันจะแปลเป็นShiftF1 ^[[23~
เทอร์มินัลจะส่งสิ่งนั้นไปยังกลุ่มซึ่งจะเข้าใจว่ามันหมายถึง<S-F1>
และจะทริกเกอร์การกระทำที่แมปไปยังรหัสคีย์นี้
เราสามารถตั้งค่ารหัส Vim ได้ดังนั้นหากเทอร์มินัลของคุณส่งรหัสที่ Vim ไม่เข้าใจ<S-F1>
เช่นคุณสามารถใช้คำสั่งต่อไปนี้ สิ่งนี้จะบอกให้ Vim ทราบเมื่อคุณได้รับรหัส^[[24~
แปลแปลว่า<S-F1>
:
set <S-F1> ^[[24~
ดังนั้นลำดับคีย์แมปคืออะไร?
ลำดับคีย์ที่แม็พจะเป็น lhs ของการแม็พและสามารถเป็นรหัสคีย์ Vim หรือรหัสเทอร์มินัลคีย์ ตัวอย่างเช่น:
:nmap ^[[24~ :bn<CR>
:nmap <S-F1> :bn<CR>
การแม็พแรกจะแม็พรหัสเทอร์มินัลในขณะที่การแมปรหัส Vim ที่สอง
ตอนนี้สำหรับความแตกต่างระหว่างtimeoutlen
และttimeoutlen
?
ttimeoutlen
เป็นเวลาที่กลุ่มจะรอชิ้นส่วนที่แตกต่างกันของคีย์รหัสขั้ว (ในตัวอย่างก่อนหน้านี้ว่าจะเป็นอย่างไร^[
นั้น[
แล้ว2
ฯลฯ ...
เนื่องจากรหัสคีย์เหล่านี้ถูกส่งโดยเทอร์มินัลจึงไม่ควรมีการหน่วงเวลาระหว่างอินพุตเหล่านี้ (เนื่องจากมีการส่งเทอร์มินัลทั้งหมดในครั้งเดียว) นี่คือเหตุผลที่หมอแนะนำค่าน้อยมากสำหรับการตั้งค่านี้
timeoutlen
คือเวลาที่ Vim จะรอคีย์ Vim ที่ต่อเนื่องซึ่งผู้ใช้ป้อนด้วยตนเองและทำให้อินพุตนานกว่ารหัสคีย์เทอร์มินัล
ในการใช้ตัวอย่างสมมติว่า:
- คุณแมป
^[[1;6B
กับการกระทำ
^[1;6B
เป็นกุญแจสำคัญของเทอร์มินัลของคุณสำหรับ ctrlshiftdown
^[
เป็น keycode terminal Escapeของคุณสำหรับ
พฤติกรรมที่คุณควรคาดหวัง:
- หากคุณตั้งค่าขนาดใหญ่
ttimeoutlen
ทุกครั้งที่คุณพิมพ์EscapeVim จะรอเพื่อดูว่าคุณหมายถึง^[
(เช่นEscape) หรือ^[1;6B
(เช่นctrlshiftdown)
- หากคุณตั้งค่าขนาดเล็ก
ttimeoutlen
คุณจะไม่ล่าช้าเมื่อคุณพิมพ์Escapeเพราะ Vim จะรู้ว่ามันเป็นรหัสคีย์ที่สมบูรณ์
และtimeoutlen
จะทำหน้าที่ในระดับที่สูงขึ้นหากคุณมีการแมปต่อไปนี้:
inoremap jj <Esc>
inoremap jk <Esc>:nohl<CR>
เมื่อคุณพิมพ์jvim จะtimeoutlen
ไม่รอเพราะจุดเริ่มต้นของรหัสคีย์เทอร์มินัลjไม่เสร็จสมบูรณ์ แต่เนื่องจากกำลังรอรหัส Vim ถัดไป
ฉันหวังว่าคำอธิบายของฉันจะสมเหตุสมผลโปรดทราบว่าการแมปบางอย่างที่ฉันใช้ไม่สมเหตุสมผลในมุมมองที่ใช้งานได้ แต่อยู่ที่นี่เพื่อความสะดวกในการอธิบาย