/ / Згорнути каталоги в zsh підкажіть унікальним способом - zsh, prompt, pwd

Згорнути каталоги в zsh підказки унікальним способом - zsh, prompt, pwd

Чи є спосіб згорнути поточний робочий каталог у підказці zsh унікальним чином, щоб я міг скопіювати та вставити його в інший термінал, натиснути клавішу TAB і отримати вихідний шлях?

Припустимо, ми маємо наступні каталоги:

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

Якщо запрошення запрограмовано для показу першогосимволи, і я "m in / b / d, тоді він унікальний. З іншого боку, / a / d не є унікальним, тому мені потрібно / ad / d, / al / de і / al / do. even / 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 )

Для отримання поточної 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 (/) на кінці глобуса. У останньому каталозі (поточному) це означає, що ви можете зрівняти щось інше, якщо є файл з тим же ім'ям плюс розширення.