Как я могу расширить все переменные в командной строке в 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 скрипт, как конкатенировать элементы массива со строкой
  • Перестроить индекс автозаполнения (или как он там называется) и двоичные файлы в кеше $ PATH в zsh
  • zle - я не могу найти, почему Ctrl + R не работает для non-root
  • Как настроить zsh-запрос, чтобы его длина была пропорциональна ширине терминала
  • строковые подстановки: все вхождения
  • ls .. не работает должным образом с символическими ссылками
  • сбросить терминал с помощью сочетания клавиш (без клавиши ввода)
  • Как я могу правильно обрезать строку с помощью sed - и не убивать строку, если шаблон не существует?
  • ZSH и завершение файлов с символами новой строки
  • Исключение кавычек в псевдониме zsh
  • Здание zsh без администратора: нет библиотеки обработки терминала
  • Изменение темы Zsh в Android Studio
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.