9

Документация говорит в разделе 18.4 «Виджеты», что «работа виджета заключается в простом выполнении небольшого действия». Но я не могу найти общее описание, как вызвать эти действия, то есть, как вызвать виджет.

Я видел в примерах (например, см. Этот раздел вопросов и ответов), что виджеты могут связывать бин с ключами, используя bindkey KEY WIDGET . Затем можно вызвать виджет с помощью KEY .

Я хотел переключить set-local-history и попытался:

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

zle -h не работает, но я нашел описание аргументов здесь. Но, похоже, что-то вроде --call .

Что я делаю неправильно? Как можно вызвать виджет без bindkey? Как я могу распечатать текущий статус? (set-local-history переключает состояние)

2 ответа2

6

Вы можете выполнить виджет с помощью виджета execute-named-cmd , который привязан к ESC-x (привязки emacs) или : (привязки vi):

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

Прочитайте имя команды редактора и выполните его.

Это открывает мини-буфер под командной строкой, где вы можете запускать zle виджеты. (Автозаполнение доступно!):

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

Чтобы запросить состояние zle (включая локальную историю), используйте переменную $ZLE_STATE (доступна только внутри функций виджета):

ZLE_STATE (scalar)

Содержит набор разделенных пробелами слов, которые описывают текущее состояние zle.

В настоящее время показанные состояния являются режимом вставки, установленным виджетами overwrite-mode или vi-replace, и будут ли команды истории посещать импортированные записи, как это контролируется виджетом set-local-history. Строка содержит insert если символы, которые будут вставлены в командную строку, перемещают существующие символы вправо или overwrite если вставляемые символы перезаписывают существующие символы. Он содержит localhistory , если только команды местной истории будут посещать или globalhistory , если также будут посещены импортированные истории команды.

Подстроки сортируются в алфавитном порядке, так что если вы хотите проверить наличие двух конкретных подстрок в будущем, вы можете выполнить сопоставление, выполнив:

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

Все цитаты из man zshzle .

1

Если вы используете tmux вы можете вызвать связанный ключ с помощью send-keys .

Примеры:

# Current pane
$ tmux send-keys C-r

# Some targeted pane
$ tmux send-keys -t SESSION_NAME:WINDOW_NUMBER.PANE_NUMBER C-z

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .