#+TITLE: Phundrak’s dotfiles
#+AUTHOR: Lucien "Phundrak” Cartier-Tilet
#+EMAIL: phundrak@phundrak.fr
#+OPTIONS: H:4 broken_links:mark email:t ^:{} auto-id:t

# ### LaTeX ####################################################################
#+LATEX_CLASS: conlang
#+LaTeX_CLASS_OPTIONS: [a4paper,twoside]
#+LATEX_HEADER_EXTRA: \usepackage{tocloft} \setlength{\cftchapnumwidth}{3em}
#+LATEX_HEADER_EXTRA: \usepackage{xltxtra,fontspec,xunicode,svg}
#+LATEX_HEADER_EXTRA: \usepackage[total={17cm,24cm}]{geometry}
#+LATEX_HEADER_EXTRA: \setromanfont{Charis SIL}
#+LATEX_HEADER_EXTRA: \usepackage{xcolor}
#+LATEX_HEADER_EXTRA: \usepackage{hyperref}
#+LATEX_HEADER_EXTRA: \hypersetup{colorlinks=true,linkbordercolor=red,linkcolor=blue,pdfborderstyle={/S/U/W 1}}
#+LATEX_HEADER_EXTRA: \usepackage{multicol}
#+LATEX_HEADER_EXTRA: \usepackage{indentfirst}
#+LATEX_HEADER_EXTRA: \sloppy

# ### HTML #####################################################################
#+HTML_DOCTYPE: html5
#+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" />
#+HTML_HEAD_EXTRA: <script src="https://kit.fontawesome.com/4d42d0c8c5.js"></script>
#+HTML_HEAD_EXTRA: <script src="https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js"></script>
#+HTML_HEAD_EXTRA: <link rel="shortcut icon" href="https://cdn.phundrak.fr/img/mahakala-128x128.png" type="img/png" media="screen" />
#+HTML_HEAD_EXTRA: <link rel="shortcut icon" href="https://cdn.phundrak.fr/img/favicon.ico" type="image/x-icon" media="screen" />
#+HTML_HEAD_EXTRA: <meta property="og:image" content="https://cdn.phundrak.fr/img/rich_preview.png" />
#+HTML_HEAD_EXTRA: <meta name="twitter:card" content="summary" />
#+HTML_HEAD_EXTRA: <meta name="twitter:site" content="@phundrak" />
#+HTML_HEAD_EXTRA: <meta name="twitter:creator" content="@phundrak" />
#+HTML_HEAD_EXTRA: <style>.org-svg{width:auto}</style>
#+INFOJS_OPT: view:info toc:1 home:https://phundrak.fr/ toc:t
#+HTML_HEAD_EXTRA: <link rel="stylesheet" href="https://langue.phundrak.fr/css/htmlize.min.css"/>
#+HTML_HEAD_EXTRA: <link rel="stylesheet" href="https://langue.phundrak.fr/css/main.css"/>
#+HTML_HEAD_EXTRA: <script src="https://langue.phundrak.fr/js/jquery.min.js"></script>
#+HTML_HEAD_EXTRA: <script defer src="https://langue.phundrak.fr/js/main.js"></script>

* 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]]
  - [[#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]]
      - [[#networkmanager][NetworkManager]]
      - [[#wget][Wget]]

* Presentation
  :PROPERTIES:
  :CUSTOM_ID: h-c2560b46-7f97-472f-b898-5ab483832228
  :HEADER-ARGS: :tangle yes
  :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=.
   #+BEGIN_SRC fish
     set -gx PATH $HOME/.local/bin $HOME/go/bin $HOME/.cargo/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. Now, we want it to run
   in the terminal,  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 -nw
   #+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:
*** 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

     And if I want to install something, I just have to type =install=.
     #+BEGIN_SRC fish
       abbr install 'sudo pacman -Sy'
     #+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

**** NetworkManager
     :PROPERTIES:
     :CUSTOM_ID: h-5f9d4866-3086-4ed9-9ff3-d80a0af36593
     :END:
     This is  just =nmcli= with  sane default options,  that is a  pretty output
     with colors.
     #+BEGIN_SRC fish
       abbr nmcli 'nmcli -p -c auto'
     #+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
