ฉันสามารถใช้โหมดการแก้ไข Vim บนบรรทัดคำสั่งโดยไม่สูญเสียการค้นหาประวัติซ้ำหรือไม่


8

ฉันกำลัง uzing zsh และเนื่องจากฉันเป็นผู้ใช้ Vim ตัวยงฉันเพิ่งเปลี่ยนมาใช้การแก้ไขสไตล์ Vim บนบรรทัดคำสั่ง (ซึ่งหมายความว่าถ้าฉันพิมพ์ls foo/barและตัดสินใจฉันต้องการที่จะcdแทนฉันสามารถตีEsc ^ที่จะกระโดดกลับไปที่จุดเริ่มต้นและcw cdมีการเปลี่ยนแปลงไปlscd

นั่นเป็นปัญหาทั้งหมด แต่ปัญหาคือฉันไม่สามารถใช้Ctrl+Rเพื่อค้นหาประวัติการเรียกซ้ำ มีวิธีอื่นที่จะทำหรือฉันสามารถแทนที่ปุ่มลัดเป็นกลุ่มเพื่อดึงมันกลับมาได้หรือไม่?


ทางเลือกที่ยาก! garyjohnแสดงวิธีการ Vim ที่จะทำและJdeBPแสดงวิธีรับ keybinding สำหรับ Ctrl + R กลับมาแล้ว! ฉันจะเล่นกับทั้งสองวิธีและยอมรับคำตอบในภายหลัง ฉันจะตัดสินใจตาม 1) วิธีการใดที่ดูเหมือนง่ายสำหรับฉันและ 2) ซึ่งได้รับการโหวตมากขึ้น ขอบคุณทั้งคุณ!
นาธานลอง

คำตอบ:


6

แน่นอนคุณไม่สามารถใช้Ctrl+ Rได้อีก หากคุณศึกษาคู่มือ Z Shell คุณจะเห็นว่ามีเพียงการเชื่อมโยงคีย์สำหรับhistory-incremental-search-backwardวิดเจ็ตในemacskeymap ไม่มีการโยงคีย์สำหรับคีย์ใน vi keymaps

แต่ตามที่คุณจะพบได้จากการอ่านคู่มือ (บทที่ 18) การเพิ่มการเชื่อมโยงคีย์เป็นการออกกำลังกายที่ค่อนข้างง่ายในการใช้bindkeyคำสั่ง:

bindkey "^R" history-incremental-search-backward

คุณไม่จำเป็นต้องใช้zleคำสั่งเพื่อแมปวิดเจ็ตไปยังฟังก์ชันเชลล์เนื่องจากนี่เป็นวิดเจ็ตมาตรฐาน

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

bindkey -M viins '^R' history-incremental-search-backward
bindkey -M vicmd '^R' history-incremental-search-backward

นอกจากนี้โปรดทราบว่าในขณะที่ garyjohn ชี้ให้เห็นใน keymap คำสั่ง "vi" /อักขระจะถูกผูกไว้กับvi-history-search-backwardวิดเจ็ต ความแตกต่างระหว่างวิดเจ็ตนี้และhistory-incremental-search-backwardวิดเจ็ตเป็นพฤติกรรมวิดเจ็ตที่ใช้ครั้งเดียวในโหมดการค้นหาประวัติ นี่คือความแตกต่างสองสามอย่างที่คุณจะสังเกตเห็น:

  • การสลับโหมด vi:
    • โหมดการค้นหาhistory-incremental-search-backwardสลับระหว่างmainและปุ่มกดvicmdเมื่อคุณเรียกใช้vi-cmd-modeวิดเจ็ตในขณะที่ยังคงอยู่ในโหมดค้นหา เช่นจากemacsโหมด presssing EscสำคัญหรือCtrl+ XCtrl+ Vปุ่มสลับโหมดการค้นหาระหว่างemacsและvicmdkeymaps (การเรียกใช้history-incremental-search-backwardจากvicmdkeymap นั้นจะยุ่งยากถ้าคุณไม่ผูกอะไรไว้vi-cmd-modeในvicmdkeymap เช่นกัน)
    • โหมดการค้นหาในการvi-history-search-backwardปฏิบัติต่อvi-cmd-modeเครื่องมือเป็นaccept-lineและจะสิ้นสุดการค้นหาเข้าสู่โหมดคำสั่งที่คุณป้อนการค้นหาอีกครั้ง ie (พร้อมการผูกค่าเริ่มต้น) /เข้าสู่โหมดค้นหาจากโหมดคำสั่งและEscกลับไปที่โหมดคำสั่ง
  • ค้นหาซ้ำ:
    • ในhistory-incremental-search-backwardทั้งสองhistory-incremental-search-backwardและvi-rev-repeat-searchวิดเจ็ตได้รับการยอมรับ เช่น (สมมติว่าคุณได้ทำการเปลี่ยนแปลงการผูกไว้ด้านบน) ทั้งCtrl+ RและNจะค้นหาบรรทัดที่ตรงกันก่อนหน้า
    • ในvi-history-search-backwardเพียงvi-rev-repeat-searchเครื่องมือที่ได้รับการยอมรับ เช่น (สมมติว่าคุณเปลี่ยนแปลงการผูกไว้ด้านบน) Ctrl+ Rจะทำให้เกิดเสียงบี๊บและถูกละเว้น

หน่วยความจำกล้ามเนื้อของฉันอวยพรคุณ!
นาธานลอง

4

ในโหมด vi ทุบตีของการพิมพ์จะค้นหาประวัติคำสั่งสำหรับ<Esc>/<string><Enter> จะค้นหาเพิ่มเติมในประวัติศาสตร์ จะค้นหาล่วงหน้า zshell อาจเหมือนกัน<string>nN


1
ที่น่าสนใจคือ - ฉันใช้การค้นหาเป็นความเคลื่อนไหวใน Vim บ่อยครั้ง ฉันเดาว่าฉันไม่สามารถใช้มันเพื่อย้ายภายในคำสั่งที่ฉันกำลังแก้ไขอยู่เนื่องจากมันถูกตรึงไว้กับประวัติการค้นหาใช่มั้ย?
นาธานลอง

ขวา. แต่คุณสามารถ (อย่างน้อยในทุบตี) ใช้ f, F, t, T, ';' (เซมิโคลอน) และคำสั่ง ',' (เครื่องหมายจุลภาค) เพื่อเลื่อนไปข้างหน้าและกลับไปที่อักขระเฉพาะในบรรทัด
garyjohn

1

ฉันชอบที่จะใช้:

bindkey -M vicmd '/' history-incremental-search-backward

วิธีนี้ฉันสามารถพิมพ์ESC /textและดูบรรทัดคำสั่ง ถ้าฉันต้องการที่จะไปตรงกับที่ฉันพิมพ์ESC n

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