2017-07-23 15 views
5

Có cách nào để thu gọn thư mục làm việc hiện tại trong lời nhắc zsh theo cách độc đáo không, để tôi có thể sao chép và dán nó vào một thiết bị đầu cuối khác, nhấn TAB và nhận đường dẫn ban đầu ?Thu gọn các thư mục trong dấu nhắc zsh theo cách độc đáo

Hãy nói rằng chúng tôi có các thư mục sau:

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

Nếu dấu nhắc được lập trình để hiển thị các ký tự đầu tiên, và tôi là trong/b/d, sau đó nó là duy nhất. Mặt khác,/a/d không phải là duy nhất, vì vậy tôi sẽ cần/ad/d,/al/de và/al/do. Và ngay cả/ali/... ngay khi người dùng alex xuất hiện.

Có thể hack trực tiếp trong zsh hay tôi cần phải viết một tập lệnh, tìm thấy sự khởi đầu ngắn nhất duy nhất của mỗi thư mục mẹ?

Cảm ơn ý kiến ​​của bạn!

Trả lời

5

Tôi không biết rằng zsh có một built-in chức năng của loại này, nhưng nó nên được khá dễ dàng để kịch bản mà không cần đến một subshell đơn hoặc ống chậm:

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

Kịch bản này sẽ ra đường dẫn ngắn nhất cần để tự động hoàn thành hoạt động.

Bạn có thể ném nó vào .zshrc làm chức năng và sau đó chạy nó từ bất kỳ thư mục nào.

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 
} 

Dưới đây là một đoạn video của nó trong hành động:

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

Hoặc nếu bạn thích, một số lượng mẫu:

~/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 
+1

Cảm ơn bạn, nó hoạt động trong lời nhắc của tôi như một sự quyến rũ. Bạn sẽ đề xuất tài nguyên nào để có được tổng quan về cú pháp zsh? – eumiro

+1

Có lẽ tài nguyên toàn diện nhất bạn sẽ tìm thấy là [Hướng dẫn sử dụng vỏ Z] (http://zsh.sourceforge.net/Doc/Release/), tài liệu tham khảo chính thức. Đó là nơi tôi đi đến bất cứ khi nào tôi muốn đào sâu vào cú pháp, và tôi thường lướt qua nó để hiểu một số cú pháp tốt hơn. Ngoài ra còn có [hướng dẫn sử dụng] (http://zsh.sourceforge.net/Guide/zshguide.html), đó là một chút kinh nghiệm học tập hơn là một tham chiếu, mặc dù tôi rất buồn khi nói rằng nó đã không được hoàn thành. Nhưng đó là một tài nguyên bắt đầu tốt, nếu không phải là một chút dài dòng và chưa được định dạng. –

0

Có nó có thể sụp đổ các thư mục để một đường dẫn chữ cái đầu tiên và có Vỏ Z mở rộng đường dẫn đó khi nhấn [Tab]. Tôi đơn giản sử dụng compinstall (kịch bản tiện ích zsh được cài đặt với Zsh) để tạo mã sau đây. Phần quan trọng cần lưu ý về việc mở rộng các phần tử đường dẫn là trên lệnh thứ sáu zstyle, gần cuối, trong đó khung ký tự để tách các điểm hoàn thành với bao gồm /, tất nhiên là dấu tách thư mục. Với điều này, các đường dẫn duy nhất bạn đề xuất sẽ điền đầy đủ chỉ bằng một lần nhấn [Tab] như thể * ở cuối mỗi chữ cái tên đường dẫn duy nhất.

# 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 

Đối với việc tạo ra con đường độc đáo ở nơi đầu tiên và chèn nó vào cửa sổ, có thể với một kịch bản zsh hoặc chức năng, và do đó nên thể cho Completer hoặc line-biên tập viên cũng có, nhưng chỉ cần gắn vào lời nhắc, bạn sẽ thêm một hàm vào mảng $precmd_functions sửa đổi hoặc thêm vào biến số PS1. Mảng đặc biệt này là danh sách các tên hàm được chạy ngay trước mỗi dấu nhắc.

function precmd_unique_pwd { 
    local pwd_string="$(upwd)" 
    PS1="%B%[email protected]%m $pwd_string => %b" 
} 
precmd_functions+=(precmd_unique_pwd) 

Để nhận của PWD hiện nay ở dạng rút gọn, tôi nghĩ rằng chức năng này là rõ ràng và dễ dàng để làm theo, mặc dù không nhất thiết phải tối ưu hóa cho việc sử dụng nguồn lực hạn chế.

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

Lưu ý rằng nó tìm đường dẫn duy nhất có tên thư mục vì tính năng Zsh (/) ở cuối thời gian kết thúc. Trên thư mục cuối cùng (hiện tại) điều này có nghĩa là bạn có thể khớp thứ gì đó khác nếu có một tệp có cùng tên cộng với một phần mở rộng.

Các vấn đề liên quan