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

12

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

lumbric
источник

Ответы:

9

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

МРУ
источник
О да, я думаю, что уже видел обе цитаты, но я не понял значения в трех скобках. Страница man говорит: «Эти специальные параметры всегда доступны в функциях виджетов, но ни в коем случае не являются особенными вне ZLE». Это значит, что для получения ZLE_STATE мне нужно определить функцию и пользовательский виджет, верно?
поясничный
@lumbric: Вы правы, ZLE_STATEопределяется только внутри функций виджета. Я уточнил свой ответ. Какова твоя цель? [Подсказка: чтобы указать локальную / глобальную историю в моем приглашении, я использую виджет, чтобы (i.) Установить переменную оболочки (это возможно внутри виджетов) и (ii.) Выполнить zle set-local-history.]
mpy
Моей основной целью было понять концепцию zle виджетов. Поэкспериментируя с set-local-history, я хотел узнать, настроен ли он в настоящее время как глобальный или локальный. Я думал, что мы должны получить текущее состояние (аналогично вызову «setopt», чтобы получить включенные параметры). Моя первоначальная цель была решена уже в этом Q & A .
поясничный
1
Я ожидаю, что строка в тесте if должна быть " *globalhistory*insert*" вместо " *insert*globalhistory*", основываясь на прочтении предложения перед примером?
Фолькер Сигел
@VolkerSiegel: Очень хороший момент, спасибо! Я проверил исходный код и сам попробовал данный пример, заключив, что пример на странице руководства неверен, а не утверждение («отсортировано по алфавиту»). Я отредактировал свой ответ и отправлю путь в список рассылки zsh- worker.
mpy
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
Эяль Левин
источник