#+TITLE: Phundrak’s dotfiles
#+AUTHOR: Lucien "Phundrak” Cartier-Tilet
#+EMAIL: phundrak@phundrak.fr
#+HTML_HEAD: <meta name="description" content="Phundrak's dotfiles" />
#+HTML_HEAD: <meta property="og:title" content="Phundrak's dotfiles" />
#+HTML_HEAD: <meta property="og:description" content="Installation instructions for Phundrak's dotfiles" />
#+OPTIONS: H:4 broken_links:mark email:t ^:{} auto_id:t
#+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_DOCTYPE: html5
#+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://langue.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:
- [[#presentation][Presentation]]
- [[#features][Features]]
- [[#screenshots][Screenshots]]
- [[#dependencies][Dependencies]]
- [[#installation][Installation]]
  - [[#install-arch-linux][Install Arch Linux]]
  - [[#update-the-system][Update the system]]
  - [[#install-yay-and-all-the-official-repos-packages][Install =yay= and all the official repos’ packages]]
  - [[#set-up-yadm][Set up =yadm=]]
    - [[#get-the-dotfiles][Get the dotfiles]]
    - [[#generate-the-alt-dotfiles][Generate the alt dotfiles]]
  - [[#set-up-emacs][Set up Emacs]]
    - [[#download-spacemacs][Download Spacemacs]]
    - [[#set-the-custom-layers][Set the custom layers]]
    - [[#symlink-the-emacs-config][Symlink the Emacs config]]
  - [[#install-the-fish-shell][Install the Fish shell]]
    - [[#install-fisher][Install fisher]]
    - [[#install-the-fish-config-and-custom-functions][Install the fish config and custom functions]]
  - [[#install-the-dotfiles][Install the dotfiles]]
    - [[#update-the-submodules][Update the submodules]]
    - [[#update-the-remotes][Update the remotes]]
    - [[#symlink-the-dotfiles][Symlink the dotfiles]]
  - [[#install-packages-from-git][Install packages from git]]
    - [[#install-i3-gaps-rounded][Install =i3-gaps-rounded=]]
    - [[#install-polybar-battery][Install Polybar Battery]]
    - [[#download-revealjs][Download Reveal.JS]]
  - [[#install-rust][Install Rust]]
    - [[#install-the-toolchains][Install the toolchains]]
  - [[#clean-the-pacman-and-yay-cache][Clean the =pacman= and =yay= cache]]
- [[#licence][Licence]]

* Presentation
  [[http://spacemacs.org][file:https://cdn.rawgit.com/syl20bnr/spacemacs/442d025779da2f62fc86c2082703697714db6514/assets/spacemacs-badge.svg]]

  This is my collection of dotfiles  for my daily GNU/Linux environment, tweaked
  to  my  liking. If  you  wish  to  get the  same  setup  as mine,  follow  the
  instructions below.

  As you can see,  I personally use [[https://fishshell.com/][fish]] as my shell of  choice, and [[https://www.gnu.org/software/emacs/][Emacs]] using
  [[http://spacemacs.org][Spacemacs]] (still with Emacs keybinding) as my main text editor.

  I also  use [[https://github.com/resloved/i3][Resloved]]’s [[https://github.com/resloved/i3][fork]] of  [[https://github.com/Airblader/i3][i3-gaps]] with two [[https://github.com/jaagr/polybar][polybar]]  bars and [[https://github.com/tryone144][Tryone144]]’s
  [[https://github.com/tryone144/compton][fork]] of [[https://github.com/chjj/compton][Compton]]. The colors scheme for [[https://github.com/davatorium/rofi][rofi]], Emacs and polybar are chosen from
  the wallpapers using [[https://github.com/dylanaraps/pywal][pywal]].

* Features
  - Emacs configuration perfectly tailored for my own use
  - Beautiful and comfy i3 and polybar configuration
  - And enough information  below to get basically the same  distro install as I
    have on my main computer and my travel laptop.

* Screenshots

  [[./img/neofetch.png]]

  [[./img/emacs.png]]

  [[./img/rofi.png]]

* Dependencies
  Of course, some dependencies are needed for  my dotfiles to work well. Here is
  a non-exhaustive list of software needed by these configuration files:
  - [[https://www.gnu.org/software/emacs/][GNU/Emacs]] >= 26.2
    - [[http://spacemacs.org][Spacemacs]] (develop branch)
    - My [[https://labs.phundrak.fr/phundrak/conlang-layer][conlanging layer]]
    - [[https://github.com/venmos/w3m-layer][Venmos]]’ [[https://github.com/venmos/w3m-layer][w3m layer]]
  - The [[https://fishshell.com/][Fish shell]], using [[https://github.com/jorgebucaran/fisher][fisher]]
  - [[https://lukesmith.xyz/][Luke Smith]]’s [[https://github.com/LukeSmithxyz/st][fork]] of [[https://st.suckless.org/][st]]
  - [[https://resloved.info/][Resloved]]’s [[https://github.com/resloved/i3][i3-gaps-rounded]] fork of [[https://github.com/Airblader/i3][Airblader]]’s [[https://github.com/Airblader/i3][i3-gaps]], itself a fork of [[https://i3wm.org/][i3]]
  - [[https://github.com/yshui/compton][Compton]], more specificaly [[https://github.com/tryone144/compton][Tryone]]’s [[https://github.com/tryone144/compton][fork]]
  - [[https://github.com/dylanaraps/pywal/][pywal]]
  - [[https://tools.suckless.org/dmenu/][dmenu]]
  - [[https://github.com/enkore/j4-dmenu-desktop][j4-dmenu-desktop]]
  - [[https://github.com/davatorium/rofi][Rofi]]
  - [[https://github.com/gpoore/minted][minted]]
  - [[https://www.rust-lang.org/][Rust]] (stable and nightly)
  - [[https://www.latex-project.org/][LaTeX]] and [[http://xetex.sourceforge.net/][XeTeX]] (=texlive= packages on Arch Linux)
  - [[https://github.com/tmux/tmux][tmux]], based on [[https://github.com/gpakosz/.tmux][this repo]]’s configuration by [[https://pempek.net/][Grégory Pakosz]].
  - And a bunch of other stuff, see below
  And some other stuff scattered around in my dotfiles.

  BTW, I use Arch.

* Installation
  Here will be  presented what I do to  get my system up and running  on a fresh
  Arch Linux install.  These installation instructions were written  in order to
  get an Arch  Linux distribution up and running with  the same configuration as
  my main computer’s and my travelling laptop’s configuration.

** Install Arch Linux
   I usually install Arch from the [[https://www.archlinux.org/download/][vanilla  ISO]], however I began using [[https://github.com/MatMoul/archfi][archfi]] to
   install easily the  distro (I’ve done it  so many times, I know  how it works
   now). Usually, my  distros will be installed on at  least two partitions, one
   dedicated to =/home=, the other to the root partition =/=. When you boot into
   the live ISO, execute the following command:
   #+BEGIN_SRC sh :exports code
     wget archfi.sf.net/archfi
     # Or from matmoul.github.io/archfi if SourceForge is down
     sh archfi
   #+END_SRC
   Then, follow the instructions and install Arch Linux.

** Update the system
   First of all, let’s make sure we have a sorted mirrorlist for pacman.
   #+BEGIN_SRC fish :exports code :dir /sudo::
     pacman -Sy reflector
     reflector --country France --country Germany --latest 200 \
               --protocol http --protocol httpqs --sort rate \
               --save /etc/pacman.d/mirrorlist
   #+END_SRC

   Now, let’s update the system in  order to be sure to have the latest
   version.
   #+BEGIN_SRC fish :dir /sudo:: :exports code
     sudo pacman -Syu --noconfirm
     sudo pacman -S git emacs --needed --noconfirm
   #+END_SRC

** Install =yay= and all the official repos’ packages
   Next step  is to install  the AUR  helper =yay= (DO  NOT use =yaourt=,  it is
   discontinued,  seriously updated  and  represents a  serious security  flaw).
   Let’s clone it in a folder =fromGIT= that will be in our home folder. This is
   also where we’ll download every other packages we’ll install from git.
   #+BEGIN_SRC fish :dir ~ :exports code
     mkdir -p fromGIT
     cd fromGIT
     git clone https://aur.archlinux.org/yay.git
     cd yay
     makepkg -si --noconfirm
   #+END_SRC

   Now, we can install all the packages I usually have installed on my computer.
   #+BEGIN_SRC fish :dir /sudo:: :exports code
     yay -S --needed --noconfirm asar ascii aspell-en aspell-fr assimp \
     autoconf automake awesome-terminal-fonts bash bat biber binutils bison \
     bleachbit bluez-firmware bluez-utils bookworm boost bzip2 chromium clisp \
     compton-tryone-git coreutils cppcheck cppreference cppreference-devhelp \
     cpupower cronie cryptsetup cups device-mapper dhcpcd diffutils\
     discord-canary discount ditaa dmenu dmenu-lpass docker docker-compose \
     doxygen dwarffortress e2fsprogs emacs exfat-utils fakeroot feh \
     ffmpegthumbnailer file filesystem findutils fingerprint-gui firefox fish \
     flake8 flex font-mathematica fontforge freeglut fzf gawk gcc gcc-libs gdb \
     gettext gimp git glibc gnome-disk-utility gnome-epub-thumbnailer \
     gnu-free-fonts gnuplot go-tools grep gzip htop i3-gaps i3lock-blur \
     i3status icecat-bin igdm-bin inetutils intel-ucode iproute2 iputils \
     j4-dmenu-desktop jfsutils lastpass-cli less libnewt libtool licenses \
     light linux linux-firmware linux-headers lldb logrotate lsof lvm2 m4 make \
     man-db man-pages mate-polkit mdadm meson minted mpc mpd \
     mpd-rich-presence-discord-git mpv mupdf-tools nano nasm ncdu ncmpcpp \
     nemo-fileroller nemo-preview neofetch netctl networkmanager \
     networkmanager-openvpn nm-connection-editor nnn nomacs noto-fonts-emoji \
     npm ntfs-3g openmp openssh p7zip pacman pacman-contrib pandoc-bin patch \
     pavucontrol pciutils pcurses pdfpc perl pkgconf polybar procps-ng psmisc \
     pulseaudio-bluetooth python-envtpl-git python-pip python-pywal qemu r \
     raw-thumbnailer redshift refind-efi reflector reiserfsprogs rofi \
     rofi-wifi-menu-git rsync rtv rustup s-nail samba scrot sdl2_gfx \
     sdl2_image sdl2_mixer sdl2_ttf sed sent shadow siji-git \
     simplescreenrecorder speedcrunch sshfs st-luke-git sudo sysfsutils \
     systemd-sysvcompat tar texinfo texlive-bibtexextra texlive-bin \
     texlive-core texlive-fontsextra texlive-formatsextra texlive-games \
     texlive-humanities texlive-langchinese texlive-langcyrillic \
     texlive-langextra texlive-langgreek texlive-langjapanese \
     texlive-langkorean texlive-latexextra texlive-music texlive-pictures \
     texlive-pstricks texlive-publishers texlive-science tmux tree \
     ttf-arphic-uming ttf-baekmuk ttf-bitstream-vera ttf-dejavu \
     ttf-google-fonts-opinionated-git ttf-joypixels ttf-liberation
     ttf-material-design-icons-git ttf-ms-fonts ttf-symbola \
     ttf-tibetan-machine ttf-twemoji-color ttf-unifont unicode unicode-emoji \
     unrar usbutils util-linux valgrind vi vim vulkan-headers w3m wget which \
     whois x11-ssh-askpass xclip xdg-user-dirs-gtk xf86-input-wacom \
     xf86-video-intel xfce4-power-manager xfsprogs xorg-server xorg-xinit \
     xss-lock yadm graphviz
   #+END_SRC

   Given how many packages  will be install from the AUR,  I’ll probably have to
   type my password a few times.

** Set up =yadm=
   =yadm= is my  dotfiles manager. It has some very  interesting, including host
   and   machine-specific  files   and  file   content,  as   can  be   seen  in
   =dotfiles/.config/i3/config##yadm.j2=.

*** Get the dotfiles
    You should clone the dotfiles with the help of =yadm=. For that purpose, you
    can execute either of the two following commands.
    - From [[https://labs.phundrak.fr/phundrak/dotfiles][labs.phundrak.fr]]:
      #+BEGIN_SRC fish :dir ~ :exports code
        yadm clone https://labs.phundrak.fr/phundrak/dotfiles.git
      #+END_SRC
    - From [[https://github.com/phundrak/dotfiles][Github]]:
      #+BEGIN_SRC fish :dir ~ :exports code
        yadm clone https://gitlab.com/phundrak/dotfiles.git
      #+END_SRC

*** Generate the alt dotfiles
    =yadm= will need  to generate the host-specific dotfiles. To  do so, you can
    run the following command:
    #+BEGIN_SRC fish :dir ~ :exports code
      yadm alt
    #+END_SRC

** Set up Emacs
   The first thing to do after setting up our system is setting up Emacs.

*** Download Spacemacs
    First, let’s download Spacemacs.
    #+BEGIN_SRC fish :dir ~ :exports code
    git clone https://github.com/syl20bnr/spacemacs ~/.emacs.d
    #+END_SRC

    Let’s switch Spacemacs’ branch to =develop=.
    #+BEGIN_SRC fish :dir ~/.emacs.d :exports code
    git checkout develop
    #+END_SRC

*** Set the custom layers
    As mentionned  above, I use some  custom layers. Let’s symlink  these to the
    private folder of our =.emacs.d/= folder.
    #+BEGIN_SRC fish :dir ~/.emacs.d/private :exports code
      for d in ~/dotfiles/spacemacs-layers/*
          ln -s $d
      end
    #+END_SRC

*** Symlink the Emacs config
    Let’s not  forget our Spacemacs/Emacs config,  we’ll symlink it to  our home
    directory.
    #+BEGIN_SRC fish :dir ~ :exports code
      ln -s ~/dotfiles/.spacemacs
    #+END_SRC

** Install the Fish shell
    As mentionned above, I  use the fish shell as my main shell.  And I use some
    extensions too that I installed from fisher, and custom functions.

*** Install fisher
    Let’s install fisher:
    #+BEGIN_SRC fish :exports code
      curl https://git.io/fisher --create-dirs -sLo \
           ~/.config/fish/functions/fisher.fish
    #+END_SRC

    Awesome! Now, onto the fisher packages:
    #+BEGIN_SRC fish :exports code
      fisher add edc/bass franciscolourenco/done jethrokuan/fzf jethrokuan/z \
                 jorgebucaran/fish-getopts laughedelic/pisces \
                 matchai/spacefish tuvistavie/fish-ssh-agent
    #+END_SRC

*** Install the fish config and custom functions
    I will be symlinking my fishfile to its location =~/.config=.
    #+BEGIN_SRC fish :dir ~/.config/ :exports code
    ln -s ~/dotfiles/config.fish
    #+END_SRC

    Now,  in  the =functions=  subdirectory,  let’s  symlink  all of  my  custom
    functions.
    #+BEGIN_SRC fish :dir ~/.config/fish/functions :exports code
      for f in ~/dotfiles/fishfunctions/*.fish
          ln -s $f
      end
    #+END_SRC

** Install the dotfiles
*** Update the submodules
    Alright, let’s do  something about all these dotfiles  laying around. First,
    let’s symlink those that are in our home directory.
    #+BEGIN_SRC fish :exports code
      yadm submodule update
    #+END_SRC

*** Update the remotes
    Now, let’s make sure we have the correct remotes set up for the dotfiles.
    #+BEGIN_SRC fish :exports code :dir ~/dotfiles
      yadm remote set-url origin "git@labs.phundrak.fr:phundrak/dotfiles.git"
      yadm remote set-url github "git@github.com:phundrak/dotfiles.git"
    #+END_SRC

*** Symlink the dotfiles
    Let’s now symlink our dotfiles. First,  we’ll take care of those that should
    be symlinked to our home directory.
    #+BEGIN_SRC fish :dir ~ :exports code
      ln -s ~/dotfiles/.Xresources
      ln -s ~/dotfiles/.gitignore_global
      ln -s ~/dotfiles/.nanorc
      ln -s ~/dotfiles/rustfmt.toml
      ln -s ~/dotfiles/.signature
      ln -s ~/dotfiles/.tmux.conf.local
      ln -s ~/dotfiles/tmux/.tmux.conf
      ln -s ~/dotfiles/.config/i3 .i3
    #+END_SRC

    Finally, let’s symlink everything that belongs to the =~/.config= folder.
    #+BEGIN_SRC fish :dir ~/.config :exports code
      for elem in ~/dotfiles/.config/*
          ln -s $elem
      end
    #+END_SRC

** Install packages from git
   Now, we move on to the installation of git-based packages.

*** Install =i3-gaps-rounded=
    I know we already installed =i3-gaps=  from the AUR, why reinstall it? Well,
    that is  certainly bad practices,  but this allowed  me to already  have the
    needed dependencies for building =i3=  installed. Now, let’s clone it, build
    it,  and  install it.  It  will  required  the  password during  the  actual
    installation.
    #+BEGIN_SRC fish :dir ~/fromGIT :exports code
      git clone https://github.com/resloved/i3.git i3-gaps-rounded
      cd i3-gaps-rounded
      rm -rf build
      autoreconf --force --install
      mkdir build && cd build
      ../configure --prefix=/usr --sysconfdir=/etc --disable-sanitizers
      make
      sudo make install
    #+END_SRC

*** Install Polybar Battery
    I use a custom  tool for my battery indicator which  also launches a warning
    when  the battery  is low.  However, I  need to  build it,  since it  is not
    available in the repos nor the AUR.
    #+BEGIN_SRC fish :dir ~/fromGIT :exports code
      git clone https://github.com/drdeimos/polybar_another_battery.git
      cd polybar_another_battery
      go get -u github.com/distatus/battery/cmd/battery
      make build
    #+END_SRC

    Let’s also  create the =~/.local/bin/=  directory in  which I will  put some
    custom executables, including the executable we just built.

*** Download Reveal.JS
    Now, let’s  download [[https://revealjs.com/#/][Reveal.JS]]. I use  it for some of  my Org presentations,
    and I set it so it is found in =~/fromGIT=.
    #+BEGIN_SRC fish :dir ~/fromGIT :exports code
      git clone https://github.com/hakimel/reveal.js.git
    #+END_SRC

** Install Rust
*** Install the toolchains
    When using rust, I bounce between two toolchains, the =stable= toolchain and
    the =nightly=  toolchain. To  install them,  I will  use =rustup=  which has
    already been installed.
    #+BEGIN_SRC fish :exports code
      rustup default stable
    #+END_SRC
    This will both download the stable toolchain  and set it as the default one.
    Now to install the nightly toolchain, let’s run this:
    #+BEGIN_SRC fish :exports code
      rustup toolchain install nightly
    #+END_SRC
    This one is updated about daily (hence the name), so we’ll often have to run
    the following command:
    #+BEGIN_SRC fish :exports code
      rustup update
    #+END_SRC

** Clean the =pacman= and =yay= cache
   Finally, we are almost done! Let’s clean the cache of =pacman= and =yay=
   #+BEGIN_SRC fish :dir /sudo:: :exports code
     yay -Sc --noconfirm
   #+END_SRC

* Licence
  All of my  dotfiles (and my dotfiles  only) are available under  the GNU GPLv3
  Licence. Please  consult [[file:LICENCE.md]] for  more information. In  short: you
  are free to  access, edit and redistribute  all of my dotfiles  under the same
  licence and as allowed by the licence, and if you fuck up something, it’s your
  own responsibility.
