Phundrak’s fish config
- Presentation
- Fish from within Emacs
- Tramp remote access
- Regular fish shell appearance
- Global variables
- Theme customization
- Abbreviations
Presentation
The file present in ~/.config/fish/config.fish is the configuration file for
  the  fish  shell. It  contains  custom  functions, environment  variables  and
  abbreviations.
  Just  in  case,  we  might  need   sometimes  to  declare  the  fish  function
  fish_title as true, so let’s do so.
  function fish_title
      true
  endFish from within Emacs
I sometimes call fish from within  emacs, with M-x ansi-term. In this case,
  the variable TERM needs to have the value eterm-color.
  if test -n "$EMACS"
      set -x TERM eterm-color
  endTramp remote access
When accessing from  a remote machine our computer from  Emacs, tramp needs a
  precise shell appearance: a simple $ followed by a space after which to put
  the  commands it  needs to  execute,  and nothing  else. Due  to this,  let’s
  deactivate  and redefine  some of  the functions  defining the  appearance of
  fish.
  if test "$TERM" = "dumb"
      function fish_prompt
          echo "\$ "
      end
      function fish_right_prompt; end
      function fish_greeting; end
      function fish_title; end
  endRegular fish shell appearance
Now, there is only  one function I modify when it comes  to the appearance of
  fish  when I’m  the  one  using it:  I  simply  “delete” the  fish_greeting
  function.
  function fish_greeting; endGlobal variables
Some global variables might sometimes be needed and need to be modified. This
  is for example the case with my PATH variable in which I add Rust’s Cargo’s
  binaries, Go’s binaries  and my own executables. And of  course, don’t forget
  to add the already existing PATH.
  set -gx PATH $HOME/.pub-cache/bin $HOME/.local/bin $HOME/go/bin $HOME/.cargo/bin $PATH
  Sometimes, software  will rely on SUDO_ASKPASS  to get a GUI  from which it
  can get the sudo password. So, let’s declare it.
  set -gx SUDO_ASKPASS ~/.local/bin/askpass
  Now, let’s declare  our editor of choice, EmacsClient; not  Emacs itself since
  it will  most often be just  quick edits, nothing  too heavy, if it  is called
  from the EDITOR variable (from Git, for example).
  set -gx EDITOR emacsclient -cWe also need to set the path to the Dart SDK.
set -gx DART_SDK /opt/dart-sdk/binAnd we also need to specify where the Android SDK it located.
set -gx ANDROID_HOME $HOME/Android/Sdk
  Finally, some development  packages require the PKG_CONFIG_PATH  to be set,
  so let’s do so.
  set -gx PKG_CONFIG_PATH /usr/local/lib/pkgconfig/ $PKG_CONFIG_PATHTheme customization
  The theme I use is bobthefish. Although its default configuration is quite
  alright, it allows some customization. The first thing I want to enable is the
  support for nerd-fonts:
  set -g theme_nerd_fonts_support yesNext, I want the name of the current process to be shown in the terminal title.
  set -g theme_title_display_process yesI also wish to display the current host in the prompt, but only when I am connected through an SSH session.
  set -g theme_display_hostname sshI also want the sudo username to be displayed, as a warning that I am indeed running a session as root.
  set -g theme_display_sudo_user yesThe exit status can be sometimes really useful, hence why I want it activated.
  set -g theme_show_exit_status yesI also want to have proper git worktree support.
  set -g theme_git_worktree_support yesAbbreviations
