I have been slowly migrating from Bash to Zsh and have got to the point where everything I have moved across is working well, with one exception.
I have a couple of functions in my .bashrc
that I use dozens of times a day and two of them do not work under Zsh. The three functions comprise a basic note taking facility.
They are currently in .config/zsh/functions
:
function n() {
local arg files=(); for arg; do files+=( ~/".notes/$arg" ); done
${EDITOR:-vi} "${files[@]}"
}
function nls() {
tree -CR --noreport $HOME/.notes | awk '{
if (NF==1) print $1;
else if (NF==2) print $2;
else if (NF==3) printf " %s\n", $3
}'
}
# TAB completion for notes
function _notes() {
local files=($HOME/.notes/**/"$2"*)
[[ -e ${files[0]} ]] && COMPREPLY=( "${files[@]##~/.notes/}" )
}
complete -o default -F _notes n
Which I source from .zshrc
like so:
autoload bashcompinit
bashcompinit
# source zshrc functions file
source "$HOME/.config/zsh/functions"
nls
works as expected, but neither n
nor Tab completion work.
I read man zshcompsys
where it says:
The function bashcompinit provides compatibility with bash's programmable completion system. When run it will define the functions, compgen and complete which correspond to the bash builtins with the same names. It will then be possible to use completion specifications and functions written for bash.
However, when I try Tab completion, nothing happens and when I enter n notename
, Vim opens my /home
in file browser mode - not quite the expected behaviour.
All of the other functions defined work well. How do I migrate these functions to work under Zsh?