[split] Move budspencer theme to oh-my-fish/theme-budspencer

https://github.com/oh-my-fish/theme-budspencer
pull/2/head
Justin Hileman 9 years ago
parent ad1561aed6
commit 8cba2bd750

@ -1,235 +0,0 @@
# Budspencer theme
A theme for the 70s, makes fish even more powerful. It's equipped with a hell
of a lot of nice functions and key bindings to speed up your workflow.
The philosophy behind budspencer theme:
* Delimit the prompt lines clearly to the output.
* Produce output only if it contains relevant information.
* Show useful notifications within the prompt.
* Equip the prompt with toggle commands in order to change its style
interactively.
* Store sessions in order to make frequently used commands quickly accessible.
* Make navigation within the directory tree as easy as possible using
bookmarks and a directory history without duplicates.
* Make histories quickly accessible with menus.
* Don't stress your eyes. Use different colors in dark and bright environments.
## 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].
It's also crucial to have vi mode enabled. Thus, execute
```
set -U fish_key_bindings fish_vi_key_bindings
```
before enabling the theme.
### 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
- Prompt line number
- Git repository information
- Status symbols
* ✻: 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 for this week, can be toggled with `#` to
show the amount of weekly 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
## 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 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.
![pwd style][pwdstyle]
- 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)
Note, the format is _username@hostname:pathname_. Thus, you can cut
the whole string with your mouse and paste it into `ssh` commands.
## Quickly navigate in history of working directories
The function `d` drops down a menu showing 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.
![dir menu][dirmenu]
The following shortcuts need vi-mode:
- Press `H` in NORMAL mode to change present working directory to previous
working directory in history.
- Press `L` in NORMAL mode to change present working directory to next working
directory in history.
## Quickly navigate in command history
The function `c` drops down a menu showing the command history as enumerated list similarly to
the `d` function. Selections are also pasted 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 universal and thus persistant.
A new shell automatically changes working directory on startup to newest bookmark.
`m` is a function that drops down a menu showing the bookmarks as enumerated list
equivalently to `d`.
The following shortcuts need vi mode:
- Create a bookmark for present working directory with `m` in NORMAL mode.
- Remove a bookmark for present working directory with `M` in NORMAL mode.
## Edit commandline with your favorite editor
The function `edit-commandline` let you edit the commandline with your editor.
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.
## Sessions
Shell session can be stored with `s <session name>`. 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 <session name>`.
Type `s -d` to detach current session.
## Set window title
Just type `wt <title>`.
## TODO
- vi REPLACE mode, as soon as REPLACE mode is implemented within fish
## Feedback
Give me feedback if you ...
* ... have ideas how I could improve budspencer.
* ... have problems with budspencer.
* ... have questions concerning budspencer.
[font]: https://github.com/Lokaltog/powerline-fonts
[ranger]: http://ranger.nongnu.org/
[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
[dirmenu]: https://raw.githubusercontent.com/tannhuber/media/master/budspencer_dir_menu.jpg
[pwdstyle]: https://raw.githubusercontent.com/tannhuber/media/master/budspencer_pwd_style.jpg

@ -1,102 +0,0 @@
###############################################################################
#
# prompt theme name:
# budspencer
#
# description:
# a sophisticated airline/powerline theme
#
# author:
# joseph tannhuber <sepp.tannhuber@yahoo.de>
#
# 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
###############################################################################
#########
# => Help
#########
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 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

@ -1,752 +0,0 @@
###############################################################################
#
# Prompt theme name:
# budspencer
#
# Description:
# a sophisticated airline/powerline theme
#
# Author:
# Joseph Tannhuber <sepp.tannhuber@yahoo.de>
#
# Sections:
# -> 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
#
###############################################################################
###############################################################################
# => Key bindings
###############################################################################
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_commandline
bind -M insert \n __budspencer_preexec
bind \n __budspencer_preexec
end
###############################################################################
# => Files
###############################################################################
# Config file
set -g budspencer_config "$HOME/.config/fish/budspencer_config.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
#####################
# => Fish termination
#####################
function __budspencer_on_termination -s HUP -s INT -s QUIT -s TERM --on-process %self -d 'Execute when shell terminates'
set -l item (contains -i %self $budspencer_sessions_active_pid ^ /dev/null)
__budspencer_detach_session $item
end
######################
# => Directory history
######################
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 __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 __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 -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)]
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)
tput cuu1
end
for i in (seq (expr $num_items + 1))
tput cuu1
end
tput ed
tput cuu1
set pcount (expr $pcount - 1)
set no_prompt_hist 'T'
end
####################
# => Command history
####################
function __budspencer_create_cmd_hist -e fish_prompt -d 'Create command history without duplicates'
if [ $_ = 'fish' ]
set -l IFS ''
set -l cmd (echo $history[1] | fish_indent | expand -t 4)
# Create prompt history
if begin
[ $pcount -gt 0 ]
and [ $no_prompt_hist = 'F' ]
end
set prompt_hist[$pcount] $cmd
else
set no_prompt_hist 'F'
end
set pcount (expr $pcount + 1)
# 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, 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
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
for i in (seq (count (echo $$cmd_hist\n)))
tput cuu1
end
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
for i in (seq (count (echo $$cmd_hist\n)))
tput cuu1
end
tput cuu1
set -e $cmd_hist[1][(expr $num_items - $cmd_num)] ^ /dev/null
end
tput ed
tput cuu1
set pcount (expr $pcount - 1)
set no_prompt_hist 'T'
end
##############
# => Bookmarks
##############
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)]
set pwd_hist_lock true
commandline -f repaint
end
end
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)]
end
for i in (seq (expr $num_items + 1))
tput cuu1
end
tput ed
tput cuu1
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]
set no_prompt_hist 'T'
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
set no_prompt_hist 'T'
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
set pcount (expr $pcount - 1)
switch $session_num
case (seq 0 (expr $num_items - 1))
set argv[1] $budspencer_sessions[(expr $num_items - $session_num)]
for i in (seq (expr $num_items + 1))
tput cuu1
end
tput ed
tput cuu1
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
if [ (expr $num_items - $session_num) -gt 0 ]
__budspencer_erase_session -e $budspencer_sessions[(expr $num_items - $session_num)]
end
for i in (seq (expr $num_items + 3))
tput cuu1
end
tput ed
return
case '*'
for i in (seq (expr $num_items + 1))
tput cuu1
end
tput ed
tput cuu1
return
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
tput cuu1
tput ed
set pcount (expr $pcount - 1)
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 __budspencer_edit_commandline -d 'Open current commandline with your editor'
commandline > $budspencer_tmpfile
eval $EDITOR $budspencer_tmpfile
set -l IFS ''
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 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 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 -l jobs (jobs | wc -l)
if [ -e ~/.taskrc ]
set todo (task due.before:sunday ^ /dev/null | tail -1 | cut -f1 -d' ')
set overdue (task due.before:today ^ /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 $overdue) -eq 0 ]
set overdue 0
end
if [ (count $appointments) -eq 0 ]
set appointments 0
end
set_color -b $budspencer_colors[2]
echo -n ''
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]
end
if [ $overdue -gt 0 ]
set_color -o $budspencer_colors[8]
end
if [ (expr $todo + $overdue) -gt 0 ]
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]
end
if [ $overdue -gt 0 ]
set_color -b $budspencer_colors[2] $budspencer_colors[8]
end
if [ (expr $todo + $overdue) -gt 0 ]
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
###############################################################################
# => Prompt initialization
###############################################################################
# Initialize some global variables
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 no_prompt_hist 'F'
set -g symbols_style 'symbols'
# Load user defined key bindings
if functions --query fish_user_key_bindings
fish_user_key_bindings
end
# Set favorite editor
if not set -q EDITOR
set -g EDITOR vi
end
# Source config file
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 not set -q budspencer_pwdstyle
set -U budspencer_pwdstyle short long none
end
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
end ^ /dev/null
cd $bookmarks[1]
end
set -x LOGIN $USER
###############################################################################
# => Left prompt
###############################################################################
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

@ -1,239 +0,0 @@
###############################################################################
#
# Prompt theme name:
# budspencer
#
# Description:
# a sophisticated airline/powerline theme
#
# Author:
# Joseph Tannhuber <sepp.tannhuber@yahoo.de>
#
# Sections:
# -> Functions
# -> Toggle functions
# -> Command duration segment
# -> Git segment
# -> PWD segment
# -> Prompt
#
###############################################################################
###############################################################################
# => Functions
###############################################################################
#####################
# => Toggle functions
#####################
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 __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 __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'
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
end
function __budspencer_is_git_stashed -d 'Check if there are stashed commits'
command git log --format="%gd" -g $argv 'refs/stash' -- ^ /dev/null | wc -l
end
function __budspencer_prompt_git_symbols -d 'Displays the git symbols'
set -l is_repo (command git rev-parse --is-inside-work-tree ^/dev/null)
if [ -z $is_repo ]
return
end
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)
if [ (expr $git_status[1] + $git_status[2] + $git_status[3] + $git_status[4] + $git_status[5] + $git_status[6] + $git_stashed) -ne 0 ]
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 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
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'
echo -n (__budspencer_cmd_duration) (__budspencer_prompt_git_symbols) (__budspencer_prompt_pwd)
set_color normal
end
Loading…
Cancel
Save