Nhìn riêng mũi tên lên cho lịch sử ZSH địa phương và toàn cầu


25

Có thể ...

  • Đẩy mạnh lịch sử trình bao ZSH cục bộ (các hành động chỉ xảy ra trong dấu nhắc đó)

  • Đẩy mạnh lịch sử ZSH toàn cầu (lịch sử chia sẻ được bật) - mặc định những gì xảy ra khi bạn nhấn mũi tên LÊN khi lịch sử chia sẻ được bật

... riêng biệt.

Ví dụ: người ta có thể liên kết CTRL + với lịch sử toàn cầu, bình thường cho lịch sử địa phương. Đồng thời, nó có ý nghĩa để sử dụng lịch sử toàn cầu cho tìm kiếm lịch sử ngược (tức là CTRL+ R).

Điều này có thể tăng tốc một số thao tác shell, vì một số thao tác dành riêng cho cửa sổ shell đó và bạn muốn quay lại chúng.

Câu trả lời:


25

Sao chép và dán cái này vào .zshrc:

Con trỏ đang sử dụng lịch sử địa phương:

bindkey "${key[Up]}" up-line-or-local-history
bindkey "${key[Down]}" down-line-or-local-history

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-history
    zle set-local-history 0
}
zle -N up-line-or-local-history
down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-history
    zle set-local-history 0
}
zle -N down-line-or-local-history

Nếu bạn cũng cần các ràng buộc chính ( CTRL+ con trỏ) để bước qua lịch sử toàn cầu, hãy thêm điều này vào .zshrc:

bindkey "^[[1;5A" up-line-or-history    # [CTRL] + Cursor up
bindkey "^[[1;5B" down-line-or-history  # [CTRL] + Cursor down

Để thực hiện công việc này, tùy chọn SHARE_HISTORY (xem Lịch sử 16.2.4 ) cần được bật. Chạy setoptvà kiểm tra nếu "sharehistory" được liệt kê. Nếu không thêm setopt sharehistoryvào của bạn .zshrc. Sau đó, người ta có thể sử dụng set-local-history như chúng ta đã làm ở trên. Thông tin nói:

Theo mặc định, các lệnh di chuyển lịch sử truy cập vào các dòng đã nhập cũng như các dòng cục bộ, nhưng bạn có thể bật và tắt tính năng này bằng liên kết zle set-local-history. Cũng có thể tạo một tiện ích zle sẽ làm cho một số lệnh bỏ qua các lệnh đã nhập và một số bao gồm chúng.

Lưu ý rằng theo lịch sử toàn cầu mặc định được sử dụng (và tất cả các chức năng kết thúc bằng "zle set-local-history 0", tức là lịch sử cục bộ bị tắt). Vì vậy, nhấn CTRL+ Rsẽ tìm kiếm lịch sử toàn cầu theo mặc định (điều này có ý nghĩa trong hầu hết các trường hợp).

Điều này khá giống với giải pháp của @mpy, nhưng đã sẵn sàng để sao chép và dán. Nó ghi đè các phím con trỏ lên và xuống. Tôi đã sử dụng danh sách thư này .

Xem thêm:


1
Trên zsh 5.0.2, tôi gặp lỗi không thể liên kết với chuỗi khóa trống. Ngay cả khi tôi thay thế nó bằng các phím từ một câu trả lời khác bên dưới, cả lên / xuống và Ctrl + lên / xuống chỉ cần đi qua lịch sử toàn cầu. Bất cứ điều gì tôi đang làm sai ở đây?
rjh

1
@rjh: Hãy thử điều này: Trong một trình soạn thảo như vim, hãy xóa ${key[Up]}. Sau đó (trong chế độ chỉnh sửa), nhập Ctrl + V theo sau là mũi tên lên. Điều này sẽ chèn mã khóa chính xác. Làm tương tự cho mũi tên xuống.
cướp

Tôi đã sử dụng phương pháp này và nó hoạt động nhưng tôi đã mất khả năng tìm kiếm lịch sử bằng cách viết phần đầu của lệnh và sau đó Mũi tên lên. Nó đi qua tất cả các lệnh như Bash, vì vậy tôi phải làm việc xung quanh bằng cách sử dụng Ctrl+R.
Melebius

5

Bạn có thể thiết lập tiện ích zle đặc biệt để chỉ hiển thị các mục lịch sử cục bộ:

function only-local-history () {
        zle set-local-history 1
        zle up-history
        zle set-local-history 0
}
zle -N only-local-history

Giả sử, điều đó bị ràng buộc up-line-or-history(tôi nghĩ đó là mặc định), bạn có thể liên kết tiện ích này với một hành trình phím khác, như CTRL+ :

 bindkey "^[Oa" only-local-history

Nếu công việc này có thể phụ thuộc vào thiết bị đầu cuối của bạn. Trên dòng hoạt động trong URxvt/Screen. Với xtermbạn sẽ cần

 bindkey "^[[1;5A" only-local-history

