Sau đây là những gì tôi muốn có. Khi hoàn thành tab không rõ ràng và bash sẽ in danh sách các khả năng. Tôi muốn nó tô màu cho ký tự tiếp theo mà tôi nên nhấn bên trong mỗi từ trong danh sách.
Sau đây là những gì tôi đã làm cho đến nay. Trong .bashrc của tôi, tôi đã xác định hàm sau và đã gọi lệnh hoàn chỉnh
_colourunique() {
local word=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=($(compgen -f -- "${word}"))
if [[ "$word" ]] && [[ ${#COMPREPLY[@]} -gt 1 ]]; then
local w
local i=0
for ((i=0;i<${#COMPREPLY[@]};i++)) ; do
w=${COMPREPLY[$i]}
n=${#word}
COMPREPLY[$i]="${w:0:n}\033[91m${w:n:1}\033[0m${w:$((n+1))}"
done
fi
}
complete -D -F _colourunique
Nhưng nó không hoạt động ... Khi tôi gõ
ls D[TAB]
Nó tự động hoàn thành như
ls D\033[91m
Thay vì liệt kê các khả năng Tài liệu, Máy tính để bàn, vv Điều gì có thể xảy ra ở đây? Hoặc có một số cách trực tiếp khác để thực hiện điều này?
CẬP NHẬT 1:
Tôi nghĩ rằng tôi hiểu những gì đang xảy ra ở đây. Vì tôi thêm \ 033 [91m vào mỗi từ trong COMPREPLY, bash thấy phần này là chung cho tất cả và tự động hoàn thành thuật ngữ chung đó vào chính dấu nhắc lệnh. (thay vì chỉ in danh sách)
Vì vậy, tôi không nghĩ rằng phương pháp chỉnh sửa mảng COMPREPLY này là cách để thực hiện. Có phương pháp nào khác không?
CẬP NHẬT 2:
Để duy trì tính đơn nhất, tôi đã cố gắng thêm $ i và \ b trong chuỗi.
COMPREPLY[$i]="${w:0:n}$i\b\033[91m${w:n:1}\033[0m${w:$((n+1))}"
Bây giờ nó in các tab hoàn thành có thể như sau.
D0\b\033[91mo\033[0mwnloads D1\b\033[91me\033[0msktop
Có nghĩa là, danh sách được in như vậy. Không có đánh giá về \ b hoặc \ 033 [91m ký tự. :-(
CẬP NHẬT 3:
Vì các câu trả lời trông giống như vậy, không có cách nào để thực hiện những gì tôi muốn trong bash (trừ khi tôi chuyển sang zsh). Tôi quyết định giải quyết cho một lựa chọn khác. Tôi sẽ cố gắng nối các nét phím duy nhất tiếp theo vào cuối mỗi từ để nó nổi bật.
Sau đây là mã cho đến nay.
SanitiseString () {
local String="$1"
local j
for j in \\ \! \@ \# \$ \% \^ \& \* \( \) \+ \{ \[ \] \} \| \; \: \" \' \, \? \ ; do
String=${String//"$j"/\\"$j"}
done
echo "$String"
}
_colourunique() {
saveIFS=$IFS
IFS=$'\n'
local word=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=($(compgen -f -- "${word}"))
if [[ "$word" ]] ; then
local w
local i=0
for ((i=0;i<${#COMPREPLY[@]};i++)) ; do
w="${COMPREPLY[$i]}"
n=${#word}
w=$(SanitiseString "$w")
if [[ ${#COMPREPLY[@]} -gt 1 ]] ; then
COMPREPLY[$i]="$w :${w:n:1}"
else
COMPREPLY[$i]="$w"
fi
done
fi
IFS=$saveIFS
}
complete -D -F _colourunique
Điều này sẽ in các tùy chọn với tổ hợp phím độc đáo tiếp theo được phân tách bằng:
Nhưng mã vẫn có hai vấn đề khó chịu. mà tôi phải giải quyết
- Nó không còn nối thêm / ở cuối thư mục tự động hoàn thành
- Nó không còn khoảng cách thông minh sau khi tự động hoàn thành.
Bất kỳ đề xuất?
bash
đơn giản là không cung cấp một móc để định dạng tùy chỉnh các hoàn thành có thể.