Phundrak’s dotfiles
- Presentation
- Screenshots
- Features
- Dependencies
- Installation
- Install Arch Linux
- Install basic packages
- Execute bootstrap
- Get a correct keyboard layout
- Set our locale
- Create some folders
- Set user’s shell to fish
- Install yayif it isn’t already installed
- Setting up Emacs: Installing Spacemacs
- Set up dotfiles
- Install basic packages
- Installing Tryone’s Compton fork
- Enable some of our services
- Set up our fish shell
- Install packages from git
- Install Rust
- Clean the pacmanandyaycache
 
 
- Licence
Presentation
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 fish as my shell of choice, and Emacs using Spacemacs (still with Emacs keybinding) as my main text editor.
I also use Resloved’s fork of i3-gaps with two polybar bars and Tryone144’s fork of Compton. The colors scheme for rofi, Emacs and polybar are chosen from the wallpapers using pywal.
Screenshots
 
 
 
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.
Most of the org  files you will find in this repos are  the actual source code
  of much  of my config  files. For instance,  the Execute bootstrap  subpart of
  this file exports almost all of its code snippets to .yadm/bootstrap thanks to
  M-x  org-babel-tangle from  within  Emacs.  Below I  will  also present  and
  comment some of my short config files which  do not deserve to have a full org
  file dedicated to them.
Email signature
This file gets inserted automatically at the end of my emails.
  Lucien “Phundrak” Cartier-Tilet
  https://phundrak.fr (Français)
  https://en.phundrak.fr (English)
  Pensez à notre planète, avez-vous vraiment besoin d’imprimer ce courriel ?
  Please mind our planet, do you really need to print this email?Global gitignore
Sometimes, there are some lines that always reappear in gitignores. So, instead of always adding them, let git now that some elements are to be ignored by default, hence the ~/.gitignore_global file. First, we don’t want nano’s backup files.
  ~*
   And output binaries generated by gcc and the likes aren’t welcome either.
  ,*.outRustfmt
In my .rustfmt.toml, you can find some custom rules on how my Rust code should be formatted.
First, we are using the 2018 edition of Rust.
edition = "2018"The maximum length of enum variant having discriminant, that gets vertically aligned with others. Variants without discriminants would be ignored for the purpose of alignment.
Note that this is not how much whitespace is inserted, but instead the longest variant name that doesn't get ignored when aligning.
enum_discrim_align_threshold = 20Put single-expression functions on a single line.
fn_single_line = trueFormat code snippet included in doc comments.
format_code_in_doc_comments = trueFormat string literals where necessary.
format_strings = trueUse tab characters for indentation, spaces for alignment.
hard_tabs = trueMaximum width of each line
max_width = 80Merge multiple imports into a single nested import.
merge_imports = trueMy newline style will always be Unix.
newline_style = Unix
   Convert /* */ comments to // comments where possible.
normalize_comments = true
   Convert #![doc] and #[doc] attributes to //! and /// doc comments.
normalize_doc_attributes = true
   Reorder  impl items.  type  and  const are  put  first,  then macros  and
   methods.
reorder_impl_items = true
   Report FIXME items in comments.
report_fixme = "Always"
   Report TODO items in comments.
todo = "Always"The maximum diff of width between struct fields to be aligned with each other.
struct_field_align_threshold = 20Number of spaces per tab.
tab_spaces = 2Break comments to fit on the line.
wrap_comments = trueXresources
My Xresources file is very short. Indeed, it only contains two lines which
   are dedicated to my st terminal to set its font and shell. The font is set
   as follows.
  st.font: Source Code Pro for Powerline:style=bookAnd I will set my shell like this:
  st.shell: /usr/bin/fishI used to have lines dedicated to UXTerm and URxvt, but I cast them out of my system.
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:
- 
GNU/Emacs >= 26.2 - Spacemacs (develop branch)
- My conlanging layer
- Venmos’ w3m layer
 
