ในระยะสั้น:
- รหัสเป็นวิธีการแทนกุญแจ
- ลำดับของคีย์ที่ถูกแมปคือการสืบทอดของรหัสที่เรียกการกระทำ
ตอนนี้ฉันคิดว่าคำถามของคุณเกี่ยวกับความแตกต่างระหว่าง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 ถัดไป
ฉันหวังว่าคำอธิบายของฉันจะสมเหตุสมผลโปรดทราบว่าการแมปบางอย่างที่ฉันใช้ไม่สมเหตุสมผลในมุมมองที่ใช้งานได้ แต่อยู่ที่นี่เพื่อความสะดวกในการอธิบาย