From f7b14abebc09ac9720c259c26b91b0640d2555a0 Mon Sep 17 00:00:00 2001 From: Tom Ryder Date: Sun, 2 Dec 2018 23:10:23 +1300 Subject: 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. --- bash/bash_completion.d/bd.bash | 16 ++++++++++++---- bash/bash_completion.d/sd.bash | 28 +++++++++++++++++++--------- 2 files changed, 31 insertions(+), 13 deletions(-) (limited to 'bash') diff --git a/bash/bash_completion.d/bd.bash b/bash/bash_completion.d/bd.bash index 4dde0eac..32969522 100644 --- a/bash/bash_completion.d/bd.bash +++ b/bash/bash_completion.d/bd.bash @@ -36,10 +36,18 @@ _bd() { # Iterate through the nodes and print the ones that match the word # being completed, with a trailing slash as terminator for node in "${nodes[@]}" ; do - case $node in - ("$2"*) printf '%s/' "$node" ;; - esac + node_quoted=$(printf '%q' "$node") + # Check the quoted and unquoted word for matching + for match in "$node" "$(printf '%q' "$node")" ; do + # Print any match, slash-terminated + case $match in + ("$2"*) + printf '%s/' "$node" + continue + ;; + esac + done done ) } -complete -F _bd bd +complete -F _bd -o filenames bd 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 -- cgit v1.2.3