ฉันจะค้นหาประวัติด้วยข้อความที่ป้อนไว้แล้วที่พร้อมท์ใน zsh ได้อย่างไร


58

ใน zsh, ฉันรู้ว่าฉันสามารถค้นหาประวัติกับ+Ctrl rอย่างไรก็ตามบ่อยครั้งที่ฉันเริ่มพิมพ์คำสั่งโดยตรงที่พรอมต์ แต่จากนั้นตระหนักว่าฉันควรจะค้นหาประวัติ เมื่อฉันกดCtrl+ rมันจะแสดงพรอมต์การค้นหาประวัติว่างดังนี้:

การแจ้งเตือนการค้นหาประวัติไม่ได้กรอกข้อมูลล่วงหน้า

แจ้งให้ทราบว่ามีข้อความที่ฉันแจ้งให้ แต่ไม่ได้ที่แจ้งให้ค้นหาประวัติ ฉันจะเริ่มการค้นหาประวัติด้วยข้อความที่มีอยู่ในพร้อมท์แล้วได้ดังนั้นจะมีลักษณะเช่นนี้:

พรอมต์การค้นหาประวัติที่เติมไว้ล่วงหน้า

คำตอบ:


44

คุณสามารถใช้ฟังก์ชั่นของ zlehistory-search :

bindkey "^[[A" history-beginning-search-backward
bindkey "^[[B" history-beginning-search-forward

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

ดังนั้นหากคุณป้อน "vim" และกดปุ่มUpzsh จะย้อนกลับย้อนหลังผ่านประวัติของคุณสำหรับคำสั่งเหล่านั้นที่เริ่มด้วย "vim" เท่านั้น

คุณสามารถวางเคอร์เซอร์ไว้ที่ท้ายบรรทัดเมื่อคุณเลือกคำสั่งที่ต้องการจากประวัติของ zsh โดยใช้ฟังก์ชั่นhistory-search-end (มักอยู่ใน/usr/share/zsh/functions/Zle/) และต่อ-endท้ายบรรทัดแต่ละบรรทัดดังนี้:

