ZSH: lịch sử tìm kiếm trên phím lên xuống?


22

Hiện tại, tôi có phần sau trong .zshrc:

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

Tuy nhiên, điều này dường như chỉ phù hợp với nội dung của đầu vào hiện tại của tôi trước khi một ký tự khoảng trắng xuất hiện. Ví dụ: sudo ls /sẽ khớp với mọi dòng trong lịch sử của tôi bắt đầu bằng sudo, trong khi tôi muốn nó chỉ khớp với các dòng khớp với toàn bộ đầu vào của tôi. (tức là sudo ls /etcsẽ khớp, nhưng không sudo cat /var/log/messages)

Tôi cần thay đổi những gì để đạt được hành vi mong muốn?

Đây là toàn bộ .zshrc của tôi trong trường hợp có liên quan: https://gist.github.com/919566

Câu trả lời:


9

Đây là hành vi được ghi lại :

down-line-or-search
Di chuyển xuống một dòng trong bộ đệm, hoặc nếu đã ở dòng dưới cùng, tìm kiếm chuyển tiếp trong lịch sử cho một dòng bắt đầu bằng từ đầu tiên trong bộ đệm.

Dường như không có một tiện ích hiện có nào thực hiện chính xác những gì bạn muốn, vì vậy bạn sẽ phải làm cho riêng mình. Đây là cách xác định một widget hoạt động như thế nào up-line-or-search, nhưng sử dụng đầu dòng (lên đến con trỏ) thay vì từ đầu tiên làm chuỗi tìm kiếm. Không thực sự được thử nghiệm, đặc biệt là không phải trên đầu vào nhiều dòng.

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

Một cách tiếp cận khác là sử dụng history-beginning-search-backward, nhưng chỉ gọi nó nếu con trỏ ở dòng đầu tiên. Chưa được kiểm tra.

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

Cảm ơn, Gilles, giải pháp đầu tiên của bạn hoạt động khá tốt, nhưng có một vấn đề và tôi hy vọng bạn có thể giúp tôi giải quyết nó. Khi tôi gọi tiền tố up-line-hoặc-search-on trên một đầu vào trống, nó sẽ cho tôi lệnh chạy cuối cùng - hành vi mong muốn. Tuy nhiên, khi tôi chạy lại tiền tố up-line-or-search-pre, nó thực hiện một dòng lên hoặc tìm kiếm trên ký tự đầu tiên của đầu vào của tôi. Có thể bằng cách nào đó thay đổi mọi thứ để nhấn mũi tên lên với đầu vào trống sẽ cuộn qua lịch sử của tôi?
rps

@rps Ah, gotcha, nó đã chọn từ đầu tiên vì đối số bị thiếu (thay vì trống rỗng như nó cần phải có). Sử dụng phiên bản chỉnh sửa của tôi.
Gilles 'SO- ngừng trở nên xấu xa'

33

zsh cung cấp chức năng này bằng cách sử dụng

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

Vd

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

Tìm mã khóa chính xác bằng
ctrl+vKEY

Vd
ctrl+ vUP
ctrl+ vDOWN
ctrl+ vPageUp
ctrl+ vPageDown
v.v.


1
Một thay thế cho các mã khóa có thể hoạt động trên các thiết bị đầu cuối khác nhau có thể được tìm thấy trong zprezto [ 1 ]. <kbd> Lên </ kbd> là $terminfo[kcuu1], <kbd> Xuống </ kbd> là $terminfo[kcud1].
Justin C

8

Bài đăng blog này từ năm 2013 đề xuất một vài tổ hợp phím khớp với tất cả các từ trước con trỏ.

# 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

(Trong phiên bản trước của câu trả lời này, tôi đã sử dụng $terminfonhư được đề xuất trong một trong những nhận xét về bài đăng trên blog. Một số giá trị terminfo được liệt kê ở đây .)


1
zsh cũng cung cấp cho các bí danh thân thiện hơn (ít nhất là trong gói ubfox) /etc/zsh/zshrc, chẳng hạn như $key[Up].
zzxyz

Nếu sử dụng, $terminfobạn cần thay đổi các chế độ đầu cuối. Xem tại đây .
Tom Hale

Tôi đã chỉnh sửa câu trả lời để sử dụng $key[]thay vì $terminfo[]. Tôi hy vọng điều này hoạt động tốt cho độc giả!
joeytwiddle

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.