Переплет «ясно, подсказка» в Mutt

9

По умолчанию при вводе информации в командной строке в mutt, вы можете очистить приглашение с помощью Ctrlg, как описано в руководстве :

^ G н / д прервать

Я пытался связать эту функцию с Escape. К сожалению, abortнет в списке доступных функций, ни в руководстве , ни в источнике .

Я пытался использовать это в моем .muttrc:

редактор привязок <esc> прервать

но выдает ошибку:

Ошибка в /home/jason/.mutt/muttrc, строка 143: прервать: нет такой функции на карте

Я попытался использовать другую карту, как ( generic) и экспериментировал с другими вымышленными функциями, вроде clear, безрезультатно.

Как бы я связал, Escapeчтобы очистить строку подсказки?

jasonwryan
источник
1
Экранирование привязки не очень хорошая идея, поскольку экранирующий символ (отправляемый после нажатия escape) также является префиксом для escape-последовательностей, отправляемых всеми функциональными клавишами, такими как стрелки, del, F1 ...
Стефан Шазелас,
Это хороший момент, который я не учел. Тестируя его, Escape необходимо отправить дважды для отправки литерала, ^[чтобы он не был showtopper (я в любом случае не использую привязки, которые полагаются на него).
Джейсонвриан
Esc, Escотправит два символа ESC. Вы также можете нажать Escодин раз и подождать около одной секунды (тайм-аут по умолчанию, ожидающий оставшуюся часть escape-последовательности).
Стефан Шазелас
Да. Сначала я должен выяснить, как связать это :)
jasonwryan

Ответы:

5

Это невозможно с привязками клавиш. Ctrl-Gжестко запрограммирован в Mutt на более низком уровне, чем обработка макросов или связывания клавиш (см mutt_getch(). исходный код Mutt, в основе всего пользовательского ввода в Mutt, который возвращает ошибку при ^G).

macro editor \e '^G'

тоже не сработает.

Что вы можете сделать, это настроить свой терминал для отправки ^Gпосле нажатияEscape

С xterm:

xterm -xrm 'XTerm.VT100.translations: #override <KeyPress> Escape: string(0x7)'

Если вы используете screen, вы также можете сделать

screen -X bindkey $'\e' stuff $'\a'

перед вызовом Mutt и восстановлением его впоследствии (к сожалению, не похоже, что вы можете иметь привязки клавиш для каждого окна на экране). Кроме того, это будет проблемой, если ваш редактор сообщений электронной почты - vi.

Стефан Шазелас
источник
Upvoted: потому что это отвечает на вопрос (то есть, это невозможно). Не могли бы вы уточнить «жестко закодированный ... на более низком уровне». И хотя обходной путь гениален, он не очень практичен, так как я использую Escape во многих других терминальных программах - отсюда и желание связать его здесь.
Джейсонвриан
Я отредактировал свой ответ с более подробной информацией. Я удивлен, что у вас есть Esc, связанный с другими программами, поскольку это обычно не в приложениях, которые я знаю по причине, указанной в комментариях выше
Стефан Шазелас
2

Мне кажется, это действительно плохая идея связать побег ControlG. Я пришел сюда в поисках дурацкого решения, но так как кажется, что его нет, я дам ответ из того, что я делаю, для всех, кто случайно наткнется на это. Это не оптимально, но это не повлияет на другие программы:

macro editor \e "<enter><shell-escape>xdotool key control+g<enter>"

или

macro editor \e "<enter><shell-escape>xsendkey Control+g<enter>"

Использование чего-то вроде xdotool или xsendkey для фальсификации control + g работает и никуда не денется. Для меня существует визуальная задержка выхода из редактора строк, но привязки индекса будут работать немедленно, и визуальная задержка исчезнет, ​​как только вы используете привязку индекса. Первый ввод необходим для того, чтобы Mutt не просто напечатал «....» и превратил его в заголовок, поисковый запрос или что-то в этом роде.

совка
источник
0

Это решение настолько плохое, что автор предпочел отредактировать исходный код Матта, чтобы избавиться от ^ G

Предупреждение: это решение кажется несовместимым с OSX, Emacs и другими приложениями, которые используют Ctrl+G

После моего первого дня в Mutt я почти по ошибке использовал ^ G в Vim ... Затем я попробовал кое-что, что, кажется, работает здесь, в оконном менеджере i3 и xfce-Terminal .

Добавил эту строку в ~/.i3/config:

bindsym --release Escape exec --no-startup-id xvkbd -xsendevent -text "\[Escape]\[Control]\[g]"

Пришлось использовать, "\[Escape]\[Control]\[g]"потому что только "\[Control]\[g]"заставил его перестать работать в Vim.

Если вы не используете i3, я думаю, что вы можете использовать xbindkeys для запуска xvkbd -xsendevent -text "\[Escape]\[Control]\[g]"при Escнажатии.

Это не красивое решение ... Это может сделать ваш Escключ непригодным для использования в некоторых программах, но, по крайней мере, здесь это выглядит нормально

РЕДАКТИРОВАТЬ:

Теперь я вижу, что часть Ctrl+ Gзаставляет Vim показывать позицию в файле. Ничего особенного, пока.

Эта ссылка, кажется, имеет лучшее решение, но для urxvt : http://www.unixli.com/q/answers-urxvt-map-esc-key-to-key-sequence-83211.html

кто то
источник