autoload -U history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^[[A" history-beginning-search-backward-end
bindkey "^[[B" history-beginning-search-forward-end

เยี่ยมมากขอบคุณ ฉันต้องลบ "--end" สำหรับทั้งคำสั่ง bindkey เพื่อให้ทำงานได้ ฉันยังไม่ได้แก้ไขคำตอบของคุณเพราะอาจมีสถานการณ์ที่จำเป็นบ้าง
Sean Mackesey

ไม่มีปัญหา: อัปเดตคำตอบพร้อมรายละเอียดที่คุณต้องการ
jasonwryan

สิ่งนี้ใช้งานได้สำหรับฉันจนถึงปลายเดือนพฤศจิกายน, ธันวาคม 2015 เมื่อฉันอัปเกรดเป็นรุ่นล่าสุดของโอ้ zsh ของฉัน ความคิดใด ๆ ข้อเสนอแนะ? มีใครเห็นอีกบ้างไหม วิธีแก้ปัญหา?
ฮานีอธิบายเมื่อ

2
@hanielabed Oh-my-Zsh เป็น clusterfsck ฉันไม่แปลกใจเลยที่มันจะทำลายบางสิ่งบางอย่างที่เป็นพื้นฐานในการค้นหาประวัติ ...
jasonwryan

1
มีวิธีใดบ้างที่เคอร์เซอร์จะข้ามไปยังจุดสิ้นสุดจากการค้นหาประวัติที่ว่างเปล่า แต่ยังคงอยู่ในตำแหน่งเดิมสำหรับการค้นหาบางส่วน? นี่คือสิ่งที่เกิดขึ้นในทุบตีในขณะนี้
CMCDragonkai

19

อีกทางเลือกที่มีประโยชน์คือ history | grep

กำหนดนามแฝงเช่น

alias hg='history | grep'

จากนั้นคุณสามารถพิมพ์hg whateverเพื่อค้นหาคำสั่งที่คุณใช้เช่น

$ hg chmod                                                                                                       
 1309  chmod +x rotate_files.sh 
 1385  chmod +x rotate_files_270.sh 
 1512  chmod +x testy.sh 
 1528  chmod +x act_on_2_numbers.sh 
 2142  chmod +x ~/bin/display_tmux_pane_pwd.sh
 4532  chmod +x cat_files.rb 

ฉันใส่นามแฝงนี้ในไฟล์ dot


17
อะไรhgทำให้ฉันนึกถึง ... โอ้ใช่แล้ว Mercurial!

12

หากคุณกำลังใช้oh-my-zshให้เพิ่มhistory-substring-searchในplugins=(...)บรรทัด

จากนั้นเพิ่ม

bindkey "^[[A" history-substring-search-up
bindkey "^[[B" history-substring-search-down

source $ZSH/oh-my-zsh.shที่ใดที่หนึ่งด้านล่างบรรทัดที่อ่าน บันทึกและเรียกใช้เทอร์มินัลใหม่หรือเรียกใช้source ~/.zshrcในเทอร์มินัลปัจจุบัน

หมายเหตุ: ^[[Aเป็นลำดับหลบหนีสำหรับลูกศรขึ้นในเทอร์มินัลที่ฉันใช้ (ลโลคิตตี) และอื่น ๆ อีกมากมาย หากต้องการเช็คอินเทอร์มินัลที่คุณเลือกให้พิมพ์showkey -aแล้วกดปุ่มพวกเขาต้องการค้นหาลำดับการหลบหนี


ไม่มีความชัดเจนว่าการกดปุ่มนี้ทำอย่างไรคำตอบข้างต้นอธิบายว่า "การเชื่อมโยงนี้ขึ้นและลง (ปรับสำหรับลำดับการหลบหนีของคุณเอง) เพื่อค้นหาประวัติย้อนหลังและไปข้างหน้าตามสิ่งที่ป้อนไว้ในพรอมต์"
โคลิน D

@ColinD เพิ่มบันทึกเพื่อชี้แจง
joelostblom

1
การค้นหาสตริงย่อยที่ดีที่สุดคือชุดคำสั่งที่ขึ้นต้นด้วย ในการใช้งานโดยไม่ต้องเป็นผู้ใช้ oh-my-zsh ที่ฉันทำbrew install zsh-history-substring-searchตรวจสอบ repo readme เพื่อดูคำแนะนำฉันจะทำต่อไปและสร้างคำตอบที่ฉันมีความสุขมากกับผลลัพธ์
เมอร์ลิน

7

คุณอาจต้องการใช้สคริปต์ที่https://github.com/zsh-users/zsh-history-substring-search

โดยที่คุณสามารถพิมพ์ส่วนใดก็ได้ของคำสั่งที่ป้อนไว้ก่อนหน้านี้แล้วกดปุ่มUpและDownเพื่อหมุนเวียนไปยังคำสั่งที่ตรงกัน


4

ฉันอยากจะแนะนำให้ใช้"$terminfo[kcuu1]"หรือ"$key[Up]"มากกว่าสิ่งที่เขียนยากเช่น"^[[A"ซึ่งอาจหรืออาจจะไม่ทำงานในระบบใด ๆ

ลองดูรหัส/etc/zsh/zshrcเพิ่มเติม นี่คือสิ่งที่ดูเหมือนในระบบของฉัน ฉันคิดว่าterminfoกุญแจมีแนวโน้มที่จะถูกกำหนด

key=(
    BackSpace  "${terminfo[kbs]}"
    Home       "${terminfo[khome]}"
    End        "${terminfo[kend]}"
    Insert     "${terminfo[kich1]}"
    Delete     "${terminfo[kdch1]}"
    Up         "${terminfo[kcuu1]}"
    Down       "${terminfo[kcud1]}"
    Left       "${terminfo[kcub1]}"
    Right      "${terminfo[kcuf1]}"
    PageUp     "${terminfo[kpp]}"
    PageDown   "${terminfo[knp]}"
)

4

สิ่งที่เกี่ยวกับการใช้zsh-autosuggestions?

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

หากไม่มีปลั๊กอินเราสามารถกดCtrlrเพื่อทำการค้นหาย้อนกลับในประวัติทันทีที่คุณเริ่มพิมพ์คำสั่งที่ตรงกันจะปรากฏเป็นคำแนะนำ


2

ฉันใช้ปลั๊กอินโหมด vi และใน ~ / .zshrc ของฉันฉันมีการเชื่อมต่อไปนี้:

bindkey "^P" history-beginning-search-backward
bindkey "^N" history-beginning-search-forward

ที่ช่วยให้ผมที่จะใช้^Pและ^Nการค้นหาย้อนกลับและไปข้างหน้าตามปกติถ้าฉันไม่ได้ป้อนข้อความใด ๆ และการค้นหากรองถ้าฉันทำ


1

ฉันเห็นด้วยกับ Cheflo ว่าการค้นหา "ซับสตริง" มีประโยชน์มากกว่า ฉันไม่สามารถแสดงความคิดเห็นที่นั่นดังนั้นฉันจึงเริ่มคำตอบใหม่ ฉันใช้ oh-my-zsh และเพิ่ม "history-substring-search" ในปลั๊กอิน = (... ) ของ ~ / .zshrc จากนั้นแหล่งที่มา ~ / .zshrc ไม่จำเป็นต้องเพิ่มอะไรอีก ใช้ "bindkey" เพื่อตรวจสอบ:

"^ [OA" history-substring-search-up
"^ [OB" history-substring-search-down

หลังจากนั้นให้คุณพิมพ์ "ถึง" และลูกศรขึ้น "ประวัติ" จะปรากฏขึ้นและ "เป็น" ไฮไลต์ (หากคุณเคยใช้คำสั่ง "ประวัติ" มาก่อน)


1

คุณสามารถใช้zawแทนซึ่งจะแทนที่การค้นหาของคุณด้วยการค้นหาแบบคำหลักที่ดีกว่าและการแก้ไขปัญหาของคุณเช่นกัน - ประวัติการค้นหาเป็นเพียงหนึ่งในสิ่งที่ zaw สามารถค้นหาได้

บทนำเล็ก ๆ/ การสนทนาที่นี่


0

เนื่องจากฉันใช้ oh-my-zsh และฉันใช้โซลูชัน substring จาก joelostblom, James ฉันจึงแก้ไข. zshrc เช่นนี้: (ซึ่งอยู่ที่บรรทัดที่ 13 หาบรรทัด "source $ ZSH / oh-my-zsh.sh" จากนั้นแก้ไขโค้ดรอบ ๆ )

plugins=(
  git
  history-substring-search
)

source $ZSH/oh-my-zsh.sh

bindkey -v
bindkey "^[[A" history-substring-search-up
bindkey "^[[B" history-substring-search-down

bindkey -vจะทำลาย ctrl-a, ctrl-e ส่วนใหญ่คำสั่ง ctrl ทั้งหมด
Michael Ozeryansky

0

คำตอบที่ไม่ใช่ Oh-My-Zsh

สิ่งนี้ทำงานสำหรับฉัน (ใน macOS) เพื่อให้สามารถเข้าถึงประวัติซับสตริงได้อย่างง่ายดายผ่านลูกศรขึ้น / ลง การผูกคีย์ขึ้นอยู่กับคุณ

ประวัติการค้นหาซับสตริงนั้นดีกว่าการเข้าถึงคำสั่งที่ขึ้นต้นด้วยสตริง นี่เป็นเหมือน ctrl-r ในกรณีส่วนใหญ่ผู้ที่ไม่มี globs หรือ regex matching

เริ่มต้นจากคำแนะนำที่zsh-users / zsh-history-substring-search

brew install zsh-history-substring-search

# add the following to .zshrc
source /usr/local/share/zsh-history-substring-search/zsh-history-substring-search.zsh
bindkey '^[[A' history-substring-search-up
bindkey '^[[B' history-substring-search-down

ตอนนี้สนุกกับมันอย่างละเอียด

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