Intereting Posts
снимать снимки объема BTRFS, смонтированного с помощью nodatacow? Категории разрешений для файлов Vintage терминал для Ubuntu Есть ли легенда в каком-то месте, которое описывает все эти цветовые кодировки в нижней части byobu? find-like tool для поиска (рекурсивно) в папках MailDir по размеру, отправителю, получателю, расширению имени вложения и т. д. Репозиторий пакета FreeBSD – как выполнить ручную проверку подписи? Что означает @ перед именем каталога? Red Hat Enterprise Linux 6: /boot/grub/menu.lst или /boot/grub/grub.conf? Почему Dropbox говорит «Killed» в Arch Linux? Каково соответствующее произношение имени файла dmesg? Использование WGET для извлечения всех имен файлов из индекса Gnome 3.22: отключить переключение клавиатуры клавиатуры + + shift Почему mutt продолжает просить имя пользователя и пароль imap? midnight commander: указать параметры командной строки в файле глобальной конфигурации как установить размер блока с помощью команды blockdev

Завершение первого аргумента cd OLD NEW

В zsh команда cd имеет форму с двумя аргументами: cd OLD NEW изменяется на ${PWD/OLD/NEW} . С системой завершения нового стиля zsh может завершить NEW : второй аргумент завершен на основе того, что OLD можно заменить, чтобы получить существующий каталог. Но первый аргумент завершен только для существующих каталогов.

Как я могу заставить zsh предлагать дополнения, которые являются возможными значениями для OLD , в дополнение к заполнению существующих каталогов?

Например, если текущий каталог является /path/to/foo а также есть каталоги /also/to/foo и /path/to/foo/prime , то cd p Tab завершает p до prime . Если я намереваюсь запустить cd path also тогда я хотел бы, чтобы zsh также предлагал path как завершение. Как?

Использование уже введенных значений второго аргумента, чтобы ограничить возможности для первого аргумента, было бы плюсом, но независимо от первого аргумента было бы хорошо.

Я думаю, вы могли бы добавить компоненты $PWD в список завершения cd , хотя это, по-видимому, требует возиться с _cd ; то есть настраиваемая версия _cd должна сначала отображаться в $fpath .

 % cd && mkdir zcomp % cp $fpath[-1]/_cd zcomp % fpath=(~/zcomp $fapth) 

Затем вверху ~/zcomp/_cd добавьте функцию

 _our_pwd() { _values ourpwd ${(ps:/:)PWD} } 

а затем непосредственно перед тем, как _alternative line добавит то, что возвращается к списку альтернатив

  ... alt=("$service-options:$service option:_cd_options" "$alt[@]") fi alt=(ourpwd:pwd:_our_pwd "$alt[@]") _alternative "$alt[@]" && ret=0 return ret ... 

хотя это всегда будет добавлять компоненты pwd к завершению cd :

 % cd Users jdoe Applications/ Desktop/ Documents/ Downloads/ Library/ ... 

с дополнительной логикой вы могли бы добавлять компоненты $PWD тогда, когда уже есть второй аргумент, а не всегда.

Однако! Это всегда _cd завершение cd и требует, чтобы мы _cd исправление вверх по _cd . Другим вариантом было бы создать новое имя для функции, предоставляемой cdsub cd , возможно, называемым cdsub , и только для этого нужно завершить компоненты PWD . Добавьте это в ~/.zshrc

 function cdsub { builtin cd "$@" } 

И затем _cd завершение для _cdsub должно быть помещено где-то в $fpath :

 #compdef cdsub # # Modified version of _cd from ZSH 5.3.1 with specific support for the # `cd old new` form whereby PWD elements are provided for completion. _cd_options() { _arguments -s \ '-q[quiet, no output or use of hooks]' \ '-s[refuse to use paths with symlinks]' \ '(-P)-L[retain symbolic links ignoring CHASE_LINKS]' \ '(-L)-P[resolve symbolic links as CHASE_LINKS]' } setopt localoptions nonomatch local expl ret=1 curarg integer argstart=2 noopts if (( CURRENT > 1 )); then # if not in command position, may have options. # Careful: -<-> is not an option. while [[ $words[$argstart] = -* && argstart -lt CURRENT ]]; do curarg=$words[$argstart] [[ $curarg = -<-> ]] && break (( argstart++ )) [[ $curarg = -- ]] && noopts=1 && break done fi if [[ CURRENT -eq $((argstart+1)) ]]; then # cd old new: look for old in $PWD and see what can replace it local rep # Get possible completions using word in position 2 rep=(${~PWD/$words[$argstart]/*}~$PWD(-/)) # Now remove all the common parts of $PWD and the completions from this rep=(${${rep#${PWD%%$words[$argstart]*}}%${PWD#*$words[$argstart]}}) (( $#rep )) && _wanted -C replacement strings expl replacement compadd -a rep else _values ourpwd ${(ps:/:)PWD} && ret=0 return ret fi