Пользовательский виджет ZSH не работает, как я думаю, должен
Я пытаюсь определить функцию, чтобы я мог запустить 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 ответ
Причина этого не работает, потому что 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
может оставить курсор в нечетных позициях при выходе.