System monitoring
Here I have  some abbreviations which are quite useful  when performing some
   system  monitoring. With  df, we  can get  an overview  of our  filesystem
   usage, while with diskspace we get some more precise information.
  abbr df 'df -H'
  abbr diskspace 'sudo df -h | grep -E "sd|lv|Size"'
   meminfo is a call to free with sane defaults.
  abbr meminfo 'free -m -l -t'
   Similar to meminfo, we  also have gpumeminfo so we can  get a quick look
   at the memory-related logs of our X session.
  abbr gpumeminfo 'grep -i --color memory /var/log/Xorg.0.log'
   I also  declared cpuinfo an alias  of lscpu in order  to keep consistent
   with meminfo.
  abbr cpuinfo lscpu
   pscpu  gives us  information on  what the  CPU is  running right  now, and
   pscpu10 limits that to the top 10 threads.
  abbr pscpu 'ps auxf | sort -nr -k 3'
  abbr pscpu10 'ps auxf | sort -nr -k 3 | head -10'
   Similarly, psmem gives  us information on the memory usage  of the current
   threads,  and psmem10  only the  ten most  important threads  in terms  of
   memory usage.
  abbr psmem 'ps auxf | sort -nr -k 4'
  abbr psmem10 'ps auxf | sort -nr -k 4 | head -10'System management (packages and services)
I added some of these abbreviations due to how often I have to write the whole thing.
Package mangaement
The first  command is remove which  removes a package from  my system, as
    well as its dependencies no longer needed.
  abbr remove 'sudo pacman -Rscnd'
    But if I just  want to run pacman as sudo, then I  could always just type
    p.
  abbr p 'sudo -A pacman'
    Sometimes,  I  just  want  to  purge my  package  manager’s  cache,  be  it
    pacman's or yay's. This is why I simply type purge.
  abbr purge 'yay -Sc'
    And  if I  want  to simply  seach  among  the pacman  repos,  I can  type
    search. Otherwise, if I want to include AUR results, I’ll use yay.
  abbr search 'pacman -Ss'
    To update everything from the  official repos, I’ll sometimes type update
    instead of the full command.
  abbr update 'sudo pacman -Syu'Service management
I don’t have the muscle memory of systemctl. So instead, I simply type
    c when I want to do something user service related.
  abbr s 'systemctl --user'
    And if I  want to manipulate system  services, I can instead  type a simple
    capital S.
  abbr S 'sudo systemctl'Development
A good amount of these commands are development related, especially when it comes to compilation or Docker.
CMake
I have the following abbreviations so I can quickly run CMake and create a configuration for debug or release profiles.
  abbr cdebug 'cmake -DCMAKE_BUILD_TYPE=Debug'
  abbr crelease 'cmake -DCMAKE_BUILD_TYPE=Release'Compilation
By  default, I  set  clang,  clang++, gcc  and  g++  to the  latest
    standard and with the -Wall flag activated.
  abbr clang 'clang -Wall'
  abbr clang++ 'clang++ -Wall'
  abbr g++ 'g++ -Wall -std=c++17'
  abbr gcc 'gcc -Wall -std=c18'Docker
And of course, when it comes to Docker Compose, I don’t have time to write the full command, so I use these instead.
  abbr dc docker-compose
  abbr dcd 'docker-compose down'
  abbr dcr 'docker-compose run --rm'
  abbr dcu 'docker-compose up'
  abbr dcub 'docker-compose up --build'Git
And let’s face it: we all at one point just wanted to commit our code without thinking about the message, to just get over with it. Don’t worry, I got you covered.
  abbr randcommit 'git commit -m (curl -s whatthecommit.com/index.txt)'Prolog
When I  launch swipl,  I prefer  to have my  terminal cleaned  before and
    after it runs, I find it more clean.
  abbr swipl 'clear && swipl -q && clear'Text editors
I greatly prefer to use Emacsclient as my main text editor; Emacs has basically all I need. So, it’s only normal I have an abbreviation to launch a new instance of it.
  abbr e 'emacsclient -c'However,  in a  graphical environment,  this  will launch  a new  graphical
    window of Emacs. To launch a terminal instance, I’ll use enw (nw stands
    for the option “nowindow” -nw of Emacs).
  abbr enw 'emacsclient -c -nw'
    I also  have the abbreviation vi  which refers to vim.  I really should
    learn vi, but I also really don’t feel like it.
  abbr vi vimLaTeX
