Có thể sử dụng hành vi lựa chọn menu zsh khác nhau cho các lệnh khác nhau?


13

Tôi đang sử dụng menu selecthành vi trong zshđó, gọi một menu bên dưới con trỏ nơi bạn có thể thấy các khả năng khác nhau. Tùy chọn .zshrc tôi đã đặt cho điều này là

zstyle ':completion:*' menu select=2

Theo mặc định, nhấn Returnđể chọn một khả năng trong menu này chỉ hoàn thành từ - nó không thực sự gửi lệnh. Ví dụ, tôi có thể nhận được một menu như thế này

~ % cd de<TAB>
completing directory:
[Desktop/]  Development/

Nhấn Returnvào đây sẽ dẫn đến

~ % cd Desktop/

Sau đó tôi phải nhấn Returnmột thứ hai thời gian để thực sự gửi lệnh.

Tôi có thể sửa đổi hành vi này để thực hiện nó để nhấn Returncả hai chọn hoàn thành gửi lệnh bằng cách thực hiện điều này

bindkey -M menuselect '^M' .accept-line

Tuy nhiên, có một vấn đề với điều này: đôi khi tôi cần hoàn thành một tệp hoặc thư mục mà không gửi lệnh. Ví dụ, tôi có thể cần phải thực hiện ln -s Desktop Desktop2- với bindkeyhành vi này , cố gắng hoàn thành Desktop sẽ dẫn đến ln -s Desktop/việc được gửi dưới dạng lệnh và rõ ràng tôi không muốn điều đó.

Tôi biết rằng chỉ cần nhấn phím cách sẽ cho phép tôi tiếp tục với lệnh, nhưng giờ đây đã trở thành thói quen.
Với điều này, có cách nào để thực hiện nó để chỉ một số lệnh cho phép bạn nhấn Returnmột lần (như cd), nhưng tất cả các lệnh khác yêu cầu nhấn hai lần?


Nếu .zshrctệp không cho phép bạn làm như vậy thì câu trả lời đơn giản là không, trừ khi bạn tự điều chỉnh mã nguồn để hỗ trợ hành vi dựa trên lệnh. Nhưng sau đó, bạn vẫn phải xác định các lệnh nào để thực hiện việc này, theo cách riêng của nó thì tẻ nhạt hơn là chỉ nhấn một mục nhập bổ sung ...
Tamara Wijsman

Câu trả lời:


3

Nếu bạn thực sự cần điều này, về mặt lý thuyết bạn có thể thiết lập một chức năng kiểm tra lệnh bạn đang thực thi và hoàn thành hoặc gửi dòng.

Hãy thử một cái gì đó như thế này (chưa được kiểm tra):

commands=(ls cd)
# define widget function
function check-command {
    zle beginning-of-line
    zle forward-word
    RBUFFER=" $RBUFFER"
    if [[ ${commands[(r)$LBUFFER]} == $LBUFFER ]] ; then ; zle accept-line ; else; zle     end-of-line ; fi
}

# create widget from function
zle -N check-command

# bind widget
bindkey -M menuselect '^M' check-command

Nguồn: sử dụng lệnh tùy chỉnh từ .inputrc cũ trong zsh?


0

Về mặt kỹ thuật, nó không thể theo cách bạn đang hỏi. Không biết có lối thoát nào khác không

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.