- The Fish shell, using fisher
- Luke Smith’s fork of st
- Resloved’s i3-gaps-rounded fork of Airblader’s i3-gaps, itself a fork of i3
- Compton, more specificaly Tryone’s fork
- pywal
- dmenu
- j4-dmenu-desktop
- Rofi
- minted
- Rust (stable and nightly)
- LaTeX and XeTeX (texlivepackages on Arch Linux)
- tmux, based on this repo’s configuration by 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 vanilla  ISO, however I began using 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 /.
   If the computer  supports EFI bootloaders, the EFI partition  will be mounted
   on /boot. I  generally use rEFInd as  my boot manager, but if  you are more
   comfortable with  another one, just install  what you want. Be  aware that if
   you format  your /boot partition,  you will  delete all boot  managers that
   already exist; so, if  you are dual-booting, DO NOT FORMAT  IT. Yes, I made
   the mistake of wiping the Windows boot manager.
The swap partition is always at least 4GB large, and I should have a total of 12GB of combined RAM and swap. This means on my main computer I have 16GB of RAM and 4GB of swap, but on my thinkpad I have 4GB of RAM and 8GB of swap.
Get the latest live system with fast mirrors
When you boot into the live ISO, execute the following command:
  pacman -Sy reflector
  reflector --country France --country Germany --latest 200 \
            --protocol http --protocol https --sort rate \
            --save /etc/pacman.d/mirrorlistThis will update the packages from your live ISO, and you will get the best mirrors for your installation. Of course, change the countries accordingly to your location.
Install the system
Then you can use a custom script to ease your installation of Arch if you do not wish to do it manually. Personally, I’ve done it several times already, I know how the distro works, I just want to be able to install my distro quickly now.
  wget archfi.sf.net/archfi
  # Or from matmoul.github.io/archfi if SourceForge is down
  sh archfiThen, follow the  instructions and install Arch Linux.  Take the opportunity
    to install  as many packages  as you  need, mainly yay  which I use  as my
    package manager  (it is  just a  wrapper for pacman)  and AUR  helper, and
    pacman-contrib which will help us installing some packages later.
Once your system is installed, reboot and remove your installation media from your computer.
Install basic packages
We will  need some  basic packages in  order to run  the bootstrap  file. So,
   let’s install fish (our shell running the script) and git.
  sudo pacman -Sy fish git yadmExecute bootstrap
yadm comes with  a very handy feature: its bootstrap  script. We can
   execute it by running the following command:
  yadm bootstrapNotice these two header files, we can see this is a fish script, hence why we need fish (which is my daily shell anyway).
  #!/usr/bin/fish
  # -*- mode: fish -*-Let’s take a look at what it does.
Get a correct keyboard layout
I use mainly the bépo layout, a French keyboard layout inspired by Dvorak layouts, however I sometimes need to switch back to the standard French AZERTY or the American QWERTY layout, so I make it so the Menu key switches for me my layout between these three. This makes it so my xorg configuration of my keyboard looks like this:
  set keyboardconf \
  'Section "InputClass"
          Identifier "system-keyboard"
          MatchIsKeyboard "on"
          Option "XkbLayout" "fr,fr,us"
          Option "XkbModel" "pc104"
          Option "XkbVariant" "bepo,,"
          Option "XkbOptions" "grp:menu_toggle"
  EndSection'So, let’s set it as our keyboard configuration.
  printf "\n# Set keyboard layout #########################################################\n\n"
  echo $keyboardconf | sudo tee /etc/X11/xorg.conf.d/00-keyboard.confSet our locale
