Создавайте расширяемые команды

Создавайте расширяемые команды

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

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

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

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

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


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

введите описание изображения здесь

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

решение1

Для этого можно использовать пользовательский виджет 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.

Связанный контент