From 5c7a8548d4f2f6126a994edfcff4ce48e751ad45 Mon Sep 17 00:00:00 2001 From: quak Date: Sun, 19 Jan 2025 22:52:24 +0100 Subject: [PATCH] added shell completions for `push` and `book`marks --- bash_setup.sh | 25 +++++++++++++++++++++---- src/arguments.rs | 3 +++ src/bookmarks.rs | 6 ++++++ src/main.rs | 1 + 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/bash_setup.sh b/bash_setup.sh index e10a957..bf50885 100644 --- a/bash_setup.sh +++ b/bash_setup.sh @@ -5,18 +5,35 @@ __call_navigate() { eval "$(navigate ${arg_pid} $@)" } -push() { +function push { __call_navigate "push $@" } -pop() { +function pop { __call_navigate "pop $@" } -stack() { +function stack { __call_navigate "stack $@" } -book() { +function book { __call_navigate "bookmark $@" } + +# completion for `push` +function _push { + CURRENT_WORD=${COMP_WORDS[COMP_CWORD]} + DIRS="$(find . -maxdepth 1 -type d | grep -vx "." | grep -vx ".." | sed s^"./"^^)" + COMPREPLY=($(compgen -W "${DIRS}" -- $CURRENT_WORD)) +} + +# completion for `book` +function _book { + CURRENT_WORD=${COMP_WORDS[COMP_CWORD]} + BOOKMARKS="$(__call_navigate bookmark names)" + COMPREPLY=($(compgen -W "${BOOKMARKS}" -- $CURRENT_WORD)) +} + +complete -F _push push +complete -F _book book diff --git a/src/arguments.rs b/src/arguments.rs index 7fbcec2..bda53e6 100644 --- a/src/arguments.rs +++ b/src/arguments.rs @@ -103,6 +103,9 @@ pub enum BookmarkAction { /// remove a bookmark by name `book remove ` remove(BookmarkSubArgs), + + /// get bookmarknames for shell completions + names(EmptyArgs), } #[derive(Debug, Clone, Args)] diff --git a/src/bookmarks.rs b/src/bookmarks.rs index 9cb9893..d27d935 100644 --- a/src/bookmarks.rs +++ b/src/bookmarks.rs @@ -128,6 +128,12 @@ impl Bookmarks { Ok(buffer) } + /// get bookmarknames as space separated values in one string (for shell completions) + pub fn get_bookmarknames(&self) -> String { + let mut names: Vec = self.bookmarks.keys().cloned().collect(); + names.join(" ") + } + /// writes the bookmarks file fn write_bookmark_file(&self) -> Result<()> { let mut file_content = String::new(); diff --git a/src/main.rs b/src/main.rs index 38bc558..430632c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -131,6 +131,7 @@ fn handle_bookmark(args: &BookmarkArgs, config: &Config, bookmarks: &mut Bookmar BookmarkAction::list(_) => list_bookmarks(config, bookmarks, output)?, BookmarkAction::add(args) => add_bookmarks(args, config, bookmarks, output)?, BookmarkAction::remove(args) => remove_bookmarks(args, config, bookmarks, output)?, + BookmarkAction::names(_) => println!("echo '{}'", bookmarks.get_bookmarknames()), }; } else if args.name.is_some() { // handle `change to bookmark` let path = bookmarks.get_path_by_name(args.name.as_ref().unwrap())?;