/ / Verzeichnisse in der Zsh-Eingabeaufforderung auf einzigartige Weise komprimieren - zsh, prompt, pwd

Reduzieren Sie Verzeichnisse in der Zsh-Eingabeaufforderung in einer eindeutigen Weise - zsh, prompt, pwd

Gibt es eine Möglichkeit, das aktuelle Arbeitsverzeichnis in der Zsh-Eingabeaufforderung auf eine einzigartige Weise zu reduzieren, so dass ich es kopieren und in ein anderes Terminal einfügen konnte, TAB drücken und den ursprünglichen Pfad abrufen?

Sagen wir, wir haben folgende Verzeichnisse:

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

Wenn die Aufforderung so programmiert ist, dass die erste angezeigt wirdZeichen, und ich bin in / b / d, dann ist es einzigartig. Auf der anderen Seite ist / a / d nicht einzigartig, also würde ich / ad / d, / al / de und / al / tun even / ali / ... sobald der Benutzer alex erscheint.

Ist es möglich, dies direkt in zsh zu hacken oder muss ich ein Skript schreiben, das den kürzesten eindeutigen Anfang jedes Elternverzeichnisses findet?

Danke für deine Ideen!

Antworten:

6 für die Antwort № 1

Das ist mir nicht bewusst zsh hat eine eingebaute Funktion dieser Art, aber es sollte ziemlich einfach zu scripten sein, ohne auf eine einzelne Subshell oder langsame Pipe zurückzugreifen:

#!/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

Dieses Skript gibt den kürzesten Pfad aus, der für die automatische Vervollständigung benötigt wird.

Sie können es in Ihre werfen .zshrc als eine Funktion und dann aus jedem Verzeichnis ausführen.

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
}

Hier ist ein Video davon in Aktion:

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

Oder, wenn Sie bevorzugen, einige Beispielausgabe:

~/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 für die Antwort № 2

Ja, es ist möglich, die Verzeichnisse zu reduzierenein Pfad des ersten eindeutigen Buchstabens und die Z-Shell erweitert diesen Pfad durch Drücken von [Tab]. Ich habe einfach compinstall (zsh Dienstprogramm-Skript mit Zsh installiert) verwendet, um den folgenden Code zu generieren. Der wichtige Teil, der für die Erweiterung der Pfadelemente beachtet werden muss, ist der sechste zstyle Befehl, nahe dem Ende, wo die Klammer von Zeichen, um Vervollständigungspunkte mit zu trennen, einschließt /Dies ist natürlich das Verzeichnistrennzeichen. Damit werden die von Ihnen vorgeschlagenen einzigartigen Pfade vollständig mit nur einem [Tab] - Knopf ausgefüllt, als ob der * Am Ende jedes Pfadnamens waren eindeutige Buchstaben.

# 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

Wie zum Erstellen des eindeutigen Pfads an erster Stelle und Einfügen in die Eingabeaufforderung ist es möglich, mit einem ZSH-Skript oder einer Funktion und daher sollte möglich sein für den Completer oder den Line-Editor auch, aber nur an die Aufforderung kleben, würden Sie eine Funktion hinzufügen $precmd_functions Array, das ändert oder hinzufügt PS1 Variable. Dieses spezielle Array ist eine Liste von Funktionsnamen, die direkt vor jeder Eingabeaufforderung ausgeführt werden.

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

Um das aktuelle PWD in gekürzter Form zu erhalten, denke ich, dass diese Funktion klar und einfach zu folgen ist, obwohl sie nicht unbedingt für eine geringe Ressourcenauslastung optimiert ist.

#!/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

Beachten Sie, dass aufgrund der Zsh-Funktion eindeutige Pfade mit Verzeichnisnamen gefunden werden (/) am Ende des Globbings. Im letzten Verzeichnis (aktuell) bedeutet dies, dass Sie etwas anderes finden können, wenn es eine Datei mit dem gleichen Namen plus einer Erweiterung gibt.