Làm cách nào tôi có thể tìm kiếm lịch sử với văn bản đã được nhập tại dấu nhắc trong zsh?


58

Trong zsh, tôi biết rằng tôi có thể tìm kiếm lịch sử với Ctrl+ r. Tuy nhiên, đôi khi tôi bắt đầu gõ một lệnh trực tiếp tại dấu nhắc, nhưng sau đó nhận ra rằng tôi nên tìm kiếm lịch sử. Khi tôi nhấn Ctrl+ r, nó sẽ hiển thị dấu nhắc tìm kiếm lịch sử trống như thế này:

nhắc nhở tìm kiếm lịch sử không được điền trước

Lưu ý cách có văn bản tại dấu nhắc của tôi nhưng không phải tại dấu nhắc tìm kiếm lịch sử. Làm cách nào để bắt đầu tìm kiếm lịch sử với văn bản đã có trong lời nhắc, vì vậy nó trông như thế này:

nhắc nhở tìm kiếm lịch sử điền sẵn

Câu trả lời:


44

Bạn có thể sử dụng chức năng của zlehistory-search :

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

Điều này liên kết UpDown(điều chỉnh các chuỗi thoát của riêng bạn) với tìm kiếm lịch sử, ngược và xuôi, dựa trên những gì đã được nhập tại dấu nhắc.

Vì vậy, nếu bạn đã nhập "vim" và nhấn Up, zsh sẽ duyệt ngược lại lịch sử của bạn chỉ với những lệnh bắt đầu bằng "vim".

Ngoài ra, bạn có thể đặt con trỏ ở cuối dòng sau khi bạn đã chọn lệnh mong muốn từ lịch sử của zsh bằng cách sử dụng chức năng kết thúc tìm kiếm lịch sử (thường nằm ở /usr/share/zsh/functions/Zle/) và nối -endvào cuối mỗi dòng, như vậy:

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

Tuyệt vời cảm ơn bạn. Tôi đã phải loại bỏ "-end" cho cả hai lệnh bindkey để làm cho chúng hoạt động. Tôi chưa chỉnh sửa câu trả lời của bạn vì có thể có một số tình huống cần thiết?
Sean Mackesey

Không có vấn đề: cập nhật câu trả lời với chi tiết bạn muốn làm rõ.
jasonwryan

Điều này được sử dụng để làm việc cho tôi cho đến cuối tháng 11, tháng 12 năm 2015 khi tôi nâng cấp lên phiên bản mới nhất của oh my zsh. Có ý kiến ​​gì không? gợi ý? có ai khác nhìn thấy điều này? Làm thế nào để gỡ lỗi?
hani xây dựng

2
@hanielabed Oh-my-Zsh là một clusterfsck; Tôi hoàn toàn không ngạc nhiên khi nó sẽ phá vỡ thứ gì đó cơ bản như tìm kiếm lịch sử ...
jasonwryan

1
Có cách nào để con trỏ nhảy đến cuối từ một tìm kiếm lịch sử trống, nhưng vẫn giữ nguyên vị trí cho một tìm kiếm một phần? Đây là những gì xảy ra trong bash hiện tại.
CMCDragonkai

19

Một lựa chọn hữu ích khác là history | grep

Gán một bí danh, vd

alias hg='history | grep'

sau đó bạn có thể nhập hg whateverđể tìm kiếm các lệnh bạn đã sử dụng, ví dụ:

$ 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 

Tôi đặt bí danh này trong các tập tin dấu chấm của tôi.


17
Điều gì làm hgtôi nhớ đến ... Oh yeah, Mercurial!

12

Nếu bạn đang sử dụng oh-my-zsh , hãy thêm history-substring-searchvào plugins=(...)dòng.

Sau đó thêm

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

đâu đó bên dưới dòng mà đọc source $ZSH/oh-my-zsh.sh. Lưu và kích hoạt một thiết bị đầu cuối mới hoặc chạy source ~/.zshrctrong thiết bị đầu cuối hiện tại.

