From 097aafc6606750be2598150ca57a108df90ce058 Mon Sep 17 00:00:00 2001 From: zdv Date: Sat, 17 Feb 2024 22:58:30 +0700 Subject: [PATCH] bash completion --- completions/note | 106 +++++++++++++++++++++++++++++++++++++++++++++++ note | 14 +++---- 2 files changed, 113 insertions(+), 7 deletions(-) create mode 100755 completions/note diff --git a/completions/note b/completions/note new file mode 100755 index 0000000..e8a60cd --- /dev/null +++ b/completions/note @@ -0,0 +1,106 @@ +# completion file for bash + +_note_complete_entries () { + local prefix="${NOTE_STORE_DIR:-$HOME/.note-store/}" + prefix="${prefix%/}/" + local suffix=".md" + local autoexpand=${1:-0} + + local IFS=$'\n' + local items=($(compgen -f $prefix$cur)) + + # Remember the value of the first item, to see if it is a directory. If + # it is a directory, then don't add a space to the completion + local firstitem="" + # Use counter, can't use ${#items[@]} as we skip hidden directories + local i=0 item + + for item in ${items[@]}; do + [[ $item =~ /\.[^/]*$ ]] && continue + + # if there is a unique match, and it is a directory with one entry + # autocomplete the subentry as well (recursively) + if [[ ${#items[@]} -eq 1 && $autoexpand -eq 1 ]]; then + while [[ -d $item ]]; do + local subitems=($(compgen -f "$item/")) + local filtereditems=( ) item2 + for item2 in "${subitems[@]}"; do + [[ $item2 =~ /\.[^/]*$ ]] && continue + filtereditems+=( "$item2" ) + done + if [[ ${#filtereditems[@]} -eq 1 ]]; then + item="${filtereditems[0]}" + else + break + fi + done + fi + + # append / to directories + [[ -d $item ]] && item="$item/" + + item="${item%$suffix}" + COMPREPLY+=("${item#$prefix}") + if [[ $i -eq 0 ]]; then + firstitem=$item + fi + let i+=1 + done + + # The only time we want to add a space to the end is if there is only + # one match, and it is not a directory + if [[ $i -gt 1 || ( $i -eq 1 && -d $firstitem ) ]]; then + compopt -o nospace + fi +} + +_note_complete_folders () { + local prefix="${NOTE_STORE_DIR:-$HOME/.note-store/}" + prefix="${prefix%/}/" + + local IFS=$'\n' + local items=($(compgen -d $prefix$cur)) + for item in ${items[@]}; do + [[ $item == $prefix.* ]] && continue + COMPREPLY+=("${item#$prefix}/") + done +} + + +_note() +{ + COMPREPLY=() + local cur="${COMP_WORDS[COMP_CWORD]}" + local commands="init ls show help version ${NOTE_STORE_EXTENSION_COMMANDS[*]}" + if [[ $COMP_CWORD -gt 1 ]]; then + local lastarg="${COMP_WORDS[$COMP_CWORD-1]}" + case "${COMP_WORDS[1]}" in + init) + _note_complete_folders + ;; + ls|list|edit) + _note_complete_entries + ;; + show|-*) + COMPREPLY+=($(compgen -W "-c --clip" -- ${cur})) + _note_complete_entries 1 + ;; + cp|copy|mv|rename) + COMPREPLY+=($(compgen -W "-f --force" -- ${cur})) + _note_complete_entries + ;; + rm|remove|delete) + COMPREPLY+=($(compgen -W "-r --recursive -f --force" -- ${cur})) + _note_complete_entries + ;; + # git) + # COMPREPLY+=($(compgen -W "init push pull config log reflog rebase" -- ${cur})) + # ;; + esac + else + COMPREPLY+=($(compgen -W "${commands}" -- ${cur})) + _note_complete_entries 1 + fi +} + +complete -o filenames -F _note note diff --git a/note b/note index efaf8b7..21cadac 100755 --- a/note +++ b/note @@ -13,7 +13,7 @@ CMD_HELP(){ if [ ! -z $1 ]; then CMD_INSERT "$@" else - echo + echo cat <<-_EOF Usage: $PROGRAM init @@ -27,14 +27,14 @@ Usage: $PROGRAM version Show version information. _EOF -fi -exit 0 + fi + exit 0 } CMD_INIT(){ test -d $NOTESPATH && echo "Note Store already exist" && exit 0 || mkdir $NOTESPATH &> /dev/null - echo "New note storage creted to: $NOTESPATH" + echo "New note storage creted to: $NOTESPATH" exit 0 } @@ -44,9 +44,9 @@ CMD_SHOWTREE(){ else echo "Note Store" tree -N -C -l --noreport $NOTESPATH | tail -n +2 |\ - sed -E 's/\.md(\x1B\[[0-9]+m)?( ->|$)/\1\2/g' + sed -E 's/\.md(\x1B\[[0-9]+m)?( ->|$)/\1\2/g' fi -exit 0 + exit 0 } CMD_FIND(){ @@ -58,7 +58,7 @@ CMD_FIND(){ } CMD_GREP(){ -echo "add to-do grep" + echo "add to-do grep" } CMD_COPY_MOVE() {