Tôi đang cố gắng thiết lập hoàn thành thư mục trong tcsh và/hoặc bash (cả hai được sử dụng tại trang web của tôi) với một chút vặn: cho một lệnh cụ thể "foo" , Tôi muốn hoàn thành sử dụng một hàm tùy chỉnh để khớp với cụm từ đầu tiên/-delimited đến nút con thực tế, và sau đó làm theo hoàn thành thư mục bình thường cho bất kỳ cụm từ liên tiếp nào. Nó là một loại kết hợp của cdpath và hoàn thành, hoặc tôi giả sử một hình thức hoàn thành thư mục nơi mà điểm bắt đầu được điều khiển bởi kịch bản hoàn thành. Nó sẽ làm việc như sau:Tcsh và/hoặc hoàn thành thư mục bash với tiền tố gốc ẩn biến
$ foo xxx<TAB>
(custom completion function produces choices it finds at arbitrary levels in the dir tree)
xxxYYY xxxZZZ xxxBLAH ...
foo xxxYYY/<TAB>
(normal directory completion proceeds from this point on, to produce something like:)
foo scene/shot/element/workspace/user/...
Chúng tôi muốn làm điều này bởi vì chúng tôi có một cây phát triển sản xuất lớn (đây là một cơ sở sản xuất CGI), mà người dùng vỏ hiểu biết đang điều hướng và nhảy xung quanh trong tất cả các thời gian. Khiếu nại là các cấp trên của cây là cồng kềnh và dư thừa; họ chỉ cần tìm kiếm nhanh về cụm từ đầu tiên để tìm các lựa chọn "đầu" có thể và thực hiện hoàn thành thư mục từ đó. Nó có vẻ như hoàn thành lập trình có thể cung cấp một cách để làm điều này, nhưng nó được bật ra được khá khó nắm bắt.
Tôi đã thực hiện một số lần thử bash và tcsh tùy chỉnh để thực hiện việc này, nhưng gần nhất tôi nhận được là một dạng "hoàn thành từ", nơi người dùng phải xử lý các cấp thư mục như các từ riêng biệt với dấu cách (ví dụ: foo scene/shot/element/không gian làm việc/...). Tôi có thể tiếp tục hack vào các kịch bản hiện tại của mình - nhưng tôi đã tự hỏi nếu có điều gì đó tôi không hiểu - đây là lần đầu tiên tôi hoàn thành chương trình, và các tài liệu và ví dụ khá mỏng trong sách vỏ và trên internet . Nếu có bất kỳ guru hoàn thành ra khỏi đó có thể giúp tôi đi đúng hướng, tôi sẽ đánh giá cao nó.
FWIW: đây là những gì tôi đã có cho đến nay (trong tcsh đầu tiên, sau đó bash). Lưu ý rằng root tĩnh '/ root/sub1/sub2/sub3' chỉ là một trình giữ chỗ cho một hàm tìm kiếm có thể tìm các kết quả khớp khác nhau ở các mức khác nhau. Nếu tôi có thể làm điều đó để làm việc, tôi có thể phụ trong tính năng tìm kiếm sau này. Một lần nữa, cả hai ví dụ thực hiện hoàn thành từ, yêu cầu người dùng nhập một khoảng trắng sau mỗi cụm từ khớp nhau (tôi cũng phải xóa các khoảng trống trong hàm để tạo đường dẫn thực tế, yuck!)
VÍ DỤ TCSH (lưu ý hàm là thực sự là một kịch bản bash):
complete complete_p2 '[email protected]*@`./complete.p2.list.bash $:1 $:2 $:3 $:4 $:5 $:6 $:7 $:8 $:9`@@'
#!/bin/bash --norc
# complete.p2.list.bash - Completion prototype "p2" for shotc command
# Remove spaces from input arguments
ppath=`echo [email protected] | sed -e 's/ //g'`
# Print basenames (with trailing slashes) of matching dirs for completion
ls -1 -d /root/sub1/sub2/sub3/$ppath* 2>/dev/null | sed -e 's#^.*/##' | awk '{print $1 "/"}'
bASH VÍ DỤ:
_foo()
{
local cur prev opts flist
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
# Get all command words so far (omit command [0] element itself), remove spaces
terms=`echo ${COMP_WORDS[@]:1} | sed -e 's/ //g'`
# Get basenames (with trailing slashes) of matching dirs for completion
flist=`ls -1 -d /root/sub1/sub2/sub3/${terms}* 2>/dev/null | sed -e 's#^.*/##' | awk '{print $1 "/"}' | xargs echo`
COMPREPLY=($(compgen -W "${flist}" ${cur}))
return 0
}
complete -F _foo foo
Biến môi trường CDPATH của bash có phù hợp với bạn không? – Cascabel
Tôi nhìn vào CDPATH, nhưng nó không hoạt động VỚI hoàn thành. Bạn có thể "cd name", nhưng không phải "cd name ..." Tôi thực sự cần hoàn thành. –
Tôi nghĩ rằng hoàn thành bash (kịch bản thêm đầy đủ các tính năng hữu ích mà tàu với bash trên hầu hết các distro) bao gồm một định nghĩa cập nhật hoàn thành cd bằng cách sử dụng CDPATH. – Cascabel