606 lines
19 KiB
Org Mode
606 lines
19 KiB
Org Mode
#+TITLE: Fish
|
||
#+setupfile: headers
|
||
#+PROPERTY: header-args:fish :mkdirp yes :tangle ~/.config/fish/config.fish :exports code :noweb yes
|
||
#+PROPERTY: header-args :exports code :tangle no
|
||
|
||
* Fish
|
||
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 sometimes need 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
|
||
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
|
||
|
||
** Global variables
|
||
An important thing to do is to load all variables from my =~/.profile=
|
||
file (which you can find [[https://labs.phundrak.com/phundrak/dotfiles/src/branch/master/.profile][here]]). The [[https://github.com/oh-my-fish/plugin-foreign-env][foreign-env]] plugin comes in handy:
|
||
#+begin_src fish
|
||
fenv source ~/.profile
|
||
#+end_src
|
||
|
||
|
||
[[https://direnv.net/][Direnv]] is a really neat tool that allows you to load the content of a
|
||
dotenv file as environment variables. Its installation is quite simple
|
||
for fish.
|
||
#+begin_src fish
|
||
direnv hook fish | source
|
||
#+end_src
|
||
|
||
Since I don’t really have a better place on this website to put it,
|
||
here is my direnv configuration located at
|
||
=$HOME/.config/direnv/direnv.toml=.
|
||
#+begin_src toml :tangle ~/.config/direnv/direnv.toml :mkdirp yes :exports code
|
||
[global]
|
||
load_dotenv = true
|
||
#+end_src
|
||
|
||
*** Development
|
||
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
|
||
|
||
** 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 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
|
||
Now, there is only one function I modify when it comes to the
|
||
appearance of fish when I’m the one using it: the ~fish_greeting~
|
||
function. I just want it empty.
|
||
#+BEGIN_SRC fish
|
||
function fish_greeting; end
|
||
#+END_SRC
|
||
|
||
For my fish prompt, I use [[https://starship.rs][starship]], a shell-agnostic prompt. Let’s
|
||
load it:
|
||
#+begin_src fish
|
||
starship init fish | source
|
||
#+end_src
|
||
|
||
** Setting up external tools
|
||
*** Starship configuration
|
||
:PROPERTIES:
|
||
:header-args:toml: :tangle ~/.config/starship.toml
|
||
:END:
|
||
As mentioned above, starship is a shell-agnostic prompt, written in
|
||
Rust and which can be configured separately from the shell. I decided
|
||
to configure it here though, since fish is the only shell I use which
|
||
is compatible with starship.
|
||
|
||
First I’ll modify the default format variable, removing the modules I
|
||
don’t need.
|
||
#+begin_src toml
|
||
format = """
|
||
$username\
|
||
$hostname\
|
||
$shlvl\
|
||
$singularity\
|
||
$kubernetes\
|
||
$directory\
|
||
$vcsh\
|
||
$git_branch\
|
||
$git_commit\
|
||
$git_state\
|
||
$git_metrics\
|
||
$git_status\
|
||
$hg_branch\
|
||
$docker_context\
|
||
$package\
|
||
$cmake\
|
||
$dart\
|
||
$deno\
|
||
$lua\
|
||
$nodejs\
|
||
$python\
|
||
$rlang\
|
||
$rust\
|
||
$scala\
|
||
$zig\
|
||
$memory_usage\
|
||
$env_var\
|
||
$custom\
|
||
$cmd_duration\
|
||
$line_break\
|
||
$jobs\
|
||
$battery\
|
||
$time\
|
||
$status\
|
||
$shell\
|
||
$character"""
|
||
#+end_src
|
||
|
||
I want starship to be able to detect Lisp files, be it CommonLisp or
|
||
EmacsLisp. Unfortunately, it seems nerd-font doesn’t have any symbol
|
||
for either language, so I’m just using a lambda character.
|
||
#+begin_src toml
|
||
[custom.lisp]
|
||
extensions = ["lisp", "el"]
|
||
symbol = "λ "
|
||
style = "bold green"
|
||
#+end_src
|
||
|
||
Finally, let’s disable all modules I don’t need.
|
||
#+begin_src toml
|
||
[cobol]
|
||
disable = true
|
||
[dotnet]
|
||
disable = true
|
||
[elixir]
|
||
disable = true
|
||
[elm]
|
||
disable = true
|
||
[erlang]
|
||
disable = true
|
||
[golang]
|
||
disable = true
|
||
[helm]
|
||
disable = true
|
||
[java]
|
||
disable = true
|
||
[julia]
|
||
disable = true
|
||
[kotlin]
|
||
disable = true
|
||
[nim]
|
||
disable = true
|
||
[ocaml]
|
||
disable = true
|
||
[perl]
|
||
disable = true
|
||
[php]
|
||
disable = true
|
||
[pulumi]
|
||
disable = true
|
||
[purescript]
|
||
disable = true
|
||
[red]
|
||
disable = true
|
||
[ruby]
|
||
disable = true
|
||
[swift]
|
||
disable = true
|
||
[terraform]
|
||
disable = true
|
||
[vlang]
|
||
disable = true
|
||
[vagrant]
|
||
disable = true
|
||
[nix_shell]
|
||
disable = true
|
||
[conda]
|
||
disable = true
|
||
[aws]
|
||
disable = true
|
||
[gcloud]
|
||
disable = true
|
||
[openstack]
|
||
disable = true
|
||
[crystal]
|
||
disable = true
|
||
#+end_src
|
||
|
||
*** Loading =zoxide=
|
||
=zoxide= is a smarter =cd= command. I actually have it replace =cd= entirely through the =--cmd= flag you see below..
|
||
#+begin_src fish
|
||
zoxide init --cmd cd fish | source
|
||
#+end_src
|
||
|
||
** Abbreviations
|
||
#+NAME: generate-abbr
|
||
#+BEGIN_SRC emacs-lisp :var table=[] :exports none :tangle no
|
||
(replace-regexp-in-string "\\\\vert[{}]*"
|
||
"|"
|
||
(mapconcat (lambda (x) (format "abbr %s '%s'" (car x) (cadr x)))
|
||
table
|
||
"\n")
|
||
t t)
|
||
#+END_SRC
|
||
|
||
Abbreviations are a great way to keep correctly track of which
|
||
commands are run in the shell without polluting the history of the
|
||
shell with obscure commands. When typing an abbreviation, fish will
|
||
replace it with replace it with its expanded equivalent. Below are
|
||
some of the abbreviations I use. Be aware some of them that invoke GUI
|
||
programs can be invoked through ~devour~ which will make the terminal
|
||
disappear while the program runs, and once the GUI program exists the
|
||
terminal window will come back.
|
||
|
||
*** 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. =meminfo= is a call to =free= with sane defaults, and similar
|
||
to =meminfo=, we also have =gpumeminfo= to get a quick look at the
|
||
memory-related logs of our X session. I also declared =cpuinfo= an alias
|
||
of =lscpu= in order to keep consistent with =meminfo=. =pscpu= gives us
|
||
information on what the CPU is running right now, and =pscpu10= limits
|
||
that to the top 10 threads. 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.
|
||
#+NAME: mgmt-abbr
|
||
| abbreviation | command |
|
||
|--------------+--------------------------------------------|
|
||
| df | df -H |
|
||
| diskspace | sudo df -h \vert grep -E "sd\vert{}lv\vert{}Size" |
|
||
| du | du -ch |
|
||
| meminfo | free -m -l -t |
|
||
| gpumeminfo | grep -i --color memory /var/log/Xorg.0.log |
|
||
| cpuinfo | lscpu |
|
||
| pscpu | ps auxf \vert sort -nr -k 3 |
|
||
| pscpu10 | ps auxf \vert sort -nr -k 3 \vert head -10 |
|
||
| psmem | ps auxf \vert sort -nr -k 4 |
|
||
| psmem10 | ps auxf \vert sort -nr -k 4 \vert head -10 |
|
||
|
||
#+begin_SRC fish
|
||
<<generate-abbr(table=mgmt-abbr)>>
|
||
#+END_SRC
|
||
|
||
*** System management (packages and services)
|
||
I added some of these abbreviations due to how often I have to write
|
||
the whole thing.
|
||
|
||
**** Package management
|
||
The first command is =remove= which removes a package from my system, as
|
||
well as its dependencies no longer needed. =p=. =pacman='s or =paru='s. This
|
||
is why I simply type =purge=. And if I want to simply search among the
|
||
=pacman= repos, I can type =search=. Otherwise, if I want to include AUR
|
||
results, I’ll use =paru=.
|
||
|
||
#+NAME: pm-abbr
|
||
| abbreviation | command |
|
||
|--------------+------------------|
|
||
| remove | sudo pacman -Rsc |
|
||
| purge | paru -Sc |
|
||
|
||
#+BEGIN_SRC fish
|
||
<<generate-abbr(table=pm-abbr)>>
|
||
#+END_SRC
|
||
|
||
**** 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. And if I want to
|
||
manipulate system services, I can instead type a simple capital =S=.
|
||
#+NAME: service-abbr
|
||
| abbreviation | command |
|
||
|--------------+------------------|
|
||
| s | systemctl |
|
||
| suser | systemctl --user |
|
||
|
||
#+BEGIN_SRC fish
|
||
<<generate-abbr(table=service-abbr)>>
|
||
#+END_SRC
|
||
|
||
*** Development
|
||
A good amount of these commands are development related, especially
|
||
when it comes to compilation or Docker.
|
||
|
||
**** CMake
|
||
I have the following abbreviations to quickly run CMake and create a
|
||
configuration for debug or release profiles.
|
||
#+NAME: abbr-cmake
|
||
| abbreviation | command |
|
||
|--------------+----------------------------------|
|
||
| cdebug | cmake -DCMAKE_BUILD_TYPE=Debug |
|
||
| crelease | cmake -DCMAKE_BUILD_TYPE=Release |
|
||
|
||
Here is the corresponding fish configuration:
|
||
#+BEGIN_SRC fish
|
||
<<generate-abbr(table=abbr-cmake)>>
|
||
#+END_SRC
|
||
|
||
**** 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.
|
||
#+NAME: abbr-docker
|
||
| abbreviation | command |
|
||
|--------------+------------------------------|
|
||
| dc | docker-compose |
|
||
| dcb | docker-compose build |
|
||
| dcd | docker-compose down |
|
||
| dcl | docker-compose logs |
|
||
| dclf | docker-compose logs -f |
|
||
| dcp | docker-compose pull |
|
||
| dcr | docker-compose run --rm |
|
||
| dcu | docker-compose up |
|
||
| dcub | docker-compose up --build |
|
||
| dcud | docker-compose up -d |
|
||
| dcudb | docker-compose up -d --build |
|
||
|
||
Here is the corresponding fish configuration:
|
||
#+BEGIN_SRC fish
|
||
<<generate-abbr(table=abbr-docker)>>
|
||
#+END_SRC
|
||
|
||
**** 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. If launched in the terminal, I’ll usually want Emacs to be displayed in
|
||
CLI mode and not in GUI mode, otherwise I would invoke it with my WM’s shortcut.
|
||
In case we want to launch Emacs in GUI mode anyway, ~egui~ is available too.
|
||
|
||
#+NAME: abbr-text-ed
|
||
| abbreviation | command |
|
||
|--------------+-----------------------|
|
||
| e | emacsclient -c -n |
|
||
| egui | devour emacsclient -c |
|
||
|
||
Here is the corresponding fish configuration:
|
||
#+BEGIN_SRC fish :noweb yes
|
||
<<generate-abbr(table=abbr-text-ed)>>
|
||
#+END_SRC
|
||
|
||
**** Compilation
|
||
By default, I set ~clang~, ~clang++~, ~gcc~ and ~g++~ to the latest standard and
|
||
with the ~-Wall~ flag activated.
|
||
#+NAME: abbr-comp
|
||
| abbreviation | command |
|
||
|--------------+----------------------|
|
||
| clang | clang -Wall |
|
||
| clang++ | clang++ -Wall |
|
||
| g++ | g++ -Wall -std=c++20 |
|
||
| gcc | gcc -Wall -std=c18 |
|
||
|
||
Here is the corresponding fish configuration:
|
||
#+BEGIN_SRC fish
|
||
<<generate-abbr(table=abbr-comp)>>
|
||
#+END_SRC
|
||
|
||
**** 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.
|
||
#+NAME: abbr-git
|
||
| abbreviation | command |
|
||
|--------------+-----------------------------------------------------|
|
||
| randcommit | git commit -m (curl -s whatthecommit.com/index.txt) |
|
||
|
||
Here is the corresponding fish configuration:
|
||
#+BEGIN_SRC fish
|
||
<<generate-abbr(table=abbr-git)>>
|
||
#+END_SRC
|
||
|
||
*** 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. Same goes for ~texhash~ which must be run as sudo.
|
||
#+NAME: latex-abbr
|
||
| abbreviation | command |
|
||
|--------------+--------------|
|
||
| tlmgr | tllocalmgr |
|
||
| texhash | sudo texhash |
|
||
|
||
Here is the corresponding fish configuration:
|
||
#+BEGIN_SRC fish
|
||
<<generate-abbr(table=latex-abbr)>>
|
||
#+END_SRC
|
||
|
||
*** Some security measures
|
||
Some commands can be quite dangerous when not used properly, which is
|
||
why I added default flags and options in order to get warnings before
|
||
things get ugly. 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=.
|
||
#+NAME: sec-abbr
|
||
| abbreviation | command |
|
||
|--------------+--------------------------|
|
||
| cp | cp -i |
|
||
| rsync | rsync -Pa --progress |
|
||
| ln | ln -i |
|
||
| lns | ln -si |
|
||
| mv | mv -i |
|
||
| rm | rm -Iv |
|
||
| rmd | rm --preserve-root -Irv |
|
||
| rmdf | rm --preserve-root -Irfv |
|
||
| rmf | rm --preserve-root -Ifv |
|
||
| chgrp | chgrp --preserve-root -v |
|
||
| chmod | chmod --preserve-root -v |
|
||
| chown | chown --preserve-root -v |
|
||
|
||
Here is the corresponding fish configuration:
|
||
#+BEGIN_SRC fish
|
||
<<generate-abbr(table=sec-abbr)>>
|
||
#+END_SRC
|
||
|
||
*** 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 reason, my brain makes me
|
||
write ~clean~ instead of ~clear~. So, let's just replace the former by the
|
||
latter. I'm also very bad at typing ~exit~. And sometimes I suck at
|
||
typing ~htop~.
|
||
#+NAME: typo-abbr
|
||
| abbreviation | command |
|
||
|--------------+---------|
|
||
| clean | clear |
|
||
| exi | exit |
|
||
| exti | exit |
|
||
| hotp | htop |
|
||
|
||
Here is the corresponding fish configuration:
|
||
#+BEGIN_SRC fish
|
||
<<generate-abbr(table=typo-abbr)>>
|
||
#+END_SRC
|
||
|
||
*** Misc
|
||
Finally, some miscellaneous abbreviations that don't really fit into any of the
|
||
above categories.
|
||
|
||
**** Media
|
||
Here you will find various commands related to media in general. The
|
||
first one is a command to play some chillhop from the [[https://www.youtube.com/@LofiGirl][Lofi Girl
|
||
YouTube channel]]'s livestream.
|
||
#+BEGIN_SRC fish
|
||
abbr chill 'mpv --force-window=no --no-video "https://www.youtube.com/watch?v=jfKfPfyJRdk" &'
|
||
#+END_SRC
|
||
|
||
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
|
||
|
||
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 -o "~/Music/%(uploader)s/%(title)s.%(ext)s"'
|
||
#+END_SRC
|
||
|
||
Some sane default options for [[https://github.com/nsxiv/nsxiv][~nsxiv~]]. This includes playing GIFs and
|
||
not displaying the filename below. Nsxiv will also open in full-screen
|
||
and will fit the displayed image to the frame. It will also output to
|
||
stdout the selected files in case I want to pipe them to another
|
||
program.
|
||
#+BEGIN_SRC fish
|
||
abbr nsxiv 'nsxiv -abfos f'
|
||
#+END_SRC
|
||
|
||
The following abbreviation is here to launch software with my Nvidia
|
||
GPU.
|
||
#+begin_src fish
|
||
abbr nv 'env __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia'
|
||
#+end_src
|
||
|
||
Finally, let's declare the following abbreviation that will launch an
|
||
MPV instance displaying my webcam:
|
||
#+BEGIN_SRC fish
|
||
abbr webcam 'devour mpv --demuxer-lavf-format=video4linux2 --demuxer-lavf-o-set=input_format=mjpeg av://v4l2:/dev/video0 --profile=low-latency --untimed'
|
||
#+END_SRC
|
||
|
||
**** 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 [[file:bin.org::#Askpass-d0d7a8c0][askpass]]). I also made it so
|
||
~please~ is an equivalent to ~sudo -A~ as a joke.
|
||
#+BEGIN_SRC fish
|
||
abbr please 'sudo -A'
|
||
#+END_SRC
|
||
|
||
**** History
|
||
I 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
|
||
|
||
**** 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 [[file:./fish.md#package-management][Package management]]).
|
||
#+NAME: tar-abbr
|
||
| abbreviation | command |
|
||
|--------------+-----------|
|
||
| compress | tar -czf |
|
||
| untar | tar -xvzf |
|
||
|
||
#+BEGIN_SRC fish
|
||
<<generate-abbr(table=tar-abbr)>>
|
||
#+END_SRC
|
||
|
||
**** exa
|
||
#+NAME: eza-abbr
|
||
| abbreviation | command |
|
||
|--------------+--------------------------------------------|
|
||
| eza | eza -halg@ --group-directories-first --git |
|
||
| lsl | eza -halg@ --group-directories-first --git |
|
||
|
||
#+BEGIN_SRC fish
|
||
<<generate-abbr(table=eza-abbr)>>
|
||
#+END_SRC
|
||
|
||
**** Network Management
|
||
First, we have just =nmcli= with sane default options, that is a pretty
|
||
output with colours.
|
||
#+BEGIN_SRC fish
|
||
abbr nmcli 'nmcli -p -c auto'
|
||
#+END_SRC
|
||
|
||
**** NordVPN
|
||
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. I also
|
||
have a couple of shortcuts to quickly connect to some preselected
|
||
countries, mainly France, Germany, Japan and the US.
|
||
#+NAME: nordvpn-abbr
|
||
| abbreviation | command |
|
||
|--------------+-------------------------|
|
||
| n | nordvpn |
|
||
| nc | nordvpn c |
|
||
| nd | nordvpn d |
|
||
| ncf | nordvpn c France |
|
||
| ncg | nordvpn c Germany |
|
||
| ncj | nordvpn c Japan |
|
||
| ncu | nordvpn c United_States |
|
||
|
||
#+BEGIN_SRC fish
|
||
<<generate-abbr(table=nordvpn-abbr)>>
|
||
#+END_SRC
|
||
|
||
**** Wget
|
||
By default, continue a download that was interrupted.
|
||
#+BEGIN_SRC fish
|
||
abbr wget 'wget --hsts-file="$XDG_DATA_HOME/wget-hsts" -c'
|
||
#+END_SRC
|
||
|
||
** Last thing before we’re done
|
||
For some reason, Fish began searching for packages when I enter a command name
|
||
wrong. For instance, if I type ~vim~, I get something like this:
|
||
#+BEGIN_SRC text :tangle no
|
||
$ vim
|
||
fish: Unknown command: vim
|
||
usr/bin/vim is owned by extra/gvim 8.2.2653-1
|
||
usr/bin/vim is owned by extra/vim 8.2.2653-1
|
||
#+END_SRC
|
||
|
||
But I don’t want that, it slows down my shell. So, in order to fix that, we need
|
||
the following lines:
|
||
#+BEGIN_SRC fish
|
||
function fish_command_not_found
|
||
__fish_default_command_not_found_handler $argv
|
||
end
|
||
#+END_SRC
|
||
|
||
Ta-dah! No more package suggestions from fish!
|
||
|
||
I also have some private abbreviations I don’t want people to know
|
||
about that I store in a separate configuration file.
|
||
#+begin_src fish
|
||
source $HOME/.config/fish/private.fish
|
||
#+end_src
|