cho CTRL+ .

Một biến thể khác có thể là

function peek-history () {
        zle set-local-history
        zle up-history
        zle set-local-history
}
zle -N peek-history

vì vậy, nếu bạn đã bật lịch sử địa phương, bạn có thể xem lén toàn cầu hoặc ngược lại.


4

Câu trả lời của @ lumbic làm việc cho tôi chỉ với một vài thay đổi:

setopt share_history

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-history
    zle set-local-history 0
}
zle -N up-line-or-local-history
down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-history
    zle set-local-history 0
}
zle -N down-line-or-local-history

bindkey '^[OA' up-line-or-history     # Cursor up
bindkey '^[OB' down-line-or-history   # Cursor down
bindkey '^[[1;5A' up-line-or-local-history    # [CTRL] + Cursor up
bindkey '^[[1;5B' down-line-or-local-history  # [CTRL] + Cursor down

Mã này làm cho lịch sử toàn cầu trở thành mặc định và sử dụng mũi tên CTRL cho lịch sử cục bộ.

Lưu ý: Tôi sử dụng zsh 5.0.2 cùng với oh-my-zsh.


Điều này trông giống như ngược lại với những gì OP yêu cầu - Ctrl+arrowscho lịch sử địa phương.
Melebius

1

Tôi đã thử các tùy chọn được liệt kê trong các câu trả lời khác ở đây nhưng tôi không hài lòng với chúng. Các widget 1 up-history hoặc up-line-or-historykhông bao gồm tìm kiếm bắt đầu và widget 1 up-line-or-beginning-search dường như không hoạt động tốt khi thay đổi tùy chọn lịch sử cục bộ trong khi sử dụng nó. 2

Vì vậy, tôi đã đến các cài đặt sau. Nó cho phép Ctrl+ mũi tên để duyệt lịch sử toàn cầu, Alt+ mũi tên chỉ duyệt lịch sử cục bộ (tương tự Bash) và mũi tên độc lập để sử dụng tìm kiếm bắt đầu thông minh (mặc định trong Oh My Zsh ).

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-search
    zle set-local-history 0
}
zle -N up-line-or-local-history

down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-search
    zle set-local-history 0
}
zle -N down-line-or-local-history

bindkey "${key[Up]}" up-line-or-beginning-search
bindkey "${key[Down]}" down-line-or-beginning-search
bindkey "^[[1;5A" up-line-or-search    # [CTRL] + Cursor up
bindkey "^[[1;5B" down-line-or-search  # [CTRL] + Cursor down
bindkey "^[[1;3A" up-line-or-local-history    # [ALT] + Cursor up
bindkey "^[[1;3B" down-line-or-local-history  # [ALT] + Cursor up

1down đối tác của họ cũng có nghĩa là ngầm.

2 Bắt đầu được sử dụng để tìm kiếm được xác định lại sau khi thay đổi tùy chọn lịch sử cục bộ, do đó, toàn bộ lệnh tìm thấy đầu tiên được sử dụng làm bắt đầu được tìm kiếm trong tìm kiếm thứ hai.


1

Dựa trên các câu trả lời khác nhau ở đây, tôi đã có thể tạo một phiên bản được điều chỉnh:

function up-line-or-history() {
    zle set-local-history 1
    zle .up-line-or-history
    zle set-local-history 0
}

function down-line-or-history() {
    zle set-local-history 1
    zle .down-line-or-history
    zle set-local-history 0
}

# Overwrite existing {up,down}-line-or-history widgets with the functions above.
zle -N up-line-or-history
zle -N down-line-or-history

Phiên bản này sẽ ghi đè lên các widget hiện có up-line-or-historydown-line-or-historycác widget với các widget mới do người dùng định nghĩa. Tiện ích này cho phép lịch sử cục bộ và sau đó sẽ gọi các tiện ích gốc , có sẵn dưới .tên -prefixed. Xem tài liệu widget zle để biết chi tiết.

Điều này có nghĩa là bạn có thể giữ bất kỳ keybindings hiện có. Do đó, bạn có thể tránh phải tìm ra chuỗi thoát là gì khi gõ một mũi tên lên trong thiết bị đầu cuối hiện tại của bạn.


-1
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 "^[[A" up-line-or-beginning-search # Up
bindkey "^[[B" down-line-or-beginning-search # Down

Trên câu trả lời làm việc cho tôi.

Tham khảo: https://coderwall.com/p/jpj_6q/zsh-better-history-searching-with-arrow-keys


Bạn có thể giải thích làm thế nào để phân biệt lịch sử địa phương và toàn cầu? IMHO mã của bạn hoàn toàn không làm điều đó. Hơn nữa, điều này dường như đã được thiết lập trong Oh My Zsh .
Melebius
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.