dotfiles

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit f56a0a0b72c2f25f02fd0801e4c9e0e73676aa7a
parent f95e873efad5c87bf7bfdba1a2278e13e7eb4da5
Author: bdmfegys@duck.com <bdmfegys@duck.com>
Date:   Fri, 10 May 2024 21:56:29 -0400

omf: add custom agnoster theme for omf

Diffstat:
Aomf/themes/agnoster/LICENSE | 21+++++++++++++++++++++
Aomf/themes/agnoster/README.md | 39+++++++++++++++++++++++++++++++++++++++
Aomf/themes/agnoster/functions/fish_mode_prompt.fish | 3+++
Aomf/themes/agnoster/functions/fish_prompt.fish | 392+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aomf/themes/agnoster/functions/fish_right_prompt.fish | 81+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 536 insertions(+), 0 deletions(-)

diff --git a/omf/themes/agnoster/LICENSE b/omf/themes/agnoster/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Bruno Ferreira Pinto + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/omf/themes/agnoster/README.md b/omf/themes/agnoster/README.md @@ -0,0 +1,39 @@ +## agnoster + +A fish theme optimized for people who use: + +* Solarized +* Git +* Mercurial (requires 'hg prompt') +* SVN +* Unicode-compatible fonts and terminals (Use a Powerline patched font, e.g., from here: https://github.com/powerline/fonts) +* Fish Vi-mode + +For Mac users, I highly recommend iTerm 2 + Solarized Dark + +![agnoster theme](https://f.cloud.github.com/assets/1765209/255379/452c668e-8c0b-11e2-8a8e-d1d13e57d15f.png) + + +#### Characteristics + +* If the previous command failed (✘) +- If private mode is enabled (🔒) +* User @ Hostname (if user is not DEFAULT_USER, which can be set in your profile) +* Git status +* Subversion status enabled by adding `set -g theme_svn_prompt_enabled yes` to your `config.fish`. +* Mercurial status enabled by adding `set -g theme_mercurial_prompt_enabled yes` to your `config.fish`. +* Branch () or detached head (➦) +* Current branch / SHA1 in detached head state + * Current branch name is shortened to 15 characters by default. Change it to `N` characters with `set -g fish_vcs_branch_name_length N` in your `config.fish`. +* Dirty working directory (±, color change) + * By default, git repos will show as dirty if there are untracked files. This can be changed by adding `set -g fish_git_prompt_untracked_files no` to your `config.fish`. This value is passed into `git status --untracked-files`, so any value git supports is valid for this command +* Current working directory +* Elevated (root) privileges (⚡) +* Current virtual environment (Python virtualenv and Nix Shell) +You will probably want to disable the default virtualenv prompt. Add to your [`init.fish`](https://github.com/oh-my-fish/oh-my-fish#dotfiles): +`set -gx VIRTUAL_ENV_DISABLE_PROMPT 1` +* Indicate vi mode. +* Source control blacklist. To disable source control prompts in certain directories, you can add the following to your `init.fish` or `config.fish`: `set -g scm_prompt_blacklist "/path/to/blacklist"`. +* The icons can be configured by setting variables. E.g. to replace the icon of failed command from the default "✘" use `set -g glyph_status_nonzero "💀"`. For configuration options see [`fish_prompt.fish`](https://github.com/oh-my-fish/theme-agnoster/blob/master/functions/fish_prompt.fish). + +Ported from https://gist.github.com/agnoster/3712874. diff --git a/omf/themes/agnoster/functions/fish_mode_prompt.fish b/omf/themes/agnoster/functions/fish_mode_prompt.fish @@ -0,0 +1,3 @@ +# Redefine fish_mode_prompt function as empty to hide fish-shell mode indicator +function fish_mode_prompt +end diff --git a/omf/themes/agnoster/functions/fish_prompt.fish b/omf/themes/agnoster/functions/fish_prompt.fish @@ -0,0 +1,392 @@ +# name: Agnoster +# agnoster's Theme - https://gist.github.com/3712874 +# A Powerline-inspired theme for FISH +# +# # README +# +# In order for this theme to render correctly, you will need a +# [Powerline-patched font](https://gist.github.com/1595572). + +## Set this options in your config.fish (if you want to :]) +# set -g theme_hide_hostname yes +set -g theme_display_user yes +set -g theme_hide_hostname no +# set -g default_user your_normal_user +# set -g theme_svn_prompt_enabled yes +# set -g theme_mercurial_prompt_enabled yes + + + +set -g current_bg NONE +set -g segment_separator \uE0B0 +set -g right_segment_separator \uE0B0 +set -q scm_prompt_blacklist; or set -g scm_prompt_blacklist +set -q max_package_count_visible_in_prompt; or set -g max_package_count_visible_in_prompt 10 +# We support trimming the version only in simple cases, such as "1.2.3". +set -q try_to_trim_nix_package_version; or set -g try_to_trim_nix_package_version yes + +# =========================== +# Color setting + +# You can set these variables in config.fish like: +# set -g color_dir_bg red +# If not set, default color from agnoster will be used. +# =========================== + +set -q color_virtual_env_bg; or set -g color_virtual_env_bg white +set -q color_virtual_env_str; or set -g color_virtual_env_str black + +set -q color_user_bg; or set -g color_user_bg 1d1d1d +set -q color_user_str; or set -g color_user_str white + +set -q color_dir_bg; or set -g color_dir_bg C5C8C6 +set -q color_dir_str; or set -g color_dir_str black + +set -q color_hg_changed_bg; or set -g color_hg_changed_bg yellow +set -q color_hg_changed_str; or set -g color_hg_changed_str black +set -q color_hg_bg; or set -g color_hg_bg green +set -q color_hg_str; or set -g color_hg_str black +set -q color_git_dirty_bg; or set -g color_git_dirty_bg yellow +set -q color_git_dirty_str; or set -g color_git_dirty_str black +set -q color_git_bg; or set -g color_git_bg green +set -q color_git_str; or set -g color_git_str black +set -q color_svn_bg; or set -g color_svn_bg green +set -q color_svn_str; or set -g color_svn_str black +set -q color_status_nonzero_bg; or set -g color_status_nonzero_bg black +set -q color_status_nonzero_str; or set -g color_status_nonzero_str red +set -q glyph_status_nonzero; or set -g glyph_status_nonzero "✘" +set -q color_status_superuser_bg; or set -g color_status_superuser_bg black +set -q color_status_superuser_str; or set -g color_status_superuser_str yellow +set -q glyph_status_superuser; or set -g glyph_status_superuser "🔒" +set -q color_status_jobs_bg; or set -g color_status_jobs_bg black +set -q color_status_jobs_str; or set -g color_status_jobs_str cyan +set -q glyph_status_jobs; or set -g glyph_status_jobs "⚡" +set -q color_status_private_bg; or set -g color_status_private_bg black +set -q color_status_private_str; or set -g color_status_private_str purple +set -q glyph_status_private; or set -g glyph_status_private "⚙" + +# =========================== +# General VCS settings + +set -q fish_vcs_branch_name_length; or set -g fish_vcs_branch_name_length 15 + +# =========================== +# Git settings +# set -g color_dir_bg red + +set -q fish_git_prompt_untracked_files; or set -g fish_git_prompt_untracked_files normal + +# =========================== +# Subversion settings + +set -q theme_svn_prompt_enabled; or set -g theme_svn_prompt_enabled no + +# =========================== +# Mercurial settings + +set -q theme_mercurial_prompt_enabled; or set -g theme_mercurial_prompt_enabled no + +# =========================== +# Helper methods +# =========================== + +set -g __fish_git_prompt_showdirtystate 'yes' +set -g __fish_git_prompt_char_dirtystate '±' +set -g __fish_git_prompt_char_cleanstate '' + +function shorten_branch_name -a branch_name + set new_branch_name $branch_name + + if test (string length $branch_name) -gt $fish_vcs_branch_name_length + # Round up length before dot (+0.5) + # Remove half the length of dots (-1) + # -> Total offset: -0.5 + set pre_dots_length (math -s0 $fish_vcs_branch_name_length / 2 - 0.5) + # Round down length after dot (-0.5) + # Remove half the length of dots (-1) + # -> Total offset: -1.5 + set post_dots_length (math -s0 $fish_vcs_branch_name_length / 2 - 1.5) + set new_branch_name (string replace -r "(.{$pre_dots_length}).*(.{$post_dots_length})" '$1..$2' $branch_name) + end + + echo $new_branch_name +end + +function parse_git_dirty + if [ $__fish_git_prompt_showdirtystate = "yes" ] + set -l submodule_syntax + set submodule_syntax "--ignore-submodules=dirty" + set untracked_syntax "--untracked-files=$fish_git_prompt_untracked_files" + set git_dirty (command git status --porcelain $submodule_syntax $untracked_syntax 2> /dev/null) + if [ -n "$git_dirty" ] + echo -n "$__fish_git_prompt_char_dirtystate" + else + echo -n "$__fish_git_prompt_char_cleanstate" + end + end +end + +function cwd_in_scm_blacklist + for entry in $scm_prompt_blacklist + pwd | grep "^$entry" - + end +end + +# =========================== +# Segments functions +# =========================== + +function prompt_segment -d "Function to draw a segment" + set -l bg + set -l fg + if [ -n "$argv[1]" ] + set bg $argv[1] + else + set bg normal + end + if [ -n "$argv[2]" ] + set fg $argv[2] + else + set fg normal + end + if [ "$current_bg" != 'NONE' -a "$argv[1]" != "$current_bg" ] + set_color -b $bg + set_color $current_bg + echo -n "$segment_separator " + set_color -b $bg + set_color $fg + else + set_color -b $bg + set_color $fg + echo -n " " + end + set current_bg $argv[1] + if [ -n "$argv[3]" ] + echo -n -s $argv[3] " " + end +end + +function prompt_finish -d "Close open segments" + if [ -n $current_bg ] + set_color normal + set_color $current_bg + echo -n "$segment_separator " + set_color normal + end + set -g current_bg NONE +end + + +# =========================== +# Theme components +# =========================== + +function prompt_virtual_env -d "Display Python or Nix virtual environment" + set envs + + if test "$CONDA_DEFAULT_ENV" + set envs $envs "conda[$CONDA_DEFAULT_ENV]" + end + + if test "$VIRTUAL_ENV" + set py_env (basename $VIRTUAL_ENV) + set envs $envs "py[$py_env]" + end + + # Support for `nix shell` command in nix 2.4+. Only the packages passed on the command line are + # available in PATH, so it is useful to print them all. + set nix_packages + for p in $PATH + set package_name_version (string match --regex '/nix/store/\w+-([^/]+)/.*' $p)[2] + if test "$package_name_version" + set package_name (string match --regex '^(.*)-(\d+(\.\d)+|unstable-20\d{2}-\d{2}-\d{2})' $package_name_version)[2] + if test "$try_to_trim_nix_package_version" = "yes" -a -n "$package_name" + set package $package_name + else + set package $package_name_version + end + if not contains $package $nix_packages + set nix_packages $nix_packages $package + end + end + end + if test (count $nix_packages) -gt $max_package_count_visible_in_prompt + set nix_packages $nix_packages[1..$max_package_count_visible_in_prompt] "..." + end + + if [ "$IN_NIX_SHELL" = "impure" ] + # Support for + # 1) `nix-shell` command + # 2) `nix develop` command in nix 2.4+. + # These commands are typically dumping too many packages into PATH for it be useful to print + # them. Thus we only print "nix[impure]". + set envs $envs "nix[impure]" + else if test "$nix_packages" + # Support for `nix-shell -p`. Would print "nix[foo bar baz]". + # We check for this case after checking for "impure" because impure brings too many packages + # into PATH. + set envs $envs "nix[$nix_packages]" + else if test "$IN_NIX_SHELL" + # Support for `nix-shell --pure`. Would print "nix[pure]". + # We check for this case after checking for individual packages because it otherwise might + # confuse the user into believing when they are in a pure shell, after they have invoked + # `nix shell` from within it. + set envs $envs "nix[$IN_NIX_SHELL]" + end + + if test "$envs" + prompt_segment $color_virtual_env_bg $color_virtual_env_str (string join " " $envs) + end +end + +function prompt_user -d "Display current user if different from $default_user" + if [ "$theme_display_user" = "yes" ] + if [ "$USER" != "$default_user" -o -n "$SSH_CLIENT" ] + set USER (whoami) + get_hostname + if [ $HOSTNAME_PROMPT ] + set USER_PROMPT $USER@$HOSTNAME_PROMPT + else + set USER_PROMPT $USER + end + prompt_segment $color_user_bg $color_user_str $USER_PROMPT + end + else + get_hostname + if [ $HOSTNAME_PROMPT ] + prompt_segment $color_user_bg $color_user_str $HOSTNAME_PROMPT + end + end +end + +function get_hostname -d "Set current hostname to prompt variable $HOSTNAME_PROMPT if connected via SSH" + set -g HOSTNAME_PROMPT "" + if [ "$theme_hide_hostname" = "no" -o \( "$theme_hide_hostname" != "yes" -a -n "$SSH_CLIENT" \) ] + set -g HOSTNAME_PROMPT (uname -n) + end +end + +function prompt_dir -d "Display the current directory" + prompt_segment $color_dir_bg $color_dir_str (prompt_pwd -D 100) +end + + +function prompt_hg -d "Display mercurial state" + not set -l root (fish_print_hg_root); and return + + set -l state + set -l branch (cat $root/branch 2>/dev/null; or echo default) + set -l bookmark (cat $root/bookmarks.current 2>/dev/null) + set state (hg_get_state) + set revision (command hg id -n) + set branch_symbol \uE0A0 + set prompt_text "$branch_symbol $branch$bookmark:$revision" + if [ "$state" = "0" ] + prompt_segment $color_hg_changed_bg $color_hg_changed_str $prompt_text " ±" + else + prompt_segment $color_hg_bg $color_hg_str $prompt_text + end +end + +function hg_get_state -d "Get mercurial working directory state" + if hg status | grep --quiet -e "^[A|M|R|!|?]" + echo 0 + else + echo 1 + end +end + + +function prompt_git -d "Display the current git state" + set -l ref + set -l dirty + if command git rev-parse --is-inside-work-tree >/dev/null 2>&1 + set dirty (parse_git_dirty) + set ref (command git symbolic-ref HEAD 2> /dev/null) + if [ $status -gt 0 ] + set -l branch (command git show-ref --head -s --abbrev |head -n1 2> /dev/null) + set ref "➦ $branch " + end + set branch_symbol \uE0A0 + set -l long_branch (echo $ref | sed "s#refs/heads/##") + set -l branch (shorten_branch_name $long_branch) + if [ "$dirty" != "" ] + prompt_segment $color_git_dirty_bg $color_git_dirty_str "$branch_symbol $branch $dirty" + else + prompt_segment $color_git_bg $color_git_str "$branch_symbol $branch $dirty" + end + end +end + + +function prompt_svn -d "Display the current svn state" + set -l ref + if command svn info >/dev/null 2>&1 + set long_branch (svn_get_branch) + set -l branch (shorten_branch_name $long_branch) + set branch_symbol \uE0A0 + set revision (svn_get_revision) + prompt_segment $color_svn_bg $color_svn_str "$branch_symbol $branch:$revision" + end +end + +function svn_get_branch -d "get the current branch name" + svn info 2> /dev/null | awk -F/ \ + '/^URL:/ { \ + for (i=0; i<=NF; i++) { \ + if ($i == "branches" || $i == "tags" ) { \ + print $(i+1); \ + break;\ + }; \ + if ($i == "trunk") { print $i; break; } \ + } \ + }' +end + +function svn_get_revision -d "get the current revision number" + svn info 2> /dev/null | sed -n 's/Revision:\ //p' +end + + +function prompt_status -d "the symbols for a non zero exit status, root and background jobs" + if [ $RETVAL -ne 0 ] + prompt_segment $color_status_nonzero_bg $color_status_nonzero_str $glyph_status_nonzero + end + + if [ "$fish_private_mode" ] + prompt_segment $color_status_private_bg $color_status_private_str $glyph_status_private + end + + # if superuser (uid == 0) + set -l uid (id -u $USER) + if [ $uid -eq 0 ] + prompt_segment $color_status_superuser_bg $color_status_superuser_str $glyph_status_superuser + end + + # Jobs display + if [ (jobs -l | wc -l) -gt 0 ] + prompt_segment $color_status_jobs_bg $color_status_jobs_str $glyph_status_jobs + end +end + +# =========================== +# Apply theme +# =========================== + +function fish_prompt + set -g RETVAL $status + prompt_status + prompt_user + prompt_dir + prompt_virtual_env + if [ (cwd_in_scm_blacklist | wc -c) -eq 0 ] + type -q git; and prompt_git + if [ "$theme_mercurial_prompt_enabled" = "yes" ] + prompt_hg + end + if [ "$theme_svn_prompt_enabled" = "yes" ] + prompt_svn + end + end + prompt_finish +end diff --git a/omf/themes/agnoster/functions/fish_right_prompt.fish b/omf/themes/agnoster/functions/fish_right_prompt.fish @@ -0,0 +1,81 @@ +# right prompt for agnoster theme +# shows vim mode status + +# =========================== +# Color setting + +# You can set these variables in config.fish like: +# set -g color_dir_bg red +# If not set, default color from agnoster will be used. +# =========================== +set -q color_vi_mode_indicator; or set color_vi_mode_indicator black +set -q color_vi_mode_normal; or set color_vi_mode_normal green +set -q color_vi_mode_insert; or set color_vi_mode_insert blue +set -q color_vi_mode_visual; or set color_vi_mode_visual red + + +# =========================== +# Cursor setting + +# You can set these variables in config.fish like: +# set -g cursor_vi_mode_insert bar_blinking +# =========================== +set -q cursor_vi_mode_normal; or set cursor_vi_mode_normal box_steady +set -q cursor_vi_mode_insert; or set cursor_vi_mode_insert bar_steady +set -q cursor_vi_mode_visual; or set cursor_vi_mode_visual box_steady + + +function fish_cursor_name_to_code -a cursor_name -d "Translate cursor name to a cursor code" + # these values taken from + # https://github.com/gnachman/iTerm2/blob/master/sources/VT100Terminal.m#L1646 + # Beginning with the statement "case VT100CSI_DECSCUSR:" + if [ $cursor_name = "box_blinking" ] + echo 1 + else if [ $cursor_name = "box_steady" ] + echo 2 + else if [ $cursor_name = "underline_blinking" ] + echo 3 + else if [ $cursor_name = "underline_steady" ] + echo 4 + else if [ $cursor_name = "bar_blinking" ] + echo 5 + else if [ $cursor_name = "bar_steady" ] + echo 6 + else + echo 2 + end +end + +function prompt_vi_mode -d 'vi mode status indicator' + set -l right_segment_separator \uE0B2 + switch $fish_bind_mode + case default + set -l mode (fish_cursor_name_to_code $cursor_vi_mode_normal) + echo -e "\e[\x3$mode q" + set_color $color_vi_mode_normal + echo "$right_segment_separator" + set_color -b $color_vi_mode_normal $color_vi_mode_indicator + echo " N " + case insert + set -l mode (fish_cursor_name_to_code $cursor_vi_mode_insert) + echo -e "\e[\x3$mode q" + set_color $color_vi_mode_insert + echo "$right_segment_separator" + set_color -b $color_vi_mode_insert $color_vi_mode_indicator + echo " I " + case visual + set -l mode (fish_cursor_name_to_code $cursor_vi_mode_visual) + echo -e "\e[\x3$mode q" + set_color $color_vi_mode_visual + echo "$right_segment_separator" + set_color -b $color_vi_mode_visual $color_vi_mode_indicator + echo " V " + end +end + +function fish_right_prompt -d 'Prints right prompt' + if not test "$fish_key_bindings" = "fish_default_key_bindings" + prompt_vi_mode + set_color normal + end +end