Lưu ý: ^[[A là chuỗi thoát cho mũi tên lên trong thiết bị đầu cuối tôi sử dụng (kitty) và nhiều thứ khác. Để kiểm tra thiết bị đầu cuối của sự lựa chọn của bạn, nhập showkey -avà sau đó nhấn phím họ bạn muốn tìm chuỗi thoát cho.


Không rõ sơ đồ phím này làm gì, câu trả lời ở trên giải thích "Điều này liên kết Lên và Xuống (điều chỉnh các chuỗi thoát của riêng bạn) với tìm kiếm lịch sử, ngược và tiến, dựa trên những gì đã được nhập tại dấu nhắc."
Colin D

@ColinD Đã thêm một ghi chú để làm rõ
joelostblom

1
tìm kiếm chuỗi con là tốt nhất, nó là một siêu lệnh bắt đầu bằng. để thực hiện mà không phải là người dùng oh-my-zsh tôi đã làm brew install zsh-history-substring-search, kiểm tra repo readme để được hướng dẫn, tôi sẽ tiếp tục và tạo câu trả lời Tôi thực sự hài lòng với kết quả này.
Merlin


4

Tôi thực sự khuyên bạn nên sử dụng "$terminfo[kcuu1]"hoặc "$key[Up]"thay vì những thứ được mã hóa cứng như thế "^[[A"có thể hoặc không thể hoạt động trên bất kỳ hệ thống cụ thể nào.

Kiểm tra /etc/zsh/zshrcđể biết thêm chìa khóa. Đây là những gì nó trông giống như trên hệ thống của tôi. Tôi nghĩ rằng các terminfophím có nhiều khả năng được xác định.

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

Còn việc sử dụng zsh-autosuggestionsthì sao?

Vấn đề là, đối với mỗi lệnh bạn nhập plugin này sẽ hiển thị cho bạn một số đề xuất có thể được chấp nhận hoặc không. Hãy thử nó và cung cấp cho chúng tôi một số thông tin phản hồi.

Không có plugin, chúng tôi có thể nhấn Ctrlrđể thực hiện tìm kiếm ngược về lịch sử, ngay khi bạn bắt đầu nhập các lệnh khớp sẽ xuất hiện dưới dạng đề xuất.


2

Tôi sử dụng plugin vi-mode . Và sau đó trong ~ / .zshrc của tôi, tôi có các ràng buộc sau:

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

Cho phép tôi sử dụng ^P^Nnhư tìm kiếm lạc hậu và chuyển tiếp bình thường nếu tôi không nhập bất kỳ văn bản, và như lọc tìm kiếm nếu tôi làm.


1

Tôi đồng ý với Cheflo rằng tìm kiếm "chuỗi con" hữu ích hơn. Tôi không thể bình luận ở đó vì vậy tôi bắt đầu một câu trả lời mới. Tôi sử dụng oh-my-zsh và thêm "history-sub chuỗi-search" vào các plugin = (...) của ~ / .zshrc. Sau đó, nguồn ~ / .zshrc. Không cần thêm bất cứ điều gì nữa. Sử dụng "bindkey" để xác minh:

"^ [OA" lịch sử chuỗi con tìm kiếm lên
"^ [OB" lịch sử chuỗi con-tìm kiếm xuống

Sau đó, bạn gõ "đến" và mũi tên lên, "history" sẽ xuất hiện và "to" được tô sáng (nếu bạn đã sử dụng lệnh "history" trước đó).


1

Thay vào đó, bạn có thể sử dụng zaw , thay thế hoàn toàn tìm kiếm của bạn bằng siêu tìm kiếm đa từ khóa tốt hơn nhiều và cũng khắc phục vấn đề của bạn - lịch sử tìm kiếm chỉ là một trong những điều mà zaw có thể tìm kiếm.

Nhỏ intro / thảo luận ở đây


0

Bởi vì tôi sử dụng oh-my-zsh và tôi sử dụng giải pháp chuỗi con từ joelostblom, James, tôi sửa đổi .zshrc như thế này: (ở dòng 13, tìm dòng "nguồn $ ZSH / oh-my-zsh.sh" , sau đó sửa đổi mã xung quanh nó.)

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 -vsẽ phá vỡ ctrl-a, ctrl-e. Nhiều khả năng tất cả các lệnh ctrl.
Michael Ozeryansky

0

Câu trả lời không phải của Oh-My-Zsh

Điều này làm việc cho tôi (trên macOS) để có được lịch sử chuỗi con dễ dàng truy cập thông qua mũi tên lên / xuống. Các ràng buộc quan trọng là tùy thuộc vào bạn.

Lịch sử tìm kiếm chuỗi con tốt hơn là chỉ truy cập các lệnh bắt đầu bằng một chuỗi. Điều này giống như ctrl-r trong hầu hết các trường hợp, những trường hợp không có sự phù hợp hoặc kết hợp regex.

Bắt đầu từ hướng dẫn tại zsh-users / zsh-history-sub chuỗi-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

Bây giờ thưởng thức triệt để.

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.