Yes, although  I use org-mode, I  still have some use  for LaTeX, especially
   when it  comes to PDF  exports of my  org files. Hence  why I use  the LaTeX
   package manager. It  is recommended to use tllocalmgr  instead of tlmgr,
   but I can never  remember the command, and the latter is  faster to type, so
   time for an abbreviation.
abbr tlmgr tllocalmgrabbr texhash 'sudo texhash'Some security measures
Some commands can be quite dangerous when not used properly, which is why I added default flags and options so I can get warnings before things get ugly.
  abbr cp 'cp -i'
  abbr ln 'ln -i'
  abbr lns 'ln -si'
  abbr mv 'mv -i'
  abbr rm 'rm -I'
  abbr rmd 'rm --preserve-root -Ir'
  abbr rmdf 'rm --preserve-root -Irf'
  abbr rmf 'rm --preserve-root -If'The -i and -I add prompts in case  we might not want to do what we asked
   the shell  to do. Notice lns  which creates symlinks, rmd  which removes
   directories,  rmf  which forces  deletion,  and  rmdf which  forces  the
   delition  of  a directory.  Notice  also  the --preserve-root  which  will
   prevent me  from accidentally  removing the  root folder.  I added  the same
   option to chgrp, chmod, and chown.
  abbr chgrp 'chgrp --preserve-root'
  abbr chmod 'chmod --preserve-root'
  abbr chown 'chown --preserve-root'Typos
Let’s admit it, we all make typos from time to time in the shell, and some are recurrent enough we make abbreviations or aliases of the correct command. Well, I have some of my abbreviations which were make exactly because of this.
   Sometimes  for some  reasons, my  brain makes  me write  clean instead  of
   clear. So, let’s just replace the former by the latter.
abbr clean clear
   I’m also very bad at typing exit.
  abbr exi exit
  abbr exti exit
   And sometimes I suck at typing htop.
  abbr hotp htopMisc
Finally, some miscellaneous abbreviations that don’t really fit into any of the above categories.
Sudo
First, I make it so that sudo comes with the -A switch in order to call
    my    custom   graphical    script   for    getting   my    password   (see
    .local/bin/askpass). I also  made it so please is an  equivalent to sudo
    -A as a joke.
  abbr sudo 'sudo -A'
  abbr please 'sudo -A'Exit
Sometimes I find it easier to just type q instead of exit.
  abbr q exitHistory
I also find  it more intuitive and  faster to just write  hist instead of
    history, so let’s declare that.
  abbr hist historySong download from YouTube
When I  want to  download a song  from YouTube, I’ll  just use  the command
    flac videoIdentifier to get it through youtube-dl.
  abbr flac 'youtube-dl -x --audio-format flac --audio-quality 0'MPV
When it comes to mpv, I do not want to force it to open a graphical window if for example I want to listen to an audio file. I also do not want any border on that window. So, I declared this abbreviation.
  abbr mpv 'mpv --no-border --force-window=no'Compression
It seems it’s just like many other people,  but I cannot for the life of me
    remember the syntax  of tar. So, I made the  following abbreviations, and
    one day hopefully, after seeing  the abbreviations’ expansion over and over
    I’ll remember the command like I  did for the abbreviation of remove (see
    Package management).
  abbr compress 'tar -czf'
  abbr untar 'tar -xvzf'Feh
Some sane default options for feh, including auto-zoom to fit the picture
    to the window,  a borderless window, and  again scale the image  to fit the
    window geometry.
  abbr feh 'feh -Zx.'ls
Yep, an  abbreviation of ls  called lsl. It allows  me to view  all the
    files in a directory as a list with detailed, human-readable information.
  abbr lsl 'ls -ahl'NetworkManager
This is  just nmcli with  sane default options,  that is a  pretty output
    with colors.
  abbr nmcli 'nmcli -p -c auto'Wget
By default, continue a download that was interupted.
  abbr wget 'wget -c'