Initial commit

1. Transfer doomemacs config from common
2. Transfer rustfmt from common
This commit is contained in:
Leni Aniva 2023-08-28 15:31:02 -07:00
commit 5cfa457ce6
Signed by: aniva
GPG Key ID: 4D9B1C8D10EA4C50
25 changed files with 2227 additions and 0 deletions

13
.gitignore vendored Normal file
View File

@ -0,0 +1,13 @@
.*
!.gitignore
# Programs that keep binary data in .config need to be excluded
borg
gimp
# Programs which require machine-specific data or cache in their rc files
gwenviewrc
katerc
spectaclerc
trashrc
vlcrc

93
README.org Normal file
View File

@ -0,0 +1,93 @@
#+title: Desktop Environment for Mellite
* Installation
Install all the packages listed below. Then,
#+begin_src
cd ~/.config
git init
git remote add origin $SOURCE
git pull origin main
#+end_src
* Login Manager
- ~sddm~: Enable ~sddm.service~
A note about themes: The themes must be placed in ~/usr/share/sddm/themes~.
Then in ~/etc/sddm.conf~, enable the relevant theme. By default the breeze
theme comes with ~plasma-workspace~ which is very bloated to install, so
consider some of the alternative themes.
* Fonts
- ~otf-font-awesome~: Needed for ~waybar~ to render icons
- Noto Sans/Serif: System font
* Hyprland
Note: Setup does not work with NVIDIA GPU without some tweaks.
- [[https://wiki.archlinux.org/title/wayland][wayland]]: display manager: ~wayland~, ~xorg-xwayland~
- [[https://wiki.archlinux.org/title/Hyprland][hyprland]]: window manager
- ~waybar~: Status bar, use ~waybar-hyprland-git~ AUR repo to enable clicking!
- ~eww-wayland~: Another status bar, requires ~socat~ to listen for hyprland events.
Until [[https://github.com/elkowar/eww/issues/111][tray support]] has been added to ~eww~ in a stable manner, tray will be handled with waybar.
- ~hyprpaper~: Wallpaper engine
The command to set a wallpaper:
~hyprctl hyprpaper wallpaper "$DISPLAY,$FILE"~
- [[https://github.com/Horus645/swww][swww]]: Alternate wallpaper engine
Note that ~~/.config/hypr/wallpapers~ must have jpeg files ~{1..8}.jpg~. A
handy command can be used crop and resize images:
#+begin_src bash
convert $IN \
-resize 3840x2160^ \
-gravity center \
-extent 3840x2160 \
$OUT
#+end_src
- ~swaync~: Notification server
The command for changing keyboard layouts is handled by ~fcitx5~.
* Utilities
- ~alacritty~: terminal emulator
Note that in order to set this as the default terminal, you may need to put
the following in ~~/.config/kdeglobals~:
#+begin_src
[General]
TerminalApplication
#+end_src
- ~wofi~: finding programs, drop in replacement for ~rofi~
- ~grimblast~: Screenshot engine
- ~dolphin~: File explorer
- ~swaylock-effects~: A simple lockscreen
- ~mpd~: Music player daemon
#+begin_src sh
systemctl enable --user mpd
systemctl start --user mpd
#+end_src
Optionally, install ~mpc~
- ~cantata~: Controls mpd (other clients are acceptable too)
- ~wl-clipboard~: Provides copying
- ~btop~/~htop~: Process monitor
- ~blueman~: Bluetooth connector
** Configuration
- ~lxappearance~: Used to configure GTK3 themes
- ~nwg-look~: Configures cursor
** Diagnostics
- ~wev~: Wayland event interceptor useful for determining keybinds
- ~neofetch~: Screenfetch
- ~macchina~ (aur): Another screenfetch
* Troubleshooting

2
alacritty/alacritty.yml Normal file
View File

@ -0,0 +1,2 @@
font:
size: 14

4
doom/.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
config.el
packages.el
# auto generated env vars
custom.el

16
doom/banner.txt Normal file
View File

@ -0,0 +1,16 @@
⠀⠀⠀⠀⠂⠀⠀⠀⠂⠐⠀⡞⢡⠐⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢂⠐
⠀⠀⠀⠀⠁⠀⠀⠀⠀⢀⣼⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡴⠋⠈
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⡇⢤⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣴⠟⠁⢀⠀
⠠⠀⠀⠀⠀⠀⠀⠀⣼⣿⠌⠀⠉⠹⡀⠀⠀⠄⠠⠀⣠⣾⣟⠡⠄⠀⠀⠀
⠐⠀⠀⠀⠀⠀⠀⢰⣿⡿⠀⠀⠀⣠⠎⠈⠉⠙⢕⠺⣿⠟⠁⠀⠑⢎⠀⠀
⠀⠀⠀⠀⠀⠀⡠⠋⠘⠃⢀⡶⠊⠀⠀⠀⠀⠀⠀⠱⡀⠑⢄⠀⢠⡄⠃⠀
⠀⠀⠀⠀⠀⡜⠁⠀⠀⠀⠌⠀⠀⠀⢠⡆⠀⠀⠀⠀⢱⡀⠀⠣⣤⠇⠀⠀
⠀⠀⠀⠀⡘⠀⠀⠀⠀⡜⠀⠀⠀⢠⣁⣇⢰⠀⠀⠀⣸⣡⠀⠀⣵⣀⠀⠀
⠀⠀⠀⠀⡇⠀⠀⡠⠊⠃⠀⠀⢠⠃⠀⢠⠈⠀⠀⠀⠆⠀⠆⠘⢿⣿⠀⠀
⠀⠀⠀⠀⣇⡄⠪⠄⠐⡆⠀⢠⢃⣀⣀⣘⠇⠀⠀⡜⣠⣤⣼⡀⢠⢫⢆⠀
⠀⠀⠀⠀⢰⠀⠀⠀⡄⠹⡀⡿⠋⣿⣿⣽⠁⡠⠺⠘⣿⡿⠈⠇⡘⠣⢈⣢
⠀⠀⠀⠀⢀⡄⠀⠀⡇⠀⠱⠸⡈⢇⡠⠹⠊⠀⠀⠀⠧⠆⣸⠘⠃⠀⣀⡀
⠀⠀⠀⠀⡌⢀⠀⠀⢁⠀⠀⢠⣱⡔⠀⠀⠀⠀⠀⠀⠀⠀⢾⠀⠁⠀⠿⠃
⠀⠀⢀⡜⠄⡆⠀⢀⠘⡤⠀⠀⡆⠁⠀⠀⠀⠀⠐⠀⠀⡠⠃⠀⡀⠀⠀⠀
⠀⠀⠀⠀⠀⢃⠀⠘⢂⢀⣇⠀⣇⠀⠳⣦⠤⠄⡤⠐⠹⢇⠀⠀⡇⠀⠀⠀
⠀⠀⠀⠀⠀⠘⠤⢇⡔⠻⣿⣆⣯⡢⣀⢸⢿⣶⡁⠀⠀⠀⠆⢸⠁⠀⠀⠀

721
doom/config.org Normal file
View File

@ -0,0 +1,721 @@
#+TITLE: Doom Emacs Configuration File
* Installation
Execute ~doom sync~ after modifying this file to tangle it to ~config.el~.
Dependencies:
- Doom Emacs: ~git~ ~ripgrep~, ~fd-find~
- ~lilypond-mode~: ~LilyPond~
- ~:app everywhere~: ~xwininfo~, ~xdotool~, ~xclip~, ~xprop~
- Font: Source Code Pro
Individual packages may have other optional dependencies. Execute ~doom doctor~ to find out.
The following block of comments is from the default configuration.
#+begin_src emacs-lisp
;;; $DOOMDIR/config.el -*- lexical-binding: t; -*-
;; Place your private configuration here! Remember, you do not need to run 'doom
;; sync' after modifying this file!
;; Whenever you reconfigure a package, make sure to wrap your config in an
;; `after!' block, otherwise Doom's defaults may override your settings. E.g.
;;
;; (after! PACKAGE
;; (setq x y))
;;
;; The exceptions to this rule:
;;
;; - Setting file/directory variables (like `org-directory')
;; - Setting variables which explicitly tell you to set them before their
;; package is loaded (see 'C-h v VARIABLE' to look up their documentation).
;; - Setting doom variables (which start with 'doom-' or '+').
;;
;; Here are some additional functions/macros that will 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.
;; Alternatively, use `C-h o' to look up a symbol (functions, variables, faces,
;; etc).
;;
;; You can also try 'gd' (or 'C-c c d') to jump to their definition and see how
;; they are implemented.
#+end_src
These packages are loaded into ~packages.el~. The following comments are provided by default.
#+begin_src emacs-lisp :tangle packages.el
;; -*- no-byte-compile: t; -*-
;;; $DOOMDIR/packages.el
;; 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/radian-software/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 radian-software/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
* User specific settings
Some functionality uses this to identify you, e.g. GPG configuration, email
clients, file templates and snippets. It is optional. This could be changed to
rely on system environment variables.
#+begin_src emacs-lisp
(setq
user-full-name "Leni Ven"
user-mail-address "leniv@stanford.edu")
#+end_src
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!
#+begin_src emacs-lisp
(setq org-directory "~/org/")
#+end_src
* Interface
** Key Bindings
Modifications to the default key bindings to mimic spacemacs
- ~SPC SPC~ is mapped to ~M-x~ (~#'execute-extended-command~)
- ~SPC !~ is mapped to ~M-!~ (~#'shell-command~)
- ~SPC :~ is mapped to ~M-:~ (~#'eval-expression~)
- ~,~ is mapped to the local (major mode) leader ~,~
- ~SPC b 0~ deletes the current buffer and window like Spacemacs ~SPC b x~
#+begin_src emacs-lisp
(setq doom-localleader-key ",")
(map! :leader
:desc "Execute shell command"
"!" #'shell-command)
(map! :leader
:desc "Execute extended command (emacs M-x)"
"SPC" #'execute-extended-command)
(map! :leader
:desc "Evaluate expression (emacs M-:)"
":" #'eval-expression)
(map! :leader
:desc "Kill buffer and window"
"b 0" #'kill-buffer-and-window)
(map! :leader
(:prefix ("S" . "Set")
:desc "Input method" "i" #'set-input-method
))
(map! :nvi "C" nil) ; remove this one weird binding
(map! "<f12>" #'toggle-input-method)
#+end_src
** Font settings
Doom exposes five (optional) variables for controlling fonts in Doom:
- ~doom-font~ -- the primary font to use
- ~doom-variable-pitch-font~ -- a non-monospace font (where applicable)
- ~doom-big-font~ -- used for ~doom-big-font-mode~; use this for
presentations or streaming.
- ~doom-unicode-font~ -- for unicode glyphs
- ~doom-serif-font~ -- for the ~fixed-pitch-serif~ face
See ~C-h v doom-font~ for documentation and more examples of what they
accept.
If you or Emacs can't find your font, use ~M-x describe-font~ to look them up,
~M-x eval-region~ to execute ELisp code, and ~M-x doom/reload-font~ to refresh
your font settings. If Emacs still can't find your font, it likely wasn't
installed correctly. Font issues are rarely Doom issues!
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.
#+begin_src emacs-lisp
(setq
default-font "Source Code Pro"
default-font-size 14.0
doom-font (font-spec
:family default-font
:size default-font-size
:weight 'semi-light)
doom-variable-pitch-font (font-spec
:family default-font
:size (+ default-font-size 1.0))
doom-unicode-font (font-spec
:family default-font
:size default-font-size)
doom-theme 'doom-lantern)
(add-to-list 'default-frame-alist '(alpha . 90))
#+end_src
** Splash Screen
#+begin_src emacs-lisp
(defun custom/doom-banner ()
(let* (
(banner (with-temp-buffer
(insert-file-contents "~/.config/doom/banner.txt")
(split-string (buffer-string) "\n" t)))
(longest-line (apply #'max (mapcar #'length banner)))
)
(put-text-property
(point)
(dolist (line banner (point))
(insert
(+doom-dashboard--center
+doom-dashboard--width
(concat line (make-string (max 0 (- longest-line (length line))) 32)))
"\n"))
'face 'doom-dashboard-banner)))
(setq +doom-dashboard-ascii-banner-fn #'custom/doom-banner)
(set-face-font 'doom-dashboard-banner (font-spec :family "Source Code Pro" :foundry "ADBO"))
#+end_src
** Line numbers
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~.
#+begin_src emacs-lisp
(setq display-line-numbers-type 'relative)
#+end_src
** Indentation Style Hooks
#+begin_src emacs-lisp
(defun custom/common-program-hook ()
(setq
whitespace-style '(face spaces tabs newline trailing space-mark tab-mark newline-mark)
whitespace-line-column 80)
(display-line-numbers-mode)
(display-fill-column-indicator-mode)
(setq
indent-tabs-mode t
indent-line-function 'tab-to-tab-stop
tab-width 3
standard-indent 3)
(indent-tabs-mode)
(smart-tabs-mode-enable)
)
(defun custom/common-richtext-hook ()
(setq whitespace-style '(face spaces tabs newline trailing space-mark tab-mark newline-mark))
(setq whitespace-line-column nil)
(display-line-numbers-mode)
)
(add-hook 'text-mode-hook #'custom/common-richtext-hook)
#+end_src
* Package-specific Settings
** Editor
*** Smart Tabs
#+begin_src emacs-lisp :tangle packages.el
(package! smart-tabs-mode)
#+end_src
#+begin_src emacs-lisp
(use-package! smart-tabs-mode
:config
(print! "Configuring smart-tabs-mode")
(smart-tabs-insinuate
'c 'c++
'java
'javascript))
(setq-default
indent-tabs-mode t
indent-line-function 'tab-to-tab-stop
tab-width 3
standard-indent 3)
#+end_src
*** Whitespace mode
#+begin_src emacs-lisp :tangle packages.el
(package! whitespace)
#+end_src
#+begin_src emacs-lisp
(use-package! whitespace
:config
(setq
whitespace-style '(face tabs tab-mark spaces space-mark trailing newline newline-mark)
whitespace-line-column 80
whitespace-display-mappings
'(
(space-mark 32 [183] [46]) ; 32 SPACE 「 」, 183 MIDDLE DOT 「·」, 46 FULL STOP 「.」
(newline-mark 10 [172 10]) ; 10 LINE FEED, 172 Not Sign「¬」
(tab-mark 9 [10141 9] [92 9]) ; 9 TAB, 10141 Triangle-headed rightwards arrow 「➝」
))
(global-whitespace-mode +1)
)
#+end_src
*** Format
Note that ~onsave~ was intentionally turned off because it messes with version control systems.
#+begin_src emacs-lisp
(after! format
(print! "Configuring (after! format ...)")
'(not
emacs-lisp-mode
sql-mode ; Broken
;; tex related modes are broken
tex-mode
latex-mode
bibtex-mode
))
#+end_src
*** Spell
#+begin_src emacs-lisp
(after! flyspell
(print! "Configuring (after! flyspell ...)")
(setq flyspell-default-dictionary "english"))
#+end_src
** Languages
*** Emacs Lisp
#+begin_src emacs-lisp
(defun custom/lisp-family-hook ()
(setq
indent-line-function 'tab-to-tab-stop
tab-width 3
standard-indent 3)
(indent-tabs-mode)
(display-line-numbers-mode)
)
(add-hook 'lisp-mode-hook #'custom/lisp-family-hook)
(add-hook 'lisp-data-mode-hook #'custom/lisp-family-hook)
(add-hook 'emacs-lisp-mode-hook #'custom/lisp-family-hook)
#+end_src
*** Epub
#+begin_src emacs-lisp :tangle packages.el
(package! nov)
#+end_src
#+begin_src emacs-lisp
(add-hook 'nov-mode-hook (lambda ()
(setq nov-text-width t)
(visual-line-mode)))
#+end_src
*** Org
Rather than using a common prefix ~, i~ like Spacemacs to consolidate all
insertion operations, we put them in different categories. Some keybindings are
removed.
#+begin_src emacs-lisp
(map! :after org
:localleader
:map org-mode-map
:desc "LaTeX Preview" "X" #'org-latex-preview
;; Remove some clutter
"h" nil
"n" nil
"i" nil
"@" nil
"q" nil
"o" nil
"I" nil ; 'org-id-get-create'
"A" nil ; 'org-archive-subtree'
(:prefix ("b". "table")
:desc "Edit formulae" "F" #'org-table-edit-formulas
:desc "Eval formula" "f" #'org-table-eval-formula
(:prefix ("m" . "move")
:desc "Move row up" "K" #'org-table-move-row-up
:desc "Move row down" "J" #'org-table-move-row-down
:desc "Move column left" "H" #'org-table-move-column-left
:desc "Move column right" "L" #'org-table-move-column-right
:desc "Move cell up" "k" #'org-table-move-cell-up
:desc "Move cell down" "j" #'org-table-move-cell-down
:desc "Move cell left" "h" #'org-table-move-cell-left
:desc "Move cell right" "l" #'org-table-move-cell-right
)
)
(:prefix ("h" . "headings")
:desc "Consult heading" "." #'consult-org-heading
:desc "Insert heading" "h" #'org-insert-heading
:desc "Insert todo heading" "t" #'org-insert-todo-heading
:desc "Insert subheading" "i" #'org-insert-subheading
:desc "Insert todo subheading" "t" #'org-insert-todo-subheading
:desc "Previous visible heading" "[" #'org-previous-visible-heading
:desc "Next visible heading" "]" #'org-next-visible-heading
)
(:prefix ("o" . "tags/properties")
:desc "Set tags command" "t" #'org-set-tags-command
:desc "Set property" "s" #'org-set-property
:desc "Delete property" "d" #'org-delete-property
:desc "Property action" "a" #'org-property-action
)
(:prefix ("i" . "insert")
:desc "Item" "i" #'org-toggle-item
:desc "Citation" "c" #'org-cite-insert
:desc "Footnote" "f" #'org-footnote-new
:desc "Id" "I" #'org-id-get-create
)
(:prefix ("l" . "links")
;; Description update
:desc "Insert/Modify Link" "l" #'org-insert-link
)
)
#+end_src
*** LaTeX
The target indentation style of ~LaTeX~ is as follows:
#+begin_src tex :tangle no
\section{A section}
% No indent here
\begin{enumerate}[1.]
\item Some item 1. Note that item is not indented.
Item 1 continued. 1 level of indentation.
\item
\begin{tikzpicture}[
xscale=2,yscale=3
]
\node[dot] (x) at (0,0);
\node[dot] (y) at (0,1);
\draw (x) -- (y)
\node[midway,fill=white] {$f$};
\end{tikzpicture}
\end{enumerate}
#+end_src
For some reason the keymap binding has to use ~LaTeX-mode-map~ or ~TeX-mode-map~
instead of ~latex-mode-map~. Also some original keybindings are removed so they
can be displayed correctly in prompts. See e.g. ~tex-buf.el~ for an example.
When unbinding these keys, use ~:g~ flag to ensure no extraneous keys are
introduced.
#+begin_src emacs-lisp
(after! latex
(print! "Configuring (after! latex ...)")
(add-hook 'tex-mode-hook #'custom/common-program-hook)
(add-hook 'LaTeX-mode-hook #'custom/common-program-hook)
(setq-default TeX-electric-sub-and-superscript nil)
;(local-unset-key "C-c C-l")
;(local-unset-key "C-c `")
)
(map! :after latex
:localleader
:map TeX-mode-map
:desc "View Compilation Log" "l" #'TeX-recenter-output-buffer
:desc "Next Error" "e" #'TeX-next-error
:desc "Close Environment" "]" #'LaTeX-close-environment
(:prefix ("f" . "Fold")
:desc "Fold Mode" "f" #'TeX-fold-mode
:desc "Environment" "e" #'TeX-fold-env
:desc "Buffer" "b" #'TeX-fold-buffer
:desc "Region" "r" #'TeX-fold-region
:desc "Paragraph" "p" #'TeX-fold-paragraph
:desc "Dwim" "d" #'TeX-fold-dwim)
)
(map! :after latex
:map TeX-mode-map
:g "C-c C-l" nil
:g "C-c `" nil
)
#+end_src
*** Lean 3
#+begin_src emacs-lisp
(add-hook! lean-mode
(activate-input-method 'Lean)
(if (not indent-tabs-mode)
(indent-tabs-mode))
)
(map! :after lean-mode
:localleader
:map lean-mode-map
:desc "Show symbol keystrokes" "k" #'quail-show-key
)
(map! :after lean-mode
:map TeX-mode-map
:g "C-c C-k" nil
:g "C-c C-r" nil
:g "C-c C-s" nil
:g "C-c C-g" nil
:g "C-c SPC" nil
)
#+end_src
*** Lean 4
Lean 4 is still volatile and under construction.
#+begin_src emacs-lisp :tangle packages.el
(package! lean4-mode :recipe (
:host github
:repo "leanprover/lean4-mode"
:files ("*.el" "data")))
#+end_src
#+begin_src emacs-lisp
(add-hook 'lean4-mode-hook (lambda ()
(setq tab-width 2)))
(map! :after lean4-mode
:localleader
:map lean4-mode-map
:desc "Execute" "R" #'lean4-execute
:desc "Execute in standalone" "r" #'lean4-std-exe
:desc "Toggle info buffer" "t" #'lean4-toggle-info
(:prefix ("e" . "Error")
:desc "Previous error" "p" #'flycheck-previous-error
:desc "Next error" "n" #'flycheck-next-error
:desc "List error" "l" #'flycheck-list-errors
)
:desc "Lake build" "b" #'lean4-lake-build
(:prefix ("p" . "leanpkg")
:desc "Test" "t" #'lean4-leanpkg-test
:desc "Build" "b" #'lean4-leanpkg-build
:desc "Configure" "c" #'lean4-leanpkg-configure
)
)
#+end_src
*** LilyPond
Add the necessary hooks for LilyPond mode.
#+begin_src emacs-lisp
(use-package! lilypond-mode
:mode ("\\.ly\\'" . LilyPond-mode)
:after-call LilyPond-mode
:config
(add-hook 'LilyPond-mode-hook #'custom/common-program-hook))
(map! :after lilypond-mode
:localleader
:map LilyPond-mode-map
:desc "Info" "I" #'LilyPond-info
:desc "Info Index Search" "i" #'LilyPond-info-index-search
:desc "Comment/Uncomment" ";" #'LilyPond-comment-region
:desc "What beat" "b" #'LilyPond-what-beat
:desc "Play midi" "m" #'LilyPond-command-current-midi
:desc "Quick insert mode" "q" #'LilyPond-quick-insert-mode
:desc "Insert tag current" "t" #'LilyPond-insert-tag-current
(:prefix ("c" . "command")
:desc "Buffer" "b" #'LilyPond-command-buffer
:desc "Master" "r" #'LilyPond-command-master
:desc "LilyPond" "l" #'LilyPond-command-lilypond
:desc "Format ps" "p" #'LilyPond-command-formatps
:desc "Format midi" "m" #'LilyPond-command-formatmidi
:desc "Kill jobs" "k" #'LilyPond-kill-jobs
)
)
#+end_src
*** Rust
#+begin_src emacs-lisp
(after! rustic
(setq rustic-indent-offset standard-indent))
#+end_src
** Tools
*** Language Server Protocol (LSP)
File path is removed from breadcrumb since it is provided by ~doom-modeline~ and
since it clutters the header-line.
#+begin_src emacs-lisp
(setq-hook! lsp-mode
lsp-headerline-breadcrumb-enable t
lsp-headerline-breadcrumb-enable-symbol-numbers nil
lsp-headerline-breadcrumb-segments '(symbols)
)
#+end_src
*** Magit
#+begin_src emacs-lisp
(map! :after magit
:localleader
:map git-commit-mode-map
:desc "Finish" "c" #'with-editor-finish
:desc "Cancel" "q" #'with-editor-cancel
)
#+end_src
*** Emacs IPython Notebook (ein)
Adapted from [[https://gist.github.com/millejoh/8632402a11384a3a0949fa350a1a271b]]
Usage: Since ~ein:notebooklist-mode~, ~ein:markdown-mode~, and
~ein:traceback-mode~ are major modes, their hotkeys are triggered by the local
leader ~,~ / ~SPC m~. However the ~ein:notebook-mode~ and
~ein:notebook-multilang-mode~ are minor modes and they are triggered by ~C-c~
instead of ~,~.
FIXME: Cleanup ~ein:markdown-mode-map~.
#+begin_src emacs-lisp
(defun custom/ein:worksheet-merge-cell-next ()
(interactive)
(ein:worksheet-merge-cell-km (ein:worksheet--get-ws-or-error) (ein:worksheet-get-current-cell) t t))
(map! :after ein
;:localleader
:map ein:notebooklist-mode-map ; Major mode
"" nil
:desc "Describe mode" "h" #'describe-mode
:desc "Reload" "r" #'ein:notebooklist-reload
:desc "File open" "o" #'ein:file-open
:desc "Open" "O" #'ein:notebook-open
:desc "Prev item" "[" #'ein:notebooklist-prev-item
:desc "Next item" "]" #'ein:notebooklist-next-item
:desc "New notebook" "n" #'ein:notebooklist-new-notebook
:desc "New notebook with name" "N" #'ein:notebooklist-new-notebook-with-name
)
(map! :after ein
:localleader
:map ein:markdown-mode-map ; Major mode
:desc "Up" "K" #'ein:markdown-move-up
:desc "Down" "J" #'ein:markdown-move-down
:desc "Promote" "H" #'ein:markdown-move-up
:desc "Demote" "L" #'ein:markdown-move-down
:desc "Do" "e" #'ein:markdown-do
:desc "Cycle" "c" #'ein:markdown-cycle
)
(map! :after ein
:map ein:notebook-mode-map ; Minor mode
:prefix "C-c"
"" nil ; Remove all keys
;; Python
:desc "Jump back" "," #'ein-pytools-jump-back-command
:desc "Jump to source" "." #'ein-pytools-jump-to-source-command
;; Cell
:desc "Copy cell" "y" #'ein:worksheet-copy-cell-km
:desc "Yank cell" "p" #'ein:worksheet-yank-cell-km
:desc "kill cell" "d" #'ein:worksheet-kill-cell-km
:desc "Insert below" "i" #'ein:worksheet-insert-cell-below-km
:desc "Insert above" "I" #'ein:worksheet-insert-cell-above-km
:desc "Goto next input" "j" #'ein:worksheet-goto-next-input-km
:desc "Goto prev input" "k" #'ein:worksheet-goto-prev-input-km
:desc "Move cell down" "J" #'ein:worksheet-move-cell-down-km
:desc "Move cell up" "K" #'ein:worksheet-move-cell-up-km
:desc "Change cell type" "u" #'ein:worksheet-change-cell-type-km
:desc "Toggle cell type" "t" #'ein:worksheet-toggle-cell-type-km
:desc "Merge cell" "m" #'ein:worksheet-merge-cell-km
:desc "Merge cell next" "M" #'custom/ein:worksheet-merge-cell-next
:desc "Split cell" "s" #'ein:worksheet-split-cell-at-point-km
:desc "Execute cell and goto next" "RET" #'ein:worksheet-execute-cell-and-goto-next-km
;; Notebook
:desc "Move prev" "H" #'ein:notebook-worksheet-move-prev
:desc "Move next" "L" #'ein:notebook-worksheet-move-next
(:prefix ("o" . "Output")
:desc "Toggle output" "t" #'ein:worksheet-toggle-output-km
:desc "Show traceback" "T" #'ein:tb-show-km
:desc "Clear output" "c" #'ein:worksheet-clear-output
:desc "Clear all output" "C" #'ein:worksheet-clear-all-output
:desc "Set output visibility" "v" #'ein:worksheet-set-output-visibility-all-km
:desc "Show code cell" "s" #'ein:shared-output-show-code-cell-at-point-km
)
(:prefix ("e" . "Execute")
:desc "All cells" "a" #'ein:worksheet-execute-all-cells
:desc "All cells above" "K" #'ein:worksheet-execute-all-cells-above
:desc "All cells below" "J" #'ein:worksheet-execute-all-cells-below
:desc "Cell and go to next" "RET" #'ein:worksheet-execute-cell-and-goto-next-km
:desc "Cell and insert below" "j" #'ein:worksheet-execute-cell-and-insert-below-km
)
(:prefix ("f" . "File")
:desc "Open console" "c" #'ein:console-open
:desc "Open prev or last" "h" #'ein:notebook-worksheet-open-prev-or-last
:desc "Open next or first" "l" #'ein:notebook-worksheet-open-next-or-first
:desc "Insert next" "n" #'ein:notebook-worksheet-insert-next
:desc "Open 1" "1" #'ein:notebook-worksheet-open-1th
:desc "Open 2" "2" #'ein:notebook-worksheet-open-2th
:desc "Open 3" "3" #'ein:notebook-worksheet-open-3th
:desc "Open 4" "4" #'ein:notebook-worksheet-open-4th
:desc "Open 5" "5" #'ein:notebook-worksheet-open-5th
:desc "Open 6" "6" #'ein:notebook-worksheet-open-5th
:desc "Open 7" "7" #'ein:notebook-worksheet-open-7th
:desc "Open 8" "8" #'ein:notebook-worksheet-open-8th
:desc "Open last" "9" #'ein:notebook-worksheet-open-last
:desc "Close notebook" "x" #'ein:notebook-close
:desc "Save notebook" "s" #'ein:notebook-save-notebook-command
:desc "Rename sheet" "R" #'ein:worksheet-rename-sheet
:desc "Rename notebook" "C-r" #'ein:notebook-rename-command
:desc "Worksheet Delete" "d" #'ein:notebook-worksheet-delete
)
)
(map! :after ein-multilang
:map ein:notebook-multilang-mode-map ; Minor mode
:prefix "C-c"
:desc "Execute cell" "RET" #'ein:worksheet-execute-cell
:desc "Execute cell and goto next" "<C-return>" #'ein:worksheet-execute-cell-and-goto-next
:desc "Goto next input" "gj" 'ein:worksheet-goto-next-input
:desc "Goto prev input" "gk" 'ein:worksheet-goto-prev-input
:desc "Move cell down" "M-j" 'ein:worksheet-move-cell-down
:desc "Move cell up" "M-k" 'ein:worksheet-move-cell-up
)
#+end_src

194
doom/init.el Normal file
View File

@ -0,0 +1,194 @@
;;; init.el -*- lexical-binding: 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 link to Doom's Module Index where all
;; of our modules are listed, including 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).
(doom! :input
;;bidi ; (tfel ot) thgir etirw uoy gnipleh
;;chinese
japanese
;;layout ; auie,ctsrnm is the superior home row
:completion
company ; 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 ; 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) ; tasing you for misspelling mispelling
;;grammar ; tasing grammar mistake every you make
:tools
;;ansible
;;biblio ; Writes a PhD for you (citation needed)
debugger ; 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 +peek) ; 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) ; 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 +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 ; organize your plain life in plain text
;;php ; perl's insecure younger brother
;;plantuml ; diagrams for confusing people more
;;purescript ; javascript, but functional
python ; 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 +tree-sitter) ; 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))

167
eww/bar/eww.scss Normal file
View File

@ -0,0 +1,167 @@
$window: #eeeeee;
$window_border: rgba(200, 200, 200, 0.7);
$workspace_inactive: rgba(100, 114, 125, 0.6);
$workspace_inactive_bg: transparent;
$workspace_active: rgba(180, 190, 200, 0.9);
$workspace_active_bg: transparent;
$workspace_focused: rgba(220, 230, 230, 0.9);
$workspace_focused_bg: rgba(100, 114, 125, 0.5);
$workspace_hover: #2E5DFF;
$widget_bg: rgba(40, 40, 40, 0.5);
$weather: rgba(180, 220, 235, 0.8);
$weather_end: rgba(171, 233, 179, 0.8);
$clock: rgba(171, 233, 179, 1.0);
$media: rgba(224, 232, 224, 0.7);
$tray_background: rgba(204, 204, 204, 0.1);
$tray: #c9cbff;
$keyboard: #f2cdcd;
$language: #e8a2af;
$idle_inhibitor: #f28fad;
$audio: #fae3b0;
$backlight: #f8bd96;
$bluetooth: #caa9c7;
$network: #bd93f9;
$cpu: #96cdfb;
$memory: #88bbeb;
$temperature: #ddb6f2;
$temperature_critical: #ff6666;
$battery: #b6b2b3;
* { all: unset; }
.bar {
//background-color: transparent;
margin-left: 5px;
font-size: 15px;
font-family: monospace;
}
.icon {
font-size: 20px;
}
.launcher {
font-size: 40px;
margin: -7px -5px 15px -5px;
}
box .workspaces {
border-radius: 10px;
button {
font-size: 30px;
padding-left: 2px;
margin: -5px -5px -5px -5px;
border-radius: 2px;
}
button:hover {
color: $workspace_hover;
}
.focused {
color: $workspace_focused;
background-color: $workspace_focused_bg;
}
.active {
color: $workspace_active;
background-color: $workspace_active_bg;
}
.inactive {
color: $workspace_inactive;
background-color: $workspace_inactive_bg;
}
}
box .weather {
color: $weather;
margin-left: 2px;
//margin-right: -1px;
background-color: $widget_bg;
border-radius: 5;
.temperature {
color: mix($weather_end, $weather, 0%);
.feelsLike {
font-style: italic;
}
}
.uvIndex {
color: mix($weather_end, $weather, 20%);
}
.humidity {
color: mix($weather_end, $weather, 40%);
}
.precip {
color: mix($weather_end, $weather, 60%);
}
.wind {
color: mix($weather_end, $weather, 80%);
}
.cloud {
color: mix($weather_end, $weather, 100%);
}
}
box .clock {
background-color: $widget_bg;
border-radius: 5;
color: $clock;
margin-bottom: 30px;
padding: 2pt 2pt 2pt 2pt;
}
.media {
font-family: "Noto Serif";
padding-left: 5px;
padding-right: 5px;
color: $media;
border: none;
}
.status {
font-family: monospace;
}
// Styles on classes (see eww.yuck for more information)
.status slider {
all: unset;
color: #ffd5cd;
}
.metric scale trough highlight {
all: unset;
background-color: #D35D6E;
color: #000000;
border-radius: 10px;
}
.metric scale trough {
all: unset;
background-color: #4e4e4e;
border-radius: 50px;
min-height: 3px;
min-width: 50px;
margin-left: 10px;
margin-right: 20px;
}
.metric scale trough highlight {
all: unset;
background-color: #D35D6E;
color: #000000;
border-radius: 10px;
}
.metric scale trough {
all: unset;
background-color: #4e4e4e;
border-radius: 50px;
min-height: 3px;
min-width: 50px;
margin-left: 10px;
margin-right: 20px;
}
.label-ram {
font-size: large;
}

180
eww/bar/eww.yuck Normal file
View File

@ -0,0 +1,180 @@
(defvar eww "eww --config $HOME/.config/eww/bar")
(defwindow bar
:exclusive true
:monitor 0
:windowtype "dock"
:geometry (geometry
:x "0%"
:y "0%"
:width "20px"
:height "100%"
:anchor "center left"
)
:reserve (struts :side "left" :distance "20px")
(widget_bar))
(defwidget widget_bar []
(centerbox :orientation "v"
(box :orientation "v" :space-evenly false :valign "start"
(box :class "launcher" :valign "start" "☯")
(widget_workspaces)
)
(widget_weather :orientation "v")
(widget_clock)
;(media)
;(widget_status)
))
(defwidget widget_weather [orientation]
(box
:class "weather"
:orientation orientation
:space-evenly false
:valign "start"
:halign "center"
:spacing 10
;(box :class "moon" :orientation "v" moon) ; Not very stable
(box :class "temperature" :orientation orientation
(box :class "icon" "")
"${weather.current_condition[0].temp_C}"
(box :class "feelsLike" "${weather.current_condition[0].FeelsLikeC}")
)
(box :class "uvIndex" :orientation orientation
(box :class "icon" "")
"${weather.current_condition[0].uvIndex}")
(box :class "humidity" :orientation orientation
(box :class "icon" "")
"${weather.current_condition[0].humidity}"
)
(box :class "precip" :orientation orientation
(box :class "icon" "")
"${weather.current_condition[0].precipMM}"
)
(box :class "wind" :orientation orientation
(box :class "icon" "")
"${weather.current_condition[0].windspeedKmph}"
"${weather.current_condition[0].winddir16Point}"
)
(box :class "cloud" :orientation orientation
(box :class "icon" "")
"${weather.current_condition[0].cloudcover}"
)
))
(defpoll moon :initial "" :interval "180s"
"curl wttr.in/?format=%m")
(defpoll weather :initial "{\"current_condition\": [{\"cloudcover\": \"\"}]}" :interval "180s"
"curl wttr.in/?format=j1")
(defwidget widget_workspaces []
(box
:class "workspaces"
:orientation "v"
:space-evenly true
:valign "start" :spacing 10
:halign "center"
(for workspace in workspaces
(button
:class "${workspace.class}"
:onclick "scripts/workspace.sh ${workspace.id}"
"${workspace.text}"))
))
(deflisten workspaces :initial "[]"
"scripts/get-workspaces")
(defwidget widget_clock []
(box
:class "clock"
:orientation "v"
:valign "end"
:spacing 1
(box :class "icon" "")
"${clock.H}" "${clock.M}"
(box :class "icon" "")
"${clock.m}" "${clock.d}"
))
(defpoll clock :initial "{}" :interval "10s"
"date '+{\"H\":\"%H\", \"M\":\"%M\", \"d\":\"%d\", \"m\":\"%m\", \"b\":\"%b\", \"Y\":\"%Y\"}'")
; Calendar
(defwindow calendar
:geometry (geometry :x "70px"
:y "65%"
:width "270px"
:height "60px")
(cal))
(defwidget cal []
(box :class "cal"
:orientation "v"
(box :class "cal-inner-box"
(calendar :class "cal"
:day calendar_day
:month calendar_month
:year calendar_year))))
(defpoll calendar_day :interval "10h"
"date '+%d'")
(defpoll calendar_month :interval "10h"
"scripts/calendar")
(defpoll calendar_year :interval "10h"
"date '+%Y'")
; Unused widgets
(defwidget widget_status []
(box
:class "status"
:orientation "v"
:space-evenly false
:valign "end"
(metric :label ""
:value volume
:onchange "amixer -D pulse sset Master {}%")
(metric :label ""
:value {EWW_RAM.used_mem_perc}
:onchange "")
(widget_clock)))
(defwidget widget_media []
(box :class "media"
:orientation "v"
:space-evenly false
:valign "center"
{music_listener != "" ? "『${music_listener}』" : ""}
(box :class "music_status"
:orientation "h"
:space-evenly false
:halign "center"
{music_listener != "" ? "${music_status_listener}" : ""})
))
(deflisten music_listener :initial ""
"playerctl --follow metadata --format '{{ artist }} / {{album}} / {{ title }}' || true")
(deflisten music_status_listener :initial ""
"playerctl --follow metadata --format '{{duration(position)}}/{{duration(mpris:length)}}' || true")
(defwidget metric [label value onchange]
(box
:orientation "v"
:class "metric"
:space-evenly false
(box :class "label" label)
(circular-progress :value value)
;(scale
; :min 0 :max 101
; :active {onchange != ""}
; :orientation "v"
; :value value
; :onchange onchange)
))
(defpoll volume :initial 0 :interval "1s"
"scripts/get-volume.sh")

3
eww/bar/scripts/get-volume.sh Executable file
View File

@ -0,0 +1,3 @@
#!/bin/bash
amixer -D pulse sget Master | grep 'Left:' | awk -F'[][]' '{ print $2 }' | tr -d '%' | head -1

86
eww/bar/scripts/get-workspaces Executable file
View File

@ -0,0 +1,86 @@
#!/usr/bin/env python
"""
Utility to generate the workspace buttons for eww bar widget.
Currently it fetches information from monitor 0. If all monitors have
synchronised workspaces this should not be a problem.
"""
import os, sys, socket, json
WORKSPACE_ICONS = [
(1, '☱'),
(2, '☲'),
(3, '☳'),
(4, '☴'),
(5, '☵'),
(6, '☶'),
(7, '☷'),
(8, '☰'),
]
EXTRA_WORKSPACE_ICONS = [
(0, '⚌'),
(1, '⚍'),
(2, '⚎'),
(3, '⚏'),
]
def get_workspace_info():
workspaces = json.loads(os.popen('hyprctl workspaces -j').read())
monitors = json.loads(os.popen('hyprctl monitors -j').read())
if not monitors:
print("No monitor found!", file=sys.stderr)
return []
monitor, active = [(m['name'], m['activeWorkspace']['id'])
for m in monitors if m['id'] == 0][0]
workspaces = [(w['id'], w['id'] == active)
for w in workspaces
if w['monitor'] == monitor]
return workspaces
def get_widgets():
# get all workspace keys
workspaces = {k: v for k, v in get_workspace_info()}
def get_class(k):
key = workspaces.get(k, None)
if key is None:
return 'inactive'
elif key:
return 'focused'
else:
return 'active'
buttons = [
f'"id": "{k}", "text": "{icon}", "class": "{get_class(k)}"'
for k, icon in WORKSPACE_ICONS
]
buttons = ', '.join(['{' + b + '}' for b in buttons])
return '[' + buttons + ']'
def listen():
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
KEY = 'HYPRLAND_INSTANCE_SIGNATURE'
signature = os.environ.get(KEY, None)
if signature is None:
print("Hyprland variable uninitialised.", file=sys.stderr)
return
server_address = f"/tmp/hypr/{signature}/.socket2.sock"
try:
sock.connect(server_address)
except:
print(f"Could not connect to {server_address}", file=sys.stderr)
raise
# The flush here is very important since python by default buffers!
print(get_widgets(), flush=True)
while sock:
data = sock.recv(1024)
if b'workspace' in data:
print(get_widgets(), flush=True)
listen()

4
eww/bar/scripts/workspace.sh Executable file
View File

@ -0,0 +1,4 @@
#!/bin/bash
hyprctl dispatch workspace $1
~/.config/hypr/wallpaper.sh $1

1
hypr/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
wallpapers

18
hypr/fonts.py Normal file
View File

@ -0,0 +1,18 @@
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
class Example(Gtk.Window):
"""Using Pango to get system fonts names"""
def list_system_fonts(self):
"""Yield system fonts families names using Pango"""
context = self.create_pango_context()
for fam in context.list_families():
yield fam.get_name()
a = Example()
system_fonts = list(a.list_system_fonts())
print(system_fonts)

201
hypr/hyprland.conf Normal file
View File

@ -0,0 +1,201 @@
# Please note not all available settings / options are set here.
# For a full list, see the wiki
#
autogenerated = 0
# See https://wiki.hyprland.org/Configuring/Monitors/
monitor=,preferred,auto,auto
# See https://wiki.hyprland.org/Configuring/Keywords/ for more
# waybar is executed after eww to have the intersection effect at top left
exec-once = hyprpaper & swaync & fcitx5 & eww --config ~/.config/eww/bar open bar & waybar
# Source a file (multi-file configs)
# source = ~/.config/hypr/myColors.conf
# Some default env vars.
env = XCURSOR_SIZE,24
# For all categories, see https://wiki.hyprland.org/Configuring/Variables/
input {
kb_layout = us
kb_variant =
kb_model =
kb_options =
kb_rules =
follow_mouse = 1
touchpad {
natural_scroll = no
}
sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
}
general {
# See https://wiki.hyprland.org/Configuring/Variables/ for more
gaps_in = 5
gaps_out = 15
border_size = 2
col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg
col.inactive_border = rgba(595959aa)
layout = dwindle
}
decoration {
# See https://wiki.hyprland.org/Configuring/Variables/ for more
rounding = 10
blur = yes
blur_size = 3
blur_passes = 1
blur_new_optimizations = on
drop_shadow = yes
shadow_range = 4
shadow_render_power = 3
col.shadow = rgba(1a1a1aee)
active_opacity = 0.95
inactive_opacity = 0.7
}
animations {
enabled = yes
# Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
bezier = myBezier, 0.05, 0.9, 0.1, 1.05
animation = windows, 1, 7, myBezier
animation = windowsOut, 1, 7, default, popin 80%
animation = border, 1, 10, default
animation = borderangle, 1, 8, default
animation = fade, 1, 7, default
animation = workspaces, 1, 6, default, slidevert
}
dwindle {
# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
pseudotile = yes # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
preserve_split = yes # you probably want this
}
master {
# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
new_is_master = true
}
gestures {
# See https://wiki.hyprland.org/Configuring/Variables/ for more
workspace_swipe = off
}
input {
kb_layout = us
}
# Dropped in favour of fcitx5
#input {
# kb_layout = us,ca,jp
# kb_options = grp:toggle
#}
# Example windowrule v1
# windowrule = float, ^(kitty)$
# Example windowrule v2
# windowrulev2 = float,class:^(kitty)$,title:^(kitty)$
# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
$mainMod = SUPER
bind = $mainMod, Q, killactive,
bind = $mainMod, M, exit,
bind = $mainMod, V, togglefloating,
bind = $mainMod, B, pin,
bind = $mainMod, F, fullscreen
bind = $mainMod, P, pseudo,
bind = $mainMod, slash, togglesplit,
bind = $mainMod, G, togglegroup,
bind = $mainMod, comma, changegroupactive, b
bind = $mainMod, period, changegroupactive, f
bind = $mainMod, T, exec, alacritty
bind = $mainMod, L, exec, swaylock -C ~/.config/swaylock/config
bind = $mainMod, N, exec, swaync-client -t
bind = $mainMod, space, exec, wofi --show drun -I -G
# Dropped in favour of fcitx5
#bind = $mainMod, X, exec, hyprctl switchxkblayout wooting-wootingtwo next
# code:107 = PrintSc
bind = $mainMod, code:107, exec, grimblast copy screen
bind = $mainMod SHIFT, code:107, exec, grimblast copy area
# Move focus with mainMod + arrow keys
bind = $mainMod, left, movefocus, l
bind = $mainMod, right, movefocus, r
bind = $mainMod, up, movefocus, u
bind = $mainMod, down, movefocus, d
bind = $mainMod SHIFT, left, movewindow, l
bind = $mainMod SHIFT, right, movewindow, r
bind = $mainMod SHIFT, up, movewindow, u
bind = $mainMod SHIFT, down, movewindow, d
# Workspaces
$w1 = ~/.config/hypr/wallpaper.sh 1
$w2 = ~/.config/hypr/wallpaper.sh 2
$w3 = ~/.config/hypr/wallpaper.sh 3
$w4 = ~/.config/hypr/wallpaper.sh 4
$w5 = ~/.config/hypr/wallpaper.sh 5
$w6 = ~/.config/hypr/wallpaper.sh 6
$w7 = ~/.config/hypr/wallpaper.sh 7
$w8 = ~/.config/hypr/wallpaper.sh 8
# Switch workspaces with mainMod + [0-9]
bind = $mainMod, 1, workspace, 1
bind = $mainMod, 2, workspace, 2
bind = $mainMod, 3, workspace, 3
bind = $mainMod, 4, workspace, 4
bind = $mainMod, 5, workspace, 5
bind = $mainMod, 6, workspace, 6
bind = $mainMod, 7, workspace, 7
bind = $mainMod, 8, workspace, 8
bind = $mainMod, 1, exec, $w1
bind = $mainMod, 2, exec, $w2
bind = $mainMod, 3, exec, $w3
bind = $mainMod, 4, exec, $w4
bind = $mainMod, 5, exec, $w5
bind = $mainMod, 6, exec, $w6
bind = $mainMod, 7, exec, $w7
bind = $mainMod, 8, exec, $w8
# Move active window to a workspace with mainMod + SHIFT + [0-9]
bind = $mainMod SHIFT, 1, movetoworkspace, 1
bind = $mainMod SHIFT, 2, movetoworkspace, 2
bind = $mainMod SHIFT, 3, movetoworkspace, 3
bind = $mainMod SHIFT, 4, movetoworkspace, 4
bind = $mainMod SHIFT, 5, movetoworkspace, 5
bind = $mainMod SHIFT, 6, movetoworkspace, 6
bind = $mainMod SHIFT, 7, movetoworkspace, 7
bind = $mainMod SHIFT, 8, movetoworkspace, 8
bind = $mainMod SHIFT, 1, exec, $w1
bind = $mainMod SHIFT, 2, exec, $w2
bind = $mainMod SHIFT, 3, exec, $w3
bind = $mainMod SHIFT, 4, exec, $w4
bind = $mainMod SHIFT, 5, exec, $w5
bind = $mainMod SHIFT, 6, exec, $w6
bind = $mainMod SHIFT, 7, exec, $w7
bind = $mainMod SHIFT, 8, exec, $w8
# Scroll through existing workspaces with mainMod + scroll
bind = $mainMod, mouse_down, workspace, e+1
bind = $mainMod, mouse_up, workspace, e-1
# Move/resize windows with mainMod + LMB/RMB and dragging
bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow

10
hypr/hyprpaper.conf Normal file
View File

@ -0,0 +1,10 @@
preload = ~/.config/hypr/wallpapers/1.jpg
preload = ~/.config/hypr/wallpapers/2.jpg
preload = ~/.config/hypr/wallpapers/3.jpg
preload = ~/.config/hypr/wallpapers/4.jpg
preload = ~/.config/hypr/wallpapers/5.jpg
preload = ~/.config/hypr/wallpapers/6.jpg
preload = ~/.config/hypr/wallpapers/7.jpg
preload = ~/.config/hypr/wallpapers/8.jpg
wallpaper = DP-1,~/.config/hypr/wallpapers/1.jpg

3
hypr/wallpaper.sh Executable file
View File

@ -0,0 +1,3 @@
#!/bin/sh
hyprctl hyprpaper wallpaper "DP-1,~/.config/hypr/wallpapers/$1.jpg"

3
mpd/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
pid
state
sticker.sql

10
mpd/mpd.conf Normal file
View File

@ -0,0 +1,10 @@
music_directory "~/Music"
# refresh the database whenever files in the music_directory are changed
auto_update "yes"
playlist_directory "~/Music/playlists"
pid_file "~/.config/mpd/pid"
state_file "~/.config/mpd/state"
sticker_file "~/.config/mpd/sticker.sql"

1
rustfmt/rustfmt.toml Symbolic link
View File

@ -0,0 +1 @@
../../common/home/rustfmt.toml

27
swaylock/config Normal file
View File

@ -0,0 +1,27 @@
# Lock
ignore-empty-password
show-failed-attempts
grace=2
# Clock
clock
timestr=%H:%M:%S
datestr=%a, %d %b %Y
# Indicator
font=Noto Serif
indicator
indicator-idle-visible
indicator-caps-lock
indicator-thickness=20
indicator-radius=250
ring-color=caa9c7
text-color=a287d2
# Effects:
screenshots
effect-pixelate=32
effect-blur=10x2
effect-vignette=0.5:0.5
fade-in=0.3

177
waybar/config Normal file
View File

@ -0,0 +1,177 @@
{
"layer": "top",
"position": "top",
"height": 20,
"spacing": 4,
"margin": "0 15 0 5",
"modules-left": [
//"wlr/workspaces",
"hyprland/window"],
"modules-center": ["mpd"],
"modules-right": [
"tray",
"idle_inhibitor", "keyboard-state",
"pulseaudio", "bluetooth", "network", "cpu", "memory", "temperature", "battery"
//"clock"
],
"wlr/workspaces": {
"format": "{icon}", // {name}
"format-icons": {
"1": "☱",
"2": "☲",
"3": "☳",
"4": "☴",
"5": "☵",
"6": "☶",
"7": "☷",
"8": "☰",
"9": "⚏",
"10": "⚌",
"default": "⚍",
"focused": "☯"
},
"on-click": "activate",
"sort-by-number": true,
},
"hyprland/window": {
"format": "<span color=\"#DDDDDD\" font-size=\"150%\"></span> {}",
"separate-outputs": true
},
"keyboard-state": {
"numlock": true,
"capslock": true,
"format": "{name} {icon}",
"format-icons": {
"locked": "",
"unlocked": "",
//"unlocked": ""
}
},
"hyprland/language": {
"format": "{}",
"format-en": "🇺🇸",
"format-fr": "🇨🇦",
"format-ja": "🇯🇵",
"tooltip-format": "{}",
"tooltip": true
},
"mpd": {
"format": "『{artist} - {album} - {title} 』<span font-size=\"60%\" font-family=\"monospace\">{stateIcon} ({elapsedTime:%M:%S}/{totalTime:%M:%S}) ⸨{songPosition}|{queueLength}⸩ {consumeIcon}{randomIcon}{repeatIcon}{singleIcon}</span>",
"format-disconnected": "Disconnected",
"format-stopped": "『』",
"unknown-tag": "N/A",
"interval": 2,
"consume-icons": {
"on": " "
},
"random-icons": {
"on": " "
},
"repeat-icons": {
"on": " "
},
"single-icons": {
"on": "1 "
},
"state-icons": {
"paused": "",
"playing": ""
},
"tooltip-format": "MPD (connected)",
"tooltip-format-disconnected": "MPD (disconnected)"
},
"user": {
"format": "{user} <span font-family=\"monospace\">↑ {work_d} {work_H}:{work_M}</span>",
"interval": 60,
"height": 30,
"width": 30
},
"idle_inhibitor": {
"format": "{icon}",
"format-icons": {
"activated": "",
"deactivated": ""
}
},
"tray": {
"icon-size": 21,
"spacing": 10
},
"clock": {
"format": "{: %H:%M  %d/%m}",
"tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>",
"format-alt": "{:%a, %d %b %Y}"
},
"cpu": {
"align": 0,
"interval": 2,
"min-length": 6,
"format": " {usage}%",
"on-click": "alacritty -e btop",
"tooltip": true
},
"memory": {
"align": 0,
"interval": 2,
"min-length": 6,
"format": " {}%"
},
"temperature": {
"thermal-zone": 2,
"align": 0,
"interval": 2,
"hwmon-path": "/sys/class/hwmon/hwmon2/temp1_input",
"critical-threshold": 80,
"format-critical": "{icon} {temperatureC}°C",
"format": "{icon} {temperatureC}°C",
"format-icons": ["", "", ""]
},
"battery": {
"align": 0,
"format": "{icon}",
"tooltip": "{time} {power} {capacity}%",
"format-icons": ["", "", "", "", ""]
},
"network": {
"interval": 10,
"align": 0,
"min-width": 25,
"format-wifi": "{icon} {essid}",
"format-icons": ["", "", ""],
"format-ethernet": " {ipaddr}/{cidr}",
"format-linked": " {ifname} (No IP)",
"format-disconnected": "⚠ Disconnected",
"format-alt": "{bandwidthUpBytes} {bandwidthDownBytes}",
"tooltip-format": "<span font-family=\"monospace\">{ifname} via {gwaddr}: {ipaddr}/{cidr}</span>"
},
"bluetooth": {
"align": 0,
"format": " {status}",
"format-connected": " {device_alias}",
"format-connected-battery": " {device_alias} {device_battery_percentage}%",
"tooltip-format": "{controller_alias}\t{controller_address}\n\n{num_connections} connected",
"tooltip-format-connected": "{controller_alias}\t{controller_address}\n\n{num_connections} connected\n\n{device_enumerate}",
"tooltip-format-enumerate-connected": "{device_alias}\t{device_address}",
"tooltip-format-enumerate-connected-battery": "{device_alias}\t{device_address}\t{device_battery_percentage}%",
"on-click": "blueman-manager"
},
"pulseaudio": {
"scroll-step": 1,
"format": "{icon} {volume}% {format_source}",
"format-bluetooth": "{icon} {volume}% {format_source}",
"format-bluetooth-muted": "{icon}  {format_source}",
"format-muted": " {format_source}",
"format-source": " {volume}%",
"format-source-muted": "",
"format-icons": {
"headphone": "",
"hands-free": "",
"headset": "",
"phone": "",
"portable": "",
"car": "",
"default": ["", "", ""]
},
"on-click": "pavucontrol"
}
}

236
waybar/style.css Normal file
View File

@ -0,0 +1,236 @@
/*
* Author: L. Aniva
*
* The central theme of this config is the "stars on a nightsky" effect. Each
* module doesn't have a background (however dark) and floats on top of the
* dark-themed wallpaper like stars.
*
* The theme is tuned to 3840x2160 screen sizes with horizontal waybar. Some
* tuning of font sizes may be needed on smaller screens.
*
* Credit: Code Breaker for inspiring this colour palette
*/
@define-color window #eeeeee;
@define-color window_border rgba(80%, 80%, 80%, 0.7);
@define-color workspace #bbbbbb;
@define-color workspace_bg transparent;
@define-color workspace_active #eeeeee;
@define-color workspace_active_bg alpha(#64727D, 0.5);
@define-color mpd rgba(88%, 91%, 88%, 0.7);
@define-color tray_background rgba(80%, 80%, 80%, 0.1);
@define-color tray #c9cbff;
@define-color keyboard #f2cdcd;
@define-color language #e8a2af;
@define-color idle_inhibitor #f28fad;
@define-color audio #fae3b0;
@define-color backlight #f8bd96;
@define-color bluetooth #caa9c7;
@define-color network #bd93f9;
@define-color cpu #96cdfb;
@define-color memory #88bbeb;
@define-color temperature #ddb6f2;
@define-color temperature_critical #ff6666;
@define-color battery #b6b2b3;
@define-color clock #abe9b3;
@define-color user #89dceb;
window#waybar {
background: transparent;
}
/* Do not use * selector since it modifies the menus. */
#window, #workspaces {
font-family: monospace;
font-size: 20px;
min-height: 15px;
padding-left: 5px;
padding-right: 5px;
padding-top: 2px;
margin-top: 1px;
margin-bottom: 0px;
border: none;
background: transparent;
border-radius: 10;
}
#tray, #idle_inhibitor, #keyboard-state, #language, #user,
#backlight, #clock, #cpu, #bluetooth, #network, #memory, #pulseaudio, #temperature {
font-family: monospace;
font-size: 20px;
min-height: 15px;
padding-left: 5px;
padding-right: 5px;
padding-top: 2px;
margin-top: 1px;
margin-bottom: 0px;
border: none;
background: transparent;
border-radius: 0;
border-top: 2px solid;
}
/* Left */
widget #window {
font-family: "Noto Sans";
color: @window;
/* Three different styles */
border-top: none;
/*
border-top: 2px dotted @window_border;
border-radius: 0;
*/
/*
border-right: 2px solid @window_border;
border-radius: 30;
*/
/*
border-left: 2px solid @window_border;
border-right: 2px solid @window_border;
border-radius: 5;
*/
background: transparent;
padding-left: 5px;
padding-right: 15px;
}
#workspaces label {
font-family: monospace;
font-size: 30px;
min-width: 30px;
padding: 0 0 0 0;
/* Ensure the symbols are much bigger */
margin: -6 -6 -6 -6;
}
#workspaces button {
color: @workspace;
background: @workspace_bg;
margin: 0 0 0 0;
padding-top: 10px;
border-radius: 5;
}
#workspaces button.active {
color: @workspace_active;
background: @workspace_active_bg;
margin: 0 0 0 0;
padding-top: 10px;
border-radius: 5;
}
#workspaces button.hidden button.urgent {
color: #0000FF;
background: @workspace_active_bg;
margin: 0 0 0 0;
padding-top: 10px;
border-radius: 5;
}
/* Centre */
widget #mpd {
font-family: "Noto Serif";
padding-left: 5px;
padding-right: 5px;
color: @mpd;
border: none;
}
/* Right */
widget #tray {
/*
border-left: 2px solid @tray;
border-right: 2px solid @tray;
min-width: 5px;
border-radius: 20;*/
background: @tray_background;
padding-right: 10px;
color: @tray;
border-top: 2px dotted alpha(@tray, 0.5);
}
widget #idle_inhibitor.activated {
min-width: 25px;
color: @idle_inhibitor;
border-top-color: alpha(@idle_inhibitor, 0.5);
}
widget #idle_inhibitor.deactivated {
min-width: 25px;
color: alpha(@idle_inhibitor, 0.5);
border-top-color: alpha(@idle_inhibitor, 0.5);
}
widget #keyboard-state {
color: @keyboard;
border-top-color: alpha(@keyboard, 0.5);
}
/* Ensure toggling doesn't affect layout */
#keyboard-state label {
opacity: 0.5;
min-width: 80px;
}
#keyboard-state label.locked {
opacity: 1.0;
min-width: 80px;
}
widget #language {
color: @language;
border-top-color: alpha(@language, 0.5);
}
widget #pulseaudio {
color: @audio;
border-top-color: alpha(@audio, 0.5);
}
widget #backlight {
color: @backlight;
border-top-color: alpha(@backlight, 0.5);
}
widget #bluetooth {
color: @bluetooth;
border-top-color: alpha(@bluetooth, 0.5);
}
widget #bluetooth.on #bluetooth.connected #bluetooth.discoverable #bluetooth.discovering #bluetooth.pairable {
opacity: 1.0;
}
widget #bluetooth.off {
opacity: 0.5;
}
widget #bluetooth.disabled {
opacity: 0.5;
}
widget #network {
color: @network;
border-top-color: alpha(@network, 0.5);
}
widget #cpu {
color: @cpu;
border-top-color: alpha(@cpu, 0.5);
}
widget #memory {
color: @memory;
border-top-color: alpha(@memory, 0.5);
}
widget #temperature {
min-width: 60px;
color: @temperature;
border-top-color: alpha(@temperature, 0.5);
}
widget #temperature.critical {
min-width: 60px;
color: @temperature_critical;
border-top-color: alpha(@temperature, 0.5);
}
widget #battery {
color: @battery;
border-top-color: alpha(@battery, 0.5);
}
widget #clock {
color: @clock;
border-top-color: alpha(@clock, 0.5);
}
widget #user {
color: @user;
border-top-color: alpha(@user, 0.5);
font-family: "Noto Serif";
}

1
wofi/config Normal file
View File

@ -0,0 +1 @@
term=alacritty

56
wofi/style.css Normal file
View File

@ -0,0 +1,56 @@
window {
opacity: 1.0;
border: 2px solid #886688;
border-radius: 20px;
font-family: "Noto Sans";
font-size: 20px;
background-color: rgba(10%, 10%, 10%, 0.9);
}
#input {
/*
border-radius: 10px 10px 0px 0px;
border: 0px;*/
padding: 10px;
margin: 0px;
font-size: 25px;
color: #DDDDDD;
border: 2px solid #886688;
border-radius: 20px;
/*border-bottom: 2px solid white;*/
background-color: transparent;
background-color: #111111;
}
#inner-box {
margin: 0px;
color: #EBDBB2;
background-color: transparent;
}
#outer-box {
margin: 0px;
background-color: transprent;
border-radius: 10px;
}
#selected {
color: #FCECC3;
background-color: #876087;
}
#entry {
padding: 0px;
margin: 0px;
background-color: transparent;
}
#scroll {
margin: 5px;
background-color: transparent;
}
#text {
margin: 0px;
padding: 2px 2px 2px 10px;
}