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перемикає стан)

Відповіді:


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.

В даний час показані стани - це режим вставки, встановлений режимами перезапису або vi-zamjeна, і чи будуть команди історії відвідувати імпортовані записи, як це контролюється віджетом set-local-history. Рядок містить, insert якщо символи, які потрібно вставити в командному рядку, переміщують існуючі символи праворуч або overwriteякщо символи, які потрібно вставити, перезаписують існуючі символи. Він містить, localhistoryякщо будуть відвідуватися лише локальні історичні команди або globalhistoryякщо також будуть відвідуватися імпортовані історії історії.

Підрядки впорядковані в алфавітному порядку, так що якщо ви хочете перевірити дві конкретні підрядки, захищені майбутнім, ви можете зіставити, виконавши:

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

Усі цитати від man zshzle.


Так, я думаю, я вже бачив обидві цитати, але значення в трьох дужках не зрозумів. На головній сторінці написано: "Ці спеціальні параметри завжди доступні у функціях віджетів, але вони жодним чином не є спеціальними поза ZLE". Це означає, що для отримання ZLE_STATE мені потрібно визначити функцію та користувальницький віджет, правда?
мастило

@lumbric: Ви маєте рацію, ZLE_STATEвизначається лише всередині функцій віджетів. Я уточнив свою відповідь. Яка ваша мета? [Дива здогадка: для вказівки локальної / глобальної історії у моєму підказці я використовую віджет для (i.) Встановлення змінної оболонки (це можливо всередині віджетів) та (ii.) Виконання zle set-local-history.]
mpy

Моєю основною метою було зрозуміти концепцію віджетів zle. Граючи з набором локальної історії, я хотів дізнатися, чи він наразі встановлений на глобальну чи локальну. Я подумав, що для отримання поточного стану (наприклад, виклик "setopt", щоб отримати доступні для цього часу параметри) повинно бути ми. Моя первісна мета була вирішена вже в цьому питанні .
мастило

1
Я б очікував, що рядок у тесті if повинен бути " *globalhistory*insert*" замість " *insert*globalhistory*" на основі читання речення перед прикладом?
Volker Siegel

@VolkerSiegel: Дуже вдалий момент, дякую! Я перевірив вихідний код і сам спробував даний приклад, зробивши висновок, що приклад на сторінці man є неправильним, а не твердженням ("відсортовано за алфавітом"). Я відредагував свою відповідь і надішлю шлях до списку розсилки zsh-працівників .
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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.