diff --git a/README.md b/README.md index 6cedbf0..635e6de 100644 --- a/README.md +++ b/README.md @@ -68,12 +68,20 @@ $ based stats ``` This will display statistics about your command usage, such as the most frequently used commands, options, and arguments. +For database maintenance (recommended to run if you notice performance issues): + +```fish +$ based maintenance +``` +This will optimize the database by running VACUUM and ANALYZE operations to keep it performing well. + ## Configuration You can customize the behavior of based.fish by setting environment variables in your Fish shell: - `BASED_NO_CONFIRMATION`: If set to `1`, automatically executes the selected suggestion without confirmation, otherwise, it requires another Enter key press to execute the suggestion. - `BASED_NO_FUZZY`: If set to `1`, disables fuzzy matching for completions and only commands that start with the typed prefix will be suggested. +- `BASED_EXCLUDED_PATHS`: A list of path patterns to exclude from history logging. Supports glob patterns like `*` and `?`. Useful for excluding temporary directories, sensitive locations, or paths where you don't want command history tracked. E.g. to disable fuzzy behavior when searching for completions @@ -81,6 +89,12 @@ E.g. to disable fuzzy behavior when searching for completions $ set -Ux BASED_NO_FUZZY 1 ``` +E.g. to exclude specific paths from history tracking + +```fish +$ set -Ux BASED_EXCLUDED_PATHS "/tmp/*" "/var/tmp/*" "$HOME/Downloads" +``` + The keybindings for the completions are as follows: - `Arrow Up` and `Arrow Down`: Navigate through the suggestions of the smart history. diff --git a/completions/based.fish b/completions/based.fish index 5ac30c6..0a999d6 100644 --- a/completions/based.fish +++ b/completions/based.fish @@ -3,4 +3,5 @@ complete -c based -n __fish_use_subcommand -f -a init -d "Initialize the Based d complete -c based -n __fish_use_subcommand -f -a import -d "Import Fish history into Based" complete -c based -n __fish_use_subcommand -f -a stats -d "Show Based statistics" complete -c based -n __fish_use_subcommand -f -a reset -d "Reset Based state" +complete -c based -n __fish_use_subcommand -f -a maintenance -d "Perform database maintenance" complete -c based -n __fish_use_subcommand -f -a help -d "Show help message" diff --git a/conf.d/based.fish b/conf.d/based.fish index f69e26a..fc9678c 100644 --- a/conf.d/based.fish +++ b/conf.d/based.fish @@ -1,4 +1,4 @@ # Load the based logger (for fish_postexec event) -source ~/.config/fish/functions/__based_log.fish +source (status dirname)/../functions/__based_log.fish # Load keybindings (↑ for smart history, Ctrl+g for fzf popup) -source ~/.config/fish/functions/based_user_key_bindings.fish +source (status dirname)/../functions/based_user_key_bindings.fish diff --git a/functions/__based_fzf_popup.fish b/functions/__based_fzf_popup.fish index da8f869..3c2bd01 100644 --- a/functions/__based_fzf_popup.fish +++ b/functions/__based_fzf_popup.fish @@ -12,13 +12,18 @@ function __based_fzf_popup if test -n "$chosen" commandline -r -- "$chosen" + # Prevent autocomplete samples from remaining before the selected command. + # i.e: if you run `cd`, then arrow up, and select a command, the initial `cd` will be + # visible before the selected command, like: `cd cd `. It doesn't affect functionality, + # but it can be visually confusing. commandline -f repaint # Only execute if the user pressed ENTER and confirmation is set if test "$key" = enter; and set -q BASED_NO_CONFIRMATION; and test "$BASED_NO_CONFIRMATION" != 0 commandline -f execute end - else - commandline -f repaint end + + # Update the display for commands like directory changes + commandline -f repaint end diff --git a/functions/__based_init_db.fish b/functions/__based_init_db.fish index b342888..d618655 100644 --- a/functions/__based_init_db.fish +++ b/functions/__based_init_db.fish @@ -18,6 +18,8 @@ function __based_init_db CREATE INDEX IF NOT EXISTS idx_log_cmd ON log(cmd); CREATE INDEX IF NOT EXISTS idx_log_path_ts ON log(path, ts); CREATE INDEX IF NOT EXISTS idx_log_path_cmd ON log(path, cmd); + CREATE INDEX IF NOT EXISTS idx_log_counter_ts ON log(counter DESC, ts DESC); + CREATE INDEX IF NOT EXISTS idx_log_cmd_like ON log(cmd COLLATE NOCASE); " echo "Based initialized. You can also import your fish history with 'based import'." diff --git a/functions/__based_log.fish b/functions/__based_log.fish index 074bd5f..bc1550e 100644 --- a/functions/__based_log.fish +++ b/functions/__based_log.fish @@ -13,6 +13,15 @@ function __based_log --on-event fish_preexec return end + # Check if path should be excluded + if set -q BASED_EXCLUDED_PATHS + for excluded_pattern in $BASED_EXCLUDED_PATHS + if string match -q $excluded_pattern $path + return + end + end + end + set cmd (string replace -a "'" "''" -- $cmd) set path (string replace -a "'" "''" -- $path) diff --git a/functions/__based_maintenance.fish b/functions/__based_maintenance.fish new file mode 100644 index 0000000..6827113 --- /dev/null +++ b/functions/__based_maintenance.fish @@ -0,0 +1,25 @@ +function __based_maintenance + set -l db ~/.local/share/fish/based/based.db + if not test -f $db + echo "Database not found. Run 'based init' first." + return 1 + end + + echo "Performing database maintenance..." + + # Get database size before + set -l size_before (du -h $db | cut -f1) + + # Vacuum the database + sqlite3 $db "VACUUM;" + + # Update statistics + sqlite3 $db "ANALYZE;" + + # Get database size after + set -l size_after (du -h $db | cut -f1) + + echo "Database maintenance completed." + echo "Size before: $size_before" + echo "Size after: $size_after" +end diff --git a/functions/__based_reset_state.fish b/functions/__based_reset_state.fish index 65ff5d5..b9c0981 100644 --- a/functions/__based_reset_state.fish +++ b/functions/__based_reset_state.fish @@ -3,5 +3,6 @@ function __based_reset_state # Unset all variables related to Based state set -e BASED_NO_CONFIRMATION set -e BASED_NO_FUZZY + set -e BASED_EXCLUDED_PATHS echo "Based state has been reset." end diff --git a/functions/based.fish b/functions/based.fish index cc2e0ae..bd49892 100644 --- a/functions/based.fish +++ b/functions/based.fish @@ -8,14 +8,22 @@ function based __based_stats case reset __based_reset_state + case maintenance vacuum + __based_maintenance case help '*' - echo "Usage: based init|import|stats|reset|help" + echo "Usage: based init|import|stats|reset|maintenance|help" echo "Commands:" - echo " init - Initialize the Based database" - echo " import - Import fish history into Based" - echo " stats - Show Based statistics" - echo " reset - Reset Based state (clears variables)" - echo " help - Show this help message" + echo " init - Initialize the Based database" + echo " import - Import fish history into Based" + echo " stats - Show Based statistics" + echo " reset - Reset Based state (clears variables)" + echo " maintenance - Perform database maintenance (vacuum & analyze)" + echo " help - Show this help message" + echo "" + echo "Configuration variables:" + echo " BASED_NO_CONFIRMATION - Skip confirmation prompts" + echo " BASED_NO_FUZZY - Disable fuzzy matching" + echo " BASED_EXCLUDED_PATHS - Paths to exclude from history (glob patterns)" case '*' echo "Unknown command: $argv[1]" echo "Use 'based help' for usage information."