อะไรคือความแตกต่างระหว่าง“ ลำดับคีย์ที่แมป” และ“ รหัสคีย์”? (timeoutlen v ttimeoutlen)


20

คู่มือที่เป็นกลุ่มบอกว่าเราสามารถใช้timeoutlenเพื่อระบุความยาวหมดเวลาของคีย์ลำดับที่แมปและสามารถใช้ttimeoutlenเพื่อระบุความยาวหมดเวลาของการคีย์รหัส :

การตั้งค่าที่มีประโยชน์จะเป็น

:set timeout timeoutlen=3000 ttimeoutlen=100

(หมดเวลาในการทำแผนที่หลังจากสามวินาทีหมดเวลากับรหัสที่สำคัญหลังจากที่สิบวินาที)

อะไรคือคีย์รหัส ? พวกเขาแตกต่างจากลำดับของคีย์ที่แมปอย่างไร

ฉันรู้ว่าตัวอย่างของลำดับคีย์แมปjkมาจากแผนที่ด้านล่าง:

inoremap jk <esc>

ในตัวอย่างนี้เมื่อฉันอยู่ในโหมดแทรกและประเภทj, กลุ่มจะรอtimeoutlenมิลลิวินาทีสำหรับฉันที่จะกดkก่อนตัดสินใจว่าเจตนาของฉันคืออะไร

แต่รหัสสำคัญคืออะไรและttimeoutlenมีผลกับมันอย่างไร ขอบคุณ.

คำตอบ:


22

ในระยะสั้น:

  • รหัสเป็นวิธีการแทนกุญแจ
  • ลำดับของคีย์ที่ถูกแมปคือการสืบทอดของรหัสที่เรียกการกระทำ

ตอนนี้ฉันคิดว่าคำถามของคุณเกี่ยวกับความแตกต่างระหว่าง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 ถัดไป


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

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