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

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

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

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

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

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

  • Как включить вкладку zsh / prezto?
  • Как отредактировать командную строку в полноэкранном редакторе в ZSH?
  • alias -g '$ {1 + "$ @"}' = '"$ @"', что он делает?
  • Как избежать столкновения / загрязнения пространства имен в сценарии, предназначенном для поиска?
  • игнорировать файл хоста в ZSH ssh / scp tab-complete
  • Чтение пароля с клавиатуры вместо stdin
  • Почему `kill -s INT <zsh PID>` ведет себя иначе, чем `Ctrl-C`?
  • Файлы инициализации оболочек
  • 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 ).

    Linux и Unix - лучшая ОС в мире.