I use two main locales, the French and US UTF-8 locales, and I like to keep the Japanese locale activated just in case.
  set mylocales "en_US.UTF-8 UTF-8" "fr_FR.UTF-8 UTF-8" "ja_JP.UTF-8 UTF-8"Let’s enable these.
  printf "\n# Set our locale ##############################################################\n\n"
  for item in $mylocales
      if test (grep -e "#$item" /etc/locale.gen)
          sudo sed -i "/$item/s/^#//g" /etc/locale.gen
      end
  endThis is my configuration I usually use when it comes to my locale.
  set localeconf "LANG=en_US.UTF-8
  LC_COLLATE=C
  LC_NAME=fr_FR.UTF-8
  LC_NUMERIC=fr_FR.UTF-8
  LC_IDENTIFICATION=fr_FR.UTF-8
  LC_TELEPHONE=fr_FR.UTF-8
  LC_MONETARY=fr_FR.UTF-8
  LC_PAPER=fr_FR.UTF-8
  LC_ADDRESS=fr_FR.UTF-8
  LC_TIME=fr_FR.UTF-8
  LC_MEASUREMENT=fr_FR.UTF-8"Let’s set it as our system’s locale.
  echo $localeconf | sudo tee /etc/locale.confNow we can generate our locale!
  printf "\n# Generate locale #############################################################\n\n"
  sudo locale-genCreate some folders
Let’s create some folders we might need for mounting our drives, Android devices and CDs.
  printf "\n# Create directories for mounting #############################################\n\n"
  sudo mkdir -p /mnt/{USB,CD,Android}
  sudo chown $USER:(id -g $USER) /mnt/{USB,CD,Android}We also need the following folder for our nano backups.
  mkdir -p $HOME/.cache/nano/backupsSet user’s shell to fish
First of all, the bootstrap shell will set the user’s shell to fish.
  printf "\n# Set fish as the default shell ###############################################\n\n"
  chsh -s /usr/bin/fish
Install yay if it isn’t already installed
Now we’ll need to be sure yay, our AUR helper, is installed on our system.
    If it is, we don’t need to  to anything. However, if it isn’t, we’ll install
    it manually.
  if ! test which yay
      printf "\n# Installing yay ##############################################################\n\n"
      cd
      mkdir -p fromGIT
      cd fromGIT
      git clone https://aur.archlinux.org/yay.git
      cd yay
      makepkg -si --noconfirm
  else
      printf "\n# yay already installed #######################################################\n\n"
  endSetting up Emacs: Installing Spacemacs
Now, the  first thing  we want  to do  with Emacs  is install  its Spacemacs
    distribution. We’ll clone its develop branch into ~/.emacs.d. We need to
    do this prior  to our dotfiles’ cloning because of  some submodules that are
    cloned  within  our ~/.emacs.d  directory,  and  git  won’t let  us  clone
    Spacemacs in  an already existing and  non-empty directory. To make  sure it
    isn’t one, let’s delete any potentially existing ~/.emacs.d directory:
  printf "\n# Installing Spacemacs ########################################################\n\n"
  rm -rf ~/.emacs.dNow we can clone Spacemacs:
  git clone --single-branch --branch develop https://github.com/syl20bnr/spacemacs ~/.emacs.dAnd we can restore what might  have been deleted in our ~/.emacs.d/private
    directory:
  yadm checkout -- ~/.emacs.d/private/Set up dotfiles
Update our dotfiles’ remotes
This line in the bootstrap script will test if the current user is using my username. If yes, it’s probably me.
  if ! test (echo "phundrak" | sed -e "s/^.*$USER//I")If it is me installing and using these dotfiles, I want the remotes of my dotfiles to be set to ssh remotes using my ssh keys.
  printf "\n# Update yadm’s remotes #######################################################\n\n"
  yadm remote set-url origin git@labs.phundrak.fr:phundrak/dotfiles.git
  yadm remote add github git@github.com:phundrak/dotfiles.gitI will also want to decrypt my encrypted files, such as said ssh keys.
  printf "\n# Decrypt encrypted dotfiles ##################################################\n\n"
  yadm decryptFinally, let’s close this if statement.
  end
Get envtpl
Before  we set  our  dotfiles up,  let’s make  sure  envtpl is  correctly
     installed. This package will be needed for generating our alt dotfiles.
  printf '\n# Install envtpl ##############################################################\n\n'
  yay -Syu python-envtpl-gitUpdate our submodules
Now we can download the various dependencies of our dotfiles. To do so, let’s run the following command:
  printf "\n# Getting yadm susbmodules ####################################################\n\n"
  yadm submodule update --init --recursiveGenerate our alt files
