我在一個有很多用戶的叢集上工作。叢集上有 50 個使用者的首字母與我的使用者名稱相同,還有一個使用者的名稱直到最後一個字母都相同。當我從 Tab 鍵完成時,/home/e
我只想看到/home/elsherbini/
,而不是必須鍵入更多字符,按 Tab 鍵,然後鍵入最後一個字符。
看來FIGNORE 不適用於絕對路徑,僅適用於檔案後綴。有沒有辦法忽略選項卡完成的精選目錄清單?
GNU bash,版本 4.1.2(1)-發布 (x86_64-redhat-linux-gnu)
答案1
我建議的一種方法是,alias
如果我們只關心home
目錄路徑,則將以下內容添加到您的目錄中profile
會有所幫助,無論您創建什麼獨特的別名,都應該使用第一個字元自動完成。
alias myHome="cd /home/elsherbini"
. .profile
my\T
pwd
/home/elsherbini
編輯:
另一種方式可能是綁定一個鍵但即使這也需要一個快速的double click
和right click
,考慮到您在 中的用法PuTTY
,如果這有幫助的話。
completeIt(){ echo "elsherbini"; }
bind -x '"\C-h": completeIt;'
使用Control-H
會提示您自訂的字串,例如您的使用者名稱。用法:
$ cd
elsherbini
答案2
我正在使用zsh
它可以非常徹底地定製完成。此選項會阻止某些模式完成:
autoload -Uz compinit; compinit
# ignore some common patterns that we usually don't want as completions
zstyle ':completion:*' ignored-patterns "/usr/share/iscan" "/usr/lib/iscan" \
"iscan" "/usr/lib/ispell" "ispell" "/usr/lib64" "/usr/lib32" \
"/usr/libx32" "/usr/libexec" "/srv/tftp" "chkwins" "dpkg-buildflags"
答案3
您可以覆蓋內建函數compgen
以完成簡單的目錄(如cd
和ls
)。例如,將此函數放在 ~/.bashrc 中
compgen(){
local IFS=$'\n'
local x tmp
x=$( builtin compgen "$@" ) &&
while read -r tmp; do
[[ "$tmp" =~ ^/home/e && ! "$tmp" =~ ^/home/elsherbini$ ]] ||
echo "$tmp"
done <<< "$x"
}
它運行內建函數compgen
並過濾輸出,以便從可能的補全列表中刪除任何以正則表達式開頭^/home/e
且不匹配的行。^/home/elsherbini$
請注意,正規表示式在 內沒有被引用[[]]
。