4193 lines
138 KiB
Org Mode
4193 lines
138 KiB
Org Mode
:DOC-CONFIG:
|
|
#+property: header-args: mkdirp yes :comments no
|
|
#+startup: fold
|
|
:END:
|
|
|
|
#+title: PWL Arch Linux Config
|
|
|
|
#+OPTIONS: toc:3
|
|
|
|
* Table of Contents :toc:
|
|
- [[#prerequisites][Prerequisites]]
|
|
- [[#literate-file-headers][Literate File Headers]]
|
|
- [[#updatesh][update.sh]]
|
|
- [[#packagestxt][packages.txt]]
|
|
- [[#aliassh][alias.sh]]
|
|
- [[#pathsh][path.sh]]
|
|
- [[#doom-emacs][Doom Emacs]]
|
|
- [[#zshrc][.zshrc]]
|
|
- [[#bashrc][.bashrc]]
|
|
- [[#autostartsh][autostart.sh]]
|
|
- [[#alacrittytoml][alacritty.toml]]
|
|
- [[#etcenvironment][/etc/environment]]
|
|
- [[#package-management][Package Management]]
|
|
- [[#yay][Yay]]
|
|
- [[#update-package-repositories][Update Package Repositories]]
|
|
- [[#package-installation][Package Installation]]
|
|
- [[#base-system][Base System]]
|
|
- [[#arch-linux][Arch Linux]]
|
|
- [[#network-manager][Network Manager]]
|
|
- [[#man-pages-and-texinfo][Man Pages and Texinfo]]
|
|
- [[#build-tools][Build Tools]]
|
|
- [[#system-locale][System Locale]]
|
|
- [[#keyboard-layout][Keyboard Layout]]
|
|
- [[#ntp][NTP]]
|
|
- [[#audio][Audio]]
|
|
- [[#additional-firmware][Additional Firmware]]
|
|
- [[#ntfs-compatibility][NTFS Compatibility]]
|
|
- [[#timeshift][Timeshift]]
|
|
- [[#desktop-environments-and-window-manager][Desktop Environments and Window Manager]]
|
|
- [[#lightdm][LightDM]]
|
|
- [[#xfce][Xfce]]
|
|
- [[#qtile][Qtile]]
|
|
- [[#text-editors][Text Editors]]
|
|
- [[#doom-emacs-1][Doom Emacs]]
|
|
- [[#vscode][VSCode]]
|
|
- [[#neovim][NeoVim]]
|
|
- [[#browser][Browser]]
|
|
- [[#firefox][Firefox]]
|
|
- [[#chromium][Chromium]]
|
|
- [[#tor][TOR]]
|
|
- [[#shells][Shells]]
|
|
- [[#aliases][Aliases]]
|
|
- [[#zsh][ZSH]]
|
|
- [[#bash][Bash]]
|
|
- [[#alacritty][Alacritty]]
|
|
- [[#font][Font]]
|
|
- [[#theming][Theming]]
|
|
- [[#doom-emacs-2][Doom Emacs]]
|
|
- [[#vscode-1][VSCode]]
|
|
- [[#qtile-1][Qtile]]
|
|
- [[#alacritty-1][Alacritty]]
|
|
- [[#xorg][Xorg]]
|
|
- [[#gtk][GTK]]
|
|
- [[#rofi][Rofi]]
|
|
- [[#dunst-urgency-levels][Dunst Urgency Levels]]
|
|
- [[#bluetooth][Bluetooth]]
|
|
- [[#installation][Installation]]
|
|
- [[#activate-systemd-service][Activate systemd Service]]
|
|
- [[#blueman-applet][Blueman Applet]]
|
|
- [[#space-mouse-support][Space Mouse Support]]
|
|
- [[#daemon][Daemon]]
|
|
- [[#git][Git]]
|
|
- [[#installation-1][Installation]]
|
|
- [[#configuration][Configuration]]
|
|
- [[#git-lfs][Git LFS]]
|
|
- [[#meld][Meld]]
|
|
- [[#miniconda][Miniconda]]
|
|
- [[#installation-2][Installation]]
|
|
- [[#zsh-special-settings][ZSH special settings]]
|
|
- [[#do-not-activate-base-environment-on-startup][Do not activate base environment on startup]]
|
|
- [[#install-mamba-for-faster-environment-solve][Install Mamba for faster environment solve]]
|
|
- [[#workaround-openssl-error][Workaround: OpenSSL error]]
|
|
- [[#zathura][Zathura]]
|
|
- [[#installation-3][Installation]]
|
|
- [[#enable-synctex][enable synctex]]
|
|
- [[#nextcloud][Nextcloud]]
|
|
- [[#add-to-autostart][add to autostart]]
|
|
- [[#add-keyring][add keyring]]
|
|
- [[#bitwarden][Bitwarden]]
|
|
- [[#installation-4][Installation]]
|
|
- [[#configuration-1][Configuration]]
|
|
- [[#pcmanfm][PCManFM]]
|
|
- [[#installation-5][Installation]]
|
|
- [[#automount-usb][Automount USB]]
|
|
- [[#trash-support][Trash Support]]
|
|
- [[#smb-support][SMB Support]]
|
|
- [[#mtp-support][MTP Support]]
|
|
- [[#redshift][Redshift]]
|
|
- [[#installation-6][Installation]]
|
|
- [[#autostart][Autostart]]
|
|
- [[#automatic-location-configuration][Automatic Location Configuration]]
|
|
- [[#frpint][frpint]]
|
|
- [[#installation-7][Installation]]
|
|
- [[#enable-systemd-service][Enable systemd Service]]
|
|
- [[#add-user-to-input-group][Add User to input Group]]
|
|
- [[#authentication-agent][Authentication Agent]]
|
|
- [[#enroll-both-hands-if-no-fingers-are-enrolled][enroll both hands if no fingers are enrolled]]
|
|
- [[#add-authentication-to-pam][Add authentication to PAM]]
|
|
- [[#communication][Communication]]
|
|
- [[#thunderbird][Thunderbird]]
|
|
- [[#whatsapp][WhatsApp]]
|
|
- [[#signal][signal]]
|
|
- [[#slack][Slack]]
|
|
- [[#discord][Discord]]
|
|
- [[#telegram][Telegram]]
|
|
- [[#rocketchat][Rocket.Chat]]
|
|
- [[#docker][Docker]]
|
|
- [[#activate-systemd-service-1][Activate systemd Service]]
|
|
- [[#add-user-to-docker-group][Add User to docker Group]]
|
|
- [[#libreoffice][LibreOffice]]
|
|
- [[#installation-8][Installation]]
|
|
- [[#texmaths-extension][TexMaths Extension]]
|
|
- [[#writer2latex-extension][Writer2LaTeX Extension]]
|
|
- [[#spell-checking][Spell-Checking]]
|
|
- [[#hyphenation-rules][Hyphenation Rules]]
|
|
- [[#thesaurus][Thesaurus]]
|
|
- [[#utils][Utils]]
|
|
- [[#downgrade][Downgrade]]
|
|
- [[#gnu-wget][GNU Wget]]
|
|
- [[#hardware-lister-lshw][Hardware Lister (lshw)]]
|
|
- [[#ncdu][NCDU]]
|
|
- [[#nmap][NMAP]]
|
|
- [[#pdftk][PDFtk]]
|
|
- [[#rpi-imager][rpi-imager]]
|
|
- [[#rsync][Rsync]]
|
|
- [[#transmission][Transmission]]
|
|
- [[#tree][Tree]]
|
|
- [[#wireguard][WireGuard]]
|
|
- [[#xarchiver][xarchiver]]
|
|
- [[#xclip][XClip]]
|
|
- [[#yt-dlp][yt-dlp]]
|
|
- [[#zip][zip]]
|
|
- [[#misc][Misc]]
|
|
- [[#latex][LaTeX]]
|
|
- [[#cups][CUPS]]
|
|
- [[#darktable][Darktable]]
|
|
- [[#eye-of-gnome-image-viewer][Eye of GNOME Image Viewer]]
|
|
- [[#evince-document-viewer][Evince Document Viewer]]
|
|
- [[#disks-utility][Disks Utility]]
|
|
- [[#font-viewer][Font Viewer]]
|
|
- [[#gimp][GIMP]]
|
|
- [[#inkscape][Inkscape]]
|
|
- [[#kdenlive][kdenlive]]
|
|
- [[#scribus][Scribus]]
|
|
- [[#shotwell-photo-manager][Shotwell Photo Manager]]
|
|
- [[#vlc][VLC]]
|
|
- [[#xclip-1][xclip]]
|
|
- [[#drawio][drawio]]
|
|
- [[#spotify][Spotify]]
|
|
- [[#virtualbox][Virtualbox]]
|
|
- [[#teamviewer][Teamviewer]]
|
|
- [[#anki][Anki]]
|
|
- [[#freecad][FreeCAD]]
|
|
- [[#gramps][Gramps]]
|
|
- [[#obs-studio][OBS Studio]]
|
|
- [[#portfolio-performance][Portfolio Performance]]
|
|
- [[#steam][Steam]]
|
|
- [[#manual-tasks-after-tangling][Manual Tasks after tangling]]
|
|
- [[#other-todos][Other TODOs]]
|
|
- [[#dunst][dunst]]
|
|
- [[#fcitx][fcitx]]
|
|
- [[#browser-landing-page][browser landing page]]
|
|
- [[#go-through-httpswikiarchlinuxorgtitlelaptop][go through https://wiki.archlinux.org/title/Laptop]]
|
|
- [[#go-through-old-pkglist][go through old pkglist]]
|
|
- [[#add-readme][add README]]
|
|
- [[#cuda][CUDA]]
|
|
|
|
* Prerequisites
|
|
- Completed Arch Linux Installation
|
|
- partitioning
|
|
- encryption
|
|
- main user
|
|
* Literate File Headers
|
|
This is used to initialize all files that are accessed from multiple places in the config
|
|
** update.sh
|
|
#+begin_src shell :tangle update.sh
|
|
#!/bin/sh
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
#+end_src
|
|
|
|
** packages.txt
|
|
contains all general Arch and AUR packages
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
#+end_src
|
|
*** pwl-desktop_pkg-list
|
|
contains all packages for the device pwl-desktop
|
|
#+begin_src conf :tangle pwl-desktop_pkg-list.txt
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
#+end_src
|
|
*** paul-laptop_pkg-list
|
|
contains all packages for the device paul-laptop
|
|
#+begin_src conf :tangle paul-laptop_pkg-list.txt
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
#+end_src
|
|
|
|
** alias.sh
|
|
#+begin_src shell :tangle ~/.alias.sh
|
|
#!/bin/sh
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
#+end_src
|
|
|
|
** path.sh
|
|
contains all modifications to the path variables
|
|
#+begin_src shell :tangle ~/.path.sh
|
|
#!/bin/sh
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
#+end_src
|
|
|
|
** Doom Emacs
|
|
We start by simply defining the standard headers used by the three files. These headers come from the initial files generated by =doom install=, and contain either some Emacs-LISP relevant indicators like =lexical-binding=, or instructions about the contents of the file.
|
|
*** init.el
|
|
#+html: <details><summary>init.el</summary>
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/init.el
|
|
;;; init.el -*- lexical-binding: t; -*-
|
|
|
|
;; DO NOT EDIT THIS FILE DIRECTLY
|
|
;; This is a file generated from a literate programing source file
|
|
;; You should make any changes there and regenerate it from Emacs org-mode
|
|
;; using org-babel-tangle (C-c C-v t)
|
|
|
|
;; This file controls what Doom modules are enabled and what order they load
|
|
;; in. Remember to run 'doom sync' after modifying it!
|
|
|
|
;; NOTE Press 'SPC h d h' (or 'C-h d h' for non-vim users) to access Doom's
|
|
;; documentation. There you'll find a "Module Index" link where you'll find
|
|
;; a comprehensive list of Doom's modules and what flags they support.
|
|
|
|
;; NOTE Move your cursor over a module's name (or its flags) and press 'K' (or
|
|
;; 'C-c c k' for non-vim users) to view its documentation. This works on
|
|
;; flags as well (those symbols that start with a plus).
|
|
;;
|
|
;; Alternatively, press 'gd' (or 'C-c c d') on a module to browse its
|
|
;; directory (for easy access to its source code).
|
|
#+end_src
|
|
#+html: </details>
|
|
|
|
*** packages.el
|
|
#+html: <details><summary>packages.el</summary>
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/packages.el
|
|
;; -*- no-byte-compile: t; -*-
|
|
;;; $DOOMDIR/packages.el
|
|
|
|
;; DO NOT EDIT THIS FILE DIRECTLY
|
|
;; This is a file generated from a literate programing source file
|
|
;; You should make any changes there and regenerate it from Emacs org-mode
|
|
;; using org-babel-tangle (C-c C-v t)
|
|
|
|
;; To install a package with Doom you must declare them here and run 'doom sync'
|
|
;; on the command line, then restart Emacs for the changes to take effect -- or
|
|
;; use 'M-x doom/reload'.
|
|
|
|
;; To install SOME-PACKAGE from MELPA, ELPA or emacsmirror:
|
|
;;(package! some-package)
|
|
|
|
;; To install a package directly from a remote git repo, you must specify a
|
|
;; `:recipe'. You'll find documentation on what `:recipe' accepts here:
|
|
;; https://github.com/raxod502/straight.el#the-recipe-format
|
|
;;(package! another-package
|
|
;; :recipe (:host github :repo "username/repo"))
|
|
|
|
;; If the package you are trying to install does not contain a PACKAGENAME.el
|
|
;; file, or is located in a subdirectory of the repo, you'll need to specify
|
|
;; `:files' in the `:recipe':
|
|
;;(package! this-package
|
|
;; :recipe (:host github :repo "username/repo"
|
|
;; :files ("some-file.el" "src/lisp/*.el")))
|
|
|
|
;; If you'd like to disable a package included with Doom, you can do so here
|
|
;; with the `:disable' property:
|
|
;;(package! builtin-package :disable t)
|
|
|
|
;; You can override the recipe of a built in package without having to specify
|
|
;; all the properties for `:recipe'. These will inherit the rest of its recipe
|
|
;; from Doom or MELPA/ELPA/Emacsmirror:
|
|
;;(package! builtin-package :recipe (:nonrecursive t))
|
|
;;(package! builtin-package-2 :recipe (:repo "myfork/package"))
|
|
|
|
;; Specify a `:branch' to install a package from a particular branch or tag.
|
|
;; This is required for some packages whose default branch isn't 'master' (which
|
|
;; our package manager can't deal with; see raxod502/straight.el#279)
|
|
;;(package! builtin-package :recipe (:branch "develop"))
|
|
|
|
;; Use `:pin' to specify a particular commit to install.
|
|
;;(package! builtin-package :pin "1a2b3c4d5e")
|
|
|
|
;; Doom's packages are pinned to a specific commit and updated from release to
|
|
;; release. The `unpin!' macro allows you to unpin single packages...
|
|
;;(unpin! pinned-package)
|
|
;; ...or multiple packages
|
|
;;(unpin! pinned-package another-pinned-package)
|
|
;; ...Or *all* packages (NOT RECOMMENDED; will likely break things)
|
|
;;(unpin! t)
|
|
#+end_src
|
|
#+html: </details>
|
|
|
|
*** config.el
|
|
#+html: <details><summary>config.el</summary>
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
;;; $DOOMDIR/config.el -*- lexical-binding: t; -*-
|
|
|
|
;; DO NOT EDIT THIS FILE DIRECTLY
|
|
;; This is a file generated from a literate programing source file
|
|
;; You should make any changes there and regenerate it from Emacs org-mode
|
|
;; using org-babel-tangle (C-c C-v t)
|
|
|
|
;; Place your private configuration here! Remember, you do not need to run 'doom
|
|
;; sync' after modifying this file!
|
|
|
|
;; Some functionality uses this to identify you, e.g. GPG configuration, email
|
|
;; clients, file templates and snippets.
|
|
;; (setq user-full-name "John Doe"
|
|
;; user-mail-address "john@doe.com")
|
|
|
|
;; Doom exposes five (optional) variables for controlling fonts in Doom. Here
|
|
;; are the three important ones:
|
|
;;
|
|
;; + `doom-font'
|
|
;; + `doom-variable-pitch-font'
|
|
;; + `doom-big-font' -- used for `doom-big-font-mode'; use this for
|
|
;; presentations or streaming.
|
|
;;
|
|
;; They all accept either a font-spec, font string ("Input Mono-12"), or xlfd
|
|
;; font string. You generally only need these two:
|
|
;; (setq doom-font (font-spec :family "monospace" :size 12 :weight 'semi-light)
|
|
;; doom-variable-pitch-font (font-spec :family "sans" :size 13))
|
|
|
|
;; There are two ways to load a theme. Both assume the theme is installed and
|
|
;; available. You can either set `doom-theme' or manually load a theme with the
|
|
;; `load-theme' function. This is the default:
|
|
;; (setq doom-theme 'doom-one)
|
|
|
|
;; If you use `org' and don't want your org files in the default location below,
|
|
;; change `org-directory'. It must be set before org loads!
|
|
;; (setq org-directory "~/org/")
|
|
|
|
;; This determines the style of line numbers in effect. If set to `nil', line
|
|
;; numbers are disabled. For relative line numbers, set this to `relative'.
|
|
;; (setq display-line-numbers-type t)
|
|
|
|
;; Here are some additional functions/macros that could help you configure Doom:
|
|
;;
|
|
;; - `load!' for loading external *.el files relative to this one
|
|
;; - `use-package!' for configuring packages
|
|
;; - `after!' for running code after a package has loaded
|
|
;; - `add-load-path!' for adding directories to the `load-path', relative to
|
|
;; this file. Emacs searches the `load-path' when you load packages with
|
|
;; `require' or `use-package'.
|
|
;; - `map!' for binding new keys
|
|
;;
|
|
;; To get information about any of these functions/macros, move the cursor over
|
|
;; the highlighted symbol at press 'K' (non-evil users must press 'C-c c k').
|
|
;; This will open documentation for it, including demos of how they are used.
|
|
;;
|
|
;; You can also try 'gd' (or 'C-c c d') to jump to their definition and see how
|
|
;; they are implemented.
|
|
#+end_src
|
|
#+html: </details>
|
|
|
|
** .zshrc
|
|
#+begin_src shell :tangle ~/.zshrc
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
#+end_src
|
|
** .bashrc
|
|
#+begin_src shell :tangle ~/.bashrc
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
#+end_src
|
|
** autostart.sh
|
|
#+begin_src shell :mkdirp yes :tangle ~/.autostart.sh
|
|
#!/bin/sh
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
#+end_src
|
|
** alacritty.toml
|
|
#+begin_src toml :tangle ~/.config/alacritty/alacritty.toml :mkdirp yes
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
#+end_src
|
|
** /etc/environment
|
|
#+begin_src conf :tangle "/sudo::/etc/environment"
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
#
|
|
# This file is parsed by pam_env module
|
|
#
|
|
# Syntax: simple "KEY=VAL" pairs on separate lines
|
|
#
|
|
#+end_src
|
|
|
|
* Package Management
|
|
** Yay
|
|
*** Prerequisites
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
git
|
|
base-devel
|
|
#+end_src
|
|
|
|
*** Installation
|
|
General Package Management is done via [[https://github.com/Jguer/yay][Yay]].
|
|
~update.sh~ will install it if needed.
|
|
#+begin_src shell :tangle update.sh
|
|
command_name="yay"
|
|
|
|
if ! command -v "$command_name" &> /dev/null; then
|
|
echo "Installing $command_name ..."
|
|
git clone https://aur.archlinux.org/yay.git /tmp/yay
|
|
cd /tmp/yay
|
|
makepkg -si
|
|
fi
|
|
#+end_src
|
|
after installation add yay to the packages list to ensure it doesn't delete itself
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
yay
|
|
#+end_src
|
|
|
|
*** Config
|
|
**** Literate File Header
|
|
#+begin_src conf :tangle "/sudo::/etc/pacman.conf"
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
#+end_src
|
|
**** Options
|
|
#+begin_src conf :tangle "/sudo::/etc/pacman.conf"
|
|
[options]
|
|
#+end_src
|
|
***** HoldPkg
|
|
Packages that should not be updated for compatibility reasons
|
|
#+begin_src conf :tangle "/sudo::/etc/pacman.conf"
|
|
HoldPkg = pacman glibc
|
|
#+end_src
|
|
***** Automatic Archtiecture Detection
|
|
#+begin_src conf :tangle "/sudo::/etc/pacman.conf"
|
|
Architecture = auto
|
|
#+end_src
|
|
***** Check Space before Operation
|
|
#+begin_src conf :tangle "/sudo::/etc/pacman.conf"
|
|
CheckSpace
|
|
#+end_src
|
|
***** Colorful Output
|
|
#+begin_src conf :tangle "/sudo::/etc/pacman.conf"
|
|
Color
|
|
#+end_src
|
|
***** Enable Parallel Downloads
|
|
Increase the download speed by enabling parallel downloads
|
|
#+begin_src conf :tangle "/sudo::/etc/pacman.conf"
|
|
ParallelDownloads = 5
|
|
#+end_src
|
|
***** Accepted Packages
|
|
#+begin_src conf :tangle "/sudo::/etc/pacman.conf"
|
|
# By default, pacman accepts packages signed by keys that its local keyring
|
|
# trusts (see pacman-key and its man page), as well as unsigned packages.
|
|
SigLevel = Required DatabaseOptional
|
|
LocalFileSigLevel = Optional
|
|
#+end_src
|
|
**** Core Packages
|
|
#+begin_src conf :tangle "/sudo::/etc/pacman.conf"
|
|
[core]
|
|
Include = /etc/pacman.d/mirrorlist
|
|
#+end_src
|
|
**** Extra Packages
|
|
#+begin_src conf :tangle "/sudo::/etc/pacman.conf"
|
|
[extra]
|
|
Include = /etc/pacman.d/mirrorlist
|
|
#+end_src
|
|
**** Multilib Packages
|
|
#+begin_src conf :tangle "/sudo::/etc/pacman.conf"
|
|
[multilib]
|
|
Include = /etc/pacman.d/mirrorlist
|
|
#+end_src
|
|
|
|
** Update Package Repositories
|
|
#+begin_src shell :tangle update.sh
|
|
yay -Sy
|
|
#+end_src
|
|
** Package Installation
|
|
remove all packages not in ~pkg-list.txt~ or the specific device ~<device_name>_pkg-list.txt~ file
|
|
#+begin_src shell :tangle update.sh
|
|
# Get list of installed packages
|
|
INSTALLED_PACKAGES=$(pacman -Qqe)
|
|
|
|
# Read the list of packages to keep from the file
|
|
KEEP_LIST=$(cat "pkg-list.txt")
|
|
KEEP_LIST+=$'\n'
|
|
KEEP_LIST+=$(cat "$(uname -n)_pkg-list.txt")
|
|
|
|
# Loop through installed packages
|
|
for PACKAGE in $INSTALLED_PACKAGES; do
|
|
# Check if the package is not in the keep list
|
|
if ! echo "$KEEP_LIST" | grep -q "^$PACKAGE$"; then
|
|
echo "Removing package: $PACKAGE"
|
|
# Uncomment the following line to actually remove the package
|
|
yay -Rns --noconfirm "$PACKAGE"
|
|
fi
|
|
done
|
|
#+end_src
|
|
|
|
remove orphaned packages and update the remaining packages to avoid version conflicts
|
|
#+begin_src shell :tangle update.sh
|
|
yay -Qtdq | yay -Rns -
|
|
yay -Syu
|
|
#+end_src
|
|
|
|
and install the packages specified in ~pkg-list.txt~ or the specific device ~<device_name>_pkg-list.txt~ file
|
|
#+begin_src shell :tangle update.sh
|
|
yay -S --needed `grep -v '^#' pkg-list.txt`
|
|
yay -S --needed `grep -v '^#' $(uname -n)_pkg-list.txt`
|
|
#+end_src
|
|
|
|
* Base System
|
|
** Arch Linux
|
|
the following packages are required for basic operation and should never be deleted
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
base
|
|
efibootmgr
|
|
grub
|
|
linux-zen
|
|
linux-zen-headers
|
|
linux-lts
|
|
linux-lts-headers
|
|
linux-firmware
|
|
linux-firmware-marvell
|
|
lvm2
|
|
sudo
|
|
#+end_src
|
|
|
|
** Network Manager
|
|
*** Installation
|
|
This config uses the [[https://wiki.archlinux.org/title/NetworkManager][NetworkManager]]
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
networkmanager
|
|
#+end_src
|
|
after being installed it also needs to be enabled
|
|
#+begin_src shell :tangle update.sh
|
|
systemd_service="NetworkManager"
|
|
if ! systemctl is-enabled --quiet "$systemd_service"; then
|
|
echo "Enabling $systemd_service"
|
|
sudo systemctl enable "$systemd_service"
|
|
sudo systemctl start "$systemd_service"
|
|
fi
|
|
#+end_src
|
|
*** TODO Networks
|
|
*** Applet
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
network-manager-applet
|
|
#+end_src
|
|
#+begin_src shell :tangle ~/.autostart.sh
|
|
nm-applet &
|
|
#+end_src
|
|
|
|
** [[https://wiki.archlinux.org/title/Man_page][Man Pages]] and [[https://wiki.archlinux.org/title/GNU#Texinfo][Texinfo]]
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
man-db
|
|
man-pages
|
|
texinfo
|
|
#+end_src
|
|
** Build Tools
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
cmake
|
|
make
|
|
#+end_src
|
|
** System Locale
|
|
#+begin_src conf :tangle "/sudo::/etc/locale.conf"
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
LANG=en_US.UTF-8
|
|
LC_CTYPE=de_DE.UTF-8
|
|
LC_NUMERIC=de_DE.UTF-8
|
|
LC_TIME=de_DE.UTF-8
|
|
LC_COLLATE=en_US.UTF-8
|
|
LC_MONETARY=de_DE.UTF-8
|
|
LC_MESSAGES=en_US.UTF-8
|
|
LC_PAPER=de_DE.UTF-8
|
|
LC_NAME=en_US.UTF-8
|
|
LC_ADDRESS=de_DE.UTF-8
|
|
LC_TELEPHONE=de_DE.UTF-8
|
|
LC_MEASUREMENTS=de_DE.UTF-8
|
|
LC_IDENTIFICATION=en_US.UTF-8
|
|
LC_ALL=
|
|
#+end_src
|
|
** Keyboard Layout
|
|
*** vconsole
|
|
#+begin_src conf :tangle "/sudo::/etc/vconsole.conf"
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
KEYMAP=de-latin1
|
|
#+end_src
|
|
*** Xorg
|
|
#+begin_src shell :tangle update.sh
|
|
if ! localectl status | grep -q "X11 Layout.*de"; then
|
|
sudo localectl set-x11-keymap --no-convert de
|
|
fi
|
|
#+end_src
|
|
** NTP
|
|
#+begin_src shell :tangle update.sh
|
|
systemd_service="systemd-timesyncd"
|
|
if ! systemctl is-enabled --quiet "$systemd_service"; then
|
|
echo "Enabling $systemd_service"
|
|
sudo systemctl enable "$systemd_service"
|
|
fi
|
|
#+end_src
|
|
|
|
** Audio
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
pulseaudio
|
|
pulseaudio-alsa
|
|
pulseaudio-bluetooth
|
|
pulseaudio-equalizer
|
|
pulseaudio-jack
|
|
#+end_src
|
|
** Additional Firmware
|
|
*** pwl-desktop
|
|
#+begin_src config :tangle pwl-desktop_pkg-list.txt
|
|
amd-ucode
|
|
aic94xx-firmware
|
|
sof-firmware
|
|
wd719x-firmware
|
|
nvidia-dkms
|
|
# opencl-headers
|
|
# opencl-nvidia
|
|
mesa
|
|
#xf86-video-nouveau
|
|
cuda
|
|
#+end_src
|
|
*** paul-laptop
|
|
#+begin_src shell :tangle paul-laptop_pkg-list.txt
|
|
amd-ucode
|
|
#+end_src
|
|
** NTFS Compatibility
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
ntfs-3g
|
|
#+end_src
|
|
** Timeshift
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
timeshift
|
|
#+end_src
|
|
* Desktop Environments and Window Manager
|
|
** [[https://wiki.archlinux.org/title/LightDM][LightDM]]
|
|
install the required packages
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
lightdm
|
|
lightdm-gtk-greeter
|
|
#+end_src
|
|
and enable the systemd service
|
|
#+begin_src shell :tangle update.sh
|
|
systemd_service="lightdm"
|
|
if ! systemctl is-enabled --quiet "$systemd_service"; then
|
|
echo "Enabling $systemd_service"
|
|
sudo systemctl enable "$systemd_service"
|
|
fi
|
|
#+end_src
|
|
|
|
** [[https://www.xfce.org/][Xfce]]
|
|
*** Installation
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
xfce4-appfinder
|
|
xfce4-panel
|
|
xfce4-power-manager
|
|
xfce4-session
|
|
xfce4-settings
|
|
xfce4-terminal
|
|
xfconf
|
|
xfdesktop
|
|
xfwm4
|
|
xfwm4-themes
|
|
exo
|
|
garcon
|
|
#file manager
|
|
thunar
|
|
#external media connection handling
|
|
gvfs
|
|
thunar-volman
|
|
#thumbnail generator
|
|
tumbler
|
|
#+end_src
|
|
** [[https://qtile.org/][Qtile]]
|
|
(Almost) all configuration is done via the ~config.py~ file
|
|
*** config.py Literate File Header
|
|
#+begin_src python :mkdirp yes :tangle ~/.config/qtile/config.py
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
#+end_src
|
|
*** Installation
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
qtile
|
|
#+end_src
|
|
*** Import Qtile Dependencies
|
|
#+begin_src python :mkdirp yes :tangle ~/.config/qtile/config.py
|
|
from libqtile import layout, bar, widget, hook
|
|
from libqtile.config import Key, Drag, Click, Group, Screen, ScratchPad, DropDown
|
|
from libqtile.lazy import lazy
|
|
#+end_src
|
|
*** Defines
|
|
Defines are stored in a separate ~defines.py~ file
|
|
**** defines.py Literate File Header
|
|
#+begin_src python :mkdirp yes :tangle ~/.config/qtile/defines.py
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
#+end_src
|
|
**** Terminal
|
|
Install [[https://alacritty.org/][Alacritty]]
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
alacritty
|
|
#+end_src
|
|
and set it as default
|
|
#+begin_src python :tangle ~/.config/qtile/defines.py :mkdirp yes
|
|
term = 'alacritty'
|
|
#+end_src
|
|
**** Main/Mod Key
|
|
This config uses the "Master" or "Windows" Key as Main/Mod Key
|
|
#+begin_src python :tangle ~/.config/qtile/defines.py :mkdirp yes
|
|
mod = 'mod4'
|
|
#+end_src
|
|
|
|
*** Visual
|
|
**** Colors
|
|
Colors are set in the [[Theming]] section of this config
|
|
**** Border Width
|
|
#+begin_src python :tangle ~/.config/qtile/defines.py :mkdirp yes
|
|
border_width = 2
|
|
#+end_src
|
|
**** Window Margin
|
|
#+begin_src python :tangle ~/.config/qtile/defines.py :mkdirp yes
|
|
window_margin = 5
|
|
#+end_src
|
|
**** Floats kept above
|
|
Keep floating windows above others
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
floats_kept_above = True
|
|
#+end_src
|
|
**** Automatic Full Screen
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
auto_fullscreen = True
|
|
#+end_src
|
|
**** Automaitc Minimization
|
|
If things like steam games want to auto-minimize themselves when losing focus, should we respect this or not?
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
auto_minimize = True
|
|
#+end_src
|
|
**** _NET_ACTIVATE_WINDOW Behavior
|
|
Behavior of the _NET_ACTIVATE_WINDOW message sent by applications
|
|
- urgent: urgent flag is set for the window
|
|
- focus: automatically focus the window
|
|
- smart: automatically focus if the window is in the current group
|
|
- never: never automatically focus any window that requests
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
focus_on_window_activation = 'smart'
|
|
#+end_src
|
|
|
|
**** Widget Defaults
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
from chassis_type import ChassisType, chassis_type
|
|
from defines import base_color
|
|
widget_defaults = dict(
|
|
background=base_color,
|
|
font='UbuntuMono Nerd Font',
|
|
fontsize=18,
|
|
padding=1 if chassis_type == ChassisType.LAPTOP else 5,
|
|
)
|
|
extension_defaults = widget_defaults.copy()
|
|
#+end_src
|
|
**** Bar Sizes and Heights
|
|
#+begin_src python :tangle ~/.config/qtile/defines.py :mkdirp yes
|
|
from chassis_type import ChassisType, chassis_type
|
|
main_bar_fontsize=22
|
|
main_bar_height=24 if chassis_type == ChassisType.LAPTOP else 28
|
|
secondary_bar_height=24
|
|
secondary_bar_fontsize=18
|
|
#+end_src
|
|
*** Compositor
|
|
[[https://github.com/yshui/picom][picom]] is used to enable window composition, transparency, etc.
|
|
**** Installation
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
picom
|
|
#+end_src
|
|
**** Configuration
|
|
#+begin_src conf :tangle ~/.config/picom/picom.conf :mkdirp yes
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
#+end_src
|
|
***** Shadows
|
|
disable shadow
|
|
#+begin_src conf :tangle ~/.config/picom/picom.conf :mkdirp yes
|
|
shadow = false;
|
|
#+end_src
|
|
***** Rounded Corners
|
|
exclude Dock and Desktop from corner rounding
|
|
#+begin_src conf :tangle ~/.config/picom/picom.conf :mkdirp yes
|
|
rounded-corners-exclude = [
|
|
"window_type = 'dock'",
|
|
"window_type = 'desktop'"
|
|
]
|
|
#+end_src
|
|
|
|
**** Add to Autostart
|
|
#+begin_src shell :tangle ~/.autostart.sh
|
|
picom &
|
|
#+end_src
|
|
|
|
*** Chassis Type Detection
|
|
Needed to load correct settings for given hardware (laptop/desktop)
|
|
**** chassis_type.py Literate File Header
|
|
#+begin_src python :mkdirp yes :tangle ~/.config/qtile/chassis_type.py
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
#+end_src
|
|
**** Enum
|
|
#+begin_src python :tangle ~/.config/qtile/chassis_type.py :mkdirp yes
|
|
from enum import Enum
|
|
import subprocess
|
|
|
|
class ChassisType(Enum):
|
|
DESKTOP = 0
|
|
LAPTOP = 1
|
|
#+end_src
|
|
**** Detection Function
|
|
#+begin_src python :mkdirp yes :tangle ~/.config/qtile/chassis_type.py
|
|
def detect_chassis_type() -> ChassisType:
|
|
try:
|
|
output = subprocess.check_output(["hostnamectl", "status"], universal_newlines=True)
|
|
except subprocess.CalledProcessError as e:
|
|
print("Error running hostnamectl:", e)
|
|
exit(1)
|
|
return ChassisType.LAPTOP if "Chassis: laptop" in output else ChassisType.DESKTOP
|
|
|
|
chassis_type = detect_chassis_type()
|
|
#+end_src
|
|
*** Mouse Settings
|
|
**** Follow Mouse Focus
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
follow_mouse_focus = True
|
|
#+end_src
|
|
**** Bring to Front with Click
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
bring_front_click = True
|
|
#+end_src
|
|
**** Warp Cursor
|
|
Cursor should not jump to the window selected via keyboard
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
cursor_warp = False
|
|
#+end_src
|
|
*** Autostart
|
|
#+begin_src python :mkdirp yes :tangle ~/.config/qtile/config.py
|
|
import os
|
|
|
|
@hook.subscribe.startup_once
|
|
def autostart():
|
|
home = os.path.expanduser('~/.autostart.sh')
|
|
subprocess.call(['sh', home])
|
|
#+end_src
|
|
*** Custom Microphone Widgets
|
|
Based on the [[https://docs.qtile.org/en/stable/manual/ref/widgets.html#volume][Volume]] widget.
|
|
It requires some packages to be installed
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
python-psutil
|
|
alsa-utils
|
|
#+end_src
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
import subprocess
|
|
import psutil
|
|
import re
|
|
|
|
re_vol = re.compile(r'\[(\d?\d?\d?)%\]')
|
|
BUTTON_MUTE = 1
|
|
class Microphone(widget.base._TextBox):
|
|
"""
|
|
Custom Microphone widget
|
|
"""
|
|
orientations = widget.base.ORIENTATION_HORIZONTAL
|
|
defaults = [
|
|
("cardid", None, "Card Id"),
|
|
("device", "default", "Device Name"),
|
|
("channel", "Capture", "Channel"),
|
|
("padding", 3, "Padding left and right. Calculated if None."),
|
|
("update_interval", 0.2, "Update time in seconds."),
|
|
("theme_path", None, "Path of the icons"),
|
|
("emoji", False, "Use emoji to display volume states, only if ``theme_path`` is not set."
|
|
"The specified font needs to contain the correct unicode characters."),
|
|
("mute_command", None, "Mute command"),
|
|
("volume_app", None, "App to control volume"),
|
|
("volume_up_command", None, "Volume up command"),
|
|
("volume_down_command", None, "Volume down command"),
|
|
("get_volume_command", None, "Command to get the current volume"),
|
|
("step", 2, "Volume change for up an down commands in percentage."
|
|
"Only used if ``volume_up_command`` and ``volume_down_command`` are not set.")
|
|
]
|
|
|
|
def __init__(self, **config):
|
|
widget.base._TextBox.__init__(self, '0', width=bar.CALCULATED, **config)
|
|
self.add_defaults(Microphone.defaults)
|
|
if self.theme_path:
|
|
self.length_type = bar.STATIC
|
|
self.length = 0
|
|
self.surfaces = {}
|
|
self.volume = None
|
|
|
|
def timer_setup(self):
|
|
self.timeout_add(self.update_interval, self.update)
|
|
if self.theme_path:
|
|
self.setup_images()
|
|
|
|
def create_amixer_command(self, *args):
|
|
cmd = ['amixer']
|
|
cmd.extend([x for x in args])
|
|
return cmd
|
|
|
|
def button_press(self, x, y, button):
|
|
if button == BUTTON_MUTE:
|
|
if self.mute_command is not None:
|
|
subprocess.call(self.mute_command, shell=True)
|
|
else:
|
|
subprocess.call(self.create_amixer_command('-q',
|
|
'sset',
|
|
self.channel,
|
|
'toggle'))
|
|
self.draw()
|
|
|
|
def update(self):
|
|
vol = self.get_volume()
|
|
if vol != self.volume:
|
|
self.volume = vol
|
|
# Update the underlying canvas size before actually attempting
|
|
# to figure out how big it is and draw it.
|
|
self._update_drawer()
|
|
self.bar.draw()
|
|
self.timeout_add(self.update_interval, self.update)
|
|
|
|
def _update_drawer(self):
|
|
if self.emoji:
|
|
if self.volume > 0:
|
|
self.text = ''
|
|
elif self.volume <= 0:
|
|
self.text = ''
|
|
else:
|
|
if self.volume == -1:
|
|
self.text = 'M'
|
|
else:
|
|
self.text = '{}%'.format(self.volume)
|
|
def get_volume(self):
|
|
try:
|
|
get_volume_cmd = self.create_amixer_command('sget',
|
|
self.channel)
|
|
|
|
if self.get_volume_command:
|
|
get_volume_cmd = self.get_volume_command
|
|
|
|
mixer_out = self.call_process(get_volume_cmd)
|
|
except subprocess.CalledProcessError:
|
|
return -1
|
|
|
|
if '[off]' in mixer_out:
|
|
return -1
|
|
|
|
volgroups = re_vol.search(mixer_out)
|
|
if volgroups:
|
|
return int(volgroups.groups()[0])
|
|
else:
|
|
# this shouldn't happen
|
|
return -1
|
|
|
|
def draw(self):
|
|
if self.theme_path:
|
|
self.drawer.draw(offsetx=self.offset, width=self.length)
|
|
else:
|
|
widget.base._TextBox.draw(self)
|
|
#+end_src
|
|
|
|
#+RESULTS:
|
|
|
|
*** Widget Groups
|
|
To simplify the configuration of the [[Bars]] widgets are grouped
|
|
**** Imports
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
from libqtile import widget
|
|
from defines import term
|
|
from defines import focus_color, light_foreground_color, dark_foreground_color, background_color0, background_color8, base_color
|
|
from defines import red_color, light_red_color, green_color, light_green_color, orange_color, yellow_color, light_yellow_color, blue_color, purple_color, light_purple_color, magenta_color, cyan_color
|
|
#+end_src
|
|
**** Workspace Status
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
def workspace_status_widgets(size, fontsize):
|
|
return [
|
|
widget.CurrentLayoutIcon(
|
|
scale = 0.9,
|
|
),
|
|
widget.TextBox(
|
|
text=' ',
|
|
foreground=light_foreground_color,
|
|
fontsize=fontsize,
|
|
background=blue_color
|
|
),
|
|
widget.GroupBox(
|
|
fontsize=fontsize,
|
|
rounded=False,
|
|
disable_drag=True,
|
|
active=light_foreground_color,
|
|
inactive=dark_foreground_color,
|
|
highlight_method='block',
|
|
highlight_color=red_color,
|
|
other_screen_border = light_purple_color,
|
|
other_current_screen_border = purple_color,
|
|
this_current_screen_border = blue_color,
|
|
this_screen_border = blue_color,
|
|
urgent_alert_method='block',
|
|
urgent_border = red_color,
|
|
),
|
|
widget.WindowName(fontsize=fontsize)
|
|
]
|
|
#+end_src
|
|
**** Audio Widgets
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
def audio_widgets(size, fontsize):
|
|
return[
|
|
widget.Volume(
|
|
foreground=light_foreground_color,
|
|
background=blue_color,
|
|
emoji=True,
|
|
fontsize=fontsize,
|
|
),
|
|
widget.Volume(
|
|
foreground=light_foreground_color,
|
|
background=blue_color,
|
|
fontsize=fontsize,
|
|
padding=0
|
|
),
|
|
Microphone(
|
|
foreground=light_foreground_color,
|
|
background=blue_color,
|
|
emoji=True,
|
|
fontsize=fontsize,
|
|
),
|
|
Microphone(
|
|
foreground=light_foreground_color,
|
|
background=blue_color,
|
|
fontsize=fontsize,
|
|
padding=0
|
|
)
|
|
]
|
|
#+end_src
|
|
**** System Widgets
|
|
These change depending on [[Chassis Type Detection][Chassis Type
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
def system_widgets(size,fontsize):
|
|
sys_widgets = []
|
|
# first widget is battery for laptop and cpu temp otherwise
|
|
if chassis_type == ChassisType.LAPTOP:
|
|
sys_widgets.append(
|
|
widget.Battery(
|
|
foreground=light_foreground_color,
|
|
background=orange_color,
|
|
fontsize=fontsize,
|
|
update_interval=1,
|
|
format="{char} {percent:2.0%}",
|
|
low_percentage=0.2,
|
|
notify_below=True,
|
|
low_foreground=red_color,
|
|
)
|
|
)
|
|
else:
|
|
sys_widgets.extend([
|
|
widget.TextBox(
|
|
text='',
|
|
foreground=light_foreground_color,
|
|
background=orange_color,
|
|
fontsize=fontsize+6
|
|
),
|
|
widget.ThermalSensor(
|
|
foreground=light_foreground_color,
|
|
background=orange_color,
|
|
fontsize=fontsize,
|
|
tag_sensor='Tctl',
|
|
)
|
|
])
|
|
sys_widgets.extend([
|
|
widget.TextBox(
|
|
text=' ',
|
|
foreground=light_foreground_color,
|
|
background=green_color,
|
|
fontsize=fontsize
|
|
),
|
|
widget.CPU(
|
|
foreground=light_foreground_color,
|
|
background=green_color,
|
|
fontsize=fontsize,
|
|
format='{load_percent}%' if chassis_type == ChassisType.LAPTOP else'{load_percent}% @ {freq_current}GHz',
|
|
),
|
|
widget.TextBox(
|
|
text='',
|
|
foreground=light_foreground_color,
|
|
background=yellow_color,
|
|
fontsize=fontsize
|
|
),
|
|
widget.Memory(
|
|
foreground=light_foreground_color,
|
|
background=yellow_color,
|
|
fontsize=fontsize,
|
|
format='{MemUsed: 2.1f}GB|{SwapUsed: 2.1f}GB' if chassis_type == ChassisType.LAPTOP else'{MemUsed: 2.1f}GB({MemPercent: 2.0f}%) | {SwapUsed: 2.1f}GB({SwapPercent: 2.0f}%)',
|
|
measure_mem = 'G',
|
|
measure_swap = 'G',
|
|
),
|
|
widget.TextBox(
|
|
text=' ',
|
|
foreground=light_foreground_color,
|
|
background=blue_color,
|
|
fontsize=fontsize
|
|
),
|
|
widget.Net(
|
|
background=blue_color,
|
|
foreground=light_foreground_color,
|
|
fontsize=fontsize,
|
|
prefix='M',
|
|
format='{down:6.2f}{down_suffix}↓{up:6.2f}{up_suffix}↑',
|
|
)
|
|
]
|
|
)
|
|
return sys_widgets
|
|
#+end_src
|
|
**** Datetime
|
|
These require the [[https://www.keshikan.net/fonts-e.html][DSEG Font]]
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
ttf-dseg
|
|
#+end_src
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
def datetime_widgets(size,fontsize):
|
|
return [
|
|
widget.TextBox(
|
|
text=' ',
|
|
foreground=light_foreground_color,
|
|
background=purple_color,
|
|
fontsize=fontsize
|
|
),
|
|
widget.Clock(
|
|
foreground=light_foreground_color,
|
|
background=purple_color,
|
|
fontsize=fontsize,
|
|
format='%Y-%m-%d'
|
|
),
|
|
widget.Clock(
|
|
font='dseg7 classic bold',
|
|
fontsize=16,
|
|
format='%H:%M'
|
|
),
|
|
]
|
|
#+end_src
|
|
*** Bars
|
|
**** Imports
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
from libqtile import widget, bar
|
|
from defines import base_color, blue_color
|
|
from defines import main_bar_fontsize, main_bar_height, secondary_bar_height, secondary_bar_fontsize
|
|
#+end_src
|
|
**** Main Bar
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
main_bar = bar.Bar([
|
|
*workspace_status_widgets(main_bar_height,main_bar_fontsize),
|
|
widget.Systray(fontsize=main_bar_fontsize),
|
|
*audio_widgets(main_bar_height,main_bar_fontsize),
|
|
*system_widgets(main_bar_height,main_bar_fontsize),
|
|
*datetime_widgets(main_bar_height,main_bar_fontsize),
|
|
],main_bar_height)
|
|
#+end_src
|
|
**** Left Screen Bars
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
left_bar = bar.Bar([
|
|
*workspace_status_widgets(secondary_bar_height,secondary_bar_fontsize),
|
|
*audio_widgets(secondary_bar_height,secondary_bar_fontsize),
|
|
*datetime_widgets(secondary_bar_height,secondary_bar_fontsize)
|
|
],secondary_bar_height)
|
|
#+end_src
|
|
**** Secondary Bar
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
secondary_bar = bar.Bar([
|
|
*workspace_status_widgets(secondary_bar_height,secondary_bar_fontsize),
|
|
*audio_widgets(secondary_bar_height,secondary_bar_fontsize),
|
|
*datetime_widgets(secondary_bar_height,secondary_bar_fontsize)
|
|
],secondary_bar_height)
|
|
#+end_src
|
|
|
|
**** Top Screen Bar
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
top_bar = bar.Bar([
|
|
*workspace_status_widgets(secondary_bar_height,secondary_bar_fontsize),
|
|
*audio_widgets(secondary_bar_height,secondary_bar_fontsize),
|
|
*datetime_widgets(secondary_bar_height,secondary_bar_fontsize)
|
|
],secondary_bar_height)
|
|
#+end_src
|
|
|
|
*** Screens
|
|
**** Desktop Screen Detection
|
|
On my desktop setup I have to special screens that should be detected
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
main_screen_res = [3440,1440]
|
|
top_screen_res = [1440,900]
|
|
#+end_src
|
|
**** Getting Screen Information
|
|
***** Dependencies
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
xorg-xrandr
|
|
#+end_src
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
import subprocess
|
|
import re
|
|
import numpy as np
|
|
from libqtile.config import Screen
|
|
#+end_src
|
|
***** Reading the Information
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
cmd = ['xrandr','--listmonitors']
|
|
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
|
|
resolution_string, junk = p.communicate()
|
|
p.stdout.close()
|
|
screen_resolutions = re.findall(r'(\d+)/\d+x(\d+)/', str(resolution_string))
|
|
max_width = max(screen_resolutions, key=lambda res: res[0])[0]
|
|
#+end_src
|
|
**** Setting the Screens
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
screens = []
|
|
defined_main_window = False
|
|
for width, height in screen_resolutions:
|
|
if width == main_screen_res[0] and height == main_screen_res[1]:
|
|
screens.append(Screen(top=main_bar, wallpaper= "~/Pictures/Wallpapers/gruvbox-like.jpg", wallpaper_mode="fill"))
|
|
defined_main_window = True
|
|
elif width == top_screen_res[0] and height == top_screen_res[1]:
|
|
screens.append(Screen(bottom=top_bar, wallpaper="~/Pictures/Wallpapers/Xorg.jpg", wallpaper_mode="fill"))
|
|
elif width < height:
|
|
screens.append(Screen(top=left_bar, wallpaper="~/Pictures/Wallpapers/gruvbox-like-left.jpg", wallpaper_mode="fill"))
|
|
elif width == max_width and not defined_main_window:
|
|
screens.append(Screen(top=main_bar, wallpaper= "~/Pictures/Wallpapers/gruvbox-like.jpg", wallpaper_mode="fill"))
|
|
defined_main_window = True
|
|
else:
|
|
screens.append(Screen(top=secondary_bar, wallpaper= "~/Pictures/Wallpapers/gruvbox-like.jpg", wallpaper_mode="fill"))
|
|
#+end_src
|
|
**** Automatically Reconfigure Screens
|
|
Controls whether or not to automatically reconfigure screens when there are changes in randr output configuration.
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
reconfigure_screens = True
|
|
#+end_src
|
|
*** Layouts
|
|
**** Basic Layouts
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
from libqtile import layout
|
|
from defines import focus_color, border_width, window_margin
|
|
|
|
layouts = [
|
|
layout.MonadTall(
|
|
align=1,
|
|
border_focus = focus_color,
|
|
border_width = border_width,
|
|
margin=window_margin,
|
|
new_client_position = 'after_current',
|
|
),
|
|
layout.Floating(
|
|
border_focus = focus_color,
|
|
border_width = border_width,
|
|
margin=window_margin,
|
|
),
|
|
layout.Max(),
|
|
layout.MonadWide(
|
|
border_focus = focus_color,
|
|
border_width = border_width,
|
|
new_client_position = 'after_current',
|
|
margin=window_margin,
|
|
),
|
|
layout.Columns(
|
|
border_focus = focus_color,
|
|
border_width = border_width,
|
|
num_columns = 3,
|
|
margin = window_margin,
|
|
)
|
|
]
|
|
#+end_src
|
|
**** Floating Layout
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
from libqtile import layout
|
|
from libqtile.config import Match
|
|
from defines import focus_color, border_width
|
|
|
|
floating_layout = layout.Floating(
|
|
border_focus = focus_color,
|
|
border_width = border_width,
|
|
float_rules=[
|
|
# Run the utility of `xprop` to see the wm class and name of an X client.
|
|
,*layout.Floating.default_float_rules,
|
|
Match(wm_class='confirmreset'), # gitk
|
|
Match(wm_class='makebranch'), # gitk
|
|
Match(wm_class='maketag'), # gitk
|
|
Match(title='branchdialog'), # gitk
|
|
Match(title='pinentry'), # GPG key password entry
|
|
Match(wm_class='ssh-askpass'), # ssh-askpass
|
|
Match(wm_class='sun-awt-X11-XWindowPeer'), #matlab
|
|
Match(wm_class='sun-awt-X11-XDialogPeer'), #matlab
|
|
])
|
|
#+end_src
|
|
***** Enable Dragging
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
from libqtile.config import Drag, Click
|
|
from libqtile.lazy import lazy
|
|
from defines import mod
|
|
mouse = [
|
|
Drag([mod], "Button1", lazy.window.set_position_floating(),
|
|
start=lazy.window.get_position()),
|
|
Drag([mod], "Button3", lazy.window.set_size_floating(),
|
|
start=lazy.window.get_size()),
|
|
Click([mod], "Button2", lazy.window.bring_to_front())
|
|
]
|
|
#+end_src
|
|
*** Groups
|
|
**** Dependencies
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
from libqtile.config import Group, ScratchPad, DropDown, Key, Match
|
|
from libqtile.lazy import lazy
|
|
|
|
import re
|
|
|
|
from defines import mod,term
|
|
#+end_src
|
|
**** Main Groups
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
main_groups_info = [(" ","Org",'o',{'layout': 'monadtall'}),
|
|
(" ","Home", 'h',{'layout': 'monadtall'}),
|
|
(" ","Browser", 'f',{'layout': 'monadtall'}),
|
|
(" ","Mail", 'm',{'layout': 'monadtall', 'matches':[Match(wm_class="Mail")]}),
|
|
(" ","Coding", 'c',{'layout': 'monadtall', 'matches' : [Match(wm_class="code")]}),
|
|
(" ","Documents", 'l',{'layout': 'monadtall'}),
|
|
(" ","Music", 'u',{'layout': 'monadtall', 'matches' : [Match(wm_class="spotify")]}),
|
|
(" ","Video", 'v',{'layout': 'monadtall', 'matches' : [Match(wm_class="vlc")]}),
|
|
(" ","VideoChat", 'z',{'layout': 'monadtall', 'matches':[Match(wm_class="discord")]}),
|
|
("一","etc1", '1', {'layout': 'monadtall'}),
|
|
("二","etc2", '2', {'layout': 'monadtall'}),
|
|
("三","etc3", '3', {'layout': 'monadtall'}),
|
|
("四","etc4", '4', {'layout': 'monadtall'})]
|
|
|
|
groups = [Group(icon, **kwargs) for icon, name, key, kwargs in main_groups_info]
|
|
#+end_src
|
|
**** DropDown Groups
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
dropdown_groups_info = []
|
|
#+end_src
|
|
***** [[https://christian.amsuess.com/tools/arandr/][ARandR]]
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
arandr
|
|
#+end_src
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
name = 'ARandR'
|
|
dropdown_groups_info.append((name,
|
|
DropDown(name,
|
|
'arandr',
|
|
height = 0.5,
|
|
width = 0.8,
|
|
x = 0.1, # (1-0.8)/2
|
|
on_focus_lost_hide=True,
|
|
opacity=1,
|
|
match = Match(wm_class='arandr')
|
|
),
|
|
[mod],'p'))
|
|
#+end_src
|
|
***** DropDown Terminal
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
name = 'Terminal'
|
|
dropdown_groups_info.append((name,
|
|
DropDown(name,
|
|
term,
|
|
height = 0.5,
|
|
width = 0.8,
|
|
x = .1
|
|
),
|
|
['mod1','control'],'space'))
|
|
#+end_src
|
|
***** [[https://htop.dev/][htop]]
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
htop
|
|
#+end_src
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
name = 'htop'
|
|
dropdown_groups_info.append((name,
|
|
DropDown(name,
|
|
term + ' -e htop'
|
|
),
|
|
['control','shift'],'Escape'))
|
|
#+end_src
|
|
***** Audio Settings
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
pavucontrol
|
|
#+end_src
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
name = 'Audio Settings'
|
|
dropdown_groups_info.append((name,
|
|
DropDown(name,
|
|
'pavucontrol'
|
|
),
|
|
['mod1','control'],'a'))
|
|
#+end_src
|
|
***** DropDown [[https://wiki.archlinux.org/title/PCManFM][PCManFM]]
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
pcmanfm-gtk3
|
|
#+end_src
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
name = 'filemanager'
|
|
dropdown_groups_info.append((name,
|
|
DropDown(name,
|
|
'pcmanfm',
|
|
on_focus_lost_hide=False,
|
|
opacity=1
|
|
),
|
|
['mod1','control'],'e'))
|
|
#+end_src
|
|
***** [[https://bitwarden.com/][Bitwarden]]
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
bitwarden
|
|
#+end_src
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
name = 'Bitwarden'
|
|
dropdown_groups_info.append((name,
|
|
DropDown(name,
|
|
'bitwarden-desktop',
|
|
on_focus_lost_hide=False,
|
|
match = Match(wm_class='bitwarden')
|
|
),
|
|
['mod1','control'],'b'))
|
|
#+end_src
|
|
***** WhatsApp
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
whatsapp-for-linux
|
|
#+end_src
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
name = 'WhatsApp'
|
|
dropdown_groups_info.append((name,
|
|
DropDown(name,
|
|
'whatsapp-for-linux',
|
|
height = 0.5,
|
|
width = 0.8,
|
|
x = .1,
|
|
on_focus_lost_hide=False,
|
|
opacity=1
|
|
),
|
|
['mod1','control'],'w'))
|
|
#+end_src
|
|
|
|
***** [[https://www.signal.org/][Signal]]
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
signal-desktop
|
|
#+end_src
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
name = 'Signal'
|
|
dropdown_groups_info.append((name,
|
|
DropDown(name,
|
|
'signal-desktop',
|
|
height = 0.5,
|
|
width = 0.8,
|
|
x = .1,
|
|
on_focus_lost_hide=False,
|
|
opacity = 1,
|
|
match = Match(wm_class='signal')
|
|
),
|
|
['mod1','control'],'i'))
|
|
#+end_src
|
|
***** [[https://qalculate.github.io/][Qalculate!]]
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
qalculate-gtk
|
|
#+end_src
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
name = 'Qalculate!'
|
|
dropdown_groups_info.append((name,
|
|
DropDown(name,
|
|
'qalculate-gtk',
|
|
height = 0.5,
|
|
width = 0.5,
|
|
x = .25,
|
|
on_focus_lost_hide=True,
|
|
opacity = 1
|
|
),
|
|
['mod1','control'],'q'))
|
|
#+end_src
|
|
***** [[https://slack.com][Slack]]
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
slack-desktop
|
|
#+end_src
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
name = 'Slack'
|
|
dropdown_groups_info.append((name,
|
|
DropDown(name,
|
|
'slack',
|
|
height = 0.5,
|
|
width = 0.8,
|
|
x = 0.1,
|
|
on_focus_lost_hide=False,
|
|
opacity=1
|
|
),
|
|
['mod1','control'],'s'))
|
|
#+end_src
|
|
***** [[https://www.deepl.com/translator][DeepL]]
|
|
DeepL is being used inside a [[https://surf.suckless.org/][surf]] DropDown
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
surf
|
|
#+end_src
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
name = 'DeepL'
|
|
dropdown_groups_info.append((name,
|
|
DropDown(name,
|
|
'surf deepl.com',
|
|
height = 0.5,
|
|
width = 0.8,
|
|
x = 0.1,
|
|
on_focus_lost_hide=True,
|
|
opacity=1
|
|
),
|
|
['mod1','control'],'d'))
|
|
#+end_src
|
|
***** [[https://telegram.org/][Telegram]]
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
telegram-desktop
|
|
#+end_src
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
name = 'Telegram'
|
|
dropdown_groups_info.append((name,
|
|
DropDown(name,
|
|
'telegram-desktop',
|
|
height = 0.5,
|
|
width = 0.8,
|
|
x = 0.1,
|
|
on_focus_lost_hide=False,
|
|
opacity=1,
|
|
match = Match(wm_class='telegram-desktop')
|
|
),
|
|
['mod1','control'],'t'))
|
|
#+end_src
|
|
***** [[Rocket.Chat]]
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
name = 'Rocket.Chat'
|
|
dropdown_groups_info.append((name,
|
|
DropDown(name,
|
|
'rocketchat-desktop',
|
|
height = 0.5,
|
|
width = 0.8,
|
|
x = 0.1,
|
|
on_focus_lost_hide=False,
|
|
opacity=1,
|
|
match = Match(wm_class='rocket.chat')
|
|
),
|
|
['mod1','control'],'r'))
|
|
#+end_src
|
|
***** Org Agenda
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
name = 'Org Agenda'
|
|
dropdown_groups_info.append((name,
|
|
DropDown(name,
|
|
'emacsclient -c -e \'(org-agenda-list)\'',
|
|
height = 0.5,
|
|
width = 0.8,
|
|
x = 0.1,
|
|
on_focus_lost_hide=True,
|
|
opacity=1,
|
|
match = Match(wm_class='emacs')
|
|
),
|
|
['mod1','control'],'k'))
|
|
#+end_src
|
|
***** Add ScratchPad to Groups
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
groups.append(ScratchPad("scratchpad",
|
|
[dropdown for (name,dropdown,base_keys,key) in dropdown_groups_info]
|
|
))
|
|
#+end_src
|
|
**** Hotkeys
|
|
***** Main Group Hotkeys
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
try:
|
|
_ = keys
|
|
except NameError:
|
|
keys = []
|
|
for (icon,name,key, kwargs) in main_groups_info:
|
|
keys.extend([
|
|
Key(["mod1","control"], str(key), lazy.group[icon].toscreen(toggle=True),
|
|
desc="Switch to group {}".format(name)),
|
|
|
|
Key(['mod1','control', "shift"], str(key), lazy.window.togroup(icon),
|
|
desc="move focused window to group {}".format(name)),
|
|
])
|
|
#+end_src
|
|
***** DropDown Group Hotkeys
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
try:
|
|
_ = keys
|
|
except NameError:
|
|
keys = []
|
|
for (name,dropdown,base_keys,key) in dropdown_groups_info:
|
|
keys.extend([
|
|
Key(base_keys,key,lazy.group['scratchpad'].dropdown_toggle(name), desc=f'open the dropdown for {name}')
|
|
])
|
|
#+end_src
|
|
*** Keys
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
from libqtile.config import Key
|
|
from libqtile.lazy import lazy
|
|
|
|
from defines import mod, term
|
|
from chassis_type import ChassisType, chassis_type
|
|
|
|
try:
|
|
_ = keys
|
|
except NameError:
|
|
keys = []
|
|
#+end_src
|
|
**** Screen Lock
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
keys.extend([
|
|
Key([mod], "End" , lazy.spawn('dm-tool lock'),desc="locks session"),
|
|
Key([], "Pause" , lazy.spawn('dm-tool lock'),desc="locks session")
|
|
])
|
|
#+end_src
|
|
**** Moving Focus
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
keys.extend([
|
|
Key([mod], "h", lazy.layout.left(),desc="move focus left"),
|
|
Key([mod], "l", lazy.layout.right(),desc="move focus right"),
|
|
Key([mod], "j", lazy.layout.down(),desc="move focus down"),
|
|
Key([mod], "k", lazy.layout.up(),desc="move focus up"),
|
|
Key([mod,"mod1"], "n", lazy.next_screen(),desc="move focus to next screen")
|
|
])
|
|
#+end_src
|
|
**** Moving Windows
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
keys.extend([
|
|
Key([mod, "shift"], "h", lazy.layout.swap_left(),desc="move focused window left"),
|
|
Key([mod, "shift"], "l", lazy.layout.swap_right(),desc="move focused window right"),
|
|
Key([mod, "shift"], "j", lazy.layout.shuffle_down(),desc="move focused window down"),
|
|
Key([mod, "shift"], "k", lazy.layout.shuffle_up(),desc="move focused window up"),
|
|
])
|
|
#+end_src
|
|
**** Resize Windows
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
keys.extend([
|
|
Key([mod], "plus", lazy.layout.grow(),desc="increase window size"),
|
|
Key([mod], "minus", lazy.layout.shrink(),desc="decrease window size"),
|
|
Key([mod], "m", lazy.layout.maximize(),desc="maximize current window"),
|
|
Key([mod], "space", lazy.window.toggle_fullscreen(),desc="toggle current window fullscreen"),
|
|
])
|
|
#+end_src
|
|
**** Toggle Layouts
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
keys.extend([
|
|
Key([mod], "Tab", lazy.next_layout(), desc="Toggle between layouts"),
|
|
])
|
|
#+end_src
|
|
**** Close Current Window
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
keys.extend([
|
|
Key([mod], "BackSpace", lazy.window.kill(), desc="Kill focused window"),
|
|
])
|
|
#+end_src
|
|
**** Qtile Meta Commands
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
keys.extend([
|
|
Key([mod, "control"], "r", lazy.restart(), desc="Restart qtile"),
|
|
Key([mod, "control"], "q", lazy.shutdown(), desc="Shutdown qtile"),
|
|
])
|
|
#+end_src
|
|
**** Audio
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
pamixer
|
|
#+end_src
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
keys.extend([
|
|
Key([], 'XF86AudioRaiseVolume', lazy.spawn(f'pamixer -i {5 if chassis_type == ChassisType.LAPTOP else 1}'), desc="increase speaker volume"),
|
|
Key([], 'XF86AudioLowerVolume', lazy.spawn(f'pamixer -d {5 if chassis_type == ChassisType.LAPTOP else 1}'), desc="decrease speaker volume"),
|
|
Key([], 'XF86AudioMute', lazy.spawn('pamixer -t'), desc="toggle speaker mute"),
|
|
Key(['control'], 'XF86AudioRaiseVolume', lazy.spawn(f'amixer set Capture {5 if chassis_type == ChassisType.LAPTOP else 1}%+'), desc="increase mic volume"),
|
|
Key(['control'], 'XF86AudioLowerVolume', lazy.spawn(f'amixer set Capture {5 if chassis_type == ChassisType.LAPTOP else 1}%-'), desc="decrease mic volume"),
|
|
Key(['control'], 'XF86AudioMute', lazy.spawn('amixer set Capture toggle'), desc="toggle mic mute"),
|
|
Key([], 'XF86AudioMicMute', lazy.spawn('amixer set Capture toggle'), desc="toggle mic mute"),
|
|
])
|
|
#+end_src
|
|
***** Add User to Audio Group
|
|
#+begin_src shell :tangle update.sh
|
|
groupname="audio"
|
|
|
|
# Add the current user to the group if not already a member
|
|
if ! groups "$USER" | grep -q "\b$groupname\b"; then
|
|
echo "Adding user $USER to group $groupname"
|
|
sudo usermod -aG "$groupname" "$USER"
|
|
if [ $? -eq 0 ]; then
|
|
echo "User $USER added to group $groupname successfully."
|
|
else
|
|
echo "Failed to add user $USER to group $groupname."
|
|
fi
|
|
fi
|
|
#+end_src
|
|
**** Media Playback
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
playerctl
|
|
#+end_src
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
keys.extend([
|
|
Key([], 'XF86AudioNext', lazy.spawn('playerctl next')),
|
|
Key([], 'XF86AudioPrev', lazy.spawn('playerctl previous')),
|
|
Key([], 'XF86AudioPlay', lazy.spawn('playerctl play-pause')),
|
|
Key([mod], 'Right', lazy.spawn('playerctl next')),
|
|
Key([mod], 'Left', lazy.spawn('playerctl previous')),
|
|
Key([mod], 'Down', lazy.spawn('playerctl play-pause')),
|
|
])
|
|
#+end_src
|
|
**** Monitor Backlight
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
acpilight
|
|
#+end_src
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
keys.extend([
|
|
Key([], 'XF86MonBrightnessUp', lazy.spawn('xbacklight -inc 5')),
|
|
Key([], 'XF86MonBrightnessDown', lazy.spawn('xbacklight -dec 5')),
|
|
])
|
|
#+end_src
|
|
***** Add User to Video Group
|
|
#+begin_src shell :tangle update.sh
|
|
groupname="video"
|
|
|
|
# Add the current user to the group if not already a member
|
|
if ! groups "$USER" | grep -q "\b$groupname\b"; then
|
|
echo "Adding user $USER to group $groupname"
|
|
sudo usermod -aG "$groupname" "$USER"
|
|
if [ $? -eq 0 ]; then
|
|
echo "User $USER added to group $groupname successfully."
|
|
else
|
|
echo "Failed to add user $USER to group $groupname."
|
|
fi
|
|
fi
|
|
#+end_src
|
|
**** App Launch Hotkeys
|
|
***** Terminal
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
keys.extend([
|
|
Key([mod],"t", lazy.spawn(term), desc="Launch terminal"),
|
|
])
|
|
#+end_src
|
|
***** [[Firefox]]
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
keys.extend([
|
|
Key([mod],"f", lazy.spawn("firefox"),desc="Launch firefox"),
|
|
])
|
|
#+end_src
|
|
***** PCManFM
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
pcmanfm-gtk3
|
|
#+end_src
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
keys.extend([
|
|
Key([mod],"e", lazy.spawn("pcmanfm"),desc="Launch pcmanfm"),
|
|
])
|
|
#+end_src
|
|
***** [[VSCode]]
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
keys.extend([
|
|
Key([mod],"c", lazy.spawn("code"),desc="Launch visual studio code"),
|
|
])
|
|
#+end_src
|
|
***** [[NeoVim]]
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
keys.extend([
|
|
Key([mod],"v", lazy.spawn(term + " -e nvim"),desc="Launch NeoVim"),
|
|
])
|
|
#+end_src
|
|
***** Screenshot Tool
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
gscreenshot
|
|
#+end_src
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
keys.extend([
|
|
Key([mod, "shift"],"s", lazy.spawn('gscreenshot -s -o -f /tmp/screenshots'),desc="take a screenshot"),
|
|
])
|
|
#+end_src
|
|
***** [[Doom Emacs]]
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
keys.extend([
|
|
Key([mod], "o", lazy.spawn("emacsclient -c -a 'emacs'"), desc="Launch Emacs (Client)"),
|
|
])
|
|
#+end_src
|
|
***** App Launcher
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
rofi
|
|
#+end_src
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
keys.extend([
|
|
Key([mod],'Return',lazy.spawn("rofi -show drun -show-icons -modi drun"),desc="launch rofi (drun)"),
|
|
])
|
|
#+end_src
|
|
*** Misc
|
|
Miscelaneous settings from the [[https://docs.qtile.org/en/stable/manual/config/default.html][default config]]
|
|
**** Deactivate dgroups
|
|
dynamic group keys are not needed, because they are assigned manually
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
dgroups_key_binder = None
|
|
dgroups_app_rules = [] # type: List
|
|
#+end_src
|
|
**** Setting WM Name
|
|
Nobody really uses or cares about this string besides java UI toolkits;
|
|
you can see several discussions on the mailing lists, GitHub issues, and other WM documentation that suggest setting this string if your java app doesn't work correctly.
|
|
We may as well just lie and say that we're a working one by default.
|
|
We choose LG3D to maximize irony:
|
|
it is a 3D non-reparenting WM written in java that happens to be on java's whitelist.
|
|
#+begin_src python :tangle ~/.config/qtile/config.py :mkdirp yes
|
|
wmname = 'LG3D'
|
|
#+end_src
|
|
*** [[https://dunst-project.org/][Dunst]]
|
|
**** Installation
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
dunst
|
|
#+end_src
|
|
**** Configuration
|
|
#+begin_src conf :mkdirp yes :tangle ~/.config/dunst/dunstrc
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
#+end_src
|
|
***** Global Configuration
|
|
#+begin_src conf :tangle ~/.config/dunst/dunstrc
|
|
[global]
|
|
### Display ###
|
|
#+end_src
|
|
****** Monitor
|
|
display dunst notifications on the main monitor
|
|
#+begin_src conf :tangle ~/.config/dunst/dunstrc
|
|
monitor = 0
|
|
# Display notification on focused monitor. Possible modes are:
|
|
# mouse: follow mouse pointer
|
|
# keyboard: follow window with keyboard focus
|
|
# none: don't follow anything
|
|
#
|
|
# "keyboard" needs a window manager that exports the
|
|
# _NET_ACTIVE_WINDOW property.
|
|
# This should be the case for almost all modern window managers.
|
|
#
|
|
# If this option is set to mouse or keyboard, the monitor option
|
|
# will be ignored.
|
|
follow = none
|
|
#+end_src
|
|
****** Geometry
|
|
#+begin_src conf :tangle ~/.config/dunst/dunstrc
|
|
# constant width
|
|
width = 500
|
|
|
|
# The height of a single notification, excluding the frame.
|
|
# dynamic
|
|
height = (0, 300)
|
|
|
|
# Position the notification in the top right corner
|
|
origin = top-right
|
|
|
|
# Offset from the origin
|
|
offset = (10, 50)
|
|
|
|
# Scale factor. It is auto-detected if value is 0.
|
|
scale = 0
|
|
|
|
# Maximum number of notification (0 means no limit)
|
|
notification_limit = 0
|
|
|
|
# Show how many messages are currently hidden (because of
|
|
# notification_limit).
|
|
indicate_hidden = yes
|
|
#+end_src
|
|
****** Progress Bar
|
|
#+begin_src conf :tangle ~/.config/dunst/dunstrc
|
|
# Turn on the progress bar. It appears when a progress hint is passed with
|
|
# for example dunstify -h int:value:12
|
|
progress_bar = true
|
|
|
|
# Set the progress bar height. This includes the frame, so make sure
|
|
# it's at least twice as big as the frame width.
|
|
progress_bar_height = 10
|
|
|
|
# Set the frame width of the progress bar
|
|
progress_bar_frame_width = 1
|
|
|
|
# Set the minimum width for the progress bar
|
|
progress_bar_min_width = 150
|
|
|
|
# Set the maximum width for the progress bar
|
|
progress_bar_max_width = 500
|
|
|
|
# Corner radius for the progress bar. 0 disables rounded corners.
|
|
progress_bar_corner_radius = 0
|
|
|
|
# Define which corners to round when drawing the progress bar. If progress_bar_corner_radius
|
|
# is set to 0 this option will be ignored.
|
|
progress_bar_corners = all
|
|
|
|
# Draw a line of "separator_height" pixel height between two
|
|
# notifications.
|
|
# Set to 0 to disable.
|
|
# If gap_size is greater than 0, this setting will be ignored.
|
|
separator_height = 2
|
|
|
|
# Padding between text and separator.
|
|
padding = 8
|
|
|
|
# Horizontal padding.
|
|
horizontal_padding = 8
|
|
|
|
# Padding between text and icon.
|
|
text_icon_padding = 0
|
|
|
|
# Defines width in pixels of frame around the notification window.
|
|
# Set to 0 to disable.
|
|
frame_width = 3
|
|
|
|
# Size of gap to display between notifications - requires a compositor.
|
|
# If value is greater than 0, separator_height will be ignored and a border
|
|
# of size frame_width will be drawn around each notification instead.
|
|
# Click events on gaps do not currently propagate to applications below.
|
|
gap_size = 0
|
|
#+end_src
|
|
****** Icons
|
|
#+begin_src conf :tangle ~/.config/dunst/dunstrc
|
|
# Corner radius for the icon image.
|
|
icon_corner_radius = 0
|
|
|
|
# Define which corners to round when drawing the icon image. If icon_corner_radius
|
|
# is set to 0 this option will be ignored.
|
|
icon_corners = all
|
|
|
|
# Recursive icon lookup. You can set a single theme, instead of having to
|
|
# define all lookup paths.
|
|
enable_recursive_icon_lookup = true
|
|
|
|
# Set icon theme (only used for recursive icon lookup)
|
|
icon_theme = Adwaita
|
|
# You can also set multiple icon themes, with the leftmost one being used first.
|
|
# icon_theme = "Adwaita, breeze"
|
|
|
|
# Align icons left/right/top/off
|
|
icon_position = left
|
|
|
|
# Scale small icons up to this size, set to 0 to disable. Helpful
|
|
# for e.g. small files or high-dpi screens. In case of conflict,
|
|
# max_icon_size takes precedence over this.
|
|
min_icon_size = 32
|
|
|
|
# Scale larger icons down to this size, set to 0 to disable
|
|
max_icon_size = 128
|
|
|
|
# Paths to default icons (only necessary when not using recursive icon lookup)
|
|
icon_path = /usr/share/icons/gnome/16x16/status/:/usr/share/icons/gnome/16x16/devices/
|
|
#+end_src
|
|
****** Transparency
|
|
#+begin_src conf :tangle ~/.config/dunst/dunstrc
|
|
# The transparency of the window. Range: [0; 100].
|
|
# This option will only work if a compositing window manager is
|
|
# present (e.g. xcompmgr, compiz, etc.). (X11 only)
|
|
transparency = 0
|
|
#+end_src
|
|
****** Colors
|
|
#+begin_src conf :tangle ~/.config/dunst/dunstrc
|
|
# Defines color of the frame around the notification window.
|
|
frame_color = "#aaaaaa"
|
|
|
|
# Define a color for the separator.
|
|
# possible values are:
|
|
# * auto: dunst tries to find a color fitting to the background;
|
|
# * foreground: use the same color as the foreground;
|
|
# * frame: use the same color as the frame;
|
|
# * anything else will be interpreted as a X color.
|
|
separator_color = frame
|
|
#+end_src
|
|
****** Sorting
|
|
#+begin_src conf :tangle ~/.config/dunst/dunstrc
|
|
# Sort type.
|
|
# possible values are:
|
|
# * id: sort by id
|
|
# * urgency_ascending: sort by urgency (low then normal then critical)
|
|
# * urgency_descending: sort by urgency (critical then normal then low)
|
|
# * update: sort by update (most recent always at the top)
|
|
sort = yes
|
|
#+end_src
|
|
****** Text
|
|
#+begin_src conf :tangle ~/.config/dunst/dunstrc
|
|
font = Monospace 8
|
|
|
|
# The spacing between lines. If the height is smaller than the
|
|
# font height, it will get raised to the font height.
|
|
line_height = 0
|
|
|
|
# Possible values are:
|
|
# full: Allow a small subset of html markup in notifications:
|
|
# <b>bold</b>
|
|
# <i>italic</i>
|
|
# <s>strikethrough</s>
|
|
# <u>underline</u>
|
|
#
|
|
# For a complete reference see
|
|
# <https://docs.gtk.org/Pango/pango_markup.html>.
|
|
#
|
|
# strip: This setting is provided for compatibility with some broken
|
|
# clients that send markup even though it's not enabled on the
|
|
# server. Dunst will try to strip the markup but the parsing is
|
|
# simplistic so using this option outside of matching rules for
|
|
# specific applications *IS GREATLY DISCOURAGED*.
|
|
#
|
|
# no: Disable markup parsing, incoming notifications will be treated as
|
|
# plain text. Dunst will not advertise that it has the body-markup
|
|
# capability if this is set as a global setting.
|
|
#
|
|
# It's important to note that markup inside the format option will be parsed
|
|
# regardless of what this is set to.
|
|
markup = full
|
|
|
|
# The format of the message. Possible variables are:
|
|
# %a appname
|
|
# %s summary
|
|
# %b body
|
|
# %i iconname (including its path)
|
|
# %I iconname (without its path)
|
|
# %p progress value if set ([ 0%] to [100%]) or nothing
|
|
# %n progress value if set without any extra characters
|
|
# %% Literal %
|
|
# Markup is allowed
|
|
format = "<b>%s</b>\n%b"
|
|
|
|
# Alignment of message text.
|
|
# Possible values are "left", "center" and "right".
|
|
alignment = left
|
|
|
|
# Vertical alignment of message text and icon.
|
|
# Possible values are "top", "center" and "bottom".
|
|
vertical_alignment = center
|
|
|
|
# Show age of message if message is older than show_age_threshold
|
|
# seconds.
|
|
# Set to -1 to disable.
|
|
show_age_threshold = 60
|
|
|
|
# Specify where to make an ellipsis in long lines.
|
|
# Possible values are "start", "middle" and "end".
|
|
ellipsize = middle
|
|
|
|
# Ignore newlines '\n' in notifications.
|
|
ignore_newline = no
|
|
|
|
# Stack together notifications with the same content
|
|
stack_duplicates = true
|
|
|
|
# Hide the count of stacked notifications with the same content
|
|
hide_duplicate_count = false
|
|
|
|
# Display indicators for URLs (U) and actions (A).
|
|
show_indicators = yes
|
|
#+end_src
|
|
****** History
|
|
#+begin_src conf :tangle ~/.config/dunst/dunstrc
|
|
# Should a notification popped up from history be sticky or timeout
|
|
# as if it would normally do.
|
|
sticky_history = yes
|
|
|
|
# Maximum amount of notifications kept in history
|
|
history_length = 20
|
|
#+end_src
|
|
****** Misc/Advanced
|
|
#+begin_src conf :tangle ~/.config/dunst/dunstrc
|
|
# dmenu path.
|
|
dmenu = /usr/bin/dmenu -p dunst:
|
|
|
|
# Browser for opening urls in context menu.
|
|
browser = /usr/bin/xdg-open
|
|
|
|
# Always run rule-defined scripts, even if the notification is suppressed
|
|
always_run_script = true
|
|
|
|
# Define the title of the windows spawned by dunst (X11 only)
|
|
title = Dunst
|
|
|
|
# Define the class of the windows spawned by dunst (X11 only)
|
|
class = Dunst
|
|
|
|
# Define the corner radius of the notification window
|
|
# in pixel size. If the radius is 0, you have no rounded
|
|
# corners.
|
|
# The radius will be automatically lowered if it exceeds half of the
|
|
# notification height to avoid clipping text and/or icons.
|
|
corner_radius = 0
|
|
|
|
# Define which corners to round when drawing the window. If the corner radius
|
|
# is set to 0 this option will be ignored.
|
|
#
|
|
# Comma-separated list of the corners. The accepted corner values are bottom-right,
|
|
# bottom-left, top-right, top-left, top, bottom, left, right or all.
|
|
corners = all
|
|
|
|
# Ignore the dbus closeNotification message.
|
|
# Useful to enforce the timeout set by dunst configuration. Without this
|
|
# parameter, an application may close the notification sent before the
|
|
# user defined timeout.
|
|
ignore_dbusclose = false
|
|
#+end_src
|
|
****** Wayland
|
|
These settings are Wayland-specific. They have no effect when using X11
|
|
#+begin_src conf :tangle ~/.config/dunst/dunstrc
|
|
# Uncomment this if you want to let notifications appear under fullscreen
|
|
# applications (default: overlay)
|
|
# layer = top
|
|
|
|
# Set this to true to use X11 output on Wayland.
|
|
force_xwayland = false
|
|
#+end_src
|
|
****** Legacy
|
|
#+begin_src conf :tangle ~/.config/dunst/dunstrc
|
|
# Use the Xinerama extension instead of RandR for multi-monitor support.
|
|
# This setting is provided for compatibility with older nVidia drivers that
|
|
# do not support RandR and using it on systems that support RandR is highly
|
|
# discouraged.
|
|
#
|
|
# By enabling this setting dunst will not be able to detect when a monitor
|
|
# is connected or disconnected which might break follow mode if the screen
|
|
# layout changes.
|
|
force_xinerama = false
|
|
#+end_src
|
|
****** Mouse Action
|
|
#+begin_src conf :tangle ~/.config/dunst/dunstrc
|
|
# Defines list of actions for each mouse event
|
|
# Possible values are:
|
|
# * none: Don't do anything.
|
|
# * do_action: Invoke the action determined by the action_name rule. If there is no
|
|
# such action, open the context menu.
|
|
# * open_url: If the notification has exactly one url, open it. If there are multiple
|
|
# ones, open the context menu.
|
|
# * close_current: Close current notification.
|
|
# * close_all: Close all notifications.
|
|
# * context: Open context menu for the notification.
|
|
# * context_all: Open context menu for all notifications.
|
|
# These values can be strung together for each mouse event, and
|
|
# will be executed in sequence.
|
|
mouse_left_click = do_action, close_current
|
|
mouse_middle_click = close_current
|
|
mouse_right_click = close_all
|
|
#+end_src
|
|
***** Experimental Configurations
|
|
#+begin_src conf :tangle ~/.config/dunst/dunstrc
|
|
# Calculate the dpi to use on a per-monitor basis.
|
|
# If this setting is enabled the Xft.dpi value will be ignored and instead
|
|
# dunst will attempt to calculate an appropriate dpi value for each monitor
|
|
# using the resolution and physical size. This might be useful in setups
|
|
# where there are multiple screens with very different dpi values.
|
|
per_monitor_dpi = false
|
|
#+end_src
|
|
*** [[https://github.com/phillipberndt/autorandr][autorandr]]
|
|
**** Installation
|
|
#+begin_src config :tangle pkg-list.txt
|
|
autorandr
|
|
#+end_src
|
|
**** Configuration
|
|
***** Config File Header
|
|
#+begin_src shell :mkdirp yes :tangle ~/.config/autorandr/postswitch
|
|
#!/bin/sh
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
#+end_src
|
|
***** Restart Qtile after switching config
|
|
#+begin_src shell :mkdirp yes :tangle ~/.config/autorandr/postswitch
|
|
# Qtile restart
|
|
sleep 1
|
|
qtile cmd-obj -o cmd -f restart
|
|
#+end_src
|
|
make the postswitch file executable
|
|
#+begin_src shell :tangle update.sh
|
|
FILE="$HOME/.config/autorandr/postswitch"
|
|
|
|
# Check if the file is already executable
|
|
if [ ! -x "$FILE" ]; then
|
|
echo "Making $FILE script executable"
|
|
chmod +x "$FILE"
|
|
fi
|
|
#+end_src
|
|
|
|
* Text Editors
|
|
** Doom Emacs
|
|
*** Installation
|
|
**** [[https://github.com/doomemacs/doomemacs#prerequisites][Prerequisites]]
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
git
|
|
emacs
|
|
ripgrep
|
|
findutils
|
|
fd
|
|
#+end_src
|
|
**** Doom Installation
|
|
~update.sh~ will install Doom Emacs if needed
|
|
#+begin_src shell :tangle update.sh
|
|
if [ ! -d "/home/paul/.config/doom" ]; then
|
|
echo "Installing Doom Emacs ..."
|
|
git clone --depth 1 https://github.com/doomemacs/doomemacs /home/paul/.config/emacs
|
|
/home/paul/.config/emacs/bin/doom install-devel
|
|
fi
|
|
#+end_src
|
|
**** add to PATH
|
|
#+begin_src shell :tangle ~/.path.sh
|
|
export PATH=$PATH:~/.config/emacs/bin
|
|
#+end_src
|
|
*** Doom Modules
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/init.el
|
|
(doom! :input
|
|
;;bidi ; (tfel ot) thgir etirw uoy gnipleh
|
|
;;chinese
|
|
;;japanese
|
|
;;layout ; auie,ctsrnm is the superior home row
|
|
|
|
:completion
|
|
(company +tng) ; the ultimate code completion backend
|
|
;;helm ; the *other* search engine for love and life
|
|
;;ido ; the other *other* search engine...
|
|
;;ivy ; a search engine for love and life
|
|
vertico ; the search engine of the future
|
|
|
|
:ui
|
|
;;deft ; notational velocity for Emacs
|
|
doom ; what makes DOOM look the way it does
|
|
doom-dashboard ; a nifty splash screen for Emacs
|
|
doom-quit ; DOOM quit-message prompts when you quit Emacs
|
|
(emoji +unicode) ; 🙂
|
|
hl-todo ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW
|
|
;;hydra
|
|
;;indent-guides ; highlighted indent columns
|
|
;;ligatures ; ligatures and symbols to make your code pretty again
|
|
;;minimap ; show a map of the code on the side
|
|
modeline ; snazzy, Atom-inspired modeline, plus API
|
|
nav-flash ; blink cursor line after big motions
|
|
;;neotree ; a project drawer, like NERDTree for vim
|
|
ophints ; highlight the region an operation acts on
|
|
(popup +defaults) ; tame sudden yet inevitable temporary windows
|
|
tabs ; a tab bar for Emacs
|
|
treemacs ; a project drawer, like neotree but cooler
|
|
unicode ; extended unicode support for various languages
|
|
(vc-gutter +pretty) ; vcs diff in the fringe
|
|
vi-tilde-fringe ; fringe tildes to mark beyond EOB
|
|
;;window-select ; visually switch windows
|
|
workspaces ; tab emulation, persistence & separate workspaces
|
|
;;zen ; distraction-free coding or writing
|
|
|
|
:editor
|
|
(evil +everywhere); come to the dark side, we have cookies
|
|
file-templates ; auto-snippets for empty files
|
|
fold ; (nigh) universal code folding
|
|
;;(format +onsave) ; automated prettiness
|
|
;;god ; run Emacs commands without modifier keys
|
|
;;lispy ; vim for lisp, for people who don't like vim
|
|
;;multiple-cursors ; editing in many places at once
|
|
;;objed ; text object editing for the innocent
|
|
;;parinfer ; turn lisp into python, sort of
|
|
;;rotate-text ; cycle region at point between text candidates
|
|
snippets ; my elves. They type so I don't have to
|
|
;;word-wrap ; soft wrapping with language-aware indent
|
|
|
|
:emacs
|
|
dired ; making dired pretty [functional]
|
|
electric ; smarter, keyword-based electric-indent
|
|
;;ibuffer ; interactive buffer management
|
|
undo ; persistent, smarter undo for your inevitable mistakes
|
|
vc ; version-control and Emacs, sitting in a tree
|
|
|
|
:term
|
|
;;eshell ; the elisp shell that works everywhere
|
|
;;shell ; simple shell REPL for Emacs
|
|
;;term ; basic terminal emulator for Emacs
|
|
vterm ; the best terminal emulation in Emacs
|
|
|
|
:checkers
|
|
syntax ; tasing you for every semicolon you forget
|
|
(spell +flyspell +everywhere) ; tasing you for misspelling mispelling
|
|
grammar ; tasing grammar mistake every you make
|
|
|
|
:tools
|
|
;;ansible
|
|
biblio ; Writes a PhD for you (citation needed)
|
|
;;collab ; buffers with friends
|
|
(debugger +lsp) ; FIXME stepping through code, to help you add bugs
|
|
;;direnv
|
|
docker
|
|
;;editorconfig ; let someone else argue about tabs vs spaces
|
|
;;ein ; tame Jupyter notebooks with emacs
|
|
(eval +overlay) ; run code, run (also, repls)
|
|
;;gist ; interacting with github gists
|
|
lookup ; navigate your code and its documentation
|
|
lsp ; M-x vscode
|
|
magit ; a git porcelain for Emacs
|
|
;;make ; run make tasks from Emacs
|
|
;;pass ; password manager for nerds
|
|
pdf ; pdf enhancements
|
|
;;prodigy ; FIXME managing external services & code builders
|
|
;;rgb ; creating color strings
|
|
;;taskrunner ; taskrunner for all your projects
|
|
;;terraform ; infrastructure as code
|
|
;;tmux ; an API for interacting with tmux
|
|
tree-sitter ; syntax and parsing, sitting in a tree...
|
|
;;upload ; map local to remote projects via ssh/ftp
|
|
|
|
:os
|
|
(:if IS-MAC macos) ; improve compatibility with macOS
|
|
;;tty ; improve the terminal Emacs experience
|
|
|
|
:lang
|
|
;;agda ; types of types of types of types...
|
|
;;beancount ; mind the GAAP
|
|
(cc +lsp +tree-sitter) ; C > C++ == 1
|
|
;;clojure ; java with a lisp
|
|
;;common-lisp ; if you've seen one lisp, you've seen them all
|
|
;;coq ; proofs-as-programs
|
|
;;crystal ; ruby at the speed of c
|
|
;;csharp ; unity, .NET, and mono shenanigans
|
|
;;data ; config/data formats
|
|
;;(dart +flutter) ; paint ui and not much else
|
|
;;dhall
|
|
;;elixir ; erlang done right
|
|
;;elm ; care for a cup of TEA?
|
|
emacs-lisp ; drown in parentheses
|
|
;;erlang ; an elegant language for a more civilized age
|
|
;;ess ; emacs speaks statistics
|
|
;;factor
|
|
;;faust ; dsp, but you get to keep your soul
|
|
;;fortran ; in FORTRAN, GOD is REAL (unless declared INTEGER)
|
|
;;fsharp ; ML stands for Microsoft's Language
|
|
;;fstar ; (dependent) types and (monadic) effects and Z3
|
|
;;gdscript ; the language you waited for
|
|
;;(go +lsp) ; the hipster dialect
|
|
;;(graphql +lsp) ; Give queries a REST
|
|
;;(haskell +lsp) ; a language that's lazier than I am
|
|
;;hy ; readability of scheme w/ speed of python
|
|
;;idris ; a language you can depend on
|
|
json ; At least it ain't XML
|
|
;;(java +lsp) ; the poster child for carpal tunnel syndrome
|
|
;;javascript ; all(hope(abandon(ye(who(enter(here))))))
|
|
;;julia ; a better, faster MATLAB
|
|
;;kotlin ; a better, slicker Java(Script)
|
|
(latex +fold +latexmk +lsp) ; writing papers in Emacs has never been so fun
|
|
;;lean ; for folks with too much to prove
|
|
;;ledger ; be audit you can be
|
|
lua ; one-based indices? one-based indices
|
|
;; markdown ; writing docs for people to ignore
|
|
;;nim ; python + lisp at the speed of c
|
|
;;nix ; I hereby declare "nix geht mehr!"
|
|
;;ocaml ; an objective camel
|
|
(org +roam2 +dragndrop +pretty +present) ; organize your plain life in plain text
|
|
;;php ; perl's insecure younger brother
|
|
;;plantuml ; diagrams for confusing people more
|
|
;;purescript ; javascript, but functional
|
|
(python +conda +lsp +pyright +pyenv +tree-sitter) ; beautiful is better than ugly
|
|
;;qt ; the 'cutest' gui framework ever
|
|
;;racket ; a DSL for DSLs
|
|
;;raku ; the artist formerly known as perl6
|
|
;;rest ; Emacs as a REST client
|
|
;;rst ; ReST in peace
|
|
;;(ruby +rails) ; 1.step {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"}
|
|
;;(rust +lsp) ; Fe2O3.unwrap().unwrap().unwrap().unwrap()
|
|
;;scala ; java, but good
|
|
;;(scheme +guile) ; a fully conniving family of lisps
|
|
sh ; she sells {ba,z,fi}sh shells on the C xor
|
|
;;sml
|
|
;;solidity ; do you need a blockchain? No.
|
|
;;swift ; who asked for emoji variables?
|
|
;;terra ; Earth and Moon in alignment for performance.
|
|
;;web ; the tubes
|
|
yaml ; JSON, but readable
|
|
;;zig ; C, but simpler
|
|
|
|
:email
|
|
;;(mu4e +org +gmail)
|
|
;;notmuch
|
|
;;(wanderlust +gmail)
|
|
|
|
:app
|
|
calendar
|
|
;;emms
|
|
;;everywhere ; *leave* Emacs!? You must be joking
|
|
;;irc ; how neckbeards socialize
|
|
;;(rss +org) ; emacs as an RSS reader
|
|
;;twitter ; twitter client https://twitter.com/vnought
|
|
|
|
:config
|
|
;; literate
|
|
(default +bindings +smartparens))
|
|
#+end_src
|
|
|
|
*** General Configuration
|
|
**** User Information
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(setq user-full-name "Paul Lödige"
|
|
user-mail-address "paul@gve-loedige.de")
|
|
#+end_src
|
|
|
|
**** Visual Settings
|
|
***** Font
|
|
install Ubuntu Mono
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
ttf-ubuntu-font-family
|
|
ttf-ubuntu-mono-nerd
|
|
ttf-ubuntu-nerd
|
|
adobe-source-han-sans-jp-fonts
|
|
adobe-source-han-serif-jp-fonts
|
|
noto-fonts-emoji
|
|
#+end_src
|
|
and activate it
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(setq doom-font (font-spec :family "Ubuntu Mono" :size 16)
|
|
doom-variable-pitch-font (font-spec :family "Ubuntu" :size 14))
|
|
#+end_src
|
|
|
|
***** Line Numbering
|
|
having used Neovim for quiet some time I got used to relative line numbering for navigation.
|
|
Until I get used to the [[https://github.com/Greduan/emacs-theme-gruvbox][evil-snipe]] navigation I would like to keep them.
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(setq display-line-numbers-type 'relative)
|
|
#+end_src
|
|
|
|
**** Authentication
|
|
Authentication information will be stored in a encrypted file that is part of my dotfiles
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(setq auth-sources
|
|
'((:source "~/.authinfo.gpg")))
|
|
#+end_src
|
|
**** Start Daemon on Startup
|
|
#+begin_src shell :tangle ~/.autostart.sh
|
|
emacs --daemon &
|
|
#+end_src
|
|
**** Misc
|
|
***** Set Start of Week to Monday
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/init.el
|
|
(setq calendar-week-start-day 1)
|
|
#+end_src
|
|
*** Multilanguage Spellcheck
|
|
Enables use of multiple dictionaries. In my case German and English
|
|
install dependencies
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
hunspell
|
|
hunspell-de
|
|
hunspell-en_us
|
|
#+end_src
|
|
and configure it
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(with-eval-after-load "ispell"
|
|
(setq ispell-program-name "hunspell")
|
|
(setq ispell-dictionary "en_US,de_DE")
|
|
(ispell-set-spellchecker-params)
|
|
(ispell-hunspell-add-multi-dic "en_US,de_DE"))
|
|
#+end_src
|
|
|
|
*** LaTeX
|
|
**** Set PDF Viewer
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(setq +latex-viewers '(zathura))
|
|
#+end_src
|
|
**** Add shell-escape Toggle Command
|
|
#+begin_src emacs-lisp :tangle ~/.config/doom/config.el
|
|
(defun TeX-command-toggle-shell-escape ()
|
|
(interactive)
|
|
(setq TeX-command-extra-options
|
|
(cond ((string-match-p "\\_<--shell-escape\\_>" TeX-command-extra-options )
|
|
(replace-regexp-in-string "\\_<--shell-escape\\_>" "" TeX-command-extra-options))
|
|
((string-empty-p TeX-command-extra-options)"--shell-escape")
|
|
(t(format "--shell-escape %s" TeX-command-extra-options))))
|
|
(message "TeX-command-extra-options : `%s'" TeX-command-extra-options))
|
|
#+end_src
|
|
|
|
*** Org Mode
|
|
**** Dependencies
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
xclip
|
|
gnome-screenshot
|
|
graphviz
|
|
#+end_src
|
|
**** Default Location
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(setq org-directory "~/org/")
|
|
#+end_src
|
|
**** Visual
|
|
***** Header Styling
|
|
****** Enable Header Numbering
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(after! org
|
|
(setq org-startup-numerated t))
|
|
#+end_src
|
|
****** Header Font Sizes
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(after! org
|
|
(custom-set-faces
|
|
(set-face-attribute 'org-document-title nil :height 2.0)
|
|
'(org-level-1 ((t(:inherit outline-1 :height 1.5))))
|
|
'(org-level-2 ((t(:inherit outline-2 :height 1.3))))
|
|
'(org-level-3 ((t(:inherit outline-3 :height 1.2))))
|
|
'(org-level-4 ((t(:inherit outline-4 :height 1.1))))))
|
|
#+end_src
|
|
***** Misc Text Styling
|
|
****** Hide Emphasis Markers
|
|
*bold* /italic/ +strikethrough+ etc. should not have markers next to them
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(after! org
|
|
(setq org-hide-emphasis-markers t))
|
|
#+end_src
|
|
***** Image Display as Default
|
|
[[https://emacs.stackexchange.com/questions/57603/how-to-always-display-inline-images-by-default-existing-solutions-dont-seem-to#comment89772_57607][this stackexchange comment]] states that this has to be done before the [[Add "~/org" to Agenda][adding the ~/org directory to Org Agenda]]
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(after! org
|
|
(setq org-startup-with-inline-images t)
|
|
(setq org-image-actual-width '(600)))
|
|
#+end_src
|
|
***** Open Video in VLC
|
|
this requires the [[https://www.emacswiki.org/emacs/OpenWith][OpenWith]] minor mode and VLC
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/packages.el
|
|
(package! openwith)
|
|
#+end_src
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
vlc
|
|
#+end_src
|
|
then the configuration from [[https://www.reddit.com/r/emacs/comments/cgbpvl/comment/euhscqj/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button][this reddit post]] can be used to achieve the desired behavior
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(after! openwith
|
|
(setq openwith-associations
|
|
(cond
|
|
((string-equal system-type "darwin")
|
|
'(("\\.\\(dmg\\|doc\\|docs\\|xls\\|xlsx\\)$"
|
|
"open" (file))
|
|
("\\.\\(mp4\\|mp3\\|webm\\|avi\\|flv\\|mov\\)$"
|
|
"open" ("-a" "VLC" file))))
|
|
((string-equal system-type "gnu/linux")
|
|
'(("\\.\\(mp4\\|mp3\\|webm\\|avi\\|flv\\|mov\\)$"
|
|
"xdg-open" (file))))))
|
|
(openwith-mode +1))
|
|
#+end_src
|
|
***** Enable $\LaTeX$ preview on default
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(after! org
|
|
(setq org-startup-latex-with-latex-preview t))
|
|
#+end_src
|
|
***** Fix $\LaTeX$ block alignment in tables with valign
|
|
install valign
|
|
#+begin_src emacs-lisp :tangle ~/.config/doom/packages.el
|
|
(package! valign)
|
|
#+end_src
|
|
and start it automatically in org mode
|
|
#+begin_src emacs-lisp :tangle ~/.config/doom/config.el
|
|
(after! org
|
|
(add-hook 'org-mode-hook #'valign-mode))
|
|
#+end_src
|
|
**** CalDAV Sync
|
|
[[https://github.com/dengste/org-caldav][org-caldav]] provides a tool for syncing with a CalDAV server (in my case Nextcloud).
|
|
A lot of the config is also taken from [[https://www.reddit.com/r/orgmode/comments/8rl8ep/comment/e0sb5j0/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button][this]] reddit post.
|
|
***** org-caldav installation
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/packages.el
|
|
(package! org-caldav)
|
|
#+end_src
|
|
***** Enable TODOs
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(after! org-caldav
|
|
(setq org-icalendar-include-todo 'all
|
|
org-caldav-sync-todo t))
|
|
#+end_src
|
|
***** Configure Sync
|
|
add the calendars to the org-caldav config
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(after! org-caldav
|
|
(setq org-caldav-url "https://cloud.ploedige.com/remote.php/dav/calendars/paul-loedige")
|
|
(setq org-caldav-sync-direction 'org->cal)
|
|
(setq org-caldav-calendars
|
|
'((:calendar-id "todo" :files ("~/org/todo.org")))))
|
|
#+end_src
|
|
**** Org Agenda Setup
|
|
***** Progress States
|
|
To get a more nuanced overview of my current TODOs I add more progress states.
|
|
| | INACTIVE | TODO | BLOCKED | IN_PROGRESS | REVIEW | TESTING | | DONE | DELEGATED | CANCELED | |
|
|
|------------+----------+------+---------+-------------+--------+---------+---+------+-----------+----------+---|
|
|
| Access Key | i | t | b | i | r | t | | d | | c | |
|
|
| Log Type | time | time | note | time | note | note | | time | note | note | |
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(after! org
|
|
(setq org-todo-keywords
|
|
'((sequence "INACTIVE(i!)" "TODO(t!)" "IN_PROGRESS(p!)" "BLOCKED(b@)" "REVIEW(r@)" "TESTING(e@)" "|" "DONE(d!)" "DELEGATED(x@)" "CANCELED(c@)"))))
|
|
#+end_src
|
|
Also set the percent states for [[*CalDAV Sync][CalDAV Sync]]
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(after! org-caldav
|
|
(setq org-caldav-todo-percent-states '((0 "INACTIVE") (1 "TODO") (2 "IN_PROGRESS") (3 "BLOCKED") (90 "REVIEW") (90 "TESTING") (100 "DONE") (100 "DELEGATED") (100 "CANCELED"))))
|
|
#+end_src
|
|
***** Add "~/org" to Agenda
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(after! org
|
|
(setq org-agenda-files (f-files "~/org"
|
|
(lambda (f)
|
|
(string= (f-ext f) "org"))
|
|
'recursive)))
|
|
#+end_src
|
|
***** Styling
|
|
****** Priorities
|
|
using [[https://github.com/harrybournis/org-fancy-priorities][org-fancy-priorites]] the displayed priorities can be styled
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(after! org-fancy-priorities
|
|
(setq org-fancy-priorities-list '((?A . "HIGH")
|
|
(?B . "MID")
|
|
(?C . "LOW")
|
|
(?D . "OPTIONAL"))))
|
|
#+end_src
|
|
**** Org Roam
|
|
***** set base directory
|
|
Both the org files themselves and the database should be located in the same directory to enable syncing via Nextcloud
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(after! org
|
|
(setq org-roam-directory (file-truename "~/org/org-roam"))
|
|
(org-roam-db-autosync-mode))
|
|
#+end_src
|
|
***** Note Templates
|
|
This contains all the capture templates I am using.
|
|
Adding the "#+category: " tag improves the Org Agenda View for tasks captured in Org Roam
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(after! org-roam
|
|
(setq org-roam-capture-templates
|
|
'(("d" "default" plain
|
|
"%?"
|
|
:if-new (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n#+category: ${title}\n")
|
|
:unnarrowed t)
|
|
("m" "Master Thesis Templates")
|
|
("md" "Default Master Thesis Template" plain
|
|
"%?"
|
|
:if-new (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n#+category: Master Thesis\n")
|
|
:unnarrowed t)
|
|
("mm" "Master Thesis Meeting Template" plain
|
|
"* Current Progress\n\n* Open Questions\n\n* TODOs\n"
|
|
:if-new (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title} Master Thesis Meeting\n#+category: Master Thesis\n")
|
|
:unnarrowed t)
|
|
)))
|
|
#+end_src
|
|
***** Misc
|
|
****** Follow Links on RET
|
|
Because the normal shortcut for `org-open-at-point` is quite cumbersome I want it to just follow links when clicking the RET button
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(after! org
|
|
(setq return-follows-link t))
|
|
#+end_src
|
|
**** Org Transclusion
|
|
***** Installation
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/packages.el
|
|
(package! org-transclusion)
|
|
#+end_src
|
|
**** Bibliography
|
|
***** Enabling Zotero Links
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
zotero
|
|
#+end_src
|
|
Following [[https://www.riccardopinosio.com/blog/posts/zotero_notes_article.html#opening-zotero-pdf-from-org-roam][this guide]] we enable using zotero links with the following code
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(after! org
|
|
:custom
|
|
(org-link-set-parameters "zotero" :follow
|
|
(lambda (zpath)
|
|
(browse-url
|
|
(format "zotero:%s" zpath)))))
|
|
#+end_src
|
|
***** Citar Config
|
|
****** Setting the Citar Bibliography
|
|
Following the [[https://github.com/doomemacs/doomemacs/tree/master/modules/tools/biblio][Doom Emacs documentation ]]we set the citar bibliography and notes paths
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(after! oc
|
|
(setq citar-bibliography '("~/org/biblio.bib"))
|
|
(setq citar-notes-paths '("~/org/org-roam/")))
|
|
#+end_src
|
|
****** Citar Templates
|
|
Following the [[https://github.com/emacs-citar/citar#configuration][citar package documentation]] we modify the note template to contain the pdf link to Zotero
|
|
*NOTE:* This requires the a [[https://www.riccardopinosio.com/blog/posts/zotero_notes_article.html#opening-zotero-pdf-from-org-roam][specific Zotero Export Configuration]]
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(after! oc
|
|
(setq citar-templates
|
|
'((main . "${author editor:30%sn} ${date year issued:4} ${title:48}")
|
|
(suffix . " ${=key= id:15} ${=type=:12} ${tags keywords:*}")
|
|
(preview . "${author editor:%etal} (${year issued date}) ${title}, ${journal journaltitle publisher container-title collection-title}.\n")
|
|
(note . "Notes on ${author editor:%etal}, ${title}\npdf: ${file}"))))
|
|
#+end_src
|
|
****** Enable Zotero Link Support
|
|
In [[https://www.riccardopinosio.com/blog/posts/zotero_notes_article.html#citar][this tutorial]] I found the config for enabling Zotero Link Support through Citar
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(after! citar
|
|
(defadvice! riccardo/citar-file-trust-zotero (oldfun &rest r)
|
|
"Leave Zotero-generated file paths alone, especially zotero://..."
|
|
:around '(citar-file-open citar-file--find-files-in-dirs)
|
|
(cl-letf (((symbol-function 'file-exists-p) #'always)
|
|
((symbol-function 'expand-file-name) (lambda (first &rest _) first)))
|
|
(apply oldfun r)))
|
|
|
|
(add-to-list 'citar-file-open-functions '("pdf" . citar-file-open-external)))
|
|
#+end_src
|
|
**** Poly-Org
|
|
[[Polymode]] for Org
|
|
#+begin_src emacs-lisp :tangle ~/.config/doom/packages.el
|
|
(package! poly-org)
|
|
#+end_src
|
|
#+begin_src emacs-lisp :tangle ~/.config/doom/config.el
|
|
;; (after! org
|
|
;; (require 'poly-org))
|
|
#+end_src
|
|
|
|
*** Polymode
|
|
[[https://polymode.github.io/][Polymode]] enables using multiple major modes inside a single buffer.
|
|
This is especially useful for Org Mode as it allows for better code editing inside code blocks
|
|
#+begin_src emacs-lisp :tangle ~/.config/doom/packages.el
|
|
(package! polymode)
|
|
#+end_src
|
|
*** Python
|
|
install dependencies
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
python-isort
|
|
python-pipenv
|
|
python-pytest
|
|
pyright
|
|
#+end_src
|
|
**** Set Debugger to debugpy
|
|
as per the [[https://github.com/doomemacs/doomemacs/tree/master/modules/tools/debugger#dap-python][Doom Emacs Documentation]] it is recommended to set the debugger used for python debugging to debugpy
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(after! dap-mode
|
|
(setq dap-python-debugger 'debugpy))
|
|
#+end_src
|
|
|
|
** VSCode
|
|
*** Installation
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
visual-studio-code-bin
|
|
#+end_src
|
|
*** Add-On Configuration
|
|
**** Config File Header
|
|
#+begin_src conf :tangle vscode-extensions.txt
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
#+end_src
|
|
**** Basic Look & Feel Extensions
|
|
***** [[https://github.com/VSCodeVim/Vim][Vim Key Bindings]]
|
|
#+begin_src conf :tangle vscode-extensions.txt
|
|
vscodevim.vim
|
|
#+end_src
|
|
**** Useful Tools
|
|
***** [[https://github.com/ChristianKohler/PathIntellisense][Path Intellisense]]
|
|
#+begin_src conf :tangle vscode-extensions.txt
|
|
christian-kohler.path-intellisense
|
|
#+end_src
|
|
***** [[https://github.com/streetsidesoftware/vscode-spell-checker][Spellcheck]]
|
|
#+begin_src conf :tangle vscode-extensions.txt
|
|
streetsidesoftware.code-spell-checker
|
|
#+end_src
|
|
**** Github Copilot
|
|
#+begin_src conf :tangle vscode-extensions.txt
|
|
github.copilot
|
|
github.copilot-chat
|
|
#+end_src
|
|
***** Configure to use the gnome-keyring
|
|
As desribed in [[https://github.com/microsoft/vscode/issues/187338][this Github issue]] it is sometimes necessary to modify VSCode's argv.json
|
|
#+begin_src js :tangle ~/.vscode/argv.json
|
|
// DO NOT EDIT THIS FILE DIRECTLY
|
|
// This is a file generated from a literate programing source file
|
|
// You should make any changes there and regenerate it from Emacs org-mode
|
|
// using org-babel-tangle (C-c C-v t)
|
|
|
|
{
|
|
// Use software rendering instead of hardware accelerated rendering.
|
|
// This can help in cases where you see rendering issues in VS Code.
|
|
// "disable-hardware-acceleration": true,
|
|
|
|
// Allows to disable crash reporting.
|
|
// Should restart the app if the value is changed.
|
|
"enable-crash-reporter": true,
|
|
|
|
// Unique id used for correlating crash reports sent from this instance.
|
|
// Do not edit this value.
|
|
"crash-reporter-id": "bbaa03bf-7872-4c27-8488-3543d3064c9d",
|
|
|
|
// enable gnome-keyring
|
|
"password-store": "gnome-libsecret"
|
|
}
|
|
#+end_src
|
|
|
|
**** ROS Development
|
|
#+begin_src conf :tangle vscode-extensions.txt
|
|
ms-vscode-remote.remote-containers
|
|
ms-vscode-remote.remote-ssh
|
|
ms-vscode.remote-server
|
|
ms-vscode.cpptools-extension-pack
|
|
ms-iot.vscode-ros
|
|
ms-vscode.cpptools
|
|
ms-vscode.cmake-tools
|
|
#+end_src
|
|
**** Languages
|
|
***** [[https://github.com/Microsoft/vscode-python][Python]]
|
|
#+begin_src conf :tangle vscode-extensions.txt
|
|
ms-python.python
|
|
donjayamanne.python-environment-manager
|
|
ms-python.debugpy
|
|
ms-python.vscode-pylance
|
|
njpwerner.autodocstring
|
|
#+end_src
|
|
Jupyter is also considered here
|
|
#+begin_src conf :tangle vscode-extensions.txt
|
|
ms-toolsai.jupyter
|
|
ms-toolsai.jupyter-keymap
|
|
ms-toolsai.jupyter-renderers
|
|
ms-toolsai.vscode-jupyter-cell-tags
|
|
ms-toolsai.vscode-jupyter-slideshow
|
|
#+end_src
|
|
***** Docker
|
|
#+begin_src conf :tangle vscode-extensions.txt
|
|
ms-azuretools.vscode-docker
|
|
#+end_src
|
|
*** Add-On Sync
|
|
remove all packages not in ~vscode-extensions.txt~ and install otherwise
|
|
#+begin_src shell :tangle update.sh
|
|
INSTALLED_EXTENSIONS=$(code --list-extensions)
|
|
KEEP_LIST=$(grep -v '^#' "vscode-extensions.txt")
|
|
|
|
for EXTENSION in $INSTALLED_EXTENSIONS; do
|
|
if ! echo "$KEEP_LIST" | grep -q "^$EXTENSION$"; then
|
|
echo "Removing VS Code Extension: $EXTENSION"
|
|
code --uninstall-extension "$EXTENSION"
|
|
fi
|
|
done
|
|
for EXTENSION in $KEEP_LIST; do
|
|
if ! echo "$INSTALLED_EXTENSIONS" | grep -q "^$EXTENSION$"; then
|
|
echo "Installing VS Code Extension: $EXTENSION"
|
|
code --install-extension "$EXTENSION"
|
|
fi
|
|
done
|
|
#+end_src
|
|
** NeoVim
|
|
[[https://neovim.io/][NeoVim Documentation]]
|
|
*** Installation
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
neovim
|
|
python-pynvim
|
|
tree-sitter-cli
|
|
#+end_src
|
|
additionally npm is needed for Conquer on Completion
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
npm
|
|
#+end_src
|
|
*** TODO Configuration
|
|
|
|
this is not the proper way to do it
|
|
#+begin_src shell :tangle update.sh
|
|
if [ ! -L "$HOME/.config/nvim" ]; then
|
|
echo "Installing Neovim Config..."
|
|
ln -s ~/.dotfiles/neovim/.config/nvim ~/.config/nvim
|
|
ln -s ~/.dotfiles/neovim/.config/coc ~/.config/coc
|
|
fi
|
|
#+end_src
|
|
|
|
* Browser
|
|
** Firefox
|
|
*** Installation
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
firefox
|
|
#+end_src
|
|
***
|
|
*** TODO Configuration
|
|
|
|
** Chromium
|
|
It's always good to have a backup browser
|
|
*** Installation
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
chromium
|
|
#+end_src
|
|
** [[https://www.torproject.org/][TOR]]
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
torbrowser-launcher
|
|
#+end_src
|
|
* Shells
|
|
ZSH is used as the default shell
|
|
** Aliases
|
|
*** Shutdown and Reboot
|
|
#+begin_src shell :tangle ~/.alias.sh
|
|
alias sn='shutdown now'
|
|
alias rb='reboot'
|
|
#+end_src
|
|
*** Confirm before overwriting
|
|
#+begin_src shell :tangle ~/.alias.sh
|
|
alias cp="cp -i"
|
|
alias mv='mv -i'
|
|
alias rm='rm -i'
|
|
#+end_src
|
|
|
|
*** Git Aliases
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
git
|
|
#+end_src
|
|
#+begin_src shell :tangle ~/.alias.sh
|
|
alias add='git add'
|
|
alias addup='git add -u'
|
|
alias addall='git add .'
|
|
alias branch='git branch'
|
|
alias checkout='git checkout'
|
|
alias co='git checkout'
|
|
alias clone='git clone'
|
|
alias commit='git commit -m'
|
|
alias fetch='git fetch'
|
|
alias pull='git pull origin'
|
|
alias push='git push origin'
|
|
alias status='git status'
|
|
alias diff='git diff'
|
|
alias remote='git remote'
|
|
alias ftemplate='git fetch template'
|
|
alias mtemplate='git merge template/master --allow-unrelated-histories'
|
|
alias log='git log'
|
|
#+end_src
|
|
*** ls -> [[https://github.com/eza-community/eza][eza]]
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
eza
|
|
#+end_src
|
|
#+begin_src shell :tangle ~/.alias.sh
|
|
alias ls='eza --icons -lF --color=always --group-directories-first --git' # my preferred listing
|
|
alias la='eza --icons -aF --color=always --group-directories-first --git' # all files and dirs
|
|
alias ll='eza --icons -alF --color=always --group-directories-first --git' # long format
|
|
alias lt='eza --icons -aTF --color=always --group-directories-first --git' # tree listing
|
|
alias lx='eza --icons -lF --color=always --group-directories-first --git --extended' # extended info
|
|
alias l.='eza -a | egrep "^\."' # list dotfiles
|
|
#+end_src
|
|
** [[https://www.zsh.org/][ZSH]]
|
|
*** Installation
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
zsh
|
|
which
|
|
#+end_src
|
|
*** Set as default shell
|
|
#+begin_src shell :tangle update.sh
|
|
if [ "$(basename $SHELL)" != "zsh" ]; then
|
|
chsh -s $(which zsh)
|
|
fi
|
|
#+end_src
|
|
*** [[https://ohmyz.sh/][Oh-My-Zsh]]
|
|
**** Installation
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
curl
|
|
#+end_src
|
|
Install if needed
|
|
Notes:
|
|
Because the tangled ~.zshrc~ already would usually be overwritten it needs to be backed up and restored.
|
|
Also, the ~$ZSH~ variable needs to be unset to avoid errors during installation
|
|
#+begin_src shell :tangle update.sh
|
|
if [ ! -d "$HOME/.oh-my-zsh" ]; then
|
|
echo "Backing up .zshrc..."
|
|
mv ~/.zshrc ~/.zshrc-tmp
|
|
echo "Installing Oh-My-Zsh..."
|
|
unset ZSH
|
|
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
|
|
if [ -e "$HOME/.zshrc.pre-oh-my-zsh" ]; then
|
|
rm ~/.zshrc.pre-oh-my-zsh
|
|
fi
|
|
echo "Restoring .zshrc..."
|
|
mv ~/.zshrc-tmp ~/.zshrc
|
|
fi
|
|
#+end_src
|
|
**** Basic Configuration
|
|
#+begin_src shell :tangle ~/.zshrc
|
|
export ZSH="$HOME/.oh-my-zsh"
|
|
|
|
# Uncomment the following line to use case-sensitive completion.
|
|
CASE_SENSITIVE="false"
|
|
|
|
# Uncomment the following line to use hyphen-insensitive completion.
|
|
# Case-sensitive completion must be off. _ and - will be interchangeable.
|
|
HYPHEN_INSENSITIVE="true"
|
|
|
|
# Uncomment the following line to change how often to auto-update (in days).
|
|
export UPDATE_ZSH_DAYS=3
|
|
|
|
# Uncomment the following line to enable command auto-correction.
|
|
ENABLE_CORRECTION="true"
|
|
|
|
# Uncomment the following line to display red dots whilst waiting for completion.
|
|
# Caution: this setting can cause issues with multiline prompts (zsh 5.7.1 and newer seem to work)
|
|
# See https://github.com/ohmyzsh/ohmyzsh/issues/5765
|
|
COMPLETION_WAITING_DOTS="true"
|
|
#+end_src
|
|
**** [[https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins][Plugins]]
|
|
***** Dependencies
|
|
some of the following plugins require dependencies
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
#for bgnotify
|
|
libnotify
|
|
fd
|
|
fzf
|
|
github-cli
|
|
#+end_src
|
|
***** Symlink External Plugins
|
|
****** [[https://github.com/conda-incubator/conda-zsh-completion][conda-zsh-completion]]
|
|
#+begin_src shell :tangle update.sh
|
|
if [ ! -L "$HOME/.oh-my-zsh/custom/plugins/conda-zsh-completion" ]; then
|
|
echo "Installing conda-zsh-completion..."
|
|
if [ ! -d "$HOME/.oh-my-zsh/custom/plugins" ]; then
|
|
mkdir -p ~/.oh-my-zsh/custom/plugins
|
|
fi
|
|
ln -s ~/.dotfiles/zsh/.oh-my-zsh/custom/plugins/conda-zsh-completion ~/.oh-my-zsh/custom/plugins/conda-zsh-completion
|
|
fi
|
|
#+end_src
|
|
****** [[https://github.com/zsh-users/zsh-autosuggestions][zsh-autosuggestions]]
|
|
#+begin_src shell :tangle update.sh
|
|
if [ ! -L "$HOME/.oh-my-zsh/custom/plugins/zsh-autosuggestions" ]; then
|
|
echo "Installing conda-zsh-completion..."
|
|
if [ ! -d "$HOME/.oh-my-zsh/custom/plugins" ]; then
|
|
mkdir -p ~/.oh-my-zsh/custom/plugins
|
|
fi
|
|
ln -s ~/.dotfiles/zsh/.oh-my-zsh/custom/plugins/zsh-autosuggestions ~/.oh-my-zsh/custom/plugins/zsh-autosuggestions
|
|
fi
|
|
#+end_src
|
|
****** [[https://github.com/zsh-users/zsh-syntax-highlighting][zsh-syntax-highlighting]]
|
|
#+begin_src shell :tangle update.sh
|
|
if [ ! -L "$HOME/.oh-my-zsh/custom/plugins/zsh-syntax-highlighting" ]; then
|
|
echo "Installing conda-zsh-completion..."
|
|
if [ ! -d "$HOME/.oh-my-zsh/custom/plugins" ]; then
|
|
mkdir -p ~/.oh-my-zsh/custom/plugins
|
|
fi
|
|
ln -s ~/.dotfiles/zsh/.oh-my-zsh/custom/plugins/zsh-syntax-highlighting ~/.oh-my-zsh/custom/plugins/zsh-syntax-highlighting
|
|
fi
|
|
#+end_src
|
|
***** Install Plugins
|
|
#+begin_src shell :tangle ~/.zshrc
|
|
# Which plugins would you like to load?
|
|
# Standard plugins can be found in $ZSH/plugins/
|
|
# Custom plugins may be added to $ZSH_CUSTOM/plugins/
|
|
# Example format: plugins=(rails git textmate ruby lighthouse)
|
|
# Add wisely, as too many plugins slow down shell startup.
|
|
plugins=(
|
|
adb
|
|
aliases
|
|
archlinux
|
|
bgnotify
|
|
colored-man-pages
|
|
command-not-found
|
|
docker
|
|
docker-compose
|
|
emacs
|
|
extract
|
|
fd
|
|
gh
|
|
git
|
|
git-auto-fetch
|
|
git-lfs
|
|
isodate
|
|
nmap
|
|
pip
|
|
pipenv
|
|
python
|
|
ripgrep
|
|
rsync
|
|
svn
|
|
systemd
|
|
themes
|
|
vi-mode
|
|
vscode
|
|
# # non oh-my-zsh plugins
|
|
zsh-autosuggestions
|
|
zsh-syntax-highlighting
|
|
conda-zsh-completion
|
|
)
|
|
#+end_src
|
|
**** [[https://github.com/romkatv/powerlevel10k][Powerlevel10k]]
|
|
create symlink if needed
|
|
#+begin_src shell :tangle update.sh
|
|
if [ ! -L "$HOME/.oh-my-zsh/custom/themes/powerlevel10k" ]; then
|
|
echo "Installing Powerlevel10k..."
|
|
if [ ! -d "$HOME/.oh-my-zsh/custom/themes" ]; then
|
|
mkdir -p ~/.oh-my-zsh/custom/themes
|
|
fi
|
|
ln -s ~/.dotfiles/zsh/.oh-my-zsh/custom/themes/powerlevel10k ~/.oh-my-zsh/custom/themes/powerlevel10k
|
|
fi
|
|
#+end_src
|
|
init
|
|
#+begin_src shell :tangle ~/.zshrc
|
|
ZSH_THEME="powerlevel10k/powerlevel10k"
|
|
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh
|
|
#+end_src
|
|
***** Config
|
|
create symlink if needed.
|
|
The config file was created via the ~p10k configure~ command
|
|
#+begin_src shell :tangle update.sh
|
|
if [ ! -L "$HOME/.p10k.zsh" ]; then
|
|
echo "Configuring Powerlevel10k..."
|
|
ln -s ~/.dotfiles/zsh/.p10k.zsh ~/.p10k.zsh
|
|
fi
|
|
#+end_src
|
|
|
|
**** Source oh-my-zsh
|
|
#+begin_src shell :tangle ~/.zshrc
|
|
source $ZSH/oh-my-zsh.sh
|
|
#+end_src
|
|
*** Configuration
|
|
**** Source Aliases
|
|
#+begin_src shell :tangle ~/.zshrc
|
|
source ~/.alias.sh
|
|
#+end_src
|
|
**** Modify PATH
|
|
#+begin_src shell :tangle ~/.zshrc
|
|
source ~/.path.sh
|
|
#+end_src
|
|
**** [[https://github.com/dylanaraps/neofetch][neofetch]]
|
|
install
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
neofetch
|
|
#+end_src
|
|
and start
|
|
#+begin_src shell :tangle ~/.zshrc
|
|
neofetch
|
|
#+end_src
|
|
** [[https://www.gnu.org/software/bash/][Bash]]
|
|
*** Installation
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
bash
|
|
#+end_src
|
|
*** Configuration
|
|
**** Source Aliases
|
|
#+begin_src shell :tangle ~/.bashrc
|
|
source ~/.alias.sh
|
|
#+end_src
|
|
**** Modify PATH
|
|
#+begin_src shell :tangle ~/.bashrc
|
|
source ~/.path.sh
|
|
#+end_src
|
|
**** [[https://github.com/dylanaraps/neofetch][neofetch]]
|
|
install
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
neofetch
|
|
#+end_src
|
|
and start
|
|
#+begin_src shell :tangle ~/.bashrc
|
|
neofetch
|
|
#+end_src
|
|
|
|
* Alacritty
|
|
** Font
|
|
#+begin_src toml :tangle ~/.config/alacritty/alacritty.toml :mkdirp yes
|
|
[font]
|
|
size = xx
|
|
|
|
[font.bold]
|
|
family = "UbuntuMonoNerdFont"
|
|
style = "Bold"
|
|
|
|
[font.bold_italic]
|
|
family = "UbuntuMonoNerdFont"
|
|
style = "Bold Italic"
|
|
|
|
[font.italic]
|
|
family = "UbuntuMonoNerdFont"
|
|
style = "Italic"
|
|
|
|
[font.normal]
|
|
family = "UbuntuMonoNerdFont"
|
|
style = "Regular"
|
|
#+end_src
|
|
The size is set via the autostart script depending on the system type (Laptop/Desktop)
|
|
#+begin_src shell :mkdirp yes :tangle ~/.autostart.sh
|
|
# Use hostnamectl to get system information
|
|
chassis_type=$(hostnamectl status | grep "Chassis:" | awk '{print $2}')
|
|
# Check if the chassis type is "laptop"
|
|
if [ "$chassis_type" == "laptop" ]; then
|
|
# set font size for alacritty
|
|
sed -i 's/size = xx/size = 9/' ~/.config/alacritty/alacritty.toml
|
|
else
|
|
# set font size for alacritty
|
|
sed -i 's/size = xx/size = 14/' ~/.config/alacritty/alacritty.toml
|
|
fi
|
|
#+end_src
|
|
since ~update.sh~ will reset the font size value. This also needs to be set in there
|
|
#+begin_src shell :tangle update.sh
|
|
# Use hostnamectl to get system information
|
|
chassis_type=$(hostnamectl status | grep "Chassis:" | awk '{print $2}')
|
|
# Check if the chassis type is "laptop"
|
|
if [ "$chassis_type" == "laptop" ]; then
|
|
# set font size for alacritty
|
|
sed -i 's/size = xx/size = 9/' ~/.config/alacritty/alacritty.toml
|
|
else
|
|
# set font size for alacritty
|
|
sed -i 's/size = xx/size = 14/' ~/.config/alacritty/alacritty.toml
|
|
fi
|
|
#+end_src
|
|
|
|
#+RESULTS:
|
|
|
|
* Theming
|
|
This Config applies the [[https://github.com/gruvbox-community/gruvbox][Gruvbox Theme]] to as many programs as possible
|
|
** Doom Emacs
|
|
Install specific package
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/packages.el
|
|
(package! gruvbox-theme)
|
|
#+end_src
|
|
and then set it
|
|
#+begin_src emacs-lisp :mkdirp yes :tangle ~/.config/doom/config.el
|
|
(setq doom-theme 'gruvbox-dark-hard)
|
|
#+end_src
|
|
** VSCode
|
|
#+begin_src conf :tangle vscode-extensions.txt
|
|
jdinhlife.gruvbox
|
|
#+end_src
|
|
|
|
** Qtile
|
|
#+begin_src python :tangle ~/.config/qtile/defines.py :mkdirp yes
|
|
focus_color = '#076678'
|
|
|
|
light_foreground_color = ['#fbf1c7','#fbf1c7']
|
|
dark_foreground_color = ['#282828','#282828']
|
|
background_color0 = ['#1d2021','#1d2021']
|
|
background_color8 = ['#7c6f64','#7c6f64']
|
|
base_color = background_color0
|
|
# red
|
|
red_color = ['#cc241d','#cc241d']
|
|
light_red_color = ['#fb4934','#fb4934']
|
|
# green
|
|
green_color = ['#98971a','#98971a']
|
|
light_green_color = ['#b8bb26','#b8bb26']
|
|
#orange
|
|
orange_color = ['#d65d0e','#d65d0e']
|
|
# yellow
|
|
yellow_color = ['#d79921','#d79921']
|
|
light_yellow_color = ['#fabd2f','#fabd2f']
|
|
#blue
|
|
blue_color = ['#076678','#076678']
|
|
# purple
|
|
purple_color = ['#b16286','#b16286']
|
|
light_purple_color = ['#d3869b','#d3869b']
|
|
# magenta
|
|
magenta_color = ['#ff79c6','#ff79c6']
|
|
# cyan
|
|
cyan_color = ['#8be9fd','#8be9fd']
|
|
#+end_src
|
|
** Alacritty
|
|
#+begin_src toml :tangle ~/.config/alacritty/alacritty.toml :mkdirp yes
|
|
[colors.bright]
|
|
black = "#928374"
|
|
blue = "#83a598"
|
|
cyan = "#8ec07c"
|
|
green = "#b8bb26"
|
|
magenta = "#d3869b"
|
|
red = "#fb4934"
|
|
white = "#ebdbb2"
|
|
yellow = "#fabd2f"
|
|
|
|
[colors.cursor]
|
|
cursor = "CellForeground"
|
|
text = "CellBackground"
|
|
|
|
[colors.dim]
|
|
black = "#32302f"
|
|
blue = "#076678"
|
|
cyan = "#427b58"
|
|
green = "#79740e"
|
|
magenta = "#8f3f71"
|
|
red = "#9d0006"
|
|
white = "#928374"
|
|
yellow = "#b57614"
|
|
|
|
[colors.normal]
|
|
black = "#282828"
|
|
blue = "#458588"
|
|
cyan = "#689d6a"
|
|
green = "#98971a"
|
|
magenta = "#b16286"
|
|
red = "#cc241d"
|
|
white = "#a89984"
|
|
yellow = "#d79921"
|
|
|
|
[colors.primary]
|
|
background = "#282828"
|
|
bright_foreground = "#f9f5d7"
|
|
dim_foreground = "#f2e5bc"
|
|
foreground = "#fbf1c7"
|
|
|
|
[colors.selection]
|
|
background = "CellForeground"
|
|
text = "CellBackground"
|
|
|
|
[colors.vi_mode_cursor]
|
|
cursor = "CellForeground"
|
|
text = "CellBackground"
|
|
#+end_src
|
|
** Xorg
|
|
#+begin_src config :tangle ~/.Xresources
|
|
! DO NOT EDIT THIS FILE DIRECTLY
|
|
! This is a file generated from a literate programing source file
|
|
! You should make any changes there and regenerate it from Emacs org-mode
|
|
! using org-babel-tangle (C-c C-v t)
|
|
|
|
! -----------------------------------------------------------------------------
|
|
! File: gruvbox-dark.xresources
|
|
! Description: Retro groove colorscheme generalized
|
|
! Author: morhetz <morhetz@gmail.com>
|
|
! Source: https://github.com/morhetz/gruvbox-generalized
|
|
! Last Modified: 6 Sep 2014
|
|
! -----------------------------------------------------------------------------
|
|
|
|
! hard contrast: *background: #1d2021
|
|
*background: #282828
|
|
! soft contrast: *background: #32302f
|
|
*foreground: #ebdbb2
|
|
! Black + DarkGrey
|
|
*color0: #282828
|
|
*color8: #928374
|
|
! DarkRed + Red
|
|
*color1: #cc241d
|
|
*color9: #fb4934
|
|
! DarkGreen + Green
|
|
*color2: #98971a
|
|
*color10: #b8bb26
|
|
! DarkYellow + Yellow
|
|
*color3: #d79921
|
|
*color11: #fabd2f
|
|
! DarkBlue + Blue
|
|
*color4: #458588
|
|
*color12: #83a598
|
|
! DarkMagenta + Magenta
|
|
*color5: #b16286
|
|
*color13: #d3869b
|
|
! DarkCyan + Cyan
|
|
*color6: #689d6a
|
|
*color14: #8ec07c
|
|
! LightGrey + White
|
|
*color7: #a89984
|
|
*color15: #ebdbb2
|
|
#+end_src
|
|
|
|
** GTK
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
gruvbox-dark-gtk
|
|
papirus-icon-theme
|
|
#+end_src
|
|
*** GTK 3
|
|
#+begin_src conf :tangle ~/.config/gtk-3.0/settings.ini
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
[Settings]
|
|
gtk-icon-theme-name = Papirus-Dark
|
|
gtk-theme-name = gruvbox-dark-gtk
|
|
gtk-font-name = UbuntuMono Nerd Font 11
|
|
#+end_src
|
|
*** GTK 4
|
|
#+begin_src conf :tangle ~/.config/gtk-4.0/settings.ini
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
[Settings]
|
|
gtk-icon-theme-name = Papirus-Dark
|
|
gtk-theme-name = gruvbox-dark-gtk
|
|
gtk-font-name = UbuntuMono Nerd Font 11
|
|
#+end_src
|
|
** Rofi
|
|
#+begin_src conf :tangle ~/.config/rofi/config.rasi :mkdirp yes
|
|
/*
|
|
DO NOT EDIT THIS FILE DIRECTLY
|
|
This is a file generated from a literate programing source file
|
|
You should make any changes there and regenerate it from Emacs org-mode
|
|
using org-babel-tangle (C-c C-v t)
|
|
*/
|
|
/* ==========================================================================
|
|
Rofi color theme
|
|
|
|
Based on the Gruvbox color scheme for Vim by morhetz
|
|
https://github.com/morhetz/gruvbox
|
|
|
|
File: gruvbox-dark-hard.rasi
|
|
Desc: Gruvbox dark (hard contrast) color theme for Rofi
|
|
Author: bardisty <b@bah.im>
|
|
Source: https://github.com/bardisty/gruvbox-rofi
|
|
Modified: Mon Feb 12 2018 06:04:26 PST -0800
|
|
========================================================================== */
|
|
|
|
*{
|
|
font: "Ubuntu Mono Nerd Font 16";
|
|
/* Theme settings */
|
|
highlight: bold italic;
|
|
scrollbar: true;
|
|
|
|
/* Gruvbox dark colors */
|
|
gruvbox-dark-bg0-hard: #1d2021;
|
|
gruvbox-dark-bg0: #282828;
|
|
gruvbox-dark-bg2: #504945;
|
|
gruvbox-dark-fg0: #fbf1c7;
|
|
gruvbox-dark-fg1: #ebdbb2;
|
|
gruvbox-dark-red-dark: #cc241d;
|
|
gruvbox-dark-red-light: #fb4934;
|
|
gruvbox-dark-yellow-dark: #d79921;
|
|
gruvbox-dark-yellow-light: #fabd2f;
|
|
gruvbox-dark-gray: #a89984;
|
|
|
|
/* Theme colors */
|
|
background: @gruvbox-dark-bg0-hard;
|
|
background-color: @background;
|
|
foreground: @gruvbox-dark-fg1;
|
|
border-color: @gruvbox-dark-gray;
|
|
separatorcolor: @border-color;
|
|
scrollbar-handle: @border-color;
|
|
|
|
normal-background: @background;
|
|
normal-foreground: @foreground;
|
|
alternate-normal-background: @gruvbox-dark-bg0;
|
|
alternate-normal-foreground: @foreground;
|
|
selected-normal-background: @gruvbox-dark-bg2;
|
|
selected-normal-foreground: @gruvbox-dark-fg0;
|
|
|
|
active-background: @gruvbox-dark-yellow-dark;
|
|
active-foreground: @background;
|
|
alternate-active-background: @active-background;
|
|
alternate-active-foreground: @active-foreground;
|
|
selected-active-background: @gruvbox-dark-yellow-light;
|
|
selected-active-foreground: @active-foreground;
|
|
|
|
urgent-background: @gruvbox-dark-red-dark;
|
|
urgent-foreground: @background;
|
|
alternate-urgent-background: @urgent-background;
|
|
alternate-urgent-foreground: @urgent-foreground;
|
|
selected-urgent-background: @gruvbox-dark-red-light;
|
|
selected-urgent-foreground: @urgent-foreground;
|
|
}
|
|
|
|
@import "gruvbox-common.rasi"
|
|
#+end_src
|
|
** Dunst Urgency Levels
|
|
*** Low Urgency
|
|
#+begin_src conf :tangle ~/.config/dunst/dunstrc
|
|
[urgency_low]
|
|
background = "#282828"
|
|
foreground = "#928374"
|
|
timeout = 10
|
|
#+end_src
|
|
*** Normal Urgency
|
|
#+begin_src conf :tangle ~/.config/dunst/dunstrc
|
|
[urgency_normal]
|
|
background = "#076678"
|
|
foreground = "#fbf1c7"
|
|
timeout = 10
|
|
override_pause_level = 30
|
|
#+end_src
|
|
*** Critical Urgency
|
|
#+begin_src conf :tangle ~/.config/dunst/dunstrc
|
|
[urgency_critical]
|
|
background = "#9d0006"
|
|
foreground = "#fbf1c7"
|
|
frame_color = "#cc241d"
|
|
timeout = 0
|
|
override_pause_level = 60
|
|
#+end_src
|
|
* Bluetooth
|
|
** Installation
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
bluez
|
|
bluez-utils
|
|
#+end_src
|
|
** Activate systemd Service
|
|
#+begin_src shell :tangle update.sh
|
|
systemd_service="bluetooth"
|
|
if ! systemctl is-enabled --quiet "$systemd_service"; then
|
|
echo "Enabling $systemd_service"
|
|
sudo systemctl enable "$systemd_service"
|
|
sudo systemctl start "$systemd_service"
|
|
fi
|
|
#+end_src
|
|
** Blueman Applet
|
|
*** Installtion
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
blueman
|
|
#+end_src
|
|
*** Autostart
|
|
#+begin_src shell :tangle ~/.autostart.sh
|
|
blueman-applet &
|
|
#+end_src
|
|
* Space Mouse Support
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
spnavcfg
|
|
#+end_src
|
|
** Daemon
|
|
#+begin_src shell :tangle update.sh
|
|
systemd_service="spacenavd"
|
|
if ! systemctl is-enabled --quiet "$systemd_service"; then
|
|
echo "Enabling $systemd_service"
|
|
sudo systemctl enable "$systemd_service"
|
|
sudo systemctl start "$systemd_service"
|
|
fi
|
|
#+end_src
|
|
|
|
* Git
|
|
** Installation
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
git
|
|
#+end_src
|
|
** Configuration
|
|
*** Literate Header
|
|
#+begin_src conf :tangle ~/.gitconfig
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
#+end_src
|
|
*** User
|
|
#+begin_src conf :tangle ~/.gitconfig
|
|
[user]
|
|
name = paul-loedige
|
|
email = 59517210+ploedige@users.noreply.github.com
|
|
#+end_src
|
|
*** Default Branch
|
|
#+begin_src conf :tangle ~/.gitconfig
|
|
[init]
|
|
defaultBranch = main
|
|
#+end_src
|
|
** Git LFS
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
git-lfs
|
|
#+end_src
|
|
** [[https://meldmerge.org/][Meld]]
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
meld
|
|
#+end_src
|
|
* Miniconda
|
|
** Installation
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
miniconda3
|
|
#+end_src
|
|
universal link
|
|
#+begin_src shell :tangle update.sh
|
|
if [ ! -e "/etc/profile.d/conda.sh" ]; then
|
|
sudo ln -s /opt/miniconda3/etc/profile.d/conda.sh /etc/profile.d/conda.sh
|
|
fi
|
|
#+end_src
|
|
add to path
|
|
#+begin_src shell :tangle ~/.path.sh
|
|
source /etc/profile.d/conda.sh
|
|
export PATH="$PATH:/opt/miniconda3/bin"
|
|
#+end_src
|
|
** ZSH special settings
|
|
#+begin_src shell :tangle ~/.zshrc
|
|
# >>> conda initialize >>>
|
|
# !! Contents within this block are managed by 'conda init' !!
|
|
__conda_setup="$('/opt/miniconda3/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
|
|
if [ $? -eq 0 ]; then
|
|
eval "$__conda_setup"
|
|
else
|
|
if [ -f "/opt/miniconda3/etc/profile.d/conda.sh" ]; then
|
|
. "/opt/miniconda3/etc/profile.d/conda.sh"
|
|
else
|
|
export PATH="$PATH:/opt/miniconda3/bin"
|
|
fi
|
|
fi
|
|
unset __conda_setup
|
|
# <<< conda initialize <<<
|
|
#+end_src
|
|
** Do not activate base environment on startup
|
|
#+begin_src shell :tangle ~/.condarc
|
|
auto_activate_base: false
|
|
#+end_src
|
|
** Install [[https://mamba.readthedocs.io][Mamba]] for faster environment solve
|
|
install micromamba
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
micromamba-bin
|
|
#+end_src
|
|
and create a symlink so it can be called as ~mamba~
|
|
#+begin_src shell :tangle update.sh
|
|
if [ ! -L "/bin/mamba" ]; then
|
|
sudo ln -s /bin/micromamba /bin/mamba
|
|
fi
|
|
#+end_src
|
|
and configure the ~MAMBA_ROOT_PREFIX~ to save environments to the conda's environment directory
|
|
#+begin_src shell :tangle ~/.zshrc
|
|
export MAMBA_ROOT_PREFIX="$HOME/.conda"
|
|
#+end_src
|
|
#+begin_src shell :tangle ~/.bashrc
|
|
export MAMBA_ROOT_PREFIX="$HOME/.conda"
|
|
#+end_src
|
|
** Workaround: OpenSSL error
|
|
as per [[https://aur.archlinux.org/packages/miniconda3#comment-973586][this comment]] in the AUR we need the current workaround
|
|
#+begin_src shell :tangle ~/.zshrc
|
|
export CRYPTOGRAPHY_OPENSSL_NO_LEGACY=1
|
|
#+end_src
|
|
|
|
* Zathura
|
|
** Installation
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
zathura
|
|
zathura-pdf-poppler
|
|
#+end_src
|
|
** enable synctex
|
|
#+begin_src conf :mkdirp yes :tangle ~/.config/zathura/zathurarc
|
|
set synctex true
|
|
#+end_src
|
|
* Nextcloud
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
nextcloud-client
|
|
#+end_src
|
|
** add to autostart
|
|
#+begin_src shell :tangle ~/.autostart.sh
|
|
nextcloud &
|
|
#+end_src
|
|
** add keyring
|
|
seahorse is used to manage the keyrings
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
gnome-keyring
|
|
seahorse
|
|
#+end_src
|
|
* Bitwarden
|
|
** Installation
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
bitwarden
|
|
#+end_src
|
|
** TODO Configuration
|
|
|
|
* PCManFM
|
|
** Installation
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
pcmanfm-gtk3
|
|
#+end_src
|
|
** Automount USB
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
udiskie
|
|
#+end_src
|
|
#+begin_src shell :tangle ~/.autostart.sh
|
|
udiskie -t &
|
|
#+end_src
|
|
** Trash Support
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
gvfs
|
|
#+end_src
|
|
** [[https://en.wikipedia.org/wiki/Server_Message_Block][SMB]] Support
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
gvfs-smb
|
|
#+end_src
|
|
** [[https://en.wikipedia.org/wiki/Media_Transfer_Protocol][MTP]] Support
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
gvfs-mtp
|
|
#+end_src
|
|
* Redshift
|
|
[[https://wiki.archlinux.org/title/Redshift][Redshift]] is a blue light filter
|
|
** Installation
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
redshift
|
|
#+end_src
|
|
** Autostart
|
|
#+begin_src shell :tangle ~/.autostart.sh
|
|
redshift-gtk -t 6500:3600 &
|
|
#+end_src
|
|
** Automatic Location Configuration
|
|
Uses [[https://gitlab.freedesktop.org/geoclue/geoclue][Geoclue]] to access the current location
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
geoclue
|
|
#+end_src
|
|
This requires a systemd service to allow access (see [[https://wiki.archlinux.org/title/Redshift#Automatic_location_based_on_GeoClue2][Arch Linux Wiki]])
|
|
#+begin_src conf :tangle ~/.config/systemd/user/geoclue-agent.service :mkdirp yes
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
[Unit]
|
|
Description=redshift needs to get a (geo)clue
|
|
|
|
[Service]
|
|
ExecStart=/usr/lib/geoclue-2.0/demos/agent
|
|
|
|
[Install]
|
|
WantedBy=default.target
|
|
#+end_src
|
|
The service needs to be enabled
|
|
#+begin_src shell :tangle update.sh
|
|
systemd_service="geoclue-agent"
|
|
if ! systemctl --user is-enabled --quiet "$systemd_service"; then
|
|
echo "Enabling $systemd_service"
|
|
systemctl --user enable "$systemd_service"
|
|
systemctl --user start "$systemd_service"
|
|
fi
|
|
#+end_src
|
|
|
|
* frpint
|
|
[[https://www.freedesktop.org/wiki/Software/fprint/][fprint]] enables authorization via fingerprint
|
|
** Installation
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
fprintd
|
|
#+end_src
|
|
** Enable systemd Service
|
|
#+begin_src shell :tangle update.sh
|
|
systemd_service="fprintd"
|
|
if ! systemctl is-enabled --quiet "$systemd_service"; then
|
|
echo "Enabling $systemd_service"
|
|
sudo systemctl enable "$systemd_service"
|
|
sudo systemctl start "$systemd_service"
|
|
fi
|
|
#+end_src
|
|
** Add User to input Group
|
|
#+begin_src shell :tangle update.sh
|
|
groupname="input"
|
|
# Add the current user to the group if not already a member
|
|
if ! groups "$USER" | grep -q "\b$groupname\b"; then
|
|
echo "Adding user $USER to group $groupname"
|
|
sudo usermod -aG "$groupname" "$USER"
|
|
if [ $? -eq 0 ]; then
|
|
echo "User $USER added to group $groupname successfully."
|
|
else
|
|
echo "Failed to add user $USER to group $groupname."
|
|
fi
|
|
fi
|
|
#+end_src
|
|
** Authentication Agent
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
lxsession-gtk3
|
|
#+end_src
|
|
#+begin_src shell :tangle ~/.autostart.sh
|
|
lxpolkit &
|
|
#+end_src
|
|
** enroll both hands if no fingers are enrolled
|
|
#+begin_src shell :tangle update.sh
|
|
if fprintd-list $USER | grep -q "no fingers enrolled"; then
|
|
echo "No fingerprints are enrolled. Enrolling all fingers..."
|
|
for finger in {left,right}-{thumb,{index,middle,ring,little}-finger}; do
|
|
fprintd-enroll -f "$finger" "$USER"
|
|
done
|
|
fi
|
|
#+end_src
|
|
** Add authentication to [[https://en.wikipedia.org/wiki/Pluggable_authentication_module][PAM]]
|
|
*** system-login
|
|
#+begin_src conf :tangle "/sudo::/etc/pam.d/system-login"
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
#%PAM-1.0
|
|
|
|
auth sufficient pam_fprintd.so
|
|
auth required pam_shells.so
|
|
auth requisite pam_nologin.so
|
|
auth include system-auth
|
|
|
|
account required pam_access.so
|
|
account required pam_nologin.so
|
|
account include system-auth
|
|
|
|
password include system-auth
|
|
|
|
session optional pam_loginuid.so
|
|
session optional pam_keyinit.so force revoke
|
|
session include system-auth
|
|
session optional pam_motd.so
|
|
session optional pam_mail.so dir=/var/spool/mail standard quiet
|
|
session optional pam_umask.so
|
|
-session optional pam_systemd.so
|
|
session required pam_env.so
|
|
#+end_src
|
|
*** sudo
|
|
#+begin_src conf :tangle "/sudo::/etc/pam.d/sudo"
|
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
# This is a file generated from a literate programing source file
|
|
# You should make any changes there and regenerate it from Emacs org-mode
|
|
# using org-babel-tangle (C-c C-v t)
|
|
|
|
#%PAM-1.0
|
|
auth sufficient pam_fprintd.so
|
|
auth include system-auth
|
|
account include system-auth
|
|
session include system-auth
|
|
#+end_src
|
|
* Communication
|
|
** Thunderbird
|
|
*** Installation
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
thunderbird
|
|
#+end_src
|
|
*** Autostart
|
|
#+begin_src shell :tangle ~/.autostart.sh
|
|
thunderbird &
|
|
#+end_src
|
|
*** TODO Config
|
|
|
|
** WhatsApp
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
whatsapp-for-linux
|
|
#+end_src
|
|
*** Fix Webkit2GTK
|
|
for more information see [[https://github.com/tauri-apps/tauri/issues/9304][this Github issue]]
|
|
#+begin_src conf :tangle "/sudo::/etc/environment"
|
|
WEBKIT_DISABLE_DMABUF_RENDERER=1
|
|
#+end_src
|
|
** signal
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
signal-desktop
|
|
#+end_src
|
|
** Slack
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
slack-desktop
|
|
#+end_src
|
|
** Discord
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
discord
|
|
#+end_src
|
|
** Telegram
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
telegram-desktop
|
|
#+end_src
|
|
** Rocket.Chat
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
rocketchat-client-bin
|
|
#+end_src
|
|
* Docker
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
docker
|
|
docker-compose
|
|
#+end_src
|
|
** Activate systemd Service
|
|
#+begin_src shell :tangle update.sh
|
|
systemd_service="docker"
|
|
if ! systemctl is-enabled --quiet "$systemd_service"; then
|
|
echo "Enabling $systemd_service"
|
|
sudo systemctl enable "$systemd_service"
|
|
sudo systemctl start "$systemd_service"
|
|
fi
|
|
#+end_src
|
|
** Add User to docker Group
|
|
#+begin_src shell :tangle update.sh
|
|
groupname="docker"
|
|
# Add the current user to the group if not already a member
|
|
if ! groups "$USER" | grep -q "\b$groupname\b"; then
|
|
echo "Adding user $USER to group $groupname"
|
|
sudo usermod -aG "$groupname" "$USER"
|
|
if [ $? -eq 0 ]; then
|
|
echo "User $USER added to group $groupname successfully."
|
|
else
|
|
echo "Failed to add user $USER to group $groupname."
|
|
fi
|
|
fi
|
|
#+end_src
|
|
* LibreOffice
|
|
** Installation
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
libreoffice-still
|
|
#+end_src
|
|
** [[http://roland65.free.fr/texmaths/][TexMaths]] Extension
|
|
Enables inserting $\LaTeX$ equations into LibreOffice
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
libreoffice-extension-texmaths
|
|
#+end_src
|
|
** [[https://writer2latex.sourceforge.net/][Writer2LaTeX]] Extension
|
|
Enables exporting LibreOffice Documents to $\LaTeX$
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
libreoffice-extension-writer2latex
|
|
#+end_src
|
|
** Spell-Checking
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
hunspell
|
|
hunspell-en_us
|
|
hunspell-de
|
|
#+end_src
|
|
** Hyphenation Rules
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
hyphen
|
|
hyphen-en
|
|
hyphen-de
|
|
#+end_src
|
|
** Thesaurus
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
libmythes
|
|
mythes-en
|
|
mythes-de
|
|
#+end_src
|
|
* Utils
|
|
** [[https://github.com/archlinux-downgrade/downgrade][Downgrade]]
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
downgrade
|
|
#+end_src
|
|
** [[https://www.gnu.org/software/wget/wget.html][GNU Wget]]
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
wget
|
|
#+end_src
|
|
** [[https://ezix.org/project/wiki/HardwareLiSter][Hardware Lister (lshw)]]
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
lshw
|
|
#+end_src
|
|
** [[https://dev.yorhel.nl/ncdu][NCDU]]
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
ncdu
|
|
#+end_src
|
|
** [[https://nmap.org/][NMAP]]
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
nmap
|
|
#+end_src
|
|
** [[https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/][PDFtk]]
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
pdftk
|
|
#+end_src
|
|
** [[https://github.com/raspberrypi/rpi-imager][rpi-imager]]
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
rpi-imager
|
|
#+end_src
|
|
** [[https://github.com/WayneD/rsync][Rsync]]
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
rsync
|
|
#+end_src
|
|
** [[https://transmissionbt.com/][Transmission]]
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
transmission-gtk
|
|
#+end_src
|
|
** [[https://gitlab.com/OldManProgrammer/unix-tree][Tree]]
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
tree
|
|
#+end_src
|
|
** [[https://www.wireguard.com/][WireGuard]]
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
wireguard-tools
|
|
#+end_src
|
|
** [[https://github.com/ib/xarchiver][xarchiver]]
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
xarchiver
|
|
#+end_src
|
|
*** Optional Dependencies
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
arj
|
|
binutils
|
|
bzip2
|
|
cpio
|
|
gzip
|
|
lhasa
|
|
lrzip
|
|
lz4
|
|
lzip
|
|
lzop
|
|
p7zip
|
|
tar
|
|
unarj
|
|
unrar
|
|
unzip
|
|
xdg-utils
|
|
xz
|
|
zip
|
|
zstd
|
|
#+end_src
|
|
** XClip
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
xclip
|
|
#+end_src
|
|
** [[https://github.com/yt-dlp/yt-dlp][yt-dlp]]
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
yt-dlp
|
|
#+end_src
|
|
** zip
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
zip
|
|
#+end_src
|
|
* Misc
|
|
** LaTeX
|
|
*** TeX Live
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
biber
|
|
texlive-basic
|
|
texlive-bibtexextra
|
|
texlive-binextra
|
|
texlive-context
|
|
texlive-fontsextra
|
|
texlive-fontsrecommended
|
|
texlive-fontutils
|
|
texlive-formatsextra
|
|
texlive-games
|
|
texlive-humanities
|
|
texlive-langarabic
|
|
texlive-langchinese
|
|
texlive-langcjk
|
|
texlive-langcyrillic
|
|
texlive-langczechslovak
|
|
texlive-langenglish
|
|
texlive-langeuropean
|
|
texlive-langfrench
|
|
texlive-langgerman
|
|
texlive-langgreek
|
|
texlive-langitalian
|
|
texlive-langjapanese
|
|
texlive-langkorean
|
|
texlive-langother
|
|
texlive-langpolish
|
|
texlive-langportuguese
|
|
texlive-langspanish
|
|
texlive-latex
|
|
texlive-latexextra
|
|
texlive-latexrecommended
|
|
texlive-luatex
|
|
texlive-mathscience
|
|
texlive-metapost
|
|
texlive-music
|
|
texlive-pictures
|
|
texlive-plaingeneric
|
|
texlive-pstricks
|
|
texlive-publishers
|
|
texlive-xetex
|
|
#+end_src
|
|
*** Pympress
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
python-pympress
|
|
python-vlc
|
|
#+end_src
|
|
** [[https://openprinting.github.io/cups/][CUPS]]
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
cups
|
|
foomatic-db-gutenprint-ppds
|
|
gutenprint
|
|
#+end_src
|
|
*** TODO Configure Printers
|
|
** [[https://www.darktable.org/][Darktable]]
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
darktable
|
|
#+end_src
|
|
** [[https://help.gnome.org/users/eog/stable/][Eye of GNOME Image Viewer]]
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
eog
|
|
#+end_src
|
|
** [[https://wiki.gnome.org/Apps/Evince][Evince]] Document Viewer
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
evince
|
|
#+end_src
|
|
** [[https://apps.gnome.org/DiskUtility/][Disks Utility]]
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
gnome-disk-utility
|
|
#+end_src
|
|
** [[https://apps.gnome.org/FontViewer/][Font Viewer]]
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
gnome-font-viewer
|
|
#+end_src
|
|
** [[https://www.gimp.org/][GIMP]]
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
gimp
|
|
#+end_src
|
|
** [[https://inkscape.org/][Inkscape]]
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
inkscape
|
|
#+end_src
|
|
** [[https://kdenlive.org/en/][kdenlive]]
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
kdenlive
|
|
#+end_src
|
|
** [[http://www.scribus.us/][Scribus]]
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
scribus
|
|
#+end_src
|
|
** [[https://shotwell-project.org/doc/html/][Shotwell Photo Manager]]
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
shotwell
|
|
#+end_src
|
|
** [[https://www.videolan.org/vlc/][VLC]]
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
vlc
|
|
#+end_src
|
|
** [[https://github.com/astrand/xclip][xclip]]
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
xclip
|
|
#+end_src
|
|
** [[https://www.drawio.com/][drawio]]
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
drawio-desktop-bin
|
|
#+end_src
|
|
|
|
** [[https://open.spotify.com][Spotify]]
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
spotify-launcher
|
|
#+end_src
|
|
** Virtualbox
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
virtualbox
|
|
virtualbox-host-dkms
|
|
virtualbox-guest-iso
|
|
#+end_src
|
|
** Teamviewer
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
teamviewer
|
|
#+end_src
|
|
** Anki
|
|
#+begin_src shell :tangle pkg-list.txt
|
|
anki-bin
|
|
#+end_src
|
|
** [[https://www.freecad.org/][FreeCAD]]
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
freecad
|
|
#+end_src
|
|
** [[https://gramps-project.org][Gramps]]
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
gramps
|
|
#+end_src
|
|
** [[https://obsproject.com/][OBS Studio]]
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
obs-studio
|
|
#+end_src
|
|
** [[https://www.portfolio-performance.info/en/][Portfolio Performance]]
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
portfolio-performance-bin
|
|
#+end_src
|
|
** Steam
|
|
#+begin_src conf :tangle pkg-list.txt
|
|
steam
|
|
#+end_src
|
|
* Manual Tasks after tangling
|
|
1. run ~update.sh~
|
|
2. log out and back in to update group permissions
|
|
3. setup Nextcloud sync directories
|
|
4. sign into Bitwarden
|
|
5. add Firefox Account
|
|
6. configure [[https://addons.mozilla.org/en-US/firefox/addon/tree-style-tab/][TST]] using [[https://github.com/piroor/treestyletab/wiki/Code-snippets-for-custom-style-rules#for-userchromecss][these instructions]]
|
|
- Note: Remove the -18px left-indent in the second config line for TST
|
|
7. configure networks
|
|
- [[https://www.scc.kit.edu/dienste/7181.php][eduroam]]
|
|
8. add message service accounts
|
|
- [ ] WhatsApp
|
|
- [ ] Slack
|
|
- [ ] Signal
|
|
- [ ] Telegram
|
|
|
|
* Other TODOs
|
|
** DONE dunst
|
|
- State "DONE" from "TODO" [2024-05-21 Di 11:31]
|
|
** TODO fcitx
|
|
** TODO browser landing page
|
|
** DONE go through https://wiki.archlinux.org/title/Laptop
|
|
- State "DONE" from "TODO" [2024-05-21 Di 11:31]
|
|
** DONE go through old pkglist
|
|
- State "DONE" from "TODO" [2024-02-20 Di 23:49]
|
|
** TODO add README
|
|
** DONE CUDA
|
|
- State "DONE" from "TODO" [2024-05-21 Di 11:31]
|