ฉันจะค้นหาย้อนกลับในโหมด vi ของ ZSH ได้อย่างไร


47

ฉันใช้vimสำหรับความต้องการแก้ไขทั้งหมดของฉันดังนั้นฉันตัดสินใจลองใช้โหมด vi สำหรับเชลล์ของฉันอีกครั้ง (ปัจจุบัน ZSH w / oh-my-zsh บน OS X) แต่ฉันพบว่าตัวเองพยายาม (และล้มเหลว) เพื่อใช้งานCtrl-Rอย่างต่อเนื่อง คีย์ที่มีผลผูกพันเทียบเท่าคืออะไร และสำหรับการอ้างอิงในอนาคตฉันจะเข้าใจตัวเองได้อย่างไร ฉันค่อนข้างมั่นใจว่าฉันสามารถใช้bind -Pในการทุบตี


2
ตาม 'man zshzle' การเพิ่มประวัติค้นหาแบบย้อนกลับจะไม่ถูกผูกไว้ในโหมด Vi (vicmd, viins) โดยค่าเริ่มต้น
paul

คำตอบ:


56

คุณสามารถเรียกใช้bindkeyโดยไม่มีอาร์กิวเมนต์เพื่อรับรายการการโยงที่มีอยู่เช่น:

# Enter vi mode
chopper:~> bindkey -v

# Search for history key bindings
chopper:~> bindkey | fgrep history
"^[OA" up-line-or-history
"^[OB" down-line-or-history
"^[[A" up-line-or-history
"^[[B" down-line-or-history

ในโหมด emacs การเชื่อมที่คุณต้องการคือhistory-incremental-search-backwardแต่ไม่ได้ผูกไว้โดยค่าเริ่มต้นในโหมด vi ในการผูก Ctrl-R ด้วยตัวคุณเองคุณสามารถเรียกใช้คำสั่งนี้หรือเพิ่มลงใน~/.zshrc:

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

zshzlemanpage ( man zshzle) มีข้อมูลเพิ่มเติมเกี่ยวกับ zsh บรรณาธิการสาย bindkey และ emacs / vi โหมด


3
zshzleขอขอบคุณอย่างยิ่งสำหรับ นั่นค่อนข้างให้ข้อมูลและมีประโยชน์
แฮงค์เกย์

ฉันรักคุณ. อย่างจริงจัง. หลังจากอัปเกรดเป็น OSX El Capitan การค้นหาย้อนกลับได้หายไปและฉันพลาดมากกว่าทุกสิ่งในเวิร์กโฟลว์ประจำวันของฉัน
Christian

24

นี่เป็นคำถามโบราณ แต่คำตอบเดียว (และยอมรับ) โดยทั่วไปบอกวิธีการปลูก“ emacs-like” history-incremental-search-backwardสู่โหมด vi ในขณะที่สิ่งนี้ทำได้อย่างสมบูรณ์แบบและอาจเป็นวิธีที่เหมาะสมสำหรับคุณ แต่ก็แปลกเล็กน้อยที่ไม่มีใครพูดถึง "วิธี vi" ของประวัติการค้นหา

โหมด vi ใน zsh รองรับประวัติการค้นหาโดยใช้ปุ่ม vi / vim มาตรฐาน: /และ?ทั้งคู่มีให้ในโหมดคำสั่ง (กด<Esc>เพื่อเปลี่ยนจากโหมดแทรกเป็นโหมดคำสั่งเหมือนกับใน vi หรือ vim)

ความรู้สึกของพวกเขากลับกัน: เนื่องจากคุณมักจะต้องการค้นหาประวัติเชลล์ของคุณในทางกลับ/กันทำการค้นหาแบบย้อนกลับในขณะที่ทำการค้นหา?แบบส่งต่อ

เมื่อการเข้าชมครั้งแรกปรากฏขึ้นคุณสามารถ (เช่นเดียวกับใน vi / vim) ใช้nเพื่อค้นหาการค้นหายอดนิยมเพิ่มเติมในทิศทางเดียวกันหรือNย้อนกลับทิศทางการค้นหา

keybindings เริ่มต้นที่เกี่ยวข้องในvicmdkeymap คือ:

"/" vi-history-search-backward
"?" vi-history-search-forward
"n" vi-repeat-search
"N" vi-rev-repeat-search

2
นอกจากนี้ยังใช้งานได้ดี"^P" history-beginning-search-backwardและ"^N" history-beginning-search-forwardสำหรับการเติมข้อความอัตโนมัติที่มีลักษณะคล้าย vim (คุณเริ่มพิมพ์แล้วกดctrl+pหรือctrl+n)
cprn

สำหรับฉัน?ขึ้นมาbck-i-searchซึ่งเป็นสิ่งที่ฉันกำลังมองหา ขอขอบคุณ.
geowa4

@wjv ข้อได้เปรียบของ history-incremental-search-backward คือรองรับรูปแบบ glob ค่าเริ่มต้น/หรือ `? ' ไม่: coderwall.com/p/-jvcag/zsh-reverse-history-search-with-regex
alpha_989

@ alpha_989 การอ้างอิงบล็อกที่คุณอ้างอิงไม่ถูกต้อง อาจเป็นไปได้ว่าผู้เขียนมีการติดตั้ง zsh“ framework” บางอย่างที่ทำให้การใส่^Rพวงกุญแจมากเกินไป อักขระ“ เหมือน regex” เท่านั้นที่ได้รับการสนับสนุนจากทั้งคู่history-search-backwardและhistory-incremental-search-backwardคือ^เพื่อยึดสตริงการค้นหาให้เป็นจุดเริ่มต้นของบรรทัด พลังที่แท้จริงของhistory-incremental-search-backwardมันคือมันทำการค้นหาที่เพิ่มขึ้นตามชื่อของมัน ฉันนึกภาพออกว่าคนเราอาจต้องการผูกมันไว้ในvicmdkeymap ด้วยเหตุผลนั้น
wjv

@wjv คุณจะขวา .. ฉันควรที่จะเขียนไม่ได้history-incremental-pattern-search-backward อาจเป็นเครื่องมือ .. แต่ฉันคิดว่ามันมาติดตั้งโดยค่าเริ่มต้นใน zsh มันสนับสนุนรูปแบบไม่เป็นคุณได้อย่างถูกต้องชี้ออก: zsh.sourceforge.net/Doc/Release/Expansion.html#Glob-Operators มีแน่นอนเป็นความผิดพลาดในการโพสต์ ..history-incremental-search-backwardhistory-incremental-pattern-search-backwardsglobregex
alpha_989
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.