Now this should be the last manipulation on our dotfiles: let’s create our alternate files:
  printf "\n# Generating alt files ########################################################\n\n"
  yadm altSymlink some system config files
We have some files in etc/ that are to be symlinked to /etc.
  for f in (find ~/.etc -type f)
      set dest (echo $f | sed -n 's/^.*etc\(.*\)$/\/etc\1/p')
      sudo ln -s $f $dest
  end
     We may also want to symlink our nanorc to the /root directory for when we
     use nano as sudo.
  read --prompt "echo 'Symlink .nanorc to root’s .nanorc? (Y/n): ' " -l nanoroot
  if test $nanoroot = 'y' || test $nanoroot = "Y" || test $nanoroot = ''
      printf "\n# Symlinking .nanorc to root’s .nanorc ########################################\n\n"
      sudo ln -s $HOME/.nanorc /root/.nanorc
  endInstall basic packages
Let’s set in a custom varible what packages we’ll be needing.
  set PACKAGES \
  acpilight asar ascii aspell-en aspell-fr assimp awesome-terminal-fonts \
  base-devel bat biber bleachbit bluez-firmware bluez-utils bookworm boost bzip2 \
  chromium clisp compton cppcheck cppreference cppreference-devhelp cpupower \
  cronie cryptsetup device-mapper diffutils discord-canary discount ditaa dmenu \
  dmenu-lpass docker docker-compose doxygen dunst dwarffortress emacs \
  exfat-utils ffmpegthumbnailer findutils firefox flake8 font-mathematica \
  fontforge freeglut fzf gcc-libs gdb gimp glibc gnome-disk-utility \
  gnome-epub-thumbnailer gnu-free-fonts gnuplot go-tools graphviz htop i3-gaps \
  i3lock-blur i3status igdm-bin inetutils j4-dmenu-desktop jfsutils jmtpfs \
  lastpass-cli less linux-headers lldb logrotate lvm2 ly-git meson minted mpc \
  mpd mpd-rich-presence-discord-git mpv mupdf-tools nano ncdu ncmpcpp \
  nemo-fileroller nemo-preview neofetch netctl networkmanager \
  networkmanager-openvpn nm-connection-editor nnn nomacs noto-fonts-emoji npm \
  ntfs-3g numlockx openssh p7zip pacman-contrib pandoc-bin pavucontrol pciutils \
  pcurses pdfpc polybar pulseaudio-bluetooth python-envtpl-git python-pip \
  python-pywal qemu r raw-thumbnailer reflector rofi rofi-wifi-menu-git rsync \
  rtv rustup s-nail samba scrot sent shadow siji-git simplescreenrecorder \
  speedcrunch sshfs st-luke-git swi-prolog texlive-most texlive-bin \
  texlive-langchinese texlive-langcyrillic texlive-langgreek \
  texlive-langjapanese texlive-langkorean texlive-latexextra \
  texlive-localmanager-git 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 valgrind vim w3m wget x11-ssh-askpass xclip xdg-user-dirs-gtk \
  xorg-drivers xorg-apps xfsprogs xorg-server xorg-xinit xss-lock yapfThese are the minimum I would have in my own installation. You can edit it however you want. Let’s install those.
  printf "\n# Installing needed packages ##################################################\n\n"
  yay -S --needed $PACKAGESInstalling Tryone’s Compton fork
For some reason, I found installing directly  this fork does not work, and I
    need  to  install  it  after  I  installed  the  regular  compton  packages.
    compton-tryone-git will replace compton which will be removed.
  printf "\n# Installing tryone’s compton fork ############################################\n\n"
  yay -S compton-tryone-gitEnable some of our services
We have installed some packages which require some services to run. Let’s enable them.
Docker
First, let’s activate Docker.
  printf "\n# Enabling and starting Docker ################################################\n\n"
  sudo systemctl enable --now docker
     Now, if we wish it, we can be  added to the docker group so we won’t have
     to type sudo each time we call Docker or Docker Compose.
  read --prompt "echo 'Do you wish to be added to the `docker` group? (Y/n): ' " -l adddockergroup
  if test $adddockergroup = 'y' || test $adddockergroup = "Y" || test $adddockergroup = ''
      sudo usermod -aG docker $USER
  endEmacs
