Как я могу расширить все переменные в командной строке в Zsh?

В более раннем вопросе, специфичном для bash, я спросил, как я могу расширить относительный путь в командной строке с завершением табуляции?

Мне понравился ответ @ Mikel, в котором упоминалось использование Ctrl + Alt + e для расширения всех переменных, и я использовал это много.

С тех пор я переключился на zsh и пока я могу набрать $PWD и нажать Tab, чтобы развернуть путь текущей директории, если я наберу что-то вроде $PWD/.profile и нажмите Tab, он не будет расширен.

Я прочитал аналогичные вопросы и увидел ответы на расширение псевдонимов, а также как расширить переменные, набрав их и нажав Tab, но ничего не изменилось, как нажатие Ctrl + Alt + e в bash .

Есть ли способ разрешить escape-последовательность, такую ​​как Ctrl + Alt + e, для расширения всех переменных в командной строке, которая вводится в zsh ?

2 Solutions collect form web for “Как я могу расширить все переменные в командной строке в Zsh?”

Вы можете настроить compinit для расширения параметров в ~/.zshrc :

 zstyle ':completion:*' completer _expand _complete autoload -Uz compinit compinit 

Это минимальная настройка, если у вас уже включена функция compinit , ее должно быть достаточно, чтобы добавить _expand в настройки completer

Существует также виджет expand-word который по умолчанию привязан к ^X* ( Ctrl + x * ), который по существу делает то же самое, что и одно и то же связывание в bash.

Примечание. Оба метода работают только с текущим словом.


В качестве альтернативы, в zsh вы действительно можете сделать то, что вы просили в своем исходном вопросе: поверните относительный путь в абсолютный путь. Вот слегка измененный пример из zshcontrib(1) :

 # load necessary utility function autoload -Uz modify-current-argument # define helper function for actual work expand-and-abspath () { # expand the path (for example `~` -> `/home/youruser`) REPLY=${~1} # transform into absolute path (use `:A` if you want to resolve symlinks) REPLY=${REPLY:a} } # actual widget function abspath-word() { # use helper function on current word modify-current-argument expand-and-abspath } # create zle widget `abspath-word` (with function of the same name) zle -N abspath-word # bind widget to "Ctrl+xp" bindkey '^Xp' abspath-word 

Это определяет виджет abspath-word , который заменяет текущее слово абсолютным представлением пути и связывает его с Ctrl + x p .

Чтобы расширить параметры, арифметические и командные подстановки (а не псевдонимы и другие формы расширений), вы можете сделать:

 my-expand() BUFFER=${(e)BUFFER} CURSOR=$#BUFFER zle -N my-expand bindkey '\e^E' my-expand 

(он имел бы аналогичные ограничения и мог быть почти таким же опасным, как и у bash ).

  • Как сохранить текущую команду на zsh?
  • Ограничение поддержки символов ZSH, поддерживающее повторение?
  • Как расширить подстроку команды?
  • Необходимо передавать URL-адреса в кавычках
  • Как разбить строку на управляющий символ?
  • / usr / bin / env: zsh -: нет такого файла или каталога
  • Как передать переменные среды в новый сеанс входа в ssh?
  • tmux start process, если он еще не запущен
  • Почему замена процесса <() не работает с ssh -F
  • Изменение динамического названия tmux-окна до последней строки вывода команды
  • Добавить (изменить) каждый элемент массива через расширение параметра (т. Е. Без printf)?
  • Linux и Unix - лучшая ОС в мире.