4

Я использую ZSH через Oh-my-zsh, и я вижу одну замечательную особенность - командная оболочка расширяет мои команды, когда они находятся в обратных тиках.

Например, `pwd` + tab заменяет` `pwd` на мой текущий путь:

https://infinit.io/_/DjmxTCK.gif

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

Чтобы было ясно, я говорю не о расширении аргументов команды, а о самой команде.


Это действительно удивительная особенность, но это не совсем то, что я искал. Если я не сделал что-то не так, это расширяет мой псевдоним до того, к чему был определен псевдоним, но не до того, каков результат. Например здесь:

Я хотел бы видеть результат этой команды вместо полной команды.

1 ответ1

2

Для этого вы можете использовать собственный виджет zle и вызывать его с помощью привязки клавиш, например Alt+Tab (идентично Esc, Tab)

expand-to-output () {
    BUFFER='$('$BUFFER')'
    CURSOR=0
    zle redisplay
    zle expand-word
}
zle -N expand-to-output
bindkey "^[^I" expand-to-output

Теперь, если вы введете какую-либо команду, а затем Alt+Tab, вся команда будет заменена ее выводом, если команда может быть успешно выполнена. Если команда не может быть успешно выполнена, набранная командная строка будет просто заключена в $(...) но не расширена. Если были сообщения об ошибках, они должны быть напечатаны над буфером редактирования. Это может не работать надежно с многострочными приглашениями.

Объяснение:

  • expand-to-output () {...} определяет (новую) функцию expand-to-output .
  • BUFFER содержит текущую командную строку
  • BUFFER='$('$BUFFER')' ставит $( до и ) после командной строки. $(...) эквивалентно `...` но может быть вложенным.
  • CURSOR - позиция курсора в командной строке
  • CURSOR=0 помещает курсор в начало (отредактированной) командной строки, то есть на $ . Не перемещая курсор туда, может случиться так, что zsh попытается развернуть слово внутри $(...) вместо всей подстановки процесса.
  • zle redisplay отображает буфер редактирования. Это предотвращает ошибки отображения, если расширенная команда печатает что-то для stderr . (Примечание: могут быть некоторые проблемы с многострочными приглашениями)
  • zle expand-word вызывает виджет expand-word , который обычно часто называют частью Tab-дополнения.
  • zle -N expand-to-output регистрирует функцию как виджет с тем же именем.
  • bindkey "^[^I" expand-to-output связывает виджет с expand-to-output с Alt+Tab .

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