使用製表符補全忽略指定的絕對目錄?

使用製表符補全忽略指定的絕對目錄?

我在一個有很多用戶的叢集上工作。叢集上有 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 clickright 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以完成簡單的目錄(如cdls)。例如,將此函數放在 ~/.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$請注意,正規表示式在 內沒有被引用[[]]

相關內容