diff --git a/README.org b/README.org
index 8205fa1..6982fa9 100644
--- a/README.org
+++ b/README.org
@@ -45,10 +45,11 @@
- [[#screenshots][Screenshots]]
- [[#features][Features]]
- [[#custom-scripts-in-path][Custom scripts in =PATH=]]
+ - [[#emacs-configuration][Emacs configuration]]
- [[#email-signature][Email signature]]
- [[#fish-configuration-with-useful-abbreviations][Fish configuration with useful abbreviations]]
- - [[#i3-configuration][i3 configuration]]
- [[#global-gitignore][Global gitignore]]
+ - [[#i3-configuration][i3 configuration]]
- [[#nano][Nano]]
- [[#configuration][Configuration]]
- [[#included-configuration-file][Included configuration file]]
@@ -57,47 +58,6 @@
- [[#xresources][Xresources]]
- [[#dependencies][Dependencies]]
- [[#installation][Installation]]
- - [[#install-arch-linux][Install Arch Linux]]
- - [[#get-the-latest-live-system-with-fast-mirrors][Get the latest live system with fast mirrors]]
- - [[#install-the-system][Install the system]]
- - [[#install-basic-packages][Install basic packages]]
- - [[#execute-bootstrap][Execute bootstrap]]
- - [[#decrypt-private-yadm-files][Decrypt private yadm files]]
- - [[#get-a-correct-keyboard-layout][Get a correct keyboard layout]]
- - [[#set-our-locale][Set our locale]]
- - [[#create-some-folders][Create some folders]]
- - [[#set-users-shell-to-fish][Set user’s shell to fish]]
- - [[#install-yay-if-it-isnt-already-installed][Install =yay= if it isn’t already installed]]
- - [[#install-basic-packages-1][Install basic packages]]
- - [[#setting-up-emacs-installing-spacemacs][Setting up Emacs: Installing Spacemacs]]
- - [[#set-up-dotfiles][Set up dotfiles]]
- - [[#update-our-dotfiles-remotes][Update our dotfiles’ remotes]]
- - [[#get-envtpl][Get =envtpl=]]
- - [[#update-our-submodules][Update our submodules]]
- - [[#generate-our-alt-files][Generate our alt files]]
- - [[#installing-tryones-compton-fork][Installing Tryone’s Compton fork]]
- - [[#enable-some-of-our-services][Enable some of our services]]
- - [[#docker][Docker]]
- - [[#emacs][Emacs]]
- - [[#ssh-server][SSH server]]
- - [[#ly][Ly]]
- - [[#acpilight][Acpilight]]
- - [[#nordvpn][NordVPN]]
- - [[#symlink-some-system-config-files][Symlink some system config files]]
- - [[#set-up-our-fish-shell][Set up our fish shell]]
- - [[#install-fisher][Install =fisher=]]
- - [[#install-our-extensions][Install our extensions]]
- - [[#install-packages-from-git][Install packages from git]]
- - [[#i3-gaps-rounded][i3-gaps rounded]]
- - [[#polybar-battery][Polybar Battery]]
- - [[#revealjs][Reveal.JS]]
- - [[#install-rust][Install Rust]]
- - [[#install-the-toolchains][Install the toolchains]]
- - [[#install-some-utilities][Install some utilities]]
- - [[#install-some-python-packages][Install some python packages]]
- - [[#install-go-packages][Install go packages]]
- - [[#set-up-chicken-scheme-interpretercompiler][Set up Chicken (Scheme interpreter/compiler)]]
- - [[#clean-the-pacman-and-yay-cache][Clean the =pacman= and =yay= cache]]
- [[#licence][Licence]]
* Presentation
@@ -157,10 +117,22 @@
I have written some scripts that help me daily accomplish some simple tasks,
like mounting and unmounting a drive or Android device, an emoji picker, a
utility to set up my Wacom tablet, and so on. You can find them stored in
- [[file:.local/bin][.local/bin]] along with their detailed explanation in the [[file:.local/bin/README.org][README]] placed in the
+ [[file:.local/bin/README.org][.local/bin]] along with their detailed explanation in the README placed in the
same folder —which is actually their source code once the org-mode file gets
tangled.
+** Emacs configuration
+ :PROPERTIES:
+ :CUSTOM_ID: h-f6d2561f-5c02-4540-8287-4acf3037b3d5
+ :END:
+ Emacs is my main text editor, which I use for almost everything. Because, you
+ know…
+ #+begin_quote
+ Emacs is a great operating system, it just lacks a good text editor.
+ #+end_quote
+ You can find my Emacs config, based on Spacemacs, in my [[https://labs.phundrak.com/phundrak/dotfiles/.spacemacs][.spacemacs]] file, and
+ my user configuration in my [[file:spacemacs.org][spacemacs.org]] file.
+
** Email signature
:PROPERTIES:
:CUSTOM_ID: h-f6c48286-a320-493f-b330-ee0a697e6d79
@@ -180,16 +152,9 @@
:PROPERTIES:
:CUSTOM_ID: h-f35ed9a3-c9fc-458c-8a62-693f679f6992
:END:
- You can also find in [[file:.config/fish][.config/fish]] my Fish shell configuration, which contains
+ You can also find in [[file:.config/fish/README.org][.config/fish]] my Fish shell configuration, which contains
my usual abbreviations.
-** i3 configuration
- :PROPERTIES:
- :CUSTOM_ID: h-c918e370-d867-412c-8b0e-078e4e3772e0
- :END:
- The i3 configuration is detailed in its corresponding README which you can
- find at [[file:.config/i3/README.org][.config/i3/README.org]].
-
** Global gitignore
:PROPERTIES:
:CUSTOM_ID: h-4f92eb29-7cfa-48ec-b39d-39037ace3682
@@ -208,6 +173,13 @@
,*.out
#+END_SRC
+** i3 configuration
+ :PROPERTIES:
+ :CUSTOM_ID: h-c918e370-d867-412c-8b0e-078e4e3772e0
+ :END:
+ The i3 configuration is detailed in its corresponding README which you can
+ find at [[file:.config/i3/README.org][.config/i3/README.org]].
+
** Nano
:PROPERTIES:
:CUSTOM_ID: h-1724166b-55b7-4a64-9ff1-47c2a9e76f46
@@ -479,673 +451,10 @@
:PROPERTIES:
:CUSTOM_ID: h-bfb2e09b-d5d7-4d6f-8b29-763c49b3fd09
:END:
- 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
- :PROPERTIES:
- :CUSTOM_ID: h-cfe21de6-15fa-477a-a5ff-6cd81dfead19
- :END:
- 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 =/=.
-
- 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
- :PROPERTIES:
- :CUSTOM_ID: h-da7951ee-e39a-4a59-a05d-7b7fffdc7825
- :END:
- When you boot into the live ISO, execute the following command:
- #+BEGIN_SRC sh :exports code
- pacman -Sy reflector
- reflector -c France -c Germany -l 200 -p http -p https --sort rate \
- --save /etc/pacman.d/mirrorlist --verbose
- #+END_SRC
- This 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
- :PROPERTIES:
- :CUSTOM_ID: h-9f9e1fe5-4726-486b-9875-5fcfd91d0bb0
- :END:
- 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.
- #+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. 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
- :PROPERTIES:
- :CUSTOM_ID: h-d2485595-3014-4151-a76c-63bc353359a8
- :END:
- 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=.
- #+BEGIN_SRC sh :exports code
- sudo pacman -Sy fish git yadm
- #+END_SRC
-
-** Execute bootstrap
- :PROPERTIES:
- :CUSTOM_ID: h-c13d132f-9e69-4bb0-838b-29c7c5611f11
- :HEADER-ARGS: :tangle ~/.config/yadm/bootstrap :exports code
- :END:
- =yadm= comes with a very handy feature: its bootstrap script. We can
- execute it by running the following command:
- #+BEGIN_SRC fish :tangle no
- yadm bootstrap
- #+END_SRC
-
- Notice these two header files, we can see this is a fish script, hence why we
- need fish (which is my daily shell anyway).
- #+BEGIN_SRC fish
- #!/usr/bin/fish
- # -*- mode: fish -*-
- #+END_SRC
- Let’s take a look at what it does.
-
-*** Decrypt private yadm files
- :PROPERTIES:
- :CUSTOM_ID: h-2ce7e756-3dab-4c12-a3b3-d1b6f8d4805d
- :END:
- Some private files are stored encrypted in the repository of my yadm
- dotfiles. I will need them later on during the bootstrap execution.
- #+BEGIN_SRC fish
- yadm decrypt
- #+END_SRC
-
-*** Get a correct keyboard layout
- :PROPERTIES:
- :CUSTOM_ID: h-89fb8f3a-6ec4-4701-a5d9-3e593c47ece9
- :END:
- I use mainly the [[https://bepo.fr/wiki/Accueil][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:
- #+BEGIN_SRC fish
- 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'
- #+END_SRC
- So, let’s set it as our keyboard configuration.
- #+BEGIN_SRC fish
- printf "\n# Set keyboard layout #########################################################\n\n"
- echo $keyboardconf | sudo tee /etc/X11/xorg.conf.d/00-keyboard.conf
- #+END_SRC
-
-*** Set our locale
- :PROPERTIES:
- :CUSTOM_ID: h-48678405-93ae-41b6-b44b-285ab0da4e92
- :END:
- I use two main locales, the French and US UTF-8 locales, and I like to keep
- the Japanese locale activated just in case.
- #+BEGIN_SRC fish
- set mylocales "en_US.UTF-8 UTF-8" "fr_FR.UTF-8 UTF-8" "ja_JP.UTF-8 UTF-8"
- #+END_SRC
- Let’s enable these.
- #+BEGIN_SRC fish
- 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
- end
- #+END_SRC
-
- This is my configuration I usually use when it comes to my locale.
- #+BEGIN_SRC fish
- 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"
- #+END_SRC
- Let’s set it as our system’s locale.
- #+BEGIN_SRC fish
- echo $localeconf | sudo tee /etc/locale.conf
- #+END_SRC
- Now we can generate our locale!
- #+BEGIN_SRC fish
- printf "\n# Generate locale #############################################################\n\n"
- sudo locale-gen
- #+END_SRC
-
-*** Create some folders
- :PROPERTIES:
- :CUSTOM_ID: h-85ce90ff-56dc-469b-bf08-480ecf27acc4
- :END:
- Let’s create some folders we might need for mounting our drives, Android
- devices and CDs.
- #+BEGIN_SRC fish
- 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}
- #+END_SRC
-
- We also need the following folder for our nano backups.
- #+BEGIN_SRC fish
- mkdir -p $HOME/.cache/nano/backups
- #+END_SRC
-
-*** Set user’s shell to fish
- :PROPERTIES:
- :CUSTOM_ID: h-c1a78394-c156-4a03-ae82-e5e9d4090dab
- :END:
- First of all, the bootstrap shell will set the user’s shell to fish.
- #+BEGIN_SRC fish
- printf "\n# Set fish as the default shell ###############################################\n\n"
- chsh -s /usr/bin/fish
- #+END_SRC
-
-*** Install =yay= if it isn’t already installed
- :PROPERTIES:
- :CUSTOM_ID: h-fef57cea-cf1d-4900-9d90-ec6353ea9661
- :END:
- 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.
- #+BEGIN_SRC fish
- 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"
- end
- #+END_SRC
-
-*** Install basic packages
- :PROPERTIES:
- :CUSTOM_ID: h-887ec6d4-535d-4363-a0a7-884717b87a47
- :END:
- Let’s set in a custom varible what packages we’ll be needing.
- #+BEGIN_SRC fish
- set PACKAGES
-
- acpilight adobe-source-han-sans-jp-fonts asar ascii aspell-en aspell-fr assimp \
- awesome-terminal-fonts base-devel bat biber bleachbit bluez-firmware \
- bluez-utils bookworm boost bzip2 ccls chicken chromium clisp compton cppcheck \
- cppreference cppreference-devhelp cpupower cronie cryptsetup device-mapper \
- diffutils discord-canary discount ditaa dmenu dmenu-lpass docker \
- docker-compose dockerfile-language-server-bin doxygen dunst dwarffortress \
- emacs exfat-utils farbfeld feh 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 \
- golangci-lint-bin graphviz htop i3-gaps i3lock-blur i3status igdm-bin \
- inetutils j4-dmenu-desktop javascript-typescript-langserver js-beautify \
- 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 neovim netctl networkmanager \
- networkmanager-openvpn nm-connection-editor nnn nodejs-vmd nomacs nordvpn-bin \
- noto-fonts-emoji npm ntfs-3g numlockx openssh otf-fandol otf-ipafont p7zip \
- pacman-contrib pandoc-bin pavucontrol pciutils pcurses pdfpc polybar prettier \
- pulseaudio-bluetooth python-autoflake python-envtpl-git python-epc \
- python-importmagic python-language-server python-nose python-pip python-ptvsd \
- python-pytest python-pywal qt5-imageformats 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-bin texlive-langchinese texlive-langcyrillic texlive-langgreek \
- texlive-langjapanese texlive-langkorean texlive-latexextra \
- texlive-localmanager-git texlive-most tmux tree ttf-arphic-uming ttf-baekmuk \
- ttf-bitstream-vera ttf-dejavu ttf-google-fonts-opinionated-git ttf-hanazono \
- ttf-joypixels ttf-koruri ttf-liberation ttf-material-design-icons-git \
- ttf-monapo ttf-mplus ttf-ms-fonts ttf-sazanami ttf-symbola ttf-tibetan-machine \
- ttf-twemoji-color ttf-unifont ttf-vlgothic typescript \
- typescript-language-server-bin unicode unicode-emoji unrar usbutils valgrind \
- vscode-css-languageserver-bin vscode-html-languageserver-bin w3m wget \
- x11-ssh-askpass xclip xdg-user-dirs-gtk xfsprogs xorg-apps xorg-drivers \
- xorg-server xorg-xinit xss-lock xvkbd yaml-language-server-bin yapf
- #+END_SRC
- These are the minimum I would have in my own installation. You can edit it
- however you want. Let’s install those.
- #+BEGIN_SRC fish
- printf "\n# Installing needed packages ##################################################\n\n"
- sudo pacman -Syu
- yay -S --needed $PACKAGES
- #+END_SRC
-
-*** Setting up Emacs: Installing Spacemacs
- :PROPERTIES:
- :CUSTOM_ID: h-bd5a92c4-1a4f-49ea-a447-050a4ff0301c
- :END:
- 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:
- #+BEGIN_SRC fish
- printf "\n# Installing Spacemacs ########################################################\n\n"
- rm -rf ~/.emacs.d
- #+END_SRC
- Now we can clone Spacemacs:
- #+BEGIN_SRC fish
- git clone --single-branch --branch develop https://github.com/syl20bnr/spacemacs ~/.emacs.d
- #+END_SRC
- And we can restore what might have been deleted in our =~/.emacs.d/private=
- directory:
- #+BEGIN_SRC fish
- yadm checkout -- ~/.emacs.d/private/
- #+END_SRC
-
-*** Set up dotfiles
- :PROPERTIES:
- :CUSTOM_ID: h-cf2c3a24-b08e-4b07-9d51-31f6df781e62
- :END:
-**** Update our dotfiles’ remotes
- :PROPERTIES:
- :CUSTOM_ID: h-18967335-2637-44d6-b407-bb1d2d2718b9
- :END:
- This line in the bootstrap script will test if the current user is using my
- username. If yes, it’s probably me.
- #+BEGIN_SRC fish
- if ! test (echo "phundrak" | sed -e "s/^.*$USER//I")
- #+END_SRC
- 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.
- #+BEGIN_SRC fish
- printf "\n# Update yadm’s remotes #######################################################\n\n"
- yadm remote set-url origin git@labs.phundrak.com:phundrak/dotfiles.git
- yadm remote add github git@github.com:phundrak/dotfiles.git
- #+END_SRC
- I will also want to decrypt my encrypted files, such as said ssh keys.
- #+BEGIN_SRC fish
- printf "\n# Decrypt encrypted dotfiles ##################################################\n\n"
- yadm decrypt
- #+END_SRC
- Finally, let’s close this =if= statement.
- #+BEGIN_SRC fish
- end
- #+END_SRC
-
-**** Get =envtpl=
- :PROPERTIES:
- :CUSTOM_ID: h-39034878-7864-4a1c-855d-d9882795aac0
- :END:
- Before we set our dotfiles up, let’s make sure =envtpl= is correctly
- installed. This package will be needed for generating our alt dotfiles.
- #+BEGIN_SRC fish
- printf '\n# Install envtpl ##############################################################\n\n'
- yay -Syu python-envtpl-git
- #+END_SRC
-
-**** Update our submodules
- :PROPERTIES:
- :CUSTOM_ID: h-ae2f8ccb-a8f3-4699-832c-52cbc8b6d081
- :END:
- Now we can download the various dependencies of our dotfiles. To do so,
- let’s run the following command:
- #+BEGIN_SRC fish
- printf "\n# Getting yadm susbmodules ####################################################\n\n"
- yadm submodule update --init --recursive
- #+END_SRC
-
-**** Generate our alt files
- :PROPERTIES:
- :CUSTOM_ID: h-f924c003-a15c-4132-891f-36cd3948a7c1
- :END:
- Now this should be the last manipulation on our dotfiles: let’s create our
- alternate files:
- #+BEGIN_SRC fish
- printf "\n# Generating alt files ########################################################\n\n"
- yadm alt
- #+END_SRC
-
-*** Installing Tryone’s Compton fork
- :PROPERTIES:
- :CUSTOM_ID: h-aecf9f01-268c-40cd-8fc3-622c6ce822e4
- :END:
- 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.
- #+BEGIN_SRC fish
- printf "\n# Installing tryone’s compton fork ############################################\n\n"
- yay -S compton-tryone-git
- #+END_SRC
-
-*** Enable some of our services
- :PROPERTIES:
- :CUSTOM_ID: h-1044da09-e992-4dcb-90ff-513725e1d450
- :END:
- We have installed some packages which require some services to run. Let’s
- enable them.
-
-**** Docker
- :PROPERTIES:
- :CUSTOM_ID: h-429cb31a-fccb-420f-a5aa-21054c45fb38
- :END:
- First, let’s activate Docker.
- #+BEGIN_SRC fish
- printf "\n# Enabling and starting Docker ################################################\n\n"
- sudo systemctl enable --now docker
- #+END_SRC
-
- 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.
- #+BEGIN_SRC fish
- 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
- end
- #+END_SRC
-
-**** Emacs
- :PROPERTIES:
- :CUSTOM_ID: h-7131fa13-3c6e-4cfc-b8e8-c880de9d380f
- :END:
- Emacs will run as a user service, which means it won’t be launched until we
- log in.
- #+BEGIN_SRC fish
- printf "\n# Enabling Emacs as user service ##############################################\n\n"
- systemctl --user enable --now emacs
- #+END_SRC
-
-**** SSH server
- :PROPERTIES:
- :CUSTOM_ID: h-1f355779-f1dc-4c0f-9cf1-14724ce05f4d
- :END:
- Maybe we want to activate an SSH server on our machine. If so, we can
- enable it. Let’s ask the question.
- #+BEGIN_SRC fish
- 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
- end
- #+END_SRC
-
-**** Ly
- :PROPERTIES:
- :CUSTOM_ID: h-2785fc5b-cd35-4c99-9f47-3dcbf1a7a870
- :END:
- 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).
- #+BEGIN_SRC fish
- sudo systemctl enable --now ly
- sudo systemctl disable getty@tty2
- #+END_SRC
-
-**** Acpilight
- :PROPERTIES:
- :CUSTOM_ID: h-5423e2a7-d2ce-4bc3-9d5d-85677c18181e
- :END:
- =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=.
- #+BEGIN_SRC fish
- sudo usermod -aG video $USER
- #+END_SRC
-
-**** NordVPN
- :PROPERTIES:
- :CUSTOM_ID: h-49c24a3e-a496-4200-bf64-96e945c203a0
- :END:
- Thanks to the AUR package ~nordvpn-bin~, I no longer have to manually
- maintain my VPN connections manually with OpenVPN. However, it requires a
- service that we should activate:
- #+BEGIN_SRC fish
- sudo systemctl enable --now nordvpnd
- #+END_SRC
-
-*** Symlink some system config files
- :PROPERTIES:
- :CUSTOM_ID: h-b14d7d03-da49-4a7b-ba05-1c0848bd8e44
- :END:
- We have some files in [[file:ect/][etc/]] that are to be symlinked to =/etc=.
- #+BEGIN_SRC fish
- for f in (find ~/.etc -type f)
- set dest (echo $f | sed -n 's/^.*etc\(.*\)$/\/etc\1/p')
- sudo ln -s $f $dest
- end
- #+END_SRC
-
- We may also want to symlink our [[file:.nanorc][nanorc]] to the =/root= directory for when we
- use =nano= as =sudo=.
- #+BEGIN_SRC fish
- 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
- end
- #+END_SRC
-
-*** Set up our fish shell
- :PROPERTIES:
- :CUSTOM_ID: h-f6f4df67-b0de-40bf-95fb-888d42169088
- :END:
-**** Install =fisher=
- :PROPERTIES:
- :CUSTOM_ID: h-d6490ddc-c909-4713-b36a-19c25a79c7ac
- :END:
- We will be using =fisher= as our extensions manager for Fish. Let’s install
- it.
- #+BEGIN_SRC fish
- printf "\n# Installing fisher ###########################################################\n\n"
- curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish
- #+END_SRC
-
-**** Install our extensions
- :PROPERTIES:
- :CUSTOM_ID: h-3d540273-bdfb-4c63-a05f-2374a010dc29
- :END:
- I generally use the following extensions in my Fish shell.
- #+BEGIN_SRC fish
- set FISHEXTENSIONS \
- edc/bass franciscolourenco/done jethrokuan/fzf jethrokuan/z \
- jorgebucaran/fish-getopts laughedelic/pisces matchai/spacefish \
- tuvistavie/fish-ssh-agent
- #+END_SRC
- Let’s install these:
- #+BEGIN_SRC fish
- fisher add $FISHEXTENSIONS
- #+END_SRC
-
-*** Install packages from git
- :PROPERTIES:
- :CUSTOM_ID: h-e79da7b2-9286-4b66-812e-453e3b2505c7
- :END:
- Now, let’s install some packages from git directly.
-
-**** i3-gaps rounded
- :PROPERTIES:
- :CUSTOM_ID: h-10e229f7-9a45-4401-a9c0-3f974482bb9f
- :END:
- 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.
- #+BEGIN_SRC fish
- 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 install
- #+END_SRC
-
-**** Polybar Battery
- :PROPERTIES:
- :CUSTOM_ID: h-f228ec52-a7d0-4c16-adfa-75c544fcfa93
- :END:
- Now let’s install =polybar-battery=. This is a binary that I’ll use in my
- [[file:.config/i3/config][i3 config]] to indicate my battery level. It also sends a notification on low
- battery and on charging completed.
- #+BEGIN_SRC fish
- 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
- #+END_SRC
-
- Now, we have our binary, let’s symlink it in our local binary directory,
- =~/.local/bin=.
- #+BEGIN_SRC fish
- ln -s polybar-ab ~/.local/bin/polybar-ab
- #+END_SRC
-
-**** Reveal.JS
- :PROPERTIES:
- :CUSTOM_ID: h-68d1cdb4-1447-420f-ab0c-53ef905e757b
- :END:
- I sometimes use Reveal.JS to make presentations, and I set its location in
- my [[file:.spacemacs][dotspacemacs]] file to be in =~/fromGIT=, so let’s clone it there.
- #+BEGIN_SRC fish
- printf "\n# Install Reveal.JS ###########################################################\n\n"
- cd ~/fromGIT
- git clone https://github.com/hakimel/reveal.js.git
- #+END_SRC
-
-*** Install Rust
- :PROPERTIES:
- :CUSTOM_ID: h-57e8af4c-93f2-4145-9c39-a5f8d1c9f012
- :END:
-**** Install the toolchains
- :PROPERTIES:
- :CUSTOM_ID: h-05ee25dc-3885-46ca-afaf-35bfb2e385d4
- :END:
- 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
- printf "\n# Install the rust toolchains, nightly is the default one #####################\n\n"
- rustup default nightly
- #+END_SRC
- This 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:
- #+BEGIN_SRC fish
- rustup toolchain install stable
- #+END_SRC
-
-**** Install some utilities
- :PROPERTIES:
- :CUSTOM_ID: h-f94f2e18-623f-4aa5-be99-6a7df6a9cbcd
- :END:
- We’ll need some utilities when developing Rust from Emacs, namely =rustfmt=
- and =racer=. Let’s install them with =cargo=.
- #+BEGIN_SRC fish
- printf "\n# Add rust utilities ##########################################################\n\n"
- cargo install rustfmt racer
- #+END_SRC
-
- We will also need some components for development purposes:
- #+BEGIN_SRC fish
- rustup component add src
- rustup component add rls
- #+END_SRC
-
-*** Install some python packages
- :PROPERTIES:
- :CUSTOM_ID: h-8155ae1a-0be1-489f-be13-9222f7686fb2
- :END:
- Some packages will be needed from pip in order to get our Emacs setup
- correctly working. Let’s install them locally for our user:
- #+BEGIN_SRC fish
- pip install --user pyls-isort pyls-mypy
- #+END_SRC
-
-*** Install go packages
- :PROPERTIES:
- :CUSTOM_ID: h-8c6e2311-eb84-4bf4-8e0b-948f89bc9664
- :END:
- For go development from Emacs, the Spacemacs go and lsp layers requires some
- packages to be installed.
- #+BEGIN_SRC fish
- go get -v golang.org/x/tools/gopls@latest
- go get -u -v golang.org/x/tools/cmd/godoc
- go get -u -v golang.org/x/tools/cmd/goimports
- go get -u -v golang.org/x/tools/cmd/gorename
- go get -u -v golang.org/x/tools/cmd/guru
- go get -u -v github.com/cweill/gotests/...
- go get -u -v github.com/davidrjenni/reftools/cmd/fillstruct
- go get -u -v github.com/fatih/gomodifytags
- go get -u -v github.com/godoctor/godoctor
- go get -u -v github.com/golangci/golangci-lint/cmd/golangci-lint
- go get -u -v github.com/haya14busa/gopkgs/cmd/gopkgs
- go get -u -v github.com/josharian/impl
- go get -u -v github.com/mdempsky/gocode
- go get -u -v github.com/rogpeppe/godef
- go get -u -v github.com/zmb3/gogetdoc
- go get -u -v golang.org/x/tools/gopls
- #+END_SRC
-
-*** Set up Chicken (Scheme interpreter/compiler)
- :PROPERTIES:
- :CUSTOM_ID: h-10ffb0c0-8028-4e9c-842e-9e7d2c165c5b
- :END:
- Chicken needs to be set up before being used. First, we need to install its
- documentation.
- #+BEGIN_SRC fish
- chicken-install -s apropos chicken-doc
- #+END_SRC
-
- Then, we’ll complete the documentation like so:
- #+BEGIN_SRC fish
- cd (chicken-csi -b -e "(import (chicken platform))" -p "(chicken-home)")
- curl https://3e8.org/pub/chicken-doc/chicken-doc-repo.tgz | sudo tar zx
- #+END_SRC
-
-*** Clean the =pacman= and =yay= cache
- :PROPERTIES:
- :CUSTOM_ID: h-fa5307ec-065b-4d06-9d47-05ccde0da8ac
- :END:
- Finally, we are almost done! Let’s clean the cache of =pacman= and =yay=.
- #+BEGIN_SRC fish
- printf "\n# Clean the pacman and yay cache ##############################################\n\n"
- yay -Sc --noconfirm
- #+END_SRC
- You should now run a system pretty close to the one I have on my main
- computer and my thinkpad.
+ For an installation walkthrough of my Arch Linux installation, check out my
+ [[file:installation.org][installation.org]] file where I walk you through the first manual steps and
+ through the bootstrap you can execute to automatically take care of a lot of
+ elements.
* Licence
:PROPERTIES:
diff --git a/installation.org b/installation.org
new file mode 100644
index 0000000..c3d3ab8
--- /dev/null
+++ b/installation.org
@@ -0,0 +1,758 @@
+#+TITLE: Install a Phundrak-flavored Arch Linux
+#+AUTHOR: Lucien "Phundrak” Cartier-Tilet
+#+EMAIL: lucien@phundrak.com
+#+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:
+#+HTML_HEAD_EXTRA:
+#+HTML_HEAD_EXTRA:
+#+HTML_HEAD_EXTRA:
+#+HTML_HEAD_EXTRA:
+#+HTML_HEAD_EXTRA:
+#+HTML_HEAD_EXTRA:
+#+HTML_HEAD_EXTRA:
+#+HTML_HEAD_EXTRA:
+#+HTML_HEAD_EXTRA:
+#+HTML_HEAD_EXTRA:
+#+HTML_HEAD_EXTRA:
+#+INFOJS_OPT: view:info toc:1 home:https://phundrak.com/config toc:t
+#+HTML_HEAD_EXTRA:
+#+HTML_HEAD_EXTRA:
+#+HTML_HEAD_EXTRA:
+#+HTML_HEAD_EXTRA:
+
+* Table of Contents :TOC_4_gh:noexport:
+ :PROPERTIES:
+ :CUSTOM_ID: h-400070eb-725f-4416-a4c6-da3053df750b
+ :END:
+
+- [[#introduction][Introduction]]
+- [[#install-arch-linux][Install Arch Linux]]
+ - [[#get-the-latest-live-system-with-fast-mirrors][Get the latest live system with fast mirrors]]
+ - [[#install-the-system][Install the system]]
+- [[#install-basic-packages][Install basic packages]]
+- [[#execute-bootstrap][Execute bootstrap]]
+ - [[#decrypt-private-yadm-files][Decrypt private yadm files]]
+ - [[#get-a-correct-keyboard-layout][Get a correct keyboard layout]]
+ - [[#set-our-locale][Set our locale]]
+ - [[#create-some-folders][Create some folders]]
+ - [[#set-users-shell-to-fish][Set user’s shell to fish]]
+ - [[#install-yay-if-it-isnt-already-installed][Install =yay= if it isn’t already installed]]
+ - [[#install-basic-packages-1][Install basic packages]]
+ - [[#setting-up-emacs-installing-spacemacs][Setting up Emacs: Installing Spacemacs]]
+ - [[#set-up-dotfiles][Set up dotfiles]]
+ - [[#update-our-dotfiles-remotes][Update our dotfiles’ remotes]]
+ - [[#get-envtpl][Get =envtpl=]]
+ - [[#update-our-submodules][Update our submodules]]
+ - [[#generate-our-alt-files][Generate our alt files]]
+ - [[#installing-tryones-compton-fork][Installing Tryone’s Compton fork]]
+ - [[#enable-some-of-our-services][Enable some of our services]]
+ - [[#docker][Docker]]
+ - [[#emacs][Emacs]]
+ - [[#ssh-server][SSH server]]
+ - [[#ly][Ly]]
+ - [[#acpilight][Acpilight]]
+ - [[#nordvpn][NordVPN]]
+ - [[#symlink-some-system-config-files][Symlink some system config files]]
+ - [[#set-up-our-fish-shell][Set up our fish shell]]
+ - [[#install-fisher][Install =fisher=]]
+ - [[#install-our-extensions][Install our extensions]]
+ - [[#install-packages-from-git][Install packages from git]]
+ - [[#i3-gaps-rounded][i3-gaps rounded]]
+ - [[#polybar-battery][Polybar Battery]]
+ - [[#revealjs][Reveal.JS]]
+ - [[#install-rust][Install Rust]]
+ - [[#install-the-toolchains][Install the toolchains]]
+ - [[#install-some-utilities][Install some utilities]]
+ - [[#install-some-python-packages][Install some python packages]]
+ - [[#install-go-packages][Install go packages]]
+ - [[#set-up-chicken-scheme-interpretercompiler][Set up Chicken (Scheme interpreter/compiler)]]
+ - [[#clean-the-pacman-and-yay-cache][Clean the =pacman= and =yay= cache]]
+
+* Introduction
+ :PROPERTIES:
+ :CUSTOM_ID: h-12a4ef6d-13b6-4d1f-9e0f-a060b63b12d4
+ :END:
+ 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
+ :PROPERTIES:
+ :CUSTOM_ID: h-cfe21de6-15fa-477a-a5ff-6cd81dfead19
+ :END:
+ 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 =/=.
+
+ 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
+ :PROPERTIES:
+ :CUSTOM_ID: h-da7951ee-e39a-4a59-a05d-7b7fffdc7825
+ :END:
+ When you boot into the live ISO, execute the following command:
+ #+BEGIN_SRC sh :exports code
+ pacman -Sy reflector
+ reflector -c France -c Germany -l 200 -p http -p https --sort rate \
+ --save /etc/pacman.d/mirrorlist --verbose
+ #+END_SRC
+ This 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
+ :PROPERTIES:
+ :CUSTOM_ID: h-9f9e1fe5-4726-486b-9875-5fcfd91d0bb0
+ :END:
+ 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.
+ #+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. 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
+ :PROPERTIES:
+ :CUSTOM_ID: h-d2485595-3014-4151-a76c-63bc353359a8
+ :END:
+ 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=.
+ #+BEGIN_SRC sh :exports code
+ sudo pacman -Sy fish git yadm
+ #+END_SRC
+
+* Execute bootstrap
+ :PROPERTIES:
+ :CUSTOM_ID: h-c13d132f-9e69-4bb0-838b-29c7c5611f11
+ :HEADER-ARGS: :tangle ~/.config/yadm/bootstrap :exports code
+ :END:
+ =yadm= comes with a very handy feature: its bootstrap script. We can execute
+ it by running the following command:
+ #+BEGIN_SRC fish :tangle no
+ yadm bootstrap
+ #+END_SRC
+
+ Notice these two header files, we can see this is a fish script, hence why we
+ need fish (which is my daily shell anyway).
+ #+BEGIN_SRC fish
+ #!/usr/bin/fish
+ # -*- mode: fish -*-
+ #+END_SRC
+ Let’s take a look at what it does.
+
+** Decrypt private yadm files
+ :PROPERTIES:
+ :CUSTOM_ID: h-2ce7e756-3dab-4c12-a3b3-d1b6f8d4805d
+ :END:
+ Some private files are stored encrypted in the repository of my yadm
+ dotfiles. I will need them later on during the bootstrap execution.
+ #+BEGIN_SRC fish
+ yadm decrypt
+ #+END_SRC
+
+** Get a correct keyboard layout
+ :PROPERTIES:
+ :CUSTOM_ID: h-89fb8f3a-6ec4-4701-a5d9-3e593c47ece9
+ :END:
+ I use mainly the [[https://bepo.fr/wiki/Accueil][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:
+ #+BEGIN_SRC fish
+ 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'
+ #+END_SRC
+ So, let’s set it as our keyboard configuration.
+ #+BEGIN_SRC fish
+ printf "\n# Set keyboard layout #########################################################\n\n"
+ echo $keyboardconf | sudo tee /etc/X11/xorg.conf.d/00-keyboard.conf
+ #+END_SRC
+
+** Set our locale
+ :PROPERTIES:
+ :CUSTOM_ID: h-48678405-93ae-41b6-b44b-285ab0da4e92
+ :END:
+ I use two main locales, the French and US UTF-8 locales, and I like to keep
+ the Japanese locale activated just in case.
+ #+BEGIN_SRC fish
+ set mylocales "en_US.UTF-8 UTF-8" "fr_FR.UTF-8 UTF-8" "ja_JP.UTF-8 UTF-8"
+ #+END_SRC
+ Let’s enable these.
+ #+BEGIN_SRC fish
+ 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
+ end
+ #+END_SRC
+
+ This is my configuration I usually use when it comes to my locale.
+ #+BEGIN_SRC fish
+ 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"
+ #+END_SRC
+ Let’s set it as our system’s locale.
+ #+BEGIN_SRC fish
+ echo $localeconf | sudo tee /etc/locale.conf
+ #+END_SRC
+ Now we can generate our locale!
+ #+BEGIN_SRC fish
+ printf "\n# Generate locale #############################################################\n\n"
+ sudo locale-gen
+ #+END_SRC
+
+** Create some folders
+ :PROPERTIES:
+ :CUSTOM_ID: h-85ce90ff-56dc-469b-bf08-480ecf27acc4
+ :END:
+ Let’s create some folders we might need for mounting our drives, Android
+ devices and CDs.
+ #+BEGIN_SRC fish
+ 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}
+ #+END_SRC
+
+ We also need the following folder for our nano backups.
+ #+BEGIN_SRC fish
+ mkdir -p $HOME/.cache/nano/backups
+ #+END_SRC
+
+** Set user’s shell to fish
+ :PROPERTIES:
+ :CUSTOM_ID: h-c1a78394-c156-4a03-ae82-e5e9d4090dab
+ :END:
+ First of all, the bootstrap shell will set the user’s shell to fish.
+ #+BEGIN_SRC fish
+ printf "\n# Set fish as the default shell ###############################################\n\n"
+ chsh -s /usr/bin/fish
+ #+END_SRC
+
+** Install =yay= if it isn’t already installed
+ :PROPERTIES:
+ :CUSTOM_ID: h-fef57cea-cf1d-4900-9d90-ec6353ea9661
+ :END:
+ 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.
+ #+BEGIN_SRC fish
+ 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"
+ end
+ #+END_SRC
+
+** Install basic packages
+ :PROPERTIES:
+ :CUSTOM_ID: h-887ec6d4-535d-4363-a0a7-884717b87a47
+ :END:
+ Let’s set in a custom varible what packages we’ll be needing.
+ #+BEGIN_SRC fish
+ set PACKAGES
+
+ acpilight adobe-source-han-sans-jp-fonts asar ascii aspell-en aspell-fr assimp \
+ awesome-terminal-fonts base-devel bat biber bleachbit bluez-firmware \
+ bluez-utils bookworm boost bzip2 ccls chicken chromium clisp compton cppcheck \
+ cppreference cppreference-devhelp cpupower cronie cryptsetup device-mapper \
+ diffutils discord-canary discount ditaa dmenu dmenu-lpass docker \
+ docker-compose dockerfile-language-server-bin doxygen dunst dwarffortress \
+ emacs exfat-utils farbfeld feh 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 \
+ golangci-lint-bin graphviz htop i3-gaps i3lock-blur i3status igdm-bin \
+ inetutils j4-dmenu-desktop javascript-typescript-langserver js-beautify \
+ 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 neovim netctl networkmanager \
+ networkmanager-openvpn nm-connection-editor nnn nodejs-vmd nomacs nordvpn-bin \
+ noto-fonts-emoji npm ntfs-3g numlockx openssh otf-fandol otf-ipafont p7zip \
+ pacman-contrib pandoc-bin pavucontrol pciutils pcurses pdfpc polybar prettier \
+ pulseaudio-bluetooth python-autoflake python-envtpl-git python-epc \
+ python-importmagic python-language-server python-nose python-pip python-ptvsd \
+ python-pytest python-pywal qt5-imageformats 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-bin texlive-langchinese texlive-langcyrillic texlive-langgreek \
+ texlive-langjapanese texlive-langkorean texlive-latexextra \
+ texlive-localmanager-git texlive-most tmux tree ttf-arphic-uming ttf-baekmuk \
+ ttf-bitstream-vera ttf-dejavu ttf-google-fonts-opinionated-git ttf-hanazono \
+ ttf-joypixels ttf-koruri ttf-liberation ttf-material-design-icons-git \
+ ttf-monapo ttf-mplus ttf-ms-fonts ttf-sazanami ttf-symbola ttf-tibetan-machine \
+ ttf-twemoji-color ttf-unifont ttf-vlgothic typescript \
+ typescript-language-server-bin unicode unicode-emoji unrar usbutils valgrind \
+ vscode-css-languageserver-bin vscode-html-languageserver-bin w3m wget \
+ x11-ssh-askpass xclip xdg-user-dirs-gtk xfsprogs xorg-apps xorg-drivers \
+ xorg-server xorg-xinit xss-lock xvkbd yaml-language-server-bin yapf
+ #+END_SRC
+ These are the minimum I would have in my own installation. You can edit it
+ however you want. Let’s install those.
+ #+BEGIN_SRC fish
+ printf "\n# Installing needed packages ##################################################\n\n"
+ sudo pacman -Syu
+ yay -S --needed $PACKAGES
+ #+END_SRC
+
+** Setting up Emacs: Installing Spacemacs
+ :PROPERTIES:
+ :CUSTOM_ID: h-bd5a92c4-1a4f-49ea-a447-050a4ff0301c
+ :END:
+ 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:
+ #+BEGIN_SRC fish
+ printf "\n# Installing Spacemacs ########################################################\n\n"
+ rm -rf ~/.emacs.d
+ #+END_SRC
+ Now we can clone Spacemacs:
+ #+BEGIN_SRC fish
+ git clone --single-branch --branch develop https://github.com/syl20bnr/spacemacs ~/.emacs.d
+ #+END_SRC
+ And we can restore what might have been deleted in our =~/.emacs.d/private=
+ directory:
+ #+BEGIN_SRC fish
+ yadm checkout -- ~/.emacs.d/private/
+ #+END_SRC
+
+** Set up dotfiles
+ :PROPERTIES:
+ :CUSTOM_ID: h-cf2c3a24-b08e-4b07-9d51-31f6df781e62
+ :END:
+*** Update our dotfiles’ remotes
+ :PROPERTIES:
+ :CUSTOM_ID: h-18967335-2637-44d6-b407-bb1d2d2718b9
+ :END:
+ This line in the bootstrap script will test if the current user is using my
+ username. If yes, it’s probably me.
+ #+BEGIN_SRC fish
+ if ! test (echo "phundrak" | sed -e "s/^.*$USER//I")
+ #+END_SRC
+ 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.
+ #+BEGIN_SRC fish
+ printf "\n# Update yadm’s remotes #######################################################\n\n"
+ yadm remote set-url origin git@labs.phundrak.com:phundrak/dotfiles.git
+ yadm remote add github git@github.com:phundrak/dotfiles.git
+ #+END_SRC
+ I will also want to decrypt my encrypted files, such as said ssh keys.
+ #+BEGIN_SRC fish
+ printf "\n# Decrypt encrypted dotfiles ##################################################\n\n"
+ yadm decrypt
+ #+END_SRC
+ Finally, let’s close this =if= statement.
+ #+BEGIN_SRC fish
+ end
+ #+END_SRC
+
+*** Get =envtpl=
+ :PROPERTIES:
+ :CUSTOM_ID: h-39034878-7864-4a1c-855d-d9882795aac0
+ :END:
+ Before we set our dotfiles up, let’s make sure =envtpl= is correctly
+ installed. This package will be needed for generating our alt dotfiles.
+ #+BEGIN_SRC fish
+ printf '\n# Install envtpl ##############################################################\n\n'
+ yay -Syu python-envtpl-git
+ #+END_SRC
+
+*** Update our submodules
+ :PROPERTIES:
+ :CUSTOM_ID: h-ae2f8ccb-a8f3-4699-832c-52cbc8b6d081
+ :END:
+ Now we can download the various dependencies of our dotfiles. To do so,
+ let’s run the following command:
+ #+BEGIN_SRC fish
+ printf "\n# Getting yadm susbmodules ####################################################\n\n"
+ yadm submodule update --init --recursive
+ #+END_SRC
+
+*** Generate our alt files
+ :PROPERTIES:
+ :CUSTOM_ID: h-f924c003-a15c-4132-891f-36cd3948a7c1
+ :END:
+ Now this should be the last manipulation on our dotfiles: let’s create our
+ alternate files:
+ #+BEGIN_SRC fish
+ printf "\n# Generating alt files ########################################################\n\n"
+ yadm alt
+ #+END_SRC
+
+** Installing Tryone’s Compton fork
+ :PROPERTIES:
+ :CUSTOM_ID: h-aecf9f01-268c-40cd-8fc3-622c6ce822e4
+ :END:
+ 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.
+ #+BEGIN_SRC fish
+ printf "\n# Installing tryone’s compton fork ############################################\n\n"
+ yay -S compton-tryone-git
+ #+END_SRC
+
+** Enable some of our services
+ :PROPERTIES:
+ :CUSTOM_ID: h-1044da09-e992-4dcb-90ff-513725e1d450
+ :END:
+ We have installed some packages which require some services to run. Let’s
+ enable them.
+
+*** Docker
+ :PROPERTIES:
+ :CUSTOM_ID: h-429cb31a-fccb-420f-a5aa-21054c45fb38
+ :END:
+ First, let’s activate Docker.
+ #+BEGIN_SRC fish
+ printf "\n# Enabling and starting Docker ################################################\n\n"
+ sudo systemctl enable --now docker
+ #+END_SRC
+
+ 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.
+ #+BEGIN_SRC fish
+ 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
+ end
+ #+END_SRC
+
+*** Emacs
+ :PROPERTIES:
+ :CUSTOM_ID: h-7131fa13-3c6e-4cfc-b8e8-c880de9d380f
+ :END:
+ Emacs will run as a user service, which means it won’t be launched until we
+ log in.
+ #+BEGIN_SRC fish
+ printf "\n# Enabling Emacs as user service ##############################################\n\n"
+ systemctl --user enable --now emacs
+ #+END_SRC
+
+*** SSH server
+ :PROPERTIES:
+ :CUSTOM_ID: h-1f355779-f1dc-4c0f-9cf1-14724ce05f4d
+ :END:
+ Maybe we want to activate an SSH server on our machine. If so, we can enable
+ it. Let’s ask the question.
+ #+BEGIN_SRC fish
+ 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
+ end
+ #+END_SRC
+
+*** Ly
+ :PROPERTIES:
+ :CUSTOM_ID: h-2785fc5b-cd35-4c99-9f47-3dcbf1a7a870
+ :END:
+ 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).
+ #+BEGIN_SRC fish
+ sudo systemctl enable --now ly
+ sudo systemctl disable getty@tty2
+ #+END_SRC
+
+*** Acpilight
+ :PROPERTIES:
+ :CUSTOM_ID: h-5423e2a7-d2ce-4bc3-9d5d-85677c18181e
+ :END:
+ =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=.
+ #+BEGIN_SRC fish
+ sudo usermod -aG video $USER
+ #+END_SRC
+
+*** NordVPN
+ :PROPERTIES:
+ :CUSTOM_ID: h-49c24a3e-a496-4200-bf64-96e945c203a0
+ :END:
+ Thanks to the AUR package ~nordvpn-bin~, I no longer have to manually
+ maintain my VPN connections manually with OpenVPN. However, it requires a
+ service that we should activate:
+ #+BEGIN_SRC fish
+ sudo systemctl enable --now nordvpnd
+ #+END_SRC
+
+** Symlink some system config files
+ :PROPERTIES:
+ :CUSTOM_ID: h-b14d7d03-da49-4a7b-ba05-1c0848bd8e44
+ :END:
+ We have some files in [[file:ect/][etc/]] that are to be symlinked to =/etc=.
+ #+BEGIN_SRC fish
+ for f in (find ~/.etc -type f)
+ set dest (echo $f | sed -n 's/^.*etc\(.*\)$/\/etc\1/p')
+ sudo ln -s $f $dest
+ end
+ #+END_SRC
+
+ We may also want to symlink our [[file:.nanorc][nanorc]] to the =/root= directory for when we
+ use =nano= as =sudo=.
+ #+BEGIN_SRC fish
+ 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
+ end
+ #+END_SRC
+
+** Set up our fish shell
+ :PROPERTIES:
+ :CUSTOM_ID: h-f6f4df67-b0de-40bf-95fb-888d42169088
+ :END:
+*** Install =fisher=
+ :PROPERTIES:
+ :CUSTOM_ID: h-d6490ddc-c909-4713-b36a-19c25a79c7ac
+ :END:
+ We will be using =fisher= as our extensions manager for Fish. Let’s install
+ it.
+ #+BEGIN_SRC fish
+ printf "\n# Installing fisher ###########################################################\n\n"
+ curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish
+ #+END_SRC
+
+*** Install our extensions
+ :PROPERTIES:
+ :CUSTOM_ID: h-3d540273-bdfb-4c63-a05f-2374a010dc29
+ :END:
+ I generally use the following extensions in my Fish shell.
+ #+BEGIN_SRC fish
+ set FISHEXTENSIONS \
+ edc/bass franciscolourenco/done jethrokuan/fzf jethrokuan/z \
+ jorgebucaran/fish-getopts laughedelic/pisces matchai/spacefish \
+ tuvistavie/fish-ssh-agent
+ #+END_SRC
+ Let’s install these:
+ #+BEGIN_SRC fish
+ fisher add $FISHEXTENSIONS
+ #+END_SRC
+
+** Install packages from git
+ :PROPERTIES:
+ :CUSTOM_ID: h-e79da7b2-9286-4b66-812e-453e3b2505c7
+ :END:
+ Now, let’s install some packages from git directly.
+
+*** i3-gaps rounded
+ :PROPERTIES:
+ :CUSTOM_ID: h-10e229f7-9a45-4401-a9c0-3f974482bb9f
+ :END:
+ 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.
+ #+BEGIN_SRC fish
+ 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 install
+ #+END_SRC
+
+*** Polybar Battery
+ :PROPERTIES:
+ :CUSTOM_ID: h-f228ec52-a7d0-4c16-adfa-75c544fcfa93
+ :END:
+ Now let’s install =polybar-battery=. This is a binary that I’ll use in my [[file:.config/i3/config][i3
+ config]] to indicate my battery level. It also sends a notification on low
+ battery and on charging completed.
+ #+BEGIN_SRC fish
+ 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
+ #+END_SRC
+
+ Now, we have our binary, let’s symlink it in our local binary directory,
+ =~/.local/bin=.
+ #+BEGIN_SRC fish
+ ln -s polybar-ab ~/.local/bin/polybar-ab
+ #+END_SRC
+
+*** Reveal.JS
+ :PROPERTIES:
+ :CUSTOM_ID: h-68d1cdb4-1447-420f-ab0c-53ef905e757b
+ :END:
+ I sometimes use Reveal.JS to make presentations, and I set its location in
+ my [[file:.spacemacs][dotspacemacs]] file to be in =~/fromGIT=, so let’s clone it there.
+ #+BEGIN_SRC fish
+ printf "\n# Install Reveal.JS ###########################################################\n\n"
+ cd ~/fromGIT
+ git clone https://github.com/hakimel/reveal.js.git
+ #+END_SRC
+
+** Install Rust
+ :PROPERTIES:
+ :CUSTOM_ID: h-57e8af4c-93f2-4145-9c39-a5f8d1c9f012
+ :END:
+*** Install the toolchains
+ :PROPERTIES:
+ :CUSTOM_ID: h-05ee25dc-3885-46ca-afaf-35bfb2e385d4
+ :END:
+ 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
+ printf "\n# Install the rust toolchains, nightly is the default one #####################\n\n"
+ rustup default nightly
+ #+END_SRC
+ This 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:
+ #+BEGIN_SRC fish
+ rustup toolchain install stable
+ #+END_SRC
+
+*** Install some utilities
+ :PROPERTIES:
+ :CUSTOM_ID: h-f94f2e18-623f-4aa5-be99-6a7df6a9cbcd
+ :END:
+ We’ll need some utilities when developing Rust from Emacs, namely =rustfmt=
+ and =racer=. Let’s install them with =cargo=.
+ #+BEGIN_SRC fish
+ printf "\n# Add rust utilities ##########################################################\n\n"
+ cargo install rustfmt racer
+ #+END_SRC
+
+ We will also need some components for development purposes:
+ #+BEGIN_SRC fish
+ rustup component add src
+ rustup component add rls
+ #+END_SRC
+
+** Install some python packages
+ :PROPERTIES:
+ :CUSTOM_ID: h-8155ae1a-0be1-489f-be13-9222f7686fb2
+ :END:
+ Some packages will be needed from pip in order to get our Emacs setup
+ correctly working. Let’s install them locally for our user:
+ #+BEGIN_SRC fish
+ pip install --user pyls-isort pyls-mypy
+ #+END_SRC
+
+** Install go packages
+ :PROPERTIES:
+ :CUSTOM_ID: h-8c6e2311-eb84-4bf4-8e0b-948f89bc9664
+ :END:
+ For go development from Emacs, the Spacemacs go and lsp layers requires some
+ packages to be installed.
+ #+BEGIN_SRC fish
+ go get -v golang.org/x/tools/gopls@latest
+ go get -u -v golang.org/x/tools/cmd/godoc
+ go get -u -v golang.org/x/tools/cmd/goimports
+ go get -u -v golang.org/x/tools/cmd/gorename
+ go get -u -v golang.org/x/tools/cmd/guru
+ go get -u -v github.com/cweill/gotests/...
+ go get -u -v github.com/davidrjenni/reftools/cmd/fillstruct
+ go get -u -v github.com/fatih/gomodifytags
+ go get -u -v github.com/godoctor/godoctor
+ go get -u -v github.com/golangci/golangci-lint/cmd/golangci-lint
+ go get -u -v github.com/haya14busa/gopkgs/cmd/gopkgs
+ go get -u -v github.com/josharian/impl
+ go get -u -v github.com/mdempsky/gocode
+ go get -u -v github.com/rogpeppe/godef
+ go get -u -v github.com/zmb3/gogetdoc
+ go get -u -v golang.org/x/tools/gopls
+ #+END_SRC
+
+** Set up Chicken (Scheme interpreter/compiler)
+ :PROPERTIES:
+ :CUSTOM_ID: h-10ffb0c0-8028-4e9c-842e-9e7d2c165c5b
+ :END:
+ Chicken needs to be set up before being used. First, we need to install its
+ documentation.
+ #+BEGIN_SRC fish
+ chicken-install -s apropos chicken-doc
+ #+END_SRC
+
+ Then, we’ll complete the documentation like so:
+ #+BEGIN_SRC fish
+ cd (chicken-csi -b -e "(import (chicken platform))" -p "(chicken-home)")
+ curl https://3e8.org/pub/chicken-doc/chicken-doc-repo.tgz | sudo tar zx
+ #+END_SRC
+
+** Clean the =pacman= and =yay= cache
+ :PROPERTIES:
+ :CUSTOM_ID: h-fa5307ec-065b-4d06-9d47-05ccde0da8ac
+ :END:
+ Finally, we are almost done! Let’s clean the cache of =pacman= and =yay=.
+ #+BEGIN_SRC fish
+ printf "\n# Clean the pacman and yay cache ##############################################\n\n"
+ yay -Sc --noconfirm
+ #+END_SRC
+ You should now run a system pretty close to the one I have on my main
+ computer and my thinkpad.