ZSH: ประวัติการค้นหาบนปุ่มขึ้นและลง?


22

ขณะนี้ฉันมีสิ่งต่อไปนี้ใน. zshrc ของฉัน:

bindkey '^[[A' up-line-or-search
bindkey '^[[B' down-line-or-search

อย่างไรก็ตามดูเหมือนว่าจะตรงกับเนื้อหาของอินพุตปัจจุบันของฉันก่อนที่จะมีอักขระเว้นวรรค ตัวอย่างเช่นsudo ls /จะจับคู่ทุกบรรทัดในประวัติของฉันที่ขึ้นต้นด้วยsudoในขณะที่ฉันต้องการให้จับคู่ทุกบรรทัดที่ตรงกับข้อมูลที่ฉันป้อนทั้งหมดเท่านั้น (เช่นsudo ls /etcจะจับคู่ แต่ไม่ใช่sudo cat /var/log/messages)

ฉันต้องเปลี่ยนอะไรเพื่อให้ได้พฤติกรรมตามที่ต้องการ

นี่คือ. zshrc ทั้งหมดของฉันในกรณีที่มีความเกี่ยวข้อง: https://gist.github.com/919566

คำตอบ:


9

นี่คือพฤติกรรมที่บันทึกไว้ :

down-line-or-search
เลื่อนบรรทัดลงในบัฟเฟอร์หรือถ้าอยู่ที่บรรทัดล่างแล้วค้นหาไปข้างหน้าในประวัติของบรรทัดที่ขึ้นต้นด้วยคำแรกในบัฟเฟอร์

ดูเหมือนจะไม่มีวิดเจ็ตที่มีอยู่ที่ทำสิ่งที่คุณต้องการอย่างแน่นอนดังนั้นคุณจะต้องทำด้วยตัวเอง ต่อไปนี้เป็นวิธีกำหนดวิดเจ็ตที่มีลักษณะการทำงานup-line-or-searchแต่ใช้จุดเริ่มต้นของบรรทัด (จนถึงเคอร์เซอร์) แทนที่จะใช้คำแรกเป็นสตริงการค้นหา ไม่ได้ทดสอบจริง ๆ โดยเฉพาะอย่างยิ่งไม่ได้อยู่ในอินพุตหลายบรรทัด

up-line-or-search-prefix () {
  local CURSOR_before_search=$CURSOR
  zle up-line-or-search "$LBUFFER"
  CURSOR=$CURSOR_before_search
}
zle -N up-line-or-search-prefix

วิธีการอื่นคือการใช้history-beginning-search-backwardแต่จะเรียกมันเฉพาะเมื่อเคอร์เซอร์อยู่บนบรรทัดแรก ยังไม่ทดลอง

up-line-or-history-beginning-search () {
  if [[ -n $PREBUFFER ]]; then
    zle up-line-or-history
  else
    zle history-beginning-search-backward
  fi
}
zle -N up-line-or-history-beginning-search

ขอบคุณ Gilles โซลูชันแรกของคุณใช้งานได้ดี แต่มีปัญหาเดียวและฉันหวังว่าคุณจะสามารถช่วยฉันแก้ไขได้ เมื่อฉันเรียกคำนำหน้า up-line-or-search-on อินพุตว่างมันทำให้ฉันมีคำสั่งเรียกใช้ล่าสุด - พฤติกรรมที่ต้องการ อย่างไรก็ตามเมื่อฉันเรียกใช้คำนำหน้าอัพไลน์หรือค้นหาอีกครั้งมันจะอัพไลน์หรือค้นหาในอักขระตัวแรกของอินพุตของฉัน เป็นไปได้ไหมที่จะเปลี่ยนแปลงบางอย่างเพื่อให้การกดลูกศรขึ้นพร้อมด้วยอินพุตว่างเปล่าจะเลื่อนดูประวัติของฉัน
rps

@rps Ah, gotcha มันก็ยกคำแรกเพราะอาร์กิวเมนต์หายไป (แทนที่จะว่างเปล่าอย่างที่ควรมี) ใช้รุ่นที่แก้ไขของฉัน
Gilles 'SO- หยุดความชั่วร้าย'

33

zsh ให้ฟังก์ชั่นนี้โดยใช้

history-beginning-search-backward
history-beginning-search-forward

อดีต

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

ค้นหารหัสคีย์ที่ถูกต้องด้วย
ctrl+vKEY

อดีต
ctrl+ vUP
ctrl+ vDOWN
ctrl+ vPageUp
ctrl+ vPageDown
ฯลฯ


1
ทางเลือกสำหรับรหัสที่อาจทำงานข้ามขั้วที่แตกต่างกันสามารถพบได้ใน zprezto [ 1 ] <kbd> ขึ้น </ kbd> เป็น$terminfo[kcuu1]<kbd> ลง </ kbd> $terminfo[kcud1]เป็น
Justin C

8

โพสต์บล็อกนี้จากปี 2013แนะนำให้ใช้ปุ่มลัดสองอันที่ตรงกับคำทั้งหมดก่อนเคอร์เซอร์

# Cycle through history based on characters already typed on the line
autoload -U up-line-or-beginning-search
autoload -U down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "$key[Up]" up-line-or-beginning-search
bindkey "$key[Down]" down-line-or-beginning-search

(ในรุ่นก่อนหน้าของคำตอบนี้ผมได้ใช้$terminfoตามคำแนะนำหนึ่งในการแสดงความคิดเห็นในโพสต์บล็อก. บางค่า terminfo จะอยู่ที่นี่ .)


1
zsh ยังช่วยให้ชื่อแทนเหล่านี้เป็นมิตร (อย่างน้อยในแพคเกจอูบุนตู) ในเช่น/etc/zsh/zshrc $key[Up]
zzxyz

หากใช้$terminfoคุณจะต้องเปลี่ยนโหมดเทอร์มินัล ดูที่นี่
Tom Hale

ฉันได้แก้ไขคำตอบที่จะใช้แทน$key[] $terminfo[]ฉันหวังว่ามันจะทำงานได้ดีสำหรับผู้อ่าน!
joeytwiddle

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