क्या एक अद्वितीय तरीके से zsh प्रॉम्प्ट में वर्तमान कार्यशील निर्देशिका को ध्वस्त करने का कोई तरीका है, ताकि मैं इसे किसी अन्य टर्मिनल पर कॉपी और पेस्ट कर सकूं, टैब को हिट कर मूल पथ प्राप्त कर सकूं?
मान लें कि हमारे पास निम्नलिखित निर्देशिकाएं हैं:
/adam/devl
/alice/devl
/alice/docs
/bob/docs
अगर प्रॉम्प्ट को पहले दिखाने के लिए प्रोग्राम किया गया हैअक्षर, और मैं "एम / बी / डी में हूं, तो यह अद्वितीय है। दूसरी ओर, / ए / डी अद्वितीय नहीं है, इसलिए मुझे / ad / d, / al / de और / al / do की आवश्यकता होगी। और यहां तक कि / ali / ... जैसे ही उपयोगकर्ता एलेक्स दिखाई देता है।
क्या यह सीधे zsh में हैक करना संभव है या क्या मुझे एक स्क्रिप्ट लिखने की ज़रूरत है, जो प्रत्येक मूल निर्देशिका की सबसे छोटी अनूठी शुरुआत पाती है?
आपके विचारों के लिए धन्यवाद!
उत्तर:
उत्तर № 1 के लिए 6मुझे पता नहीं है कि 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
हां निर्देशिकाओं को पतन करना संभव हैएक पहला अनूठा-अक्षर पथ है और जेड शैल [टैब] दबाकर उस पथ का विस्तार करता है। मैं निम्नलिखित कोड उत्पन्न करने के लिए बस compinstall (zsh उपयोगिता स्क्रिप्ट स्थापित) का उपयोग किया। पथ तत्वों का विस्तार करने के लिए ध्यान देने का महत्वपूर्ण हिस्सा है छठा zstyle
आदेश, अंत के पास, जहां पूर्णांक बिंदुओं को अलग करने के लिए वर्णों का ब्रैकेट शामिल है /
, जो, निश्चित रूप से, निर्देशिका विभाजक है। इसके साथ ही, आपके द्वारा सुझाए गए अद्वितीय पथ पूरी तरह से एक [टैब] प्रेस के साथ भर जाएंगे जैसे कि *
प्रत्येक पथ-नाम अद्वितीय अक्षरों के अंत में थे।
# 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 सुविधा के कारण यह निर्देशिका नामों के साथ अद्वितीय पथ पाता है (/)
globbing के अंत में। अंतिम निर्देशिका (वर्तमान) पर इसका मतलब है कि यदि आप एक ही नाम और एक एक्सटेंशन वाले फ़ाइल हैं तो आप किसी और से मेल खा सकते हैं।