[Bug 1394920] Re: complete -o filename can't be used with filenames relative to another directory to handle space vs. trailing /
Peter Cordes
peter at cordes.ca
Mon Dec 1 21:51:06 UTC 2014
Was working on completions for something else, and thought of this when
I saw completions/make checking if COMPREPLY has only a single entry.
If it does, that means completion will replace the user's word, rather
than show possible completions. In that case, run compopt -o nospace.
And maybe also make sure your possible completions for directories end
with /, to trick the shell into appending that. (Sort that out in the
subshell that's cded there, so it can tell.)
_get_comp_words_by_ref is in /usr/share/bash-completion/bash_completion.
You might as well use any of those building blocks. But mostly they're
overkill solutions for the problem of noticing when there's a > or <
redirect, and completing on filenames for it, and then adjusting the
rest of the line like it hadn't happened, I think.
AFAICT, that's all you miss out on with
local cur="${COMP_WORDS[$COMP_CWORD]}"
vs.
_get_comp_words_by_ref cur prev
If you want more help with this, you should prob. post on stackoverflow
about how to complete filenames relative to something other than the
current directory. This Ubuntu bug probably isn't the most visible
place for anyone to notice and tip you off to a good idea. Since I'm
pretty much at the limit of my knowledge of obscure tips and tricks for
making something like this not take a lot of code and debugging time.
--
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