20 KiB
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
end
Fish 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
end
Tramp 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
end
Regular 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; end
Global 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
.
additional path | what it leads to |
---|---|
$HOME/.pub-cache/bin | Dart binaries and executables |
$HOME/.local/bin | Custom executables, see /phundrak/dotfiles/src/commit/90512f8dafc9b9b799c43dda7682ff1b751211c3/org/config-website/bin.org |
$HOME/go/bin | Go binaries and executables |
$HOME/.cargo/bin | Rust binaries and executables |
$HOME/.gem/ruby/2.6.0/bin | Ruby binaries and executables |
$HOME/.pub-cache/bin $HOME/.local/bin $HOME/go/bin $HOME/.cargo/bin $HOME/.gem/ruby/2.6.0/bin
set -gx PATH <<generate-extra-paths()>> $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 -c
We also need to set the path to the Dart SDK.
set -gx DART_SDK /opt/dart-sdk/bin
And 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_PATH
Theme 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 yes
Next, I want the name of the current process to be shown in the terminal title.
set -g theme_title_display_process yes
I 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 ssh
I 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 yes
The exit status can be sometimes really useful, hence why I want it activated.
set -g theme_show_exit_status yes
I also want to have proper git worktree support.
set -g theme_git_worktree_support yes
Abbreviations
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 vim
LaTeX
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 tllocalmgr
abbr 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 -Iv'
abbr rmd 'rm --preserve-root -Irv'
abbr rmdf 'rm --preserve-root -Irfv'
abbr rmf 'rm --preserve-root -Ifv'
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 -v'
abbr chmod 'chmod --preserve-root -v'
abbr chown 'chown --preserve-root -v'
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 htop
Misc
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 please 'sudo -A'
Exit
Sometimes I find it easier to just type q
instead of exit
.
abbr q exit
History
I also find it more intuitive and faster to just write hist
instead of
history
, so let’s declare that.
abbr hist history
youtube-dl
related commands
Song 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 -o "~/Music/%(uploader)s/%(title)s.%(ext)s"'
Videos download from YouTube
I download a LOT of videos from YouTube, generally educative videos that I
do not want to lose to YouTube one day who will decide that such channel is
unworthy of their platform, or if the original author decides to delete
their videos or whatever. So, I use the abbreviation ytdl
to download
either one video, or a whole YouTube channel.
abbr ytdl 'youtube-dl -f best -ciw -o "~/Videos/YouTube/%(uploader)s/%(upload_date)s - %(title)s.%(ext)s"'
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.'
Network Management
First, we have just nmcli
with sane default options, that is a pretty output
with colors.
abbr nmcli 'nmcli -p -c auto'
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.
abbr n 'nordvpn'
abbr nc 'nordvpn c'
abbr nd 'nordvpn d'
I also have a couple of shortcuts to quickly connect to some preselected countries, mainly France, Germany, Japan and the US.
abbr ncf 'nordvpn c France'
abbr ncg 'nordvpn c Germany'
abbr ncj 'nordvpn c Japan'
abbr ncu 'nordvpn c United_States'
Wget
By default, continue a download that was interupted.
abbr wget 'wget -c'