3

Я пытаюсь определить функцию, чтобы я мог запустить Midnight Commander нажатием Alt-, но эта функция просто не работает.

Я нашел и изменил функцию на другом сайте и изменил ее так:

function _midnight {
    zle kill-whole-line
    zle -U "mc"
    zle accept-line
}
zle -N _midnight
bindkey '\e,' _midnight

И это то, что я думаю, я говорю это сделать:

define _midnight as {
erase everything on the line
insert "mc" on the command line
execute as a shell command
}
create _midnight as a custom widget
bind alt-comma to the widget

На самом деле он просто отправляет возврат каретки, а затем вставляет mc на следующей строке, не отправляя его.

Причина, по которой я использую это вместо bindkey -s '\e,' '^Umc^M заключается в том, что я в конечном итоге хотел бы найти способ запустить Midnight Commander без чего-либо, появляющегося в командной строке.

1 ответ1

2

Причина, по которой это не работает, заключается в том, что zle -U "mc" помещает "mc" во входной стек, но не заменяет текущий буфер команд.

Что на самом деле делает ваш виджет:

  • пустая строка
  • положить "mc" на стек ввода
  • принять пустую строку

После того, как строка принята, zsh извлекает "mc" из стека ввода и помещает текущий текущий буфер. Вот почему кажется, что виджет печатает только "mc", не делая ничего другого.

Предполагаемый результат может быть достигнут с

function _midnight {
    BUFFER="mc"
    zle accept-line
}

Но вы также можете сделать просто:

function _midnight {
    mc
    zle reset-prompt
}

Основное отличие состоит в том, что первое решение имитирует то, что вы будете делать, например, набирать команду и принимать ее (это включает mc в историю команд). Пока второй просто запускает mc . zle reset-prompt необязательно, но mc может оставить курсор в нечетных позициях при выходе.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .