каждый. Немного сложно объяснить, что я хочу сделать.

Я хочу создать скрипт «example», который может вводить для вас длинные команды после того, как вы запустите его с короткими параметрами. Например,

$ example server # I input this line manually
$ ssh user@192.168.1.2 # This line is automatically generated by the above command

Так что я могу редактировать командную строку в текущей строке.

Я использую оболочку ZSH . И я пробовал что-то вроде history но в конце не получилось. Любое предложение?

2 ответа2

1

Вместо использования функции оболочки вы также можете использовать связывание клавиш. Например, вот так:

bindkey -s '\C-e\C-l' 'ssh user@192.168.1.2'

Здесь -s создает подстановку строк, смотрите man zshzle:

-s in-string out-string ... Свяжите каждую строку с каждой строкой. Когда набирается in-string, out-string будет отталкиваться и обрабатываться как ввод в редакторе строк. Когда также используется -R, интерпретируйте строки как диапазоны.

В приведенном выше примере вы можете использовать CTRL+E, CTRL+L для вставки ssh user@192.168.1.2 в командную строку в текущей позиции курсора.

Это имеет то преимущество, что вы можете легко использовать этот ярлык для создания трубы, например

cat foo | CTRL+E,CTRL+L  =>  cat foo | ssh user@192.168.1.2
1

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

При этом можно расширить zle (редактор командной строки zsh) своими собственными функциями, так называемыми виджетами.

Любой пользовательский виджет имеет доступ к BUFFER , который содержит буфер редактирования и также может быть изменен.

Вот краткий прототип:

function example () {
    if [[ $BUFFER = 'server' ]]; then
        LBUFFER='ssh user@192.168.1.2 '
    else
        zle accept-line
    fi
}

zle -N example
bindkey '^M' example

zle -N example создает новый виджет с именем example и сопоставляет его с функцией с тем же именем. bindkey '^M' example отображает Control+M, также известный как Return, на example виджета. Поэтому каждый раз, когда вы просто набираете "server" и нажимаете Return, он заменяется ssh user@192.168.1.2 и курсор помещается в конец для дальнейшего редактирования, в то время как любая другая строка выполняется / принимается как есть.

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