The following commit has been merged in the master branch: commit ccbf141e13eaa98d6a8721ae015a5504654424cb Author: Freddy Vulto <fvu...@gmail.com> Date: Wed Jun 30 23:28:31 2010 +0200
Fix tilde (~) completion with _filedir This fixes tilde completion when doing for instance `ls ~<TAB>'. See also: Alioth #312613. Added _tilde() helper function. Contrary to _expand() and __expand_tilde_by_ref(), _tilde() also leaves the tilde (~) intact. Replacement of the tilde has been a complaint in other bugreports, especially since plain bash completion (without bash-completion installed) doesn't expand the tilde when doing a `ls ~<TAB>'. To run the tests: ./run completion/ls.exp ./run unit/_tilde.exp diff --git a/CHANGES b/CHANGES index 05ac17a..1c311bc 100644 --- a/CHANGES +++ b/CHANGES @@ -10,6 +10,9 @@ bash-completion (2.x) * Add "short" tarball extensions to unxz, unlzma etc completions. * Improve /etc/init.d/* and sqlite3 completions. + [ Freddy Vulto ] + * Added _tilde(), fix ~username completion (Alioth: #312613, Debian: #587095) + -- David Paleino <d.pale...@gmail.com> Wed, 16 Jun 2010 17:53:22 +0200 bash-completion (1.2) diff --git a/bash_completion b/bash_completion index 53eea33..e1e926b 100644 --- a/bash_completion +++ b/bash_completion @@ -618,7 +618,7 @@ _filedir() { local i IFS=$'\t\n' xspec - __expand_tilde_by_ref cur + _tilde "$cur" || return 0 local -a toks local quoted tmp @@ -803,7 +803,26 @@ _available_interfaces() } +# Perform tilde (~) completion +# @return True (0) if completion needs further processing, +# False (> 0) if tilde is followed by a valid username, completions +# are put in COMPREPLY and no further processing is necessary. +_tilde() { + local result=0 + # Does $1 start with tilde (~) and doesn't contain slash (/)? + if [[ ${1:0:1} == "~" && $1 == ${1//\/} ]]; then + # Try generate username completions + COMPREPLY=( $( compgen -P '~' -u "${1#\~}" ) ) + result=${#comprep...@]} + fi + return $result +} + + # Expand variable starting with tilde (~) +# We want to expand ~foo/... to /home/foo/... to avoid problems when +# word-to-complete starting with a tilde is fed to commands and ending up +# quoted instead of expanded. # Only the first portion of the variable from the tilde up to the first slash # (~../) is expanded. The remainder of the variable, containing for example # a dollar sign variable ($) or asterisk (*) is not expanded. @@ -832,7 +851,7 @@ __expand_tilde_by_ref() { # becomes "~a". Double quotes allow eval. # 2: Remove * before the first slash (/), i.e. "~a/b" # becomes "b". Single quotes prevent eval. - # +-----1----+ +---2----+ + # +-----1----+ +---2----+ eval $1="${!1/%\/*}"/'${!1#*/}' else # No, $1 doesn't contain slash diff --git a/test/lib/completions/ls.exp b/test/lib/completions/ls.exp index 171f6e1..fa47f85 100644 --- a/test/lib/completions/ls.exp +++ b/test/lib/completions/ls.exp @@ -19,4 +19,14 @@ if {[assert_exec {ls --help} "" "" "unsupported"]} { sync_after_int +set test "~part should complete to ~full" +assert_bash_exec {compgen -u} {} /@ users +find_unique_completion_pair $users part full +set cmd [format {ls ~%s} $part] +assert_complete "~$full/" $cmd $test + + +sync_after_int + + teardown diff --git a/test/unit/_tilde.exp b/test/unit/_tilde.exp new file mode 100644 index 0000000..54394cb --- /dev/null +++ b/test/unit/_tilde.exp @@ -0,0 +1,51 @@ +# @param string $part Reference to variable to hold partial unique username +# @param string $full Reference to variable to hold full unique username +proc setup {part full} { + upvar $part _part + upvar $full _full + + assert_bash_exec {compgen -u} {} /@ users + find_unique_completion_pair $users _part _full + save_env +} + + +proc teardown {} { + assert_env_unmodified { + /COMPREPLY=/d + } +} + + +setup part full + + +set test "function should run without errors" +assert_bash_exec {_tilde > /dev/null} $test + + +sync_after_int + + +set test "function should not pollute environment" +# NOTE: A possible environment pollution is detected by assert_env_modified() in teardown() +assert_bash_exec {foo() { local aa="~"; _tilde "$aa"; }; foo; unset foo} $test + + +sync_after_int + + +set test "~full should complete to ~full unmodified" +set cmd [format {_tilde "~%s"; printf "%%s" "${comprep...@]}"} $full] +assert_bash_list "~$full" $cmd $test + + +sync_after_int + + +set test "~part should complete to ~full" +set cmd [format {_tilde "~%s"; printf "%%s" "${comprep...@]}"} $part] +assert_bash_list "~$full" $cmd $test + + +teardown -- bash-completion _______________________________________________ Bash-completion-commits mailing list Bash-completion-commits@lists.alioth.debian.org http://lists.alioth.debian.org/mailman/listinfo/bash-completion-commits