From 3649ca3b387c8d55a0869a268b237440992a34e8 Mon Sep 17 00:00:00 2001 From: Joseph Tannhuber Date: Sat, 6 Sep 2014 22:08:09 +0200 Subject: [PATCH] Budspencer theme improvements - prompt line enumeration implemented - new function to set the window title - new session history - README file updated - replaced all `math` commands by `expr` for better performance --- themes/budspencer/README.md | 191 +++-- themes/budspencer/fish_greeting.fish | 102 ++- themes/budspencer/fish_prompt.fish | 894 ++++++++++++++--------- themes/budspencer/fish_right_prompt.fish | 375 +++++----- 4 files changed, 937 insertions(+), 625 deletions(-) diff --git a/themes/budspencer/README.md b/themes/budspencer/README.md index ff30f92..e426bb2 100644 --- a/themes/budspencer/README.md +++ b/themes/budspencer/README.md @@ -1,89 +1,144 @@ -# budspencer theme +# Budspencer theme -Translation of zsh's prezto [budspencer theme][budspencer]. This theme is -optimized for visibility and a fast workflow. +A theme for the 70s, makes fish even more powerful. It's equipped with a few +nice functions and key bindings to speed up your workflow. + +## Demonstration video + +[![video][screenshot]](http://vimeo.com/105546618) ## Requirements +You need an up-to-date fish shell version from [github][fish-git] or a +[nightly build][fish-nightly]. + Non standard tools: * xsel +* wmctrl * git +* [taskwarrior][taskwarrior] (optional) +* [remind][remind] (optional) ## Configuration +### General configuration + The theme behaves similar to vim's airline/powerline plugins. Thus, it needs a [powerline font][font]. Although it works with emacs mode, it's more powerful -with vi mode. In order to enable vi mode, put the following lines into -`$HOME/.config/fish/config.fish` before `set fish_path $HOME/.oh-my-fish`: - +with vi mode. In order to enable vi mode, execute: ``` set -U fish_key_bindings fish_vi_key_bindings ``` +### Colors + +Redefine `$budspencer_colors` with the `set` command in order to change the +colors of the prompt. + +Example: +``` +set budspencer_colors 000000 333333 666666 ffffff ffff00 ff6600 ff0000 ff0033 3300ff 0000ff 00ffff +00ff00 +``` +will result in a prompt like this: +![color replace example][colors] + +Two color schemes for bright and dark environments are predefined. You can +enable them with `day` and `night`, respectively. + +### Command history +Commands that shouldn't appear in the command history are defined by a universal +list `$budspencer_nocmdhist`. Default: +``` +set -U budspencer_nocmdhist c d ll ls m s +``` + +### Disable/reenable greeting + +Disable: +``` +set -U budspencer_nogreeting +``` + +Reenable: +``` +set -e budspencer_nogreeting +``` + +## Outer prompt segments + +- Vi mode is indicated by color of outer segments, cursor color also changes + if terminal supports it: + * blue: NORMAL mode + * yellow: INSERT mode + * magenta: VISUAL mode + ## Left prompt segments -- Vi mode indicator similar to vim airline/powerline, cursor color also changes - if terminal supports it +- Prompt line number - Git repository information - Status symbols - * ⌘: present working directory is in bookmark list, can be toggled with `#` to - show the number of the bookmark - * V: vi is parent process - * R: [ranger][ranger] is parent process - * ⚙: there are background jobs, can be toggled with `#` to show the amount of - background jobs - * : no write permissions in present working directory - * ✔: last command succeeded, can be toggled with `#` to show the status value - * ✘: last command failed, can be toggled with `#` to show the status value - * ⚡: superuser indicator + * ✻: keep track of this shell session, can be toggled with `#` to show the number of + the session within the sessions list + * ⌘: present working directory is in bookmark list, can be toggled with `#` to + show the number of the bookmark + * V: vi is parent process + * R: [ranger][ranger] is parent process + * ⚙: there are background jobs, can be toggled with `#` to show the amount of + background jobs + * : no write permissions in present working directory + * ⚔: there are tasks scheduled due today, can be toggled with `#` to + show the amount of tasks + * ⚑: there are appointments for today, can be toggled with `#` to + show the amount of appointments + * ✔: last command succeeded, can be toggled with `#` to show the status value + * ✘: last command failed, can be toggled with `#` to show the status value + * ⚡: superuser indicator - Present working directory ## Right prompt segments - Last command's duration time -- Git status - * symbols: - - ↑: git repository is ahead origin - - ↓: git repository is behind origin - - +: changes have been added to git index - - –: files have been deleted in work tree - - ✱: files have been modified in work tree - - →: files have been renamed in git index - - ═: there are unmerged commits - - ●: there are untracked (new) files - - ✭: there are stashed commits +- Git status symbols: + * ↑: git repository is ahead origin + * ↓: git repository is behind origin + * +: changes have been added to git index + * –: files have been deleted in work tree + * ✱: files have been modified in work tree + * →: files have been renamed in git index + * ═: there are unmerged commits + * ●: there are untracked (new) files + * ✭: there are stashed commits ## Toggle prompt segments The following shortcuts need vi-mode: - Style of "present working directory"-segment can be toggled in NORMAL and in VISUAL mode with space bar - * styles implemented: - - `short` (shows username, short hostname and truncated path; recommended in - most cases) - - `long` (shows username, full hostname and full path; useful for copy-paste - in ssh connections) - - `none` (shows nothing except small delimiter; useful for small terminals) - - If prompt is toggled with `#`, the IP address is shown instead of the - hostname. - * configurable by global list `$PWDSTYLE` (if not set, defaults to - `short long none`); put `set -g PWDSTYLE none long` into - `$HOME/.config/fish/budspencer_config.fish` if you want to toggle only between - `none` and `long`. + * styles implemented: + - `short` (shows username, short hostname and truncated path; recommended in + most cases) + - `long` (shows username, full hostname and full path; useful for copy-paste + in ssh connections) + - `none` (shows nothing except small delimiter; useful for small terminals) + - If prompt is toggled with `#`, the IP address is shown instead of the + hostname. + * configurable by universal list `$budspencer_pwdstyle` (if not set, defaults to + `short long none`); note that changes to `$budspencer_pwdstyle` keep persistant as it's + a universal variable. - Style of symbols can be toggled in NORMAL and in VISUAL mode with `#` - * styles implemented: - - `symbols` (shows status symbols) - - `numbers` (shows numbers instead of symbols in left prompt as well as amount of changes in - right git prompt) + * styles implemented: + - `symbols` (shows status symbols) + - `numbers` (shows numbers instead of symbols in left prompt as well as amount of changes in + right git prompt) ## Quickly navigate in history of working directories -There is a function `d` that shows the history as enumerated list. Unlike -fish's builtin `dirh`, `d` does not show any duplicates. Enter a number to jump -to a directory within the list. It's also possible to give that number directly as -argument to the `d` function. +The function `d` shows the history as enumerated list. Unlike fish's builtin +`dirh`, `d` does not show any duplicates. Enter a number to jump to a directory +within the list. The following shortcuts need vi-mode: - Press `H` in NORMAL mode to change present working directory to previous @@ -93,14 +148,15 @@ The following shortcuts need vi-mode: ## Quickly navigate in command history -The function `c` shows the command history as enumerated list equivalently to -the `d` function. Selections are also paste into the X clipboard. +The function `c` shows the command history as enumerated list similarly to +the `d` function. Selections are also paste into the X clipboard. It's possible +to load a command of a former prompt by giving the prompt line number as +argument. ## Bookmarks A bookmark can be created with `mark`. It can be removed with `unmark`. -Bookmarks are persistent and universal. -They are stored in `$HOME/.config/fish/budspencer_config.fish`. +Bookmarks are universal and thus persistant. A new shell automatically changes working directory on startup to newest bookmark. `m` is a function that shows the bookmarks as enumerated list equivalently to `d`. @@ -111,21 +167,38 @@ The following shortcuts need vi mode: ## Edit commandline with your favorite editor The function `edit-commandline` let you edit the commandline with your editor. -It makes your commandline as powerful as your editor. If `$EDITOR` is not set, -use vi. +It makes the commandline as powerful as your editor. If `$EDITOR` is not set, +vi is used. The following shortcut needs vi mode: - Type `.` in NORMAL mode to edit commandline in editor. -## Screenshot +## Sessions -![budspencer theme][screenshot] +Shell session can be stored with `s `. If a session with `session +name` already exists, the session with this name will be attached. If a session with +`session name` is already active within another terminal, this terminal will be +focussed. + +A list of available sessions can be shown with `s`. + +A session can be erased with `s -e `. + +Type `s -d` to detach current session. + +## Set window title + +Just type `wt `. ## TODO - vi REPLACE mode, as soon as REPLACE mode is implemented within fish -[budspencer]: https://github.com/tannhuber/prezto [font]: https://github.com/Lokaltog/powerline-fonts [ranger]: http://ranger.nongnu.org/ -[screenshot]: https://raw.githubusercontent.com/tannhuber/prezto/master/screenshots/budspencer.png +[taskwarrior]: http://taskwarrior.org/ +[remind]: http://www.roaringpenguin.com/products/remind +[fish-git]: https://github.com/fish-shell/fish-shell.git +[fish-nightly]: https://github.com/fish-shell/fish-shell/wiki/Nightly-builds +[screenshot]: https://raw.githubusercontent.com/tannhuber/media/master/budspencer.jpg +[colors]: https://raw.githubusercontent.com/tannhuber/media/master/budspencer_replace_colors.jpg diff --git a/themes/budspencer/fish_greeting.fish b/themes/budspencer/fish_greeting.fish index 2f31e8d..e2ef8cf 100644 --- a/themes/budspencer/fish_greeting.fish +++ b/themes/budspencer/fish_greeting.fish @@ -1,21 +1,46 @@ ############################################################################### # -# Prompt theme name: +# prompt theme name: # budspencer # -# Description: +# description: # a sophisticated airline/powerline theme # -# Author: -# Joseph Tannhuber <sepp.tannhuber@yahoo.de> +# author: +# joseph tannhuber <sepp.tannhuber@yahoo.de> # -# Sections: +# sections: +# -> Color definitions # -> Functions # -> Help +# -> Environment +# -> Window title # -> Welcome message # ############################################################################### +############################################################################### +# => Color definitions +############################################################################### + +# Define colors +set -U budspencer_night 000000 083743 445659 fdf6e3 b58900 cb4b16 dc121f af005f 6c71c4 268bd2 2aa198 859900 +set -U budspencer_day 000000 333333 666666 ffffff ffff00 ff6600 ff0000 ff0033 3300ff 00aaff 00ffff 00ff00 +if not set -q budspencer_colors + # Values are: black dark_gray light_gray white yellow orange red magenta violet blue cyan green + set -U budspencer_colors $budspencer_night +end + +# Cursor color changes according to vi-mode +# Define values for: normal_mode insert_mode visual_mode +set -U budspencer_cursors "\033]12;#$budspencer_colors[10]\007" "\033]12;#$budspencer_colors[5]\007" "\033]12;#$budspencer_colors[8]\007" "\033]12;#$budspencer_colors[9]\007" + +# Some terminals cannot change the cursor color +set -l unsupported_terminals 'fbterm' 'st' 'linux' 'screen' +if contains $TERM $unsupported_terminals + set budspencer_cursors '' '' '' '' +end + ############################################################################### # => Functions ############################################################################### @@ -23,32 +48,55 @@ ######### # => Help ######### -function budspencer_help -d "Shows helpfile" - set -l readme_file $fish_path"/themes/budspencer/README.md" - if set -q PAGER - if test -e $readme_file - eval $PAGER $readme_file - else - set_color $fish_color_error - echo $readme_file" wasn't found." - end - else - open $readme_file - end +function budspencer_help -d 'Show helpfile' + set -l readme_file "$fish_path/themes/budspencer/README.md" + if set -q PAGER + if [ -e $readme_file ] + eval $PAGER $readme_file + else + set_color $fish_color_error[1] + echo "$readme_file wasn't found." + end + else + open $readme_file + end +end + +################ +# => Environment +################ +function day -d "Set color palette for bright environment." + set budspencer_colors $budspencer_day + set budspencer_cursors "\033]12;#$budspencer_colors[10]\007" "\033]12;#$budspencer_colors[5]\007" "\033]12;#$budspencer_colors[8]\007" "\033]12;#$budspencer_colors[9]\007" +end + +function night -d "Set color palette for dark environment." + set budspencer_colors $budspencer_night + set budspencer_cursors "\033]12;#$budspencer_colors[10]\007" "\033]12;#$budspencer_colors[5]\007" "\033]12;#$budspencer_colors[8]\007" "\033]12;#$budspencer_colors[9]\007" +end + +################# +# => Window title +################# +function wt -d 'Set window title' + set -g window_title $argv + function fish_title + echo -n $window_title + end end #################### # => Welcome message #################### -function fish_greeting -d "Show greeting in login shell." - if begin - test (count $bookmarks) -gt 0 - and not set -q -x LOGIN - and not set -q -x RANGER_LEVEL - and not set -q -x VIM - end - echo This is oh-my-fish\'s (set_color -b 083746 268bd2)budspencer(set_color normal) theme. - echo Type (set_color -b 083746 cb4b16)»budspencer_help«(set_color normal) in order to see how you can speed up your workflow. - set_color normal +function fish_greeting -d 'Show greeting in login shell.' + if not set -q budspencer_nogreeting + if begin + not set -q -x LOGIN + and not set -q -x RANGER_LEVEL + and not set -q -x VIM + end + echo This is (set_color -b $budspencer_colors[2] $budspencer_colors[10])budspencer(set_color normal) theme for fish, a theme for the 70s. + echo Type (set_color -b $budspencer_colors[2] $budspencer_colors[6])»budspencer_help«(set_color normal) in order to see how you can speed up your workflow. + end end end diff --git a/themes/budspencer/fish_prompt.fish b/themes/budspencer/fish_prompt.fish index 08a1a97..1f0aff1 100644 --- a/themes/budspencer/fish_prompt.fish +++ b/themes/budspencer/fish_prompt.fish @@ -10,55 +10,39 @@ # Joseph Tannhuber <sepp.tannhuber@yahoo.de> # # Sections: -# -> Color definitions # -> Key bindings # -> Files # -> Functions +# -> Pre execute # -> Directory history # -> Command history # -> Bookmarks +# -> Sessions # -> Commandline editing with $EDITOR # -> Git segment # -> Bind-mode segment # -> Symbols segment # -> Prompt initialization # -> Left prompt -# -> Segments # ############################################################################### -############################################################################### -# => Color definitions -############################################################################### - -# Define colors -# Values are: black dark_gray light_gray white yellow orange red magenta violet blue cyan green -set -g budspencer_colors 000000 083743 445659 fdf6e3 b58900 cb4b16 dc121f af005f 6c71c4 268bd2 2aa198 859900 - -# Cursor color changes according to vi-mode -# Define values for: normal_mode insert_mode visual_mode -set -g budspencer_cursors "\033]12;#$budspencer_colors[10]\007" "\033]12;#$budspencer_colors[5]\007" "\033]12;#$budspencer_colors[8]\007" - -# Some terminals cannot change the cursor color -set -l unsupported_terminals "fbterm" "st" "linux" "screen" -if contains $TERM $unsupported_terminals - set -e budspencer_cursors -end - ############################################################################### # => Key bindings ############################################################################### -if test "$fish_key_bindings" = "fish_vi_key_bindings" - bind '#' fish_symbols_toggle_cm - bind -M visual '#' fish_symbols_toggle_cm - bind ' ' fish_pwd_toggle_cm - bind -M visual ' ' fish_pwd_toggle_cm - bind L fish_cd_next - bind H fish_cd_prev - bind m mark - bind M unmark - bind . edit-commandline +if [ $fish_key_bindings = 'fish_vi_key_bindings' ] + bind '#' __budspencer_toggle_symbols + bind -M visual '#' __budspencer_toggle_symbols + bind ' ' __budspencer_toggle_pwd + bind -M visual ' ' __budspencer_toggle_pwd + bind L __budspencer_cd_next + bind H __budspencer_cd_prev + bind m mark + bind M unmark + bind . __budspencer_edit_comandline + bind -M insert \n __budspencer_preexec + bind \n __budspencer_preexec end ############################################################################### @@ -66,340 +50,571 @@ end ############################################################################### # Config file -set -g budspencer_config $HOME/.config/fish/budspencer_config.fish +set -g budspencer_config "$HOME/.config/fish/budspencer_config.fish" -# Temporary file -set -g budspencer_tmpfile "/tmp/"(echo %self)".fish" +# Temporary files +set -g budspencer_tmpfile '/tmp/'(echo %self)'_budspencer_edit.fish' ############################################################################### # => Functions ############################################################################### +################ +# => Pre execute +################ +function __budspencer_preexec -d 'Execute after hitting <Enter> before doing anything else' + set -l cmd (commandline | sed 's|\s\+|\x1e|g') + if [ $_ = 'fish' ] + if [ -z $cmd[1] ] + set -e cmd[1] + end + if [ -z $cmd[1] ] + return + end + set -e budspencer_prompt_error[1] + if not type -q $cmd[1] + if [ -d $cmd[1] ] + set budspencer_prompt_error (cd $cmd[1] ^&1) + and commandline '' + commandline -f repaint + return + end + end + switch $cmd[1] + case 'c' + if begin + [ (count $cmd) -gt 1 ] + and [ $cmd[2] -gt 0 ] + and [ $cmd[2] -lt $pcount ] + end + commandline $prompt_hist[$cmd[2]] + echo $prompt_hist[$cmd[2]] | xsel + commandline -f repaint + return + end + case 'cd' + if [ (count $cmd) -le 2 ] + set budspencer_prompt_error (eval $cmd ^&1) + and commandline '' + if [ (count $budspencer_prompt_error) -gt 1 ] + set budspencer_prompt_error $budspencer_prompt_error[1] + end + commandline -f repaint + return + end + case 'day' 'night' + if [ (count $cmd) -eq 1 ] + eval $cmd + commandline '' + commandline -f repaint + return + end + end + end + commandline -f execute +end + ###################### # => Directory history ###################### -function create_dir_hist -v PWD -d "Create directory history without duplicates" - if test $hist_lock = "false" - if contains $PWD $dir_hist - set -e dir_hist[(contains -i $PWD $dir_hist)] - end - set dir_hist $dir_hist "$PWD" - set -g dir_hist_val (count $dir_hist) - end +function __budspencer_create_dir_hist -v PWD -d 'Create directory history without duplicates' + if [ $pwd_hist_lock = false ] + if contains $PWD $$dir_hist + set -e $dir_hist[1][(contains -i $PWD $$dir_hist)] + end + set $dir_hist $$dir_hist $PWD + set -g dir_hist_val (count $$dir_hist) + end end -function fish_cd_prev -d "Change to previous directory, press H in NORMAL mode." - if test $dir_hist_val -gt 1 - set dir_hist_val (math $dir_hist_val-1) - set hist_lock "true" - cd $dir_hist[$dir_hist_val] - commandline -f repaint - end +function __budspencer_cd_prev -d 'Change to previous directory, press H in NORMAL mode.' + if [ $dir_hist_val -gt 1 ] + set dir_hist_val (expr $dir_hist_val - 1) + set pwd_hist_lock true + cd $$dir_hist[1][$dir_hist_val] + commandline -f repaint + end end -function fish_cd_next -d "Change to next directory, press L in NORMAL mode." - if test $dir_hist_val -lt (math (count $dir_hist)) - set dir_hist_val (math $dir_hist_val+1) - set hist_lock "true" - cd $dir_hist[$dir_hist_val] - commandline -f repaint - end +function __budspencer_cd_next -d 'Change to next directory, press L in NORMAL mode.' + if [ $dir_hist_val -lt (count $$dir_hist) ] + set dir_hist_val (expr $dir_hist_val + 1) + set pwd_hist_lock true + cd $$dir_hist[1][$dir_hist_val] + commandline -f repaint + end end -function d -d "List directory history, jump to directory in list with d <number>" - set hist_lock "true" - set -l num_items (math (count $dir_hist)-1) - if test $num_items -eq 0 - echo (set_color $fish_color_error)"Directory history is empty." - return - end - if test $argv[1] -ge 0 -a $argv[1] -lt $num_items ^ /dev/null - cd $dir_hist[(math $num_items-$argv[1])] - else - for i in (seq $num_items) - if test (math \($num_items-$i\)%2) -eq 0 - set_color normal - else - set_color $budspencer_colors[4] - end - echo (math $num_items-$i)\t$dir_hist[$i] | sed "s|$HOME|~|" - end - if test $num_items -eq 1 - set last_item "" - else - set last_item "-"(math $num_items-1) - end - set input_length (expr length (math $num_items-1)) - read -p 'echo -n (set_color -b $budspencer_colors[2] $budspencer_colors[5])" ♻ Goto [0"$last_item"] "(set_color -b normal $budspencer_colors[2])" "(set_color $budspencer_colors[5])' -n $input_length -l dir_num - if begin - test -n $dir_num - and contains $dir_num (seq 0 (math $num_items-1)) - end - cd $dir_hist[(math $num_items-$dir_num)] - end -end +function d -d 'List directory history, jump to directory in list with d <number>' + set -l num_items (expr (count $$dir_hist) - 1) + if [ $num_items -eq 0 ] + set_color $fish_color_error[1] + echo 'Directory history is empty. '(set_color normal)'It will be created automatically' + return + end + for i in (seq $num_items) + if [ (expr \( $num_items - $i \) \% 2) -eq 0 ] + set_color normal + else + set_color $budspencer_colors[4] + end + echo (expr $num_items - $i)\t$$dir_hist[1][$i] | sed "s|$HOME|~|" + end + if [ $num_items -eq 1 ] + set last_item '' + else + set last_item '-'(expr $num_items - 1) + end + echo -en $budspencer_cursors[2] + set input_length (expr length (expr $num_items - 1)) + read -p 'echo -n (set_color -b $budspencer_colors[2] $budspencer_colors[5])" ♻ Goto [e|0"$last_item"] "(set_color -b normal $budspencer_colors[2])" "(set_color $budspencer_colors[5])' -n $input_length -l dir_num + switch $dir_num + case (seq 0 (expr $num_items - 1)) + cd $$dir_hist[1][(expr $num_items - $dir_num)] + return 0 + case 'e' + read -p 'echo -n (set_color -b $budspencer_colors[2] $budspencer_colors[5])" ♻ Erase [0"$last_item"] "(set_color -b normal $budspencer_colors[2])" "(set_color $budspencer_colors[5])' -n $input_length -l dir_num + set -e $dir_hist[1][(expr $num_items - $dir_num)] ^ /dev/null + set dir_hist_val (count $$dir_hist) + return 0 + end + return 1 end #################### # => Command history #################### -function create_cmd_hist -e fish_prompt -d "Create command history without duplicates" - if test $hist_lock = "false" - set -l cmd $history[1] - if not begin - expr $cmd : 'cd ' > /dev/null - or expr $cmd : '[cdm] ' > /dev/null - or test $cmd = 'cd' -o $cmd = 'c' -o $cmd = 'd' -o $cmd = 'm' - end - if contains $cmd $cmd_hist - set -e cmd_hist[(contains -i $cmd $cmd_hist)] - end - set cmd_hist $cmd_hist $cmd - end +function __budspencer_create_cmd_hist -e fish_prompt -d 'Create command history without duplicates' + if [ $_ = 'fish' ] + set pcount (expr $pcount + 1) + set -l IFS '' + set -l cmd (echo $history[1] | fish_indent | expand -t 4) + # Create prompt history + set prompt_hist $prompt_hist $cmd + # Create command history + if not begin + expr $cmd : '[cdms] ' > /dev/null + or contains $cmd $budspencer_nocmdhist + end + if contains $cmd $$cmd_hist + set -e $cmd_hist[1][(contains -i $cmd $$cmd_hist)] + end + set $cmd_hist $$cmd_hist $cmd + end end + set fish_bind_mode insert + echo -n \a end -function c -d "List command history, execute command in list with c <number>" - set hist_lock "true" - set -l num_items (count $cmd_hist) - if test $num_items -eq 0 - echo (set_color $fish_color_error)"Command history is empty." - return - end - if test $argv[1] -lt $num_items ^ /dev/null - commandline $cmd_hist[(math $num_items-$argv[1])] - echo $cmd_hist[(math $num_items-$argv[1])] | xsel - else - for i in (seq $num_items) - if test (math \($num_items-$i\)%2) -eq 0 - set_color normal - else - set_color $budspencer_colors[4] - end - echo -n (math $num_items-$i) - set -l item (echo $cmd_hist[$i] | fish_indent | expand -t 4) - echo -n \t$item\n - end - if test $num_items -eq 1 - set last_item "" - else - set last_item "-"(math $num_items-1) - end - set input_length (expr length (math $num_items-1)) - read -p 'echo -n (set_color -b $budspencer_colors[2] $budspencer_colors[8])" ↩ Exec [0"$last_item"] "(set_color -b normal $budspencer_colors[2])" "(set_color $budspencer_colors[8])' -n $input_length -l cmd_num - if begin - test -n $cmd_num - and contains $cmd_num (seq 0 (math $num_items-1)) - end - commandline $cmd_hist[(math $num_items-$cmd_num)] - echo $cmd_hist[(math $num_items-$cmd_num)] | xsel - end - set fish_bind_mode default +function c -d 'List command history, load command from prompt with c <prompt number>' + set -l num_items (count $$cmd_hist) + if [ $num_items -eq 0 ] + set_color $fish_color_error[1] + echo 'Command history is empty. '(set_color normal)'It will be created automatically.' + return end - set hist_lock "false" + for i in (seq $num_items) + if [ (expr \( $num_items - $i \) \% 2) -eq 0 ] + set_color normal + else + set_color $budspencer_colors[4] + end + echo -n (expr $num_items - $i) + set -l item (echo $$cmd_hist[1][$i]) + echo -n \t$item\n + end + if [ $num_items -eq 1 ] + set last_item '' + else + set last_item '-'(expr $num_items - 1) + end + echo -en $budspencer_cursors[4] + set input_length (expr length (expr $num_items - 1)) + read -p 'echo -n (set_color -b $budspencer_colors[2] $budspencer_colors[9])" ↩ Exec [e|0"$last_item"] "(set_color -b normal $budspencer_colors[2])" "(set_color $budspencer_colors[9])' -n $input_length -l cmd_num + switch $cmd_num + case (seq 0 (expr $num_items - 1)) + commandline $$cmd_hist[1][(expr $num_items - $cmd_num)] + echo $$cmd_hist[1][(expr $num_items - $cmd_num)] | xsel + return 0 + case 'e' + read -p 'echo -n (set_color -b $budspencer_colors[2] $budspencer_colors[9])" ↩ Erase [0"$last_item"] "(set_color -b normal $budspencer_colors[2])" "(set_color $budspencer_colors[9])' -n $input_length -l cmd_num + set -e $cmd_hist[1][(expr $num_items - $cmd_num)] ^ /dev/null + return 0 + end + return 1 end ############## # => Bookmarks ############## -function mark -d "Create bookmark for present working directory." - if not contains $PWD $bookmarks - set -U bookmarks $PWD $bookmarks - sed -i '/^set -U bookmarks/d' $budspencer_config ^ /dev/null - echo "set -U bookmarks $bookmarks" >> $budspencer_config - set hist_lock "true" - commandline -f repaint - end +function mark -d 'Create bookmark for present working directory.' + if not contains $PWD $bookmarks + set -U bookmarks $PWD $bookmarks + set pwd_hist_lock true + commandline -f repaint + end end -function unmark -d "Remove bookmark for present working directory." - if contains $PWD $bookmarks - set -e bookmarks[(contains -i $PWD $bookmarks)] - sed -i '/^set -U bookmarks/d' $budspencer_config ^ /dev/null - echo "set -U bookmarks $bookmarks" >> $budspencer_config - set hist_lock "true" - commandline -f repaint - end +function unmark -d 'Remove bookmark for present working directory.' + if contains $PWD $bookmarks + set -e bookmarks[(contains -i $PWD $bookmarks)] + set pwd_hist_lock true + commandline -f repaint + end end -function m -d "List bookmarks, jump to directory in list with m <number>" - set hist_lock "true" - set -l num_items (count $bookmarks) - if test $num_items -eq 0 - echo (set_color $fish_color_error)"Bookmark list is empty." - return - end - if test $argv[1] -ge 0 -a $argv[1] -lt $num_items ^ /dev/null - cd $bookmarks[(math $num_items-$argv[1])] - else - for i in (seq $num_items) - if test (math \($num_items-$i\)%2) -eq 0 - set_color normal - else - set_color $budspencer_colors[4] - end - echo (math $num_items-$i)\t$bookmarks[$i] | sed "s|$HOME|~|" - end - if test $num_items -eq 1 - set last_item "" - else - set last_item "-"(math $num_items-1) - end - echo -en $budspencer_cursors[1] - set input_length (expr length $num_items) - read -p 'echo -n (set_color -b $budspencer_colors[2] $budspencer_colors[10])" ⌘ Goto [0"$last_item"] "(set_color -b normal $budspencer_colors[2])" "(set_color $budspencer_colors[10])' -n $input_length -l dir_num +function m -d 'List bookmarks, jump to directory in list with m <number>' + set -l num_items (count $bookmarks) + if [ $num_items -eq 0 ] + set_color $fish_color_error[1] + echo 'Bookmark list is empty. '(set_color normal)'Enter '(set_color $fish_color_command[1])'mark '(set_color normal)'in INSERT mode or '(set_color $fish_color_command[1])'m '(set_color normal)'in NORMAL mode, if you want to add the current directory to your bookmark list.' + return + end + for i in (seq $num_items) + if [ $PWD = $bookmarks[$i] ] + set_color $budspencer_colors[10] + else + if [ (expr \( $num_items - $i \) \% 2) -eq 0 ] + set_color normal + else + set_color $budspencer_colors[4] + end + end + echo (expr $num_items - $i)\t$bookmarks[$i] | sed "s|$HOME|~|" + end + if [ $num_items -eq 1 ] + set last_item '' + else + set last_item '-'(expr $num_items - 1) + end + echo -en $budspencer_cursors[1] + set input_length (expr length (expr $num_items - 1)) + read -p 'echo -n (set_color -b $budspencer_colors[2] $budspencer_colors[10])" ⌘ Goto [0"$last_item"] "(set_color -b normal $budspencer_colors[2])" "(set_color $budspencer_colors[10])' -n $input_length -l dir_num + switch $dir_num + case (seq 0 (expr $num_items - 1)) + cd $bookmarks[(expr $num_items - $dir_num)] + return 0 + end + return 1 +end - if begin - test -n $dir_num - and contains $dir_num (seq 0 (math $num_items-1)) - end - cd $bookmarks[(math $num_items-$dir_num)] - end +############# +# => Sessions +############# +function __budspencer_delete_zombi_sessions -d 'Delete zombi sessions' + for i in $budspencer_sessions_active_pid + if not contains $i %fish + set -l item (contains -i $i $budspencer_sessions_active_pid) + set -e budspencer_sessions_active_pid[$item] + set -e budspencer_sessions_active[$item] + end + end +end + +function __budspencer_create_new_session -d 'Create a new session' + set -U budspencer_session_cmd_hist_$argv[1] $$cmd_hist + set -U budspencer_session_dir_hist_$argv[1] $$dir_hist + set -U budspencer_sessions $argv[1] $budspencer_sessions +end + +function __budspencer_erase_session -d 'Erase current session' + if [ (count $argv) -eq 1 ] + set_color $fish_color_error[1] + echo 'Missing argument: name of session to erase' + return + end + if contains $argv[2] $budspencer_sessions_active + set_color $fish_color_error[1] + echo "Session '$argv[2]' cannot be erased because it's currently active." + return + end + if contains $argv[2] $budspencer_sessions + set -e budspencer_session_cmd_hist_$argv[2] + set -e budspencer_session_dir_hist_$argv[2] + set -e budspencer_sessions[(contains -i $argv[2] $budspencer_sessions)] + else + set_color $fish_color_error[1] + echo "Session '$argv[2]' not found. "(set_color normal)'Enter '(set_color $fish_color_command[1])'s '(set_color normal)'to show a list of all recorded sessions.' + end +end + +function __budspencer_detach_session -d 'Detach current session' + set cmd_hist cmd_hist_nosession + set dir_hist dir_hist_nosession + if [ -z $$dir_hist ] ^ /dev/null + set $dir_hist $PWD + end + set dir_hist_val (count $$dir_hist) + set -e budspencer_sessions_active_pid[$argv] ^ /dev/null + set -e budspencer_sessions_active[$argv] ^ /dev/null + set budspencer_session_current '' + cd $$dir_hist[1][$dir_hist_val] +end + +function __budspencer_attach_session -d 'Attach session' + set argv (echo -sn $argv\n | sed 's|[^[:alnum:]]|_|g') + if contains $argv[1] $budspencer_sessions_active + wmctrl -a "✻ $argv[1]" + else + wt "✻ $argv[1]" + __budspencer_detach_session $argv[-1] + set budspencer_sessions_active $budspencer_sessions_active $argv[1] + set budspencer_sessions_active_pid $budspencer_sessions_active_pid %self + set budspencer_session_current $argv[1] + if not contains $argv[1] $budspencer_sessions + __budspencer_create_new_session $argv[1] + end + set cmd_hist budspencer_session_cmd_hist_$argv[1] + set dir_hist budspencer_session_dir_hist_$argv[1] + if [ -z $$dir_hist ] ^ /dev/null + set $dir_hist $PWD + end + set dir_hist_val (count $$dir_hist) + cd $$dir_hist[1][$dir_hist_val] ^ /dev/null + end +end + +function s -d 'Create, delete or attach session' + __budspencer_delete_zombi_sessions + if [ (count $argv) -eq 0 ] + set -l active_indicator + set -l num_items (count $budspencer_sessions) + if [ $num_items -eq 0 ] + set_color $fish_color_error[1] + echo -n 'Session list is empty. ' + set_color normal + echo -n 'Enter ' + set_color $fish_color_command[1] + echo -n 's ' + set_color $fish_color_param[1] + echo -n 'session-name' + set_color normal + echo ' to record the current session.' + return + end + for i in (seq $num_items) + if [ $budspencer_sessions[$i] = $budspencer_session_current ] + set_color $budspencer_colors[8] + else + if [ (expr \( $num_items - $i \) \% 2) -eq 0 ] + set_color normal + else + set_color $budspencer_colors[4] + end + end + if contains $budspencer_sessions[$i] $budspencer_sessions_active + set active_indicator '✻ ' + else + set active_indicator ' ' + end + echo (expr $num_items - $i)\t$active_indicator$budspencer_sessions[$i] + end + if [ $num_items -eq 1 ] + set last_item '' + else + set last_item '-'(expr $num_items - 1) + end + echo -en $budspencer_cursors[3] + set input_length (expr length (expr $num_items - 1)) + read -p 'echo -n (set_color -b $budspencer_colors[2] $budspencer_colors[8])" ✻ Attach [e|0"$last_item"] "(set_color -b normal $budspencer_colors[2])" "(set_color $budspencer_colors[8])' -n $input_length -l session_num + switch $session_num + case (seq 0 (expr $num_items - 1)) + set argv[1] $budspencer_sessions[(expr $num_items - $session_num)] + case 'e' + read -p 'echo -n (set_color -b $budspencer_colors[2] $budspencer_colors[8])" ✻ Erase [0"$last_item"] "(set_color -b normal $budspencer_colors[2])" "(set_color $budspencer_colors[8])' -n $input_length -l session_num + __budspencer_erase_session -e $budspencer_sessions[(expr $num_items - $session_num)] + return 0 + case '*' + return 1 + end + end + set -l item (contains -i %self $budspencer_sessions_active_pid ^ /dev/null) + switch $argv[1] + case '-e' + __budspencer_erase_session $argv + case '-d' + wt 'fish' + __budspencer_detach_session $item + case '-*' + set_color $fish_color_error[1] + echo "Invalid argument: $argv[1]" + case '*' + __budspencer_attach_session $argv $item end end ##################################### # => Commandline editing with $EDITOR ##################################### -function edit-commandline -d "Opens current commandline with your $EDITOR" - commandline > $budspencer_tmpfile - eval $EDITOR $budspencer_tmpfile - if test -s $budspencer_tmpfile - set hist_lock "true" - commandline (sed 's|^\s*||' $budspencer_tmpfile) - else - set hist_lock "true" - commandline "" - end - rm $budspencer_tmpfile +function __budspencer_edit_comandline -d 'Open current commandline with your editor' + commandline > $budspencer_tmpfile + eval $EDITOR $budspencer_tmpfile + if [ -s $budspencer_tmpfile ] + commandline (sed 's|^\s*||' $budspencer_tmpfile) + else + commandline '' + end + rm $budspencer_tmpfile end ################ # => Git segment ################ -function __budspencer_prompt_git_branch -d "Return the current branch name" - set -l branch (command git symbolic-ref HEAD ^ /dev/null | sed -e 's|^refs/heads/||') - if test (count $branch) -eq 0 - set -l position (command git describe --contains --all HEAD ^ /dev/null) - if test (count $position) -eq 0 - set -l commit (command git rev-parse HEAD ^ /dev/null | sed 's|\(^.......\).*|\1|') - echo -n (set_color -b $budspencer_colors[11])""(set_color $budspencer_colors[1])" ➦ "$commit" "(set_color $budspencer_colors[11]) - else - echo -n (set_color -b $budspencer_colors[9])""(set_color $budspencer_colors[1])"  "$position" "(set_color $budspencer_colors[9]) - end - else - echo -n (set_color -b $budspencer_colors[3])""(set_color $budspencer_colors[1])"  "$branch" "(set_color $budspencer_colors[3]) - end +function __budspencer_prompt_git_branch -d 'Return the current branch name' + set -l branch (command git symbolic-ref HEAD ^ /dev/null | sed -e 's|^refs/heads/||') + if not test $branch > /dev/null + set -l position (command git describe --contains --all HEAD ^ /dev/null) + if not test $position > /dev/null + set -l commit (command git rev-parse HEAD ^ /dev/null | sed 's|\(^.......\).*|\1|') + echo -n (set_color -b $budspencer_colors[11])''(set_color $budspencer_colors[1])' ➦ '$commit' '(set_color $budspencer_colors[11]) + else + echo -n (set_color -b $budspencer_colors[9])''(set_color $budspencer_colors[1])'  '$position' '(set_color $budspencer_colors[9]) + end + else + echo -n (set_color -b $budspencer_colors[3])''(set_color $budspencer_colors[1])'  '$branch' '(set_color $budspencer_colors[3]) + end end ###################### # => Bind-mode segment ###################### -function __budspencer_prompt_bindmode -d "Displays the current mode" - switch $fish_bind_mode - case default - set_color -b $budspencer_colors[10] $budspencer_colors[1] - echo -en $budspencer_cursors[1] - if test "$fish_key_bindings" = "fish_vi_key_bindings" -o "$fish_key_bindings" = "fish_user_key_bindings" - echo -n " NORMAL " - else - echo -n " EMACS " - end - set_color -b $budspencer_colors[1] $budspencer_colors[10] - case insert - set_color -b $budspencer_colors[5] $budspencer_colors[1] - echo -en $budspencer_cursors[2] - echo -n " INSERT " - set_color -b $budspencer_colors[1] $budspencer_colors[5] - if test $hist_lock = "true" - set hist_lock "false" - create_dir_hist - end - case visual - set_color -b $budspencer_colors[8] $budspencer_colors[1] - echo -en $budspencer_cursors[3] - echo -n " VISUAL " - set_color -b $budspencer_colors[1] $budspencer_colors[8] - end +function __budspencer_prompt_bindmode -d 'Displays the current mode' + switch $fish_bind_mode + case default + set budspencer_current_bindmode_color $budspencer_colors[10] + echo -en $budspencer_cursors[1] + case insert + set budspencer_current_bindmode_color $budspencer_colors[5] + echo -en $budspencer_cursors[2] + if [ $pwd_hist_lock = true ] + set pwd_hist_lock false + __budspencer_create_dir_hist + end + case visual + set budspencer_current_bindmode_color $budspencer_colors[8] + echo -en $budspencer_cursors[3] + end + if [ (count $budspencer_prompt_error) -eq 1 ] + set budspencer_current_bindmode_color $budspencer_colors[7] + end + set_color -b $budspencer_current_bindmode_color $budspencer_colors[1] + echo -n " $pcount " + set_color -b $budspencer_colors[1] $budspencer_current_bindmode_color end #################### # => Symbols segment #################### -function __budspencer_prompt_left_symbols -d "Display symbols" - set_color -b $budspencer_colors[2] - echo -n "" +function __budspencer_prompt_left_symbols -d 'Display symbols' + set -l jobs (jobs | wc -l) + if [ -e ~/.taskrc ] + set todo (task due.before:tomorrow ^ /dev/null | tail -1 | cut -f1 -d' ') + end + if [ -e ~/.reminders ] + set appointments (rem -a | cut -f1 -d' ') + end + if [ (count $todo) -eq 0 ] + set todo 0 + end + if [ (count $appointments) -eq 0 ] + set appointments 0 + end + set_color -b $budspencer_colors[2] + echo -n '' - # Bookmark indicator - if contains $PWD $bookmarks - if test $symbols_style = "symbols" - set_color -o $budspencer_colors[10] - echo -n " ⌘" - else - set_color $budspencer_colors[10] - echo -n " "(math (count $bookmarks)-(contains -i $PWD $bookmarks)) - end - end - - # Indicator for vim parent process - if set -q -x VIM - set_color -o $budspencer_colors[9] - echo -n " V" - end - - # Indicator for ranger parent process - if set -q -x RANGER_LEVEL - set_color -o $budspencer_colors[9] - echo -n " R" - end - - # Background job indicator - set jobs (jobs | wc -l) - if [ $jobs -gt 0 ] - if test $symbols_style = "symbols" - set_color -o $budspencer_colors[11] - echo -n " ⚙" - else - set_color normal - set_color -b $budspencer_colors[2] $budspencer_colors[11] - echo -n " "$jobs - end - end - - # Write protection indicator - if [ ! -w . ] - set_color -o $budspencer_colors[6] - echo -n " " - end - - # Status indicator - if [ $last_status -eq 0 ] - if test $symbols_style = "symbols" - set_color -o $budspencer_colors[12] - echo -n " ✔" - else - set_color normal - set_color -b $budspencer_colors[2] $budspencer_colors[12] - echo -n " "$last_status - end - else - if test $symbols_style = "symbols" - set_color -o $budspencer_colors[7] - echo -n " ✘" - else - set_color normal - set_color -b $budspencer_colors[2] $budspencer_colors[7] - echo -n " "$last_status - end - end - - # Superuser indicator - if [ $USER = "root" ] - set_color -o $budspencer_colors[6] - echo -n " ⚡" - end - echo -n " " - set_color -b normal $budspencer_colors[2] + if [ $symbols_style = 'symbols' ] + if [ $budspencer_session_current != '' ] + set_color -o $budspencer_colors[8] + echo -n ' ✻' + end + if contains $PWD $bookmarks + set_color -o $budspencer_colors[10] + echo -n ' ⌘' + end + if set -q -x VIM + set_color -o $budspencer_colors[9] + echo -n ' V' + end + if set -q -x RANGER_LEVEL + set_color -o $budspencer_colors[9] + echo -n ' R' + end + if [ $jobs -gt 0 ] + set_color -o $budspencer_colors[11] + echo -n ' ⚙' + end + if [ ! -w . ] + set_color -o $budspencer_colors[6] + echo -n ' ' + end + if [ $todo -gt 0 ] + set_color -o $budspencer_colors[4] + echo -n ' ⚔' + end + if [ $appointments -gt 0 ] + set_color -o $budspencer_colors[5] + echo -n ' ⚑' + end + if [ $last_status -eq 0 ] + set_color -o $budspencer_colors[12] + echo -n ' ✔' + else + set_color -o $budspencer_colors[7] + echo -n ' ✘' + end + if [ $USER = 'root' ] + set_color -o $budspencer_colors[6] + echo -n ' ⚡' + end + else + if [ $budspencer_session_current != '' ] ^ /dev/null + set_color $budspencer_colors[8] + echo -n ' '(expr (count $budspencer_sessions) - (contains -i $budspencer_session_current $budspencer_sessions)) + end + if contains $PWD $bookmarks + set_color $budspencer_colors[10] + echo -n ' '(expr (count $bookmarks) - (contains -i $PWD $bookmarks)) + end + if set -q -x VIM + set_color -o $budspencer_colors[9] + echo -n ' V' + set_color normal + end + if set -q -x RANGER_LEVEL + set_color -b $budspencer_colors[2] $budspencer_colors[9] + echo -n ' '$RANGER_LEVEL + end + if [ $jobs -gt 0 ] + set_color -b $budspencer_colors[2] $budspencer_colors[11] + echo -n ' '$jobs + end + if [ ! -w . ] + set_color -o $budspencer_colors[6] + echo -n ' ' + set_color normal + end + if [ $todo -gt 0 ] + set_color -b $budspencer_colors[2] $budspencer_colors[4] + echo -n " $todo" + end + if [ $appointments -gt 0 ] + set_color -b $budspencer_colors[2] $budspencer_colors[5] + echo -n " $appointments" + end + if [ $last_status -eq 0 ] + set_color -b $budspencer_colors[2] $budspencer_colors[12] + echo -n ' '$last_status + else + set_color -b $budspencer_colors[2] $budspencer_colors[7] + echo -n ' '$last_status + end + if [ $USER = 'root' ] + set_color -o $budspencer_colors[6] + echo -n ' ⚡' + end + end + echo -n ' ' + set_color -b normal $budspencer_colors[2] end ############################################################################### @@ -407,10 +622,20 @@ end ############################################################################### # Initialize some global variables -set -g hist_lock false -set -g dir_hist -set -g cmd_hist +set -g budspencer_prompt_error +set -g budspencer_current_bindmode_color +set -U budspencer_sessions_active $budspencer_sessions_active +set -U budspencer_sessions_active_pid $budspencer_sessions_active_pid +set -g budspencer_session_current '' +set -g cmd_hist_nosession +set -g cmd_hist cmd_hist_nosession set -g CMD_DURATION 0 +set -g dir_hist_nosession +set -g dir_hist dir_hist_nosession +set -g pwd_hist_lock false +set -g pcount 1 +set -g prompt_hist +set -g symbols_style 'symbols' # Load user defined key bindings if functions --query fish_user_key_bindings @@ -423,21 +648,26 @@ if not set -q EDITOR end # Source config file -if test -e $budspencer_config - source $budspencer_config +if [ -e $budspencer_config ] + source $budspencer_config +end + +# Don't save in command history +if not set -q budspencer_nocmdhist + set -U budspencer_nocmdhist 'c' 'd' 'll' 'ls' 'm' 's' end # Set PWD segment style -if set -q $PWDSTYLE - set -g PWDSTYLE short long none +if not set -q budspencer_pwdstyle + set -U budspencer_pwdstyle short long none end -set pwd_style $PWDSTYLE[1] +set pwd_style $budspencer_pwdstyle[1] # Cd to newest bookmark if this is a login shell if not begin - set -q -x LOGIN - or set -q -x RANGER_LEVEL - or set -q -x VIM + set -q -x LOGIN + or set -q -x RANGER_LEVEL + or set -q -x VIM end ^ /dev/null cd $bookmarks[1] end @@ -447,27 +677,7 @@ set -x LOGIN $USER # => Left prompt ############################################################################### -function fish_prompt -d "Write out the left prompt of the budspencer theme" - set -g last_status $status - - ############# - # => Segments - ############# - - # Vi mode - set -l ps_vi "" - set ps_vi (__budspencer_prompt_bindmode) - - # Git - set -l ps_git "" - set -l git_branch_name (__budspencer_prompt_git_branch) - if test -n "$git_branch_name" - set ps_git $git_branch_name - end - - # Symbols - set -l ps_symbols (__budspencer_prompt_left_symbols) - - # Left prompt - echo -n -s $ps_vi $ps_git $ps_symbols '' ' ' +function fish_prompt -d 'Write out the left prompt of the budspencer theme' + set -g last_status $status + echo -n -s (__budspencer_prompt_bindmode) (__budspencer_prompt_git_branch) (__budspencer_prompt_left_symbols) '' ' ' end diff --git a/themes/budspencer/fish_right_prompt.fish b/themes/budspencer/fish_right_prompt.fish index 5456125..93a975e 100644 --- a/themes/budspencer/fish_right_prompt.fish +++ b/themes/budspencer/fish_right_prompt.fish @@ -16,7 +16,6 @@ # -> Git segment # -> PWD segment # -> Prompt -# -> Segments # ############################################################################### @@ -27,231 +26,213 @@ ##################### # => Toggle functions ##################### -set symbols_style "symbols" -function fish_symbols_toggle_cm -d "Toggles style of symbols, press # in NORMAL or VISUAL mode" - if test $symbols_style = "symbols" - set symbols_style "numbers" - else - set symbols_style "symbols" - end - set hist_lock "true" - commandline -f repaint +function __budspencer_toggle_symbols -d 'Toggles style of symbols, press # in NORMAL or VISUAL mode' + if [ $symbols_style = 'symbols' ] + set symbols_style 'numbers' + else + set symbols_style 'symbols' + end + set pwd_hist_lock true + commandline -f repaint end -function fish_pwd_toggle_cm -d "Toggles style of pwd segment, press space bar in NORMAL or VISUAL mode" - for i in (seq (count $PWDSTYLE)) - if test $PWDSTYLE[$i] = $pwd_style - set pwd_style $PWDSTYLE[(math $i%(count $PWDSTYLE)+1)] - set hist_lock "true" - commandline -f repaint - break - end - end +function __budspencer_toggle_pwd -d 'Toggles style of pwd segment, press space bar in NORMAL or VISUAL mode' + for i in (seq (count $budspencer_pwdstyle)) + if [ $budspencer_pwdstyle[$i] = $pwd_style ] + set pwd_style $budspencer_pwdstyle[(expr $i \% (count $budspencer_pwdstyle) + 1)] + set pwd_hist_lock true + commandline -f repaint + break + end + end end ############################# # => Command duration segment ############################# -function fish_cmd_duration_cm -d "Displays the elapsed time of last command" - set -l seconds "" - set -l minutes "" - set -l hours "" - set -l days "" - set -l cmd_duration (math $CMD_DURATION/1000) - if test $cmd_duration -gt 0 - set seconds (math $cmd_duration%68400%3600%60)"s" - if test $cmd_duration -ge 60 - set minutes (math $cmd_duration%68400%3600/60)"m" - if test $cmd_duration -ge 3600 - set hours (math $cmd_duration%68400/3600)"h" - if test $cmd_duration -ge 68400 - set days (math $cmd_duration/68400)"d" - end - end - end - if test $last_status -ne 0 - echo -n (set_color $budspencer_colors[2])""(set_color -b $budspencer_colors[2] $budspencer_colors[7])" "$days$hours$minutes$seconds - else - echo -n (set_color $budspencer_colors[2])""(set_color -b $budspencer_colors[2] $budspencer_colors[12])" "$days$hours$minutes$seconds - end - end +function __budspencer_cmd_duration -d 'Displays the elapsed time of last command' + set -l seconds '' + set -l minutes '' + set -l hours '' + set -l days '' + set -l cmd_duration (expr $CMD_DURATION / 1000) + if [ $cmd_duration -gt 0 ] + set seconds (expr $cmd_duration \% 68400 \% 3600 \% 60)'s' + if [ $cmd_duration -ge 60 ] + set minutes (expr $cmd_duration \% 68400 \% 3600 / 60)'m' + if [ $cmd_duration -ge 3600 ] + set hours (expr $cmd_duration \% 68400 / 3600)'h' + if [ $cmd_duration -ge 68400 ] + set days (expr $cmd_duration / 68400)'d' + end + end + end + if [ $last_status -ne 0 ] + echo -n (set_color $budspencer_colors[2])''(set_color -b $budspencer_colors[2] $budspencer_colors[7])' '$days$hours$minutes$seconds + else + echo -n (set_color $budspencer_colors[2])''(set_color -b $budspencer_colors[2] $budspencer_colors[12])' '$days$hours$minutes$seconds + end + end end ################ # => Git segment ################ -function __budspencer_is_git_ahead_or_behind -d "Check if there are unpulled or unpushed commits" - command git rev-list --count --left-right "HEAD...@{upstream}" ^ /dev/null | sed 's|\s\+|\n|g' +function __budspencer_is_git_ahead_or_behind -d 'Check if there are unpulled or unpushed commits' + command git rev-list --count --left-right 'HEAD...@{upstream}' ^ /dev/null | sed 's|\s\+|\n|g' end -function __budspencer_git_status -d "Check git status" - set -l git_status (command git status --porcelain ^/dev/null | cut -c 1-2) - set -l added (echo -sn $git_status\n | egrep -c "[ACDMT][ MT]|[ACMT]D") - set -l deleted (echo -sn $git_status\n | egrep -c "[ ACMRT]D") - set -l modified (echo -sn $git_status\n | egrep -c ".[MT]") - set -l renamed (echo -sn $git_status\n | egrep -c "R.") - set -l unmerged (echo -sn $git_status\n | egrep -c "AA|DD|U.|.U") - set -l untracked (echo -sn $git_status\n | egrep -c "\?\?") - echo -n $added\n$deleted\n$modified\n$renamed\n$unmerged\n$untracked +function __budspencer_git_status -d 'Check git status' + set -l git_status (command git status --porcelain ^/dev/null | cut -c 1-2) + set -l added (echo -sn $git_status\n | egrep -c "[ACDMT][ MT]|[ACMT]D") + set -l deleted (echo -sn $git_status\n | egrep -c "[ ACMRT]D") + set -l modified (echo -sn $git_status\n | egrep -c ".[MT]") + set -l renamed (echo -sn $git_status\n | egrep -c "R.") + set -l unmerged (echo -sn $git_status\n | egrep -c "AA|DD|U.|.U") + set -l untracked (echo -sn $git_status\n | egrep -c "\?\?") + echo -n $added\n$deleted\n$modified\n$renamed\n$unmerged\n$untracked end -function __budspencer_is_git_stashed -d "Check if there are stashed commits" - command git stash list ^ /dev/null | wc -l +function __budspencer_is_git_stashed -d 'Check if there are stashed commits' + command git stash list ^ /dev/null | wc -l end -function __budspencer_prompt_git_symbols -d "Displays the git symbols" - set -l git_prompt "" - set -l is_repo (command git rev-parse --is-inside-work-tree ^/dev/null) - if test $is_repo="true" +function __budspencer_prompt_git_symbols -d 'Displays the git symbols' + set -l is_repo (command git rev-parse --is-inside-work-tree ^/dev/null) + set -l git_ahead_behind (__budspencer_is_git_ahead_or_behind) + set -l git_status (__budspencer_git_status) + set -l git_stashed (__budspencer_is_git_stashed) - set -l git_ahead_behind (__budspencer_is_git_ahead_or_behind) - if test (count $git_ahead_behind) -eq 2 - if test $git_ahead_behind[1] -gt 0 - if test $symbols_style = "symbols" - set git_prompt (set_color -o $budspencer_colors[5])" ↑" - else - set git_prompt (set_color $budspencer_colors[5])" "$git_ahead_behind[1] - end - end - - if test $git_ahead_behind[2] -gt 0 - if test $symbols_style = "symbols" - set git_prompt $git_prompt(set_color -o $budspencer_colors[5])" ↓" - else - set git_prompt $git_prompt(set_color $budspencer_colors[5])" "$git_ahead_behind[2] - end - end - end - - set -l git_status (__budspencer_git_status) - if test $git_status[1] -gt 0 - if test $symbols_style = "symbols" - set git_prompt $git_prompt(set_color -o $budspencer_colors[12])" +" - else - set git_prompt $git_prompt(set_color $budspencer_colors[12])" "$git_status[1] - end - end - - if test $git_status[2] -gt 0 - if test $symbols_style = "symbols" - set git_prompt $git_prompt(set_color -o $budspencer_colors[7])" –" - else - set git_prompt $git_prompt(set_color $budspencer_colors[7])" "$git_status[2] - end - end - - if test $git_status[3] -gt 0 - if test $symbols_style = "symbols" - set git_prompt $git_prompt(set_color -o $budspencer_colors[10])" ✱" - else - set git_prompt $git_prompt(set_color $budspencer_colors[10])" "$git_status[3] - end - end - - if test $git_status[4] -gt 0 - if test $symbols_style = "symbols" - set git_prompt $git_prompt(set_color -o $budspencer_colors[8])" →" - else - set git_prompt $git_prompt(set_color $budspencer_colors[8])" "$git_status[4] - end - end - - if test $git_status[5] -gt 0 - if test $symbols_style = "symbols" - set git_prompt $git_prompt(set_color -o $budspencer_colors[9])" ═" - else - set git_prompt $git_prompt(set_color $budspencer_colors[9])" "$git_status[5] - end - end - - if test $git_status[6] -gt 0 - if test $symbols_style = "symbols" - set git_prompt $git_prompt(set_color -o $budspencer_colors[4])" ●" - else - set git_prompt $git_prompt(set_color $budspencer_colors[4])" "$git_status[6] - end - end - - set -l git_stashed (__budspencer_is_git_stashed) - if test $git_stashed -gt 0 - if test $symbols_style = "symbols" - set git_prompt $git_prompt(set_color -o $budspencer_colors[11])" ✭" - else - set git_prompt $git_prompt(set_color $budspencer_colors[11])" "$git_stashed - end - end - echo -n $git_prompt - - end + if begin + [ $is_repo=true ] + [ (expr $git_status[1] + $git_status[2] + $git_status[3] + $git_status[4] + $git_status[5] + $git_status[6]) -ne 0 ] + end + set_color $budspencer_colors[3] + echo -n '' + set_color -b $budspencer_colors[3] + if [ $symbols_style = 'symbols' ] + if [ (count $git_ahead_behind) -eq 2 ] + if [ $git_ahead_behind[1] -gt 0 ] + set_color -o $budspencer_colors[5] + echo -n ' ↑' + end + if [ $git_ahead_behind[2] -gt 0 ] + set_color -o $budspencer_colors[5] + echo -n ' ↓' + end + end + if [ $git_status[1] -gt 0 ] + set_color -o $budspencer_colors[12] + echo -n ' +' + end + if [ $git_status[2] -gt 0 ] + set_color -o $budspencer_colors[7] + echo -n ' –' + end + if [ $git_status[3] -gt 0 ] + set_color -o $budspencer_colors[10] + echo -n ' ✱' + end + if [ $git_status[4] -gt 0 ] + set_color -o $budspencer_colors[8] + echo -n ' →' + end + if [ $git_status[5] -gt 0 ] + set_color -o $budspencer_colors[9] + echo -n ' ═' + end + if [ $git_status[6] -gt 0 ] + set_color -o $budspencer_colors[4] + echo -n ' ●' + end + if [ $git_stashed -gt 0 ] + set_color -o $budspencer_colors[11] + echo -n ' ✭' + end + else + if [ (count $git_ahead_behind) -eq 2 ] + if [ $git_ahead_behind[1] -gt 0 ] + set_color $budspencer_colors[5] + echo -n ' '$git_ahead_behind[1] + end + if [ $git_ahead_behind[2] -gt 0 ] + set_color $budspencer_colors[5] + echo -n ' '$git_ahead_behind[2] + end + end + if [ $git_status[1] -gt 0 ] + set_color $budspencer_colors[12] + echo -n ' '$git_status[1] + end + if [ $git_status[2] -gt 0 ] + set_color $budspencer_colors[7] + echo -n ' '$git_status[2] + end + if [ $git_status[3] -gt 0 ] + set_color $budspencer_colors[10] + echo -n ' '$git_status[3] + end + if [ $git_status[4] -gt 0 ] + set_color $budspencer_colors[8] + echo -n ' '$git_status[4] + end + if [ $git_status[5] -gt 0 ] + set_color $budspencer_colors[9] + echo -n ' '$git_status[5] + end + if [ $git_status[6] -gt 0 ] + set_color $budspencer_colors[4] + echo -n ' '$git_status[6] + end + if [ $git_stashed -gt 0 ] + set_color $budspencer_colors[11] + echo -n ' '$git_stashed + end + end + set_color -b $budspencer_colors[3] normal + end end ################ # => PWD segment ################ -function __budspencer_prompt_pwd -d "Displays the present working directory" - set -l user_host " " - if test (count $SSH_CLIENT) -gt 0 - if test $symbols_style = "symbols" - switch $pwd_style - case short - set user_host " "$USER"@"(hostname -s)":" - case long - set user_host " "$USER"@"(hostname -f)":" - end +function __budspencer_prompt_pwd -d 'Displays the present working directory' + set -l user_host ' ' + if set -q SSH_CLIENT + if [ $symbols_style = 'symbols' ] + switch $pwd_style + case short + set user_host " $USER@"(hostname -s)':' + case long + set user_host " $USER@"(hostname -f)':' + end else - set user_host " "$USER"@"(hostname -i)":" - end - end - switch $fish_bind_mode - case default - set_color $budspencer_colors[10] - echo -n "" - set_color normal - set_color -b $budspencer_colors[10] $budspencer_colors[1] - case insert - set_color $budspencer_colors[5] - echo -n "" - set_color normal - set_color -b $budspencer_colors[5] $budspencer_colors[1] - case visual - set_color $budspencer_colors[8] - echo -n "" - set_color normal - set_color -b $budspencer_colors[8] $budspencer_colors[1] - end - switch $pwd_style - case short - echo -n $user_host(prompt_pwd)' ' - case long - echo -n $user_host$PWD' ' - end - set_color normal + set user_host " $USER@"(hostname -i)':' + end + end + set_color $budspencer_current_bindmode_color + echo -n '' + set_color normal + set_color -b $budspencer_current_bindmode_color $budspencer_colors[1] + if [ (count $budspencer_prompt_error) != 1 ] + switch $pwd_style + case short + echo -n $user_host(prompt_pwd)' ' + case long + echo -n $user_host$PWD' ' + end + else + echo -n " $budspencer_prompt_error " + set -e budspencer_prompt_error[1] + end + set_color normal end ############################################################################### # => Prompt ############################################################################### -function fish_right_prompt -d "Write out the right prompt of the budspencer theme" - - ############# - # => Segments - ############# - - # Command duration - set ps_duration (fish_cmd_duration_cm) - - # Git - set ps_git (__budspencer_prompt_git_symbols) - if test -n "$ps_git" - set ps_git (set_color $budspencer_colors[3])""(set_color -b $budspencer_colors[3])""$ps_git(set_color -b $budspencer_colors[3] normal) - end - - # Pwd - set -l ps_pwd "" - set ps_pwd (__budspencer_prompt_pwd) - - # Right prompt - echo -n $ps_duration $ps_git $ps_pwd - set_color normal +function fish_right_prompt -d 'Write out the right prompt of the budspencer theme' + echo -n (__budspencer_cmd_duration) (__budspencer_prompt_git_symbols) (__budspencer_prompt_pwd) + set_color normal end