ZSH: как напрямую вызывать виджеты ZLE?

ZSH: как напрямую вызывать виджеты ZLE?

В документации говорится в разделе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переключает состояние)

решение1

Вы можете выполнить виджет с помощью виджета 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.

решение2

Если вы используете, 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

Связанный контент