Emacs will run as a user service, which means it won’t be launched until we log in.
  printf "\n# Enabling Emacs as user service ##############################################\n\n"
  systemctl --user enable --now emacsSSH server
Maybe we want to activate an SSH server on our machine. If so, we can enable it. Let’s ask the question.
  read --prompt "echo 'Do you want to activate the ssh server? (Y/n): ' " -l sshdserver
  if test $sshdserver = 'y' || test $sshdserver = "Y" || test $sshdserver = ''
      printf "\n# Enabling ssh server #########################################################\n\n"
      sudo systemctl enable --now sshd
  endLy
Ly is a display manager based on ncurses which I find nice enough for me to use (I generally don’t like using display managers). Let’s enable it, and let’s disable tty2 while we’re at it (Ly uses it to run X).
  sudo systemctl enable --now ly
  sudo systemctl disable getty@tty2Acpilight
acpilight is our utility managing the  brightness of our screen. There is
     actually no service to enable here, but  we must ensure the user is part of
     the video  group so we  can modify the  brightness of our  screen without
     using sudo.
  sudo usermod -aG video $USERSet up our fish shell
Install fisher
We will be using fisher as our extensions manager for Fish. Let’s install
     it.
  printf "\n# Installing fisher ###########################################################\n\n"
  curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fishInstall our extensions
I generally use the following extensions in my Fish shell.
  set FISHEXTENSIONS \
  edc/bass franciscolourenco/done jethrokuan/fzf jethrokuan/z \
  jorgebucaran/fish-getopts laughedelic/pisces matchai/spacefish \
  tuvistavie/fish-ssh-agentLet’s install these:
  fisher add $FISHEXTENSIONSInstall packages from git
Now, let’s install some packages from git directly.
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. Doing  this is probably  very bad practices  though, be
    warned.
  printf "\n# Install i3-gaps-rounded #####################################################\n\n"
  cd ~/fromGIT
  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 -j
  sudo make installPolybar Battery
Now let’s install  polybar-battery. This is a binary that  I’ll use in my
     i3 config to indicate my battery level. It also sends a notification on low
     battery and on charging completed.
  printf "\n# Install polybar-battery #####################################################\n\n"
  cd ~/fromGIT
  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
     Now, we  have our binary, let’s  symlink it in our  local binary directory,
     ~/.local/bin.
  ln -s polybar-ab ~/.local/bin/polybar-abReveal.JS
I sometimes use Reveal.JS to make  presentations, and I set its location in
     my dotspacemacs file to be in ~/fromGIT, so let’s clone it there.
  printf "\n# Install Reveal.JS ###########################################################\n\n"
  cd ~/fromGIT
  git clone https://github.com/hakimel/reveal.js.gitInstall 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.
  printf "\n# Install the rust toolchains, nightly is the default one #####################\n\n"
  rustup default nightlyThis will both download the nightly toolchain and set it as the default one. Yup, I like to live dangerously. Now to install the stable toolchain, let’s run this:
  rustup toolchain install stableInstall some utilities
We’ll need some utilities when developing Rust from Emacs, namely rustfmt
     and racer. Let’s install them with cargo.
  printf "\n# Add rust utilities ##########################################################\n\n"
  cargo install rustfmt racer
Clean the pacman and yay cache
Finally, we are almost done! Let’s clean the cache of pacman and yay.
  printf "\n# Clean the pacman and yay cache ##############################################\n\n"
  yay -Sc --noconfirmYou should now run a system pretty close to the one I have on my main computer and my thinkpad.
Licence
All of my dotfiles (and my dotfiles only) are available under the GNU GPLv3 Licence. Please consult /phundrak/dotfiles/src/commit/fb89592d20fbf56fb22ee80d026b817d9b454e58/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.