# -*- org-confirm-babel-evaluate: nil -*-
#+TITLE: Phundrak’s fish config
#+INCLUDE: headers.org
#+OPTIONS: auto-id:t
#+HTML_HEAD_EXTRA: <meta name="description" content="Phundrak's fish config" />
#+HTML_HEAD_EXTRA: <meta property="og:title" content="Phundrak's fish config" />
#+HTML_HEAD_EXTRA: <meta property="og:description" content="Description of the fish config file of Phundrak" />
#+PROPERTY: header-args:fish :tangle ~/.config/fish/config.fish :exports code :noweb yes
#+PROPERTY: header-args :exports code :tangle no
#+STARTUP: content

* Table of Contents :TOC: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]]
- [[#abbreviations][Abbreviations]]
  - [[#system-monitoring][System monitoring]]
  - [[#system-management-packages-and-services][System management (packages and services)]]
    - [[#package-management][Package management]]
    - [[#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]]
    - [[#youtube-dl-related-commands][~youtube-dl~ related commands]]
      - [[#song-download-from-youtube][Song download from YouTube]]
      - [[#videos-download-from-youtube][Videos download from YouTube]]
    - [[#mpv][MPV]]
    - [[#compression][Compression]]
    - [[#feh][Feh]]
    - [[#network-management][Network Management]]
    - [[#nordvpn][NordVPN]]
    - [[#webcam][Webcam]]
    - [[#wget][Wget]]

* Presentation
  :PROPERTIES:
  :CUSTOM_ID: h-c2560b46-7f97-472f-b898-5ab483832228
  :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
  :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
  :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
  :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
  :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=.

  #+NAME: extra-paths
  | additional path           | what it leads to                     |
  |---------------------------+--------------------------------------|
  | $HOME/.pub-cache/bin      | Dart binaries and executables        |
  | $HOME/.local/bin          | Custom executables, see [[file: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        |

  #+NAME: generate-extra-paths
  #+BEGIN_SRC emacs-lisp :var paths=extra-paths[,0] :exports none :cache yes
    (mapconcat (lambda (x) x)
               paths " ")
  #+END_SRC

  #+RESULTS[d6cf1e9d562d644db1bc6458eca1fc165b065f0c]: generate-extra-paths
  : $HOME/.pub-cache/bin $HOME/.local/bin $HOME/go/bin $HOME/.cargo/bin $HOME/.gem/ruby/2.6.0/bin

  #+BEGIN_SRC fish :noweb yes
    set -gx PATH <<generate-extra-paths()>> $PATH
  #+END_SRC

  In order  to keep some other  code clean, I  set the ~$BROWSER~ variable  so I
  don’t have to call my web browser directly but rather with this variable.
  #+BEGIN_SRC fish
    set -gx BROWSER firefox
  #+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

* Abbreviations
  :PROPERTIES:
  :CUSTOM_ID: h-740bd904-3e32-4c09-b0a4-bde16ae2e116
  :END:
  #+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

** 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.  =meminfo= is a
   call to  =free= with sane  defaults, and similar  to =meminfo=, we  also have
   =gpumeminfo= so we can  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" |
   | 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)
   :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 management
    :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. =p=. =pacman='s or =yay='s. This
    is  why I  simply type  =purge=. 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=.

    #+NAME: pm-abbr
    | abbreviation | command            |
    |--------------+--------------------|
    | remove       | sudo pacman -Rscnd |
    | p            | sudo pacman        |
    | purge        | yay -Sc            |
    | search       | yay -Ss            |

    #+BEGIN_SRC fish
      <<generate-abbr(table=pm-abbr)>>
    #+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.
    And if I  want to manipulate system  services, I can instead  type a simple
    capital =S=.
    #+NAME: service-abbr
    | abbreviation | command          |
    |--------------+------------------|
    | s            | systemctl --user |
    | S            | sudo systemctl   |

    #+BEGIN_SRC fish
      <<generate-abbr(table=service-abbr)>>
    #+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.
    #+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

*** 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.
    #+NAME: abbr-comp
    | abbreviation | command              |
    |--------------+----------------------|
    | clang        | clang -Wall          |
    | clang++      | clang++ -Wall        |
    | g++          | g++ -Wall -std=c++17 |
    | gcc          | gcc -Wall -std=c18   |

    Here is the corresponding fish configuration:
    #+BEGIN_SRC fish :tangle
      <<generate-abbr(table=abbr-comp)>>
    #+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.
    #+NAME: abbr-docker
    | abbreviation | command                   |
    |--------------+---------------------------|
    | dc           | docker-compose            |
    | dcd          | docker-compose down       |
    | dcr          | docker-compose run --rm   |
    | dcu          | docker-compose up         |
    | dcub         | docker-compose up --build |

    Here is the corresponding fish configuration:
    #+BEGIN_SRC fish
      <<generate-abbr(table=abbr-docker)>>
    #+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.
    #+NAME: abbr-git
    | abbreviation | command                                             |
    |--------------+-----------------------------------------------------|
    | randcommit   | git commit -m (curl -s whatthecommit.com/index.txt) |

    Here is the corresponding fish configuration:
    #+BEGIN_SRC fish :tangle
      <<generate-abbr(table=abbr-git)>>
    #+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.
    #+NAME: abbr-prolog
    | abbreviation | command                    |
    |--------------+----------------------------|
    | swipl        | clear && swipl -q && clear |

    Here is the corresponding fish configuration:
    #+BEGIN_SRC fish
      <<generate-abbr(table=abbr-prolog)>>
    #+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. 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). I also wish to
    completely stop  using other text editors,  such as =vi=, =vim=,  =nano= and
    =ed=, so let’s all add their command as an abbreviation for Emacs.

    #+NAME: abbr-text-ed
    | abbreviation | command            |
    |--------------+--------------------|
    | e            | emacsclient -c     |
    | enw          | emacsclient -c -nw |
    | vi           | emacsclient -c     |
    | vim          | emacsclient -c     |
    | nano         | emacsclient -c     |
    | ed           | emacsclient -c     |

    Here is the corresponding fish configuration:
    #+BEGIN_SRC fish :noweb yes
      <<generate-abbr(table=abbr-text-ed)>>
    #+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. 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
   :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.
   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                    |
   | 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
   :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.  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
   :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 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

*** ~youtube-dl~ related commands
    :PROPERTIES:
    :CUSTOM_ID: h-177d56dc-39a6-4f4c-a7ba-179dd5c6cac8
    :END:
**** 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 -o "~/Music/%(uploader)s/%(title)s.%(ext)s"'
     #+END_SRC

**** Videos download from YouTube
     :PROPERTIES:
     :CUSTOM_ID: h-e6e45b59-7620-4d17-ba32-67a33f39cc4b
     :END:
     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.
     #+BEGIN_SRC fish
       abbr ytdl 'youtube-dl -f best -ciw -o "~/Videos/YouTube/%(uploader)s/%(upload_date)s - %(title)s.%(ext)s"'
     #+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]]).
    #+NAME: tar-abbr
    | abbreviation | command   |
    |--------------+-----------|
    | compress     | tar -czf  |
    | untar        | tar -xvzf |

    #+BEGIN_SRC fish
      <<generate-abbr(table=tar-abbr)>>
    #+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

*** 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

*** NordVPN
    :PROPERTIES:
    :CUSTOM_ID: h-f35e00a2-ec5b-416d-821f-56040ad1d6b4
    :END:
    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

*** Webcam
    :PROPERTIES:
    :CUSTOM_ID: h-465adbc6-cad0-441a-9e54-f5e389e7362d
    :END:
    #+NAME: webcam-abbr
    | abbreviation | command                                                                                                          |
    |--------------+------------------------------------------------------------------------------------------------------------------|
    | webcam       | mpv --no-border --demuxer-lavf-format=video4linux2 --demuxer-lavf-o-set=input_format=mjpeg av://v4l2:/dev/video0 |

    #+BEGIN_SRC fish
      <<generate-abbr(table=webcam-abbr)>>
    #+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
