/ / Свиване на директории в zsh prompt по уникален начин - zsh, prompt, pwd

Сгъване на директории в zsh prompt по уникален начин - zsh, prompt, pwd

Има ли начин за свиване на текущата работна директория в прозореца на zsh по един уникален начин, така че да мога да го копирате и поставите в друг терминал, да ударите TAB и да получите оригиналния път?

Да кажем, че имаме следните директории:

/adam/devl
/alice/devl
/alice/docs
/bob/docs

Ако подканата е програмирана да покаже първатаи аз съм в / b / d, тогава е уникален, а от друга страна, / a / d не е уникален, така че ще ми трябва / ad / d, / al / de и / al / do. дори / ali / ... веднага щом се появи потребителът alex.

Възможно ли е да направите това директно в zsh или трябва да напиша скрипт, който намира най-краткото уникално начало на всяка родителска директория?

Благодаря ви за вашите идеи!

Отговори:

6 за отговор № 1

Не знам това zsh има вградена функция от този вид, но би трябвало да е доста лесна за писане, без да прибягва до единична подложка или бавна тръба:

#!/bin/zsh

paths=(${(s:/:)PWD})

cur_path="/"
cur_short_path="/"
for directory in ${paths[@]}
do
cur_dir=""
for (( i=0; i<${#directory}; i++ )); do
cur_dir+="${directory:$i:1}"
matching=("$cur_path"/"$cur_dir"*/)
if [[ ${#matching[@]} -eq 1 ]]; then
break
fi
done
cur_short_path+="$cur_dir/"
cur_path+="$directory/"
done

printf %q "${cur_short_path: : -1}"
echo

Този скрипт ще изведе най-краткия път, необходим за автоматичното изпълнение, за да работи.

Можете да го хвърлите във вашия .zshrc като функция и след това да го стартирате от която и да е директория.

function spwd {
paths=(${(s:/:)PWD})

cur_path="/"
cur_short_path="/"
for directory in ${paths[@]}
do
cur_dir=""
for (( i=0; i<${#directory}; i++ )); do
cur_dir+="${directory:$i:1}"
matching=("$cur_path"/"$cur_dir"*/)
if [[ ${#matching[@]} -eq 1 ]]; then
break
fi
done
cur_short_path+="$cur_dir/"
cur_path+="$directory/"
done

printf %q "${cur_short_path: : -1}"
echo
}

Ето видеоклип от него в действие:

https://asciinema.org/a/0TyL8foqvQ8ec5ZHS3c1mn5LH

Или, ако предпочитате, извадка от извадката:

~/t $ ls
adam  alice  bob  getshortcwd.zsh

~/t $ ls adam
devl

~/t $ ls alice
devl  docs

~/t $ spwd
/h/v/t

~/t $ cd adam/devl

~/t/adam/devl $ spwd
/h/v/t/ad/d

~/t/adam/devl $ cd ../../alice/devl

~/t/alice/devl $ spwd
/h/v/t/al/de

~/t/alice/devl $ cd ../docs

~/t/alice/docs $ spwd
/h/v/t/al/do

~/t/alice/docs $ `spwd` [TAB]
~/t/alice/docs $ /h/v/t/al/do [TAB]
~/t/alice/docs $ /home/vsimonian/t/alice/docs

0 за отговор № 2

Да, възможно е да се свиват директорите допърво път с уникални букви и да разгънат Z Shell този път при натискане на [Tab]. Просто използвах compinstall (скрипт на помощна програма zsh инсталиран с Zsh), за да генерира следния код. Важната част, която трябва да отбележим за разширяването на елементите на пътя, е шести zstyle команда, близо до края, където скобата на знаците за отделни точки на завършване включва /, което, разбира се, е сепараторът на директории. С това уникалните пътеки, които предложихте, ще се попълнят напълно само с едно [Tab], като че ли * бяха в края на всяко име на пътя уникални букви.

# The following lines were added by compinstall

zstyle ":completion:*" add-space true
zstyle ":completion:*" completer _list _expand _complete _ignored _match _correct _approximate _prefix
zstyle ":completion:*" completions 1
zstyle ":completion:*" list-colors ${(s.:.)LS_COLORS}
zstyle ":completion:*" matcher-list "m:{[:lower:]}={[:upper:]} r:|[._-]=* r:|=*" "m:{[:lower:]}={[:upper:]} m:{[:lower:][:upper:]}={[:upper:][:lower:]} r:|[._-]=* r:|=*" "r:|[._-/]=* r:|=*" "l:|=* r:|=*"
zstyle ":completion:*" match-original both
zstyle :compinstall filename "/home/micah/.zsh/.zshrc"

autoload -Uz compinit
compinit
# End of lines added by compinstall

Що се отнася до създаването на уникалния път на първо място и вмъкването му в подкана, е възможно с zsh скрипт или функция и следователно Трябва да бъде възможно и за завършителя или редактора на реда, но просто да се придържате към подканата, бихте добавили функция към $precmd_functions масив, който променя или добавя към PS1 променлива. Този специален масив е списък на имената на функциите, които се изпълняват точно преди всяка подкана.

function precmd_unique_pwd {
local pwd_string="$(upwd)"
PS1="%B%n@%m $pwd_string => %b"
}
precmd_functions+=( precmd_unique_pwd )

За да се сдобият с настоящата версия на ДКУ в съкратена форма, мисля, че тази функция е ясна и лесна за следене, макар и не непременно оптимизирана за ниско използване на ресурсите.

#!/bin/zsh
function upwd {
emulate -LR zsh -o nullglob
local dir Path
local -a newpwd tmp stack
local -i length=1 Flag=0
newpwd=( ${(s./.)PWD} )
foreach dir ( $newpwd )
(( length=0, Flag=0 ))
repeat $#dir
do
(( length += 1 ))
tmp=( ${(j.*/.)~stack}/$dir[1,$length]*(/) )
if
(( $#tmp == 1 ))
then
Path=$Path/$dir[1,$length]
stack+=( /$dir )
(( Flag=1 ))
break
fi
done
if
(( Flag ))
then
continue
else
Path=$Path/$dir
fi
end
print -- $Path
}
upwd

Забележете, че открива уникални пътища с имена на директории поради функцията Zsh (/) в края на гроба. От последната директория (текуща) това означава, че може да съвпадате с нещо друго, ако има файл със същото име плюс разширение.