ZSH: làm thế nào để các widget ZLE trực tiếp?


12

Tài liệu nói trong phần 18.4 Widgets , rằng "công việc của widget chỉ đơn giản là thực hiện một số hành động nhỏ". Nhưng tôi không thể tìm thấy một mô tả chung làm thế nào để gọi các hành động này, tức là làm thế nào để gọi một widget.

Tôi đã thấy trong các ví dụ (ví dụ xem phần Hỏi & Đáp này ) rằng các widget có thể bin bị ràng buộc với các khóa bằng cách sử dụng bindkey KEY WIDGET. Sau đó, người ta có thể gọi các widget bằng cách sử dụng KEY.

Tôi muốn chuyển đổi set-local-historyvà tôi đã thử:

$ zle set-local-history 1
zle: widgets can only be called when ZLE is active

zle -hkhông hoạt động, nhưng tôi đã tìm thấy một mô tả về các đối số ở đây . Nhưng dường như không có cái gì đó như thế --call.

Tôi đang làm gì sai? Làm thế nào có thể gọi các widget mà không có bindkey? Làm thế nào tôi có thể in trạng thái hiện tại? ( set-local-historybật tắt trạng thái)

Câu trả lời:


9

Bạn có thể thực thi widget bằng widget execute-named-cmd, được ràng buộc với ESC-x(emacs ràng buộc) hoặc :(vi ràng buộc):

execute-named-cmd (ESC-x) (:) (unbound)

Đọc tên của một lệnh biên tập và thực hiện nó.

Điều này mở ra một bộ đệm nhỏ bên dưới dòng lệnh, nơi bạn có thể bắt đầu các widget zle. (Tự động hoàn tất có sẵn!):

$ [ESC-x]
execute: set-[TAB]
set-local-history  set-mark-command

Để truy vấn trạng thái zle(bao gồm cả lịch sử cục bộ), hãy sử dụng biến $ZLE_STATE(chỉ có thể truy cập bên trong các chức năng của widget):

ZLE_STATE (scalar)

Chứa một tập hợp các từ được phân tách bằng dấu cách mô tả trạng thái zle hiện tại.

Hiện tại, các trạng thái được hiển thị là chế độ chèn như được đặt bởi các tiện ích ghi đè chế độ ghi đè hoặc vi thay thế và liệu các lệnh lịch sử sẽ truy cập các mục nhập đã được kiểm soát bởi tiện ích lịch sử cục bộ. Chuỗi chứa insert nếu các ký tự được chèn trên dòng lệnh di chuyển các ký tự hiện có sang phải hoặc overwritenếu các ký tự được chèn sẽ ghi đè lên các ký tự hiện có. Nó chứa localhistorynếu chỉ các lệnh lịch sử cục bộ sẽ được truy cập hoặc globalhistorynếu các lệnh lịch sử đã nhập cũng sẽ được truy cập.

Các chuỗi con được sắp xếp theo thứ tự bảng chữ cái để nếu bạn muốn kiểm tra hai chuỗi con cụ thể theo cách chứng minh trong tương lai, bạn có thể thực hiện khớp bằng cách thực hiện:

if [[ $ZLE_STATE == *globalhistory*insert* ]]; then ...; fi

Tất cả các trích dẫn từ man zshzle.


Uh vâng, tôi nghĩ rằng tôi đã thấy cả hai trích dẫn, nhưng tôi không hiểu giá trị trong ba dấu ngoặc nhọn. Trang hướng dẫn cho biết: "Các tham số đặc biệt này luôn có sẵn trong các chức năng của widget, nhưng không có cách nào đặc biệt ngoài ZLE." Điều đó có nghĩa là, để có được ZLE_STATE, tôi cần xác định một chức năng và một tiện ích tùy chỉnh, phải không?
thắt lưng 23/12/13

@lumbric: Bạn nói đúng, ZLE_STATEchỉ được xác định bên trong các chức năng của widget. Tôi tinh chỉnh câu trả lời của tôi. Mục tiêu của bạn là gì? [Dự đoán hoang dã: Để chỉ ra lịch sử địa phương / toàn cầu trong lời nhắc của tôi, tôi sử dụng một tiện ích để (i.) Đặt biến vỏ (điều này có thể bên trong các tiện ích) và (ii.) Thực thi zle set-local-history.]
mpy 23/12/13

Mục tiêu chính của tôi là hiểu khái niệm về các vật dụng zle. Chơi xung quanh với lịch sử tập cục bộ, tôi muốn biết liệu nó hiện được đặt thành toàn cầu hay cục bộ. Tôi nghĩ rằng phải có một chúng ta để có được trạng thái hiện tại (tương tự như gọi "setopt" để có được các tùy chọn hiện được kích hoạt). Mục tiêu ban đầu của tôi đã được giải quyết trong phần hỏi đáp này .
thắt lưng 23/12/13

1
Tôi mong đợi chuỗi trong bài kiểm tra if sẽ là " *globalhistory*insert*" thay vì " *insert*globalhistory*", dựa trên việc đọc câu trước ví dụ?
Volker Siegel

@VolkerSiegel: Một điểm rất tốt, cảm ơn! Tôi đã kiểm tra với mã nguồn và tự mình thử ví dụ đã cho, kết luận rằng ví dụ trong trang man là sai, không phải là câu lệnh ("được sắp xếp theo thứ tự abc"). Tôi đã chỉnh sửa câu trả lời của mình và sẽ gửi đường dẫn đến danh sách gửi thư của zsh-worker .
mpy

1

Nếu bạn đang sử dụng, tmuxbạn có thể gọi khóa bị ràng buộc với send-keys.

Ví dụ:

# Current pane
$ tmux send-keys C-r

# Some targeted pane
$ tmux send-keys -t SESSION_NAME:WINDOW_NUMBER.PANE_NUMBER C-z
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.