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

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

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

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

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

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

  • Zsh очистить командную строку от вызова zsh / sched
  • Ctrl-Arrow больше не работает после установки Prezto
  • Ограничение поддержки символов ZSH, поддерживающее повторение?
  • Как «расширить» переменную bash (включенный код работает для bash, но не zsh)
  • Shell Script для перехода через рекурсивно и chmodding в соответствии с условиями типа файла
  • Как использовать замещение параметров в шаблоне glob (zsh)
  • Как изменить тему с помощью zsh
  • Тестирование LS_COLORS в 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 ).

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