
Я использую ZSH через Oh-my-zsh, и одна полезная функция, которую я вижу, заключается в том, что оболочка расширяет мои команды, когда они заключены в обратные кавычки.
Например, `pwd`
+ tabзаменяет `pwd`
мой текущий путь:
Мне интересно, есть ли относительно простой способ сделать то же самое для некоторых команд без использования обратных кавычек. Я бы хотел применить это к некоторым псевдонимам (или функциям).
Для ясности: я говорю не о расширении аргументов команды, а о самой команде.
Это действительно потрясающая функция, но это не совсем то, что я искал. Если я не сделал ничего неправильного, это расширяет мой псевдоним до того, для чего он был определен, но не до того, что является результатом. Например, здесь:
Я хотел бы увидеть результат этой команды, а не полную команду.
решение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.