#+TITLE: Phundrak’s fish config #+AUTHOR: Lucien "Phundrak” Cartier-Tilet #+EMAIL: lucien@phundrak.com #+OPTIONS: H:4 broken_links:mark email:t ^:{} auto-id:t #+EXPORT_FILE_NAME: index.html # ### LaTeX #################################################################### #+LATEX_CLASS: article #+LaTeX_CLASS_OPTIONS: [a4paper,twoside] #+LATEX_HEADER_EXTRA: \usepackage{xltxtra,xcolor,hyperref,indentfirst} #+LATEX_HEADER_EXTRA: \usepackage[total={17cm,24cm}]{geometry} #+LATEX_HEADER_EXTRA: \setmainfont{Charis SIL} #+LATEX_HEADER_EXTRA: \hypersetup{colorlinks=true,linkbordercolor=red,linkcolor=blue,pdfborderstyle={/S/U/W 1}} # ### HTML ##################################################################### #+HTML_DOCTYPE: html5 #+HTML_HEAD_EXTRA: #+HTML_HEAD_EXTRA: #+HTML_HEAD_EXTRA: #+HTML_HEAD_EXTRA: #+HTML_HEAD_EXTRA: #+HTML_HEAD_EXTRA: #+HTML_HEAD_EXTRA: #+HTML_HEAD_EXTRA: #+HTML_HEAD_EXTRA: #+HTML_HEAD_EXTRA: #+HTML_HEAD_EXTRA: #+HTML_HEAD_EXTRA: #+INFOJS_OPT: view:info toc:1 home:https://phundrak.com/config toc:t #+HTML_HEAD_EXTRA: #+HTML_HEAD_EXTRA: #+HTML_HEAD_EXTRA: #+HTML_HEAD_EXTRA: * Table of Contents :TOC_4_gh:noexport: :PROPERTIES: :CUSTOM_ID: h-c7ab05d0-4c5f-4a4c-8603-4c79e264141c :END: - [[#presentation][Presentation]] - [[#fish-from-within-emacs][Fish from within Emacs]] - [[#tramp-remote-access][Tramp remote access]] - [[#regular-fish-shell-appearance][Regular fish shell appearance]] - [[#global-variables][Global variables]] - [[#theme-customization][Theme customization]] - [[#abbreviations][Abbreviations]] - [[#system-monitoring][System monitoring]] - [[#system-management-packages-and-services][System management (packages and services)]] - [[#package-mangaement][Package mangaement]] - [[#service-management][Service management]] - [[#development][Development]] - [[#cmake][CMake]] - [[#compilation][Compilation]] - [[#docker][Docker]] - [[#git][Git]] - [[#prolog][Prolog]] - [[#text-editors][Text editors]] - [[#latex][LaTeX]] - [[#some-security-measures][Some security measures]] - [[#typos][Typos]] - [[#misc][Misc]] - [[#sudo][Sudo]] - [[#exit][Exit]] - [[#history][History]] - [[#song-download-from-youtube][Song download from YouTube]] - [[#mpv][MPV]] - [[#compression][Compression]] - [[#feh][Feh]] - [[#ls][ls]] - [[#network-management][Network Management]] - [[#wget][Wget]] * Presentation :PROPERTIES: :CUSTOM_ID: h-c2560b46-7f97-472f-b898-5ab483832228 :HEADER-ARGS: :tangle config.fish :exports code :END: The file present in =~/.config/fish/config.fish= is the configuration file for the [[https://fishshell.com/][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. #+BEGIN_SRC fish function fish_title true end #+END_SRC * Fish from within Emacs :PROPERTIES: :CUSTOM_ID: h-97d738f4-1ea0-4f64-a31d-19643486a951 :HEADER-ARGS: :tangle config.fish :exports code :END: 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=. #+BEGIN_SRC fish if test -n "$EMACS" set -x TERM eterm-color end #+END_SRC * Tramp remote access :PROPERTIES: :CUSTOM_ID: h-6cad2cc9-aef6-4df4-90f9-97053e82072a :HEADER-ARGS: :tangle config.fish :exports code :END: 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. #+BEGIN_SRC fish if test "$TERM" = "dumb" function fish_prompt echo "\$ " end function fish_right_prompt; end function fish_greeting; end function fish_title; end end #+END_SRC * Regular fish shell appearance :PROPERTIES: :CUSTOM_ID: h-a8434b29-c146-4141-b8f8-1b446c791907 :HEADER-ARGS: :tangle config.fish :exports code :END: 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. #+BEGIN_SRC fish function fish_greeting; end #+END_SRC * Global variables :PROPERTIES: :CUSTOM_ID: h-0eff37da-af9f-4546-8ad3-201961a2200f :HEADER-ARGS: :tangle config.fish :exports code :END: 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=. #+BEGIN_SRC fish set -gx PATH \ $HOME/.pub-cache/bin $HOME/.local/bin $HOME/go/bin $HOME/.cargo/bin \ $HOME/.gem/ruby/2.6.0/bin $PATH #+END_SRC Sometimes, software will rely on =SUDO_ASKPASS= to get a GUI from which it can get the sudo password. So, let’s declare it. #+BEGIN_SRC fish set -gx SUDO_ASKPASS ~/.local/bin/askpass #+END_SRC 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). #+BEGIN_SRC fish set -gx EDITOR emacsclient -c #+END_SRC We also need to set the path to the Dart SDK. #+BEGIN_SRC fish set -gx DART_SDK /opt/dart-sdk/bin #+END_SRC And we also need to specify where the Android SDK it located. #+BEGIN_SRC fish set -gx ANDROID_HOME $HOME/Android/Sdk #+END_SRC Finally, some development packages require the =PKG_CONFIG_PATH= to be set, so let’s do so. #+BEGIN_SRC fish set -gx PKG_CONFIG_PATH /usr/local/lib/pkgconfig/ $PKG_CONFIG_PATH #+END_SRC * Theme customization :PROPERTIES: :CUSTOM_ID: h-e9dccb31-8350-459d-b688-b5b7cbeab272 :END: 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=: #+BEGIN_SRC fish set -g theme_nerd_fonts_support yes #+END_SRC Next, I want the name of the current process to be shown in the terminal title. #+BEGIN_SRC fish set -g theme_title_display_process yes #+END_SRC I also wish to display the current host in the prompt, but only when I am connected through an SSH session. #+BEGIN_SRC fish set -g theme_display_hostname ssh #+END_SRC I also want the sudo username to be displayed, as a warning that I am indeed running a session as root. #+BEGIN_SRC fish set -g theme_display_sudo_user yes #+END_SRC The exit status can be sometimes really useful, hence why I want it activated. #+BEGIN_SRC fish set -g theme_show_exit_status yes #+END_SRC I also want to have proper git worktree support. #+BEGIN_SRC fish set -g theme_git_worktree_support yes #+END_SRC * Abbreviations :PROPERTIES: :CUSTOM_ID: h-740bd904-3e32-4c09-b0a4-bde16ae2e116 :HEADER-ARGS: :tangle config.fish :exports code :END: ** System monitoring :PROPERTIES: :CUSTOM_ID: h-ec910a8c-9154-48a4-b4cd-df28cb4e54d9 :END: 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. #+BEGIN_SRC fish abbr df 'df -H' abbr diskspace 'sudo df -h | grep -E "sd|lv|Size"' #+END_SRC =meminfo= is a call to =free= with sane defaults. #+BEGIN_SRC fish abbr meminfo 'free -m -l -t' #+END_SRC Similar to =meminfo=, we also have =gpumeminfo= so we can get a quick look at the memory-related logs of our X session. #+BEGIN_SRC fish abbr gpumeminfo 'grep -i --color memory /var/log/Xorg.0.log' #+END_SRC I also declared =cpuinfo= an alias of =lscpu= in order to keep consistent with =meminfo=. #+BEGIN_SRC fish abbr cpuinfo lscpu #+END_SRC =pscpu= gives us information on what the CPU is running right now, and =pscpu10= limits that to the top 10 threads. #+BEGIN_SRC fish abbr pscpu 'ps auxf | sort -nr -k 3' abbr pscpu10 'ps auxf | sort -nr -k 3 | head -10' #+END_SRC 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. #+BEGIN_SRC fish abbr psmem 'ps auxf | sort -nr -k 4' abbr psmem10 'ps auxf | sort -nr -k 4 | head -10' #+END_SRC ** System management (packages and services) :PROPERTIES: :CUSTOM_ID: h-78ac23f0-960d-4f56-9cba-64413fd61885 :END: I added some of these abbreviations due to how often I have to write the whole thing. *** Package mangaement :PROPERTIES: :CUSTOM_ID: h-281a59aa-4ea0-47ab-a4cc-33fff8d38165 :END: The first command is =remove= which removes a package from my system, as well as its dependencies no longer needed. #+BEGIN_SRC fish abbr remove 'sudo pacman -Rscnd' #+END_SRC But if I just want to run =pacman= as sudo, then I could always just type =p=. #+BEGIN_SRC fish abbr p 'sudo -A pacman' #+END_SRC 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=. #+BEGIN_SRC fish abbr purge 'yay -Sc' #+END_SRC 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=. #+BEGIN_SRC fish abbr search 'pacman -Ss' #+END_SRC To update everything from the official repos, I’ll sometimes type =update= instead of the full command. #+BEGIN_SRC fish abbr update 'sudo pacman -Syu' #+END_SRC *** Service management :PROPERTIES: :CUSTOM_ID: h-3a734119-ccee-4cdf-b04c-d55a37dea571 :END: I don’t have the muscle memory of =systemctl=. So instead, I simply type =c= when I want to do something user service related. #+BEGIN_SRC fish abbr s 'systemctl --user' #+END_SRC And if I want to manipulate system services, I can instead type a simple capital =S=. #+BEGIN_SRC fish abbr S 'sudo systemctl' #+END_SRC ** Development :PROPERTIES: :CUSTOM_ID: h-32ae38a2-41ad-438e-b619-220a63166115 :END: A good amount of these commands are development related, especially when it comes to compilation or Docker. *** CMake :PROPERTIES: :CUSTOM_ID: h-887c87aa-b100-4b27-9006-778fd7e3329c :END: I have the following abbreviations so I can quickly run CMake and create a configuration for debug or release profiles. #+BEGIN_SRC fish abbr cdebug 'cmake -DCMAKE_BUILD_TYPE=Debug' abbr crelease 'cmake -DCMAKE_BUILD_TYPE=Release' #+END_SRC *** Compilation :PROPERTIES: :CUSTOM_ID: h-0beb47e5-d76a-4037-8f58-e8de141e3761 :END: By default, I set =clang=, =clang++=, =gcc= and =g++= to the latest standard and with the =-Wall= flag activated. #+BEGIN_SRC fish :tangle abbr clang 'clang -Wall' abbr clang++ 'clang++ -Wall' abbr g++ 'g++ -Wall -std=c++17' abbr gcc 'gcc -Wall -std=c18' #+END_SRC *** Docker :PROPERTIES: :CUSTOM_ID: h-91c7ff90-7b43-4802-be69-5d102281c6d3 :END: And of course, when it comes to Docker Compose, I don’t have time to write the full command, so I use these instead. #+BEGIN_SRC fish 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' #+END_SRC *** Git :PROPERTIES: :CUSTOM_ID: h-e72347d4-590e-448c-bc33-0a70fa8ab35b :END: 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. #+BEGIN_SRC fish :tangle abbr randcommit 'git commit -m (curl -s whatthecommit.com/index.txt)' #+END_SRC *** Prolog :PROPERTIES: :CUSTOM_ID: h-cbb6c31e-faaa-48c3-a83a-d1f143fdcb8d :END: When I launch =swipl=, I prefer to have my terminal cleaned before and after it runs, I find it more clean. #+BEGIN_SRC fish abbr swipl 'clear && swipl -q && clear' #+END_SRC *** Text editors :PROPERTIES: :CUSTOM_ID: h-51155e06-872d-4a12-9bf7-ae5eabc256ad :END: 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. #+BEGIN_SRC fish abbr e 'emacsclient -c' #+END_SRC 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). #+BEGIN_SRC fish abbr enw 'emacsclient -c -nw' #+END_SRC I also have the abbreviation =vi= which refers to =vim=. I really should learn =vi=, but I also really don’t feel like it. #+BEGIN_SRC fish abbr vi vim #+END_SRC ** LaTeX :PROPERTIES: :CUSTOM_ID: h-a8f8a707-90d7-4784-982d-d959b183148e :END: 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. #+BEGIN_SRC fish abbr tlmgr tllocalmgr #+END_SRC #+BEGIN_SRC fish abbr texhash 'sudo texhash' #+END_SRC ** Some security measures :PROPERTIES: :CUSTOM_ID: h-dd97ea71-c43f-4b79-8bb7-1f857284b1b4 :END: 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. #+BEGIN_SRC fish 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' #+END_SRC 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=. #+BEGIN_SRC fish abbr chgrp 'chgrp --preserve-root' abbr chmod 'chmod --preserve-root' abbr chown 'chown --preserve-root' #+END_SRC ** Typos :PROPERTIES: :CUSTOM_ID: h-4c5a03cd-20a8-437e-87b7-af990780084e :END: 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. #+BEGIN_SRC fish abbr clean clear #+END_SRC I’m also very bad at typing =exit=. #+BEGIN_SRC fish abbr exi exit abbr exti exit #+END_SRC And sometimes I suck at typing =htop=. #+BEGIN_SRC fish abbr hotp htop #+END_SRC ** Misc :PROPERTIES: :CUSTOM_ID: h-3a237ec0-c535-42c7-9c60-3d083745b643 :END: Finally, some miscellaneous abbreviations that don’t really fit into any of the above categories. *** Sudo :PROPERTIES: :CUSTOM_ID: h-0955e2fc-ec25-41b6-814a-929fa3718dda :END: 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 [[file:~/.local/bin/askpass][.local/bin/askpass]]). I also made it so =please= is an equivalent to =sudo -A= as a joke. #+BEGIN_SRC fish abbr sudo 'sudo -A' abbr please 'sudo -A' #+END_SRC *** Exit :PROPERTIES: :CUSTOM_ID: h-8cf0e895-b919-41a8-ad3d-c5294dc507fd :END: Sometimes I find it easier to just type =q= instead of =exit=. #+BEGIN_SRC fish abbr q exit #+END_SRC *** History :PROPERTIES: :CUSTOM_ID: h-162052c5-63c4-435a-b973-422346522c69 :END: I also find it more intuitive and faster to just write =hist= instead of =history=, so let’s declare that. #+BEGIN_SRC fish abbr hist history #+END_SRC *** Song download from YouTube :PROPERTIES: :CUSTOM_ID: h-4bc663a9-b609-4c86-9a4d-a220013c67f9 :END: When I want to download a song from YouTube, I’ll just use the command =flac videoIdentifier= to get it through =youtube-dl=. #+BEGIN_SRC fish abbr flac 'youtube-dl -x --audio-format flac --audio-quality 0' #+END_SRC *** MPV :PROPERTIES: :CUSTOM_ID: h-3fd5a7eb-4ed4-4b0b-87ca-28f36fb22793 :END: 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. #+BEGIN_SRC fish abbr mpv 'mpv --no-border --force-window=no' #+END_SRC *** Compression :PROPERTIES: :CUSTOM_ID: h-05919be3-360a-45c6-8c89-76836375d55b :END: 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 [[#h-281a59aa-4ea0-47ab-a4cc-33fff8d38165][Package management]]). #+BEGIN_SRC fish abbr compress 'tar -czf' abbr untar 'tar -xvzf' #+END_SRC *** Feh :PROPERTIES: :CUSTOM_ID: h-41cfc583-14ba-4f15-9578-bc37b432a3ce :END: 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. #+BEGIN_SRC fish abbr feh 'feh -Zx.' #+END_SRC *** ls :PROPERTIES: :CUSTOM_ID: h-9980009d-3fc4-4e2e-861b-1af007212f8d :END: 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. #+BEGIN_SRC fish abbr lsl 'ls -ahl' #+END_SRC *** Network Management :PROPERTIES: :CUSTOM_ID: h-5f9d4866-3086-4ed9-9ff3-d80a0af36593 :END: First, we have just =nmcli= with sane default options, that is a pretty output with colors. #+BEGIN_SRC fish abbr nmcli 'nmcli -p -c auto' #+END_SRC Next, we have some NordVPN-related shortcuts. The first one is a simple abbreviation to =nordvpn=. The second one is a shortcut to connect to a server, and to disconnect from the current server. #+BEGIN_SRC fish abbr n 'nordvpn' abbr nc 'nordvpn c' abbr nd 'nordvpn d' #+END_SRC I also have a couple of shortcuts to quickly connect to some preselected countries, mainly France, Germany, Japan and the US. #+BEGIN_SRC fish abbr ncf 'nordvpn c France' abbr ncg 'nordvpn c Germany' abbr ncj 'nordvpn c Japan' abbr ncu 'nordvpn c United_States' #+END_SRC *** Wget :PROPERTIES: :CUSTOM_ID: h-74f84f1c-433d-488a-88a7-89915c1a3bd5 :END: By default, continue a download that was interupted. #+BEGIN_SRC fish abbr wget 'wget -c' #+END_SRC