[Bug 1394920] Re: complete -o filename can't be used with filenames relative to another directory to handle space vs. trailing /
hakon
hakon.hagland at gmail.com
Wed Dec 10 19:56:05 UTC 2014
Hi Peter, you were completely right! Now I have got some help at
stackoverflow, and it seems that helped solve this issue. There are four
things that seems must be in place to solve it:
1. compopt -o nospace
2. compopt -o filenames
3. Running compgen -f with an absolute path
4. Then postprocessing the results of compgen
a) removing absoulte path prefix
b) adding slashes after filenames
So here is minimal example (not handling quoting and spaces in file
names):
_compTest() {
local cur tmp val
cur="${COMP_WORDS[$COMP_CWORD]}"
tmp=~/tmp/
tmp_escaped=${tmp//\//\\\/}
cur="$tmp$cur"
COMPREPLY=( $(compgen -f "$cur") )
for ((i=0 ; i<${#COMPREPLY[@]}; i++ )) ; do
val="${COMPREPLY[$i]}"
[[ -d "$val" ]] && val="$val/"
COMPREPLY[$i]="${val/$tmp_escaped/}"
done
}
complete -o filenames -o nospace -F _compTest aaa
Thanks again for excellent help!
--
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to bash-completion in Ubuntu.
https://bugs.launchpad.net/bugs/1394920
Title:
complete -o filename can't be used with filenames relative to another
directory to handle space vs. trailing /
Status in bash-completion package in Ubuntu:
Opinion
Bug description:
I am trying to ignore certain directory names when using bash
completion. For example to ignore "backup" directories I use
$ cat setup.sh
_compTest() {
local curdir cur words val name
cur="${COMP_WORDS[$COMP_CWORD]}"
baseFolder="."
curdir=$PWD
cd "$baseFolder"
words=( $(compgen -f "$cur") )
COMPREPLY=()
for val in "${words[@]}" ; do
name=$(basename "$val")
if [[ $name == "backup" ]] ; then
continue
fi
COMPREPLY+=( "$val" )
done
cd "$curdir"
}
complete -o filenames -F _compTest aaa
After sourcing this:
$ . setup.sh
I can type
$ aaa <tab><tab>
and it works fine. However if I use another baseFolder, for example
setting
baseFolder="$HOME/base"
in the above script (setup.sh) (where $HOME/base is different from the
current directory) the completion list is no longer what I would
expect. That is:
* slashes are missing at the end of directory names, and
* a space is added after each completed directory name, instead of a slash ("/")
$ lsb_release -rd
Description: Ubuntu 14.04.1 LTS
Release: 14.04
$ apt-cache policy bash-completion
bash-completion:
Installed: 1:2.1-4
Candidate: 1:2.1-4
Version table:
*** 1:2.1-4 0
500 http://no.archive.ubuntu.com/ubuntu/ trusty/main i386 Packages
100 /var/lib/dpkg/status
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/bash-completion/+bug/1394920/+subscriptions
More information about the foundations-bugs
mailing list