diff options
author | Tom Ryder <tom@sanctum.geek.nz> | 2018-12-02 23:10:23 +1300 |
---|---|---|
committer | Tom Ryder <tom@sanctum.geek.nz> | 2018-12-02 23:10:23 +1300 |
commit | f7b14abebc09ac9720c259c26b91b0640d2555a0 (patch) | |
tree | 8458d8d90eec9c3b58ea23fa2f373b20ca9eebb7 /bash/bash_completion.d/sd.bash | |
parent | Remove unneeded braces (diff) | |
download | dotfiles-f7b14abebc09ac9720c259c26b91b0640d2555a0.tar.gz dotfiles-f7b14abebc09ac9720c259c26b91b0640d2555a0.zip |
Make bd() and sd() match quoted and unquoted words
I suspect there's a more correct way to do this, but it's working well
for the moment.
Diffstat (limited to 'bash/bash_completion.d/sd.bash')
-rw-r--r-- | bash/bash_completion.d/sd.bash | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/bash/bash_completion.d/sd.bash b/bash/bash_completion.d/sd.bash index a776fbe3..4dc72f31 100644 --- a/bash/bash_completion.d/sd.bash +++ b/bash/bash_completion.d/sd.bash @@ -15,18 +15,28 @@ _sd() { # Make globs expand appropriately shopt -s dotglob nullglob if _completion_ignore_case ; then - shopt -s nocaseglob + shopt -s nocasematch 2>/dev/null fi # Print matching sibling dirs that are not the current dir - for sibling in ../"$2"*/ ; do - sibling=${sibling%/} - sibling=${sibling#../} - case $sibling in - ("${PWD##*/}") ;; - (*) printf '%q/' "$sibling" ;; - esac + for sib in ../*/ ; do + # Strip leading ../ + sib=${sib#../} + # Strip trailing slash + sib=${sib%/} + # Skip self + [[ $sib != "${PWD##*/}" ]] || continue + # Check the quoted and unquoted word for matching + for match in "$sib" "$(printf '%q' "$sib")" ; do + # Print any match, slash-terminated + case $match in + ("$2"*) + printf '%s/' "$sib" + continue + ;; + esac + done done ) } -complete -F _sd sd +complete -F _sd -o filenames sd |