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