diff options
-rwxr-xr-x | .emacs.d/exwm/EXWM.desktop | 8 | ||||
-rwxr-xr-x | .emacs.d/exwm/start-exwm.sh | 3 | ||||
-rw-r--r-- | .emacs.d/init.el | 1031 | ||||
-rwxr-xr-x | .emacs.d/snippets/anki-editor.el | 769 | ||||
-rwxr-xr-x | .emacs.d/snippets/workspaces.el | 42 | ||||
-rw-r--r-- | .shells/alias.sh | 36 | ||||
-rw-r--r-- | .shells/exports.sh | 18 | ||||
-rwxr-xr-x | .shells/prompt.sh | 14 | ||||
-rw-r--r-- | README.md | 66 | ||||
-rw-r--r-- | pkglist.txt | 139 |
10 files changed, 0 insertions, 2126 deletions
diff --git a/.emacs.d/exwm/EXWM.desktop b/.emacs.d/exwm/EXWM.desktop deleted file mode 100755 index 656e385..0000000 --- a/.emacs.d/exwm/EXWM.desktop +++ /dev/null @@ -1,8 +0,0 @@ -[Desktop Entry] -Name=EXWM -Comment=Emacs Window Manager -Exec=sh /home/apollo/.emacs.d/exwm/start-exwm.sh -TryExec=sh -Type=Application -X-LightDM-DesktopName=exwm -DesktopNames=exwm
\ No newline at end of file diff --git a/.emacs.d/exwm/start-exwm.sh b/.emacs.d/exwm/start-exwm.sh deleted file mode 100755 index a161a8a..0000000 --- a/.emacs.d/exwm/start-exwm.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -exec emacs -mm --debug-init diff --git a/.emacs.d/init.el b/.emacs.d/init.el deleted file mode 100644 index 01b2bcf..0000000 --- a/.emacs.d/init.el +++ /dev/null @@ -1,1031 +0,0 @@ -(defvar is-zeus (equal (system-name) "zeus")) -(defvar is-hermes (equal (system-name) "hermes")) - -(setq browse-url-browser-function 'browse-url-generic - browse-url-generic-program "mullvad-browser") - -(setq backup-directory-alist '((".*" . "~/.Trash"))) - -(defconst my-package-list '(org-snooze - all-the-icons - all-the-icons-dired - all-the-icons-ivy-rich - dap-mode - toc-org - emojify - general - doom-themes - gruvbox-theme - doom-modeline - counsel - which-key - ivy - ivy-rich - helpful - password-store - org - org-modern - visual-fill-column - rainbow-delimiters - flycheck - lsp-mode - lsp-ui - json-mode - rjsx-mode - typescript-mode - python-mode - pyvenv - company - company-box - magit - elfeed - elfeed-goodies - paredit - corfu - monkeytype - sudo-edit - exwm - exwm-mff - consult - alsamixer - simple-httpd - eshell-syntax-highlighting - org-superstar - mastodon - dashboard - org-auto-tangle - slime - slime-company)) - -(setq package-archives '(("melpa" . "https://melpa.org/packages/") - ("org" . "https://orgmode.org/elpa/") - ("elpa" . "https://elpa.gnu.org/packages/") - ("jcs-elpa" . "https://jcs-emacs.github.io/jcs-elpa/packages/"))) -(package-initialize) -(unless package-archive-contents - (package-refresh-contents)) - -(defvar my-missing-packages '() - "List populated at each startup. -Contains the list of packages that need to be installed.") - -(dolist (p my-package-list) - (when (not (package-installed-p p)) - (add-to-list 'my-missing-packages p))) - -(when my-missing-packages - (message "Emacs is now refreshing its package database...") - (package-refresh-contents) - ;; Install the missing packages - (dolist (p my-missing-packages) - (message "Installing `%s' .." p) - (package-install p)) - (setq my-missing-packages '())) - -(unless (package-installed-p 'use-package) - (package-install 'use-package)) - -;; set and load custom.el -(setq custom-file (concat user-emacs-directory "custom.el")) -(load custom-file 'noerror) - -(setq inhibit-startup-message nil) -;; Transparency -(set-frame-parameter (selected-frame) 'alpha '(90 95)) -(add-to-list 'default-frame-alist '(alpha 90 90)) - -(add-hook 'dired-mode-hook 'all-the-icons-dired-mode) - - -(if is-zeus - (display-battery-mode 0) - (display-battery-mode 1)) - -(scroll-bar-mode -1) -(tool-bar-mode -1) -(tooltip-mode -1) -(set-fringe-mode 10) -(menu-bar-mode -1) -(which-key-mode 1) -(blink-cursor-mode -1) -(menu-bar--visual-line-mode-enable) -(global-visual-line-mode 1) - -(require 'emojify) -(global-emojify-mode 1) - -(setq visible-bell t) - - -(column-number-mode) -(global-display-line-numbers-mode 0) -(menu-bar--display-line-numbers-mode-relative) -;;Disable line numbers for some modes -(dolist (mode '(pdf-view-mode-hook - org-mode-hook - term-mode-hook - shell-mode-hook - eshell-mode-hook - vterm-mode-hook - elfeed)) - (add-hook mode (lambda () (display-line-numbers-mode 0)))) - -(defvar apollo/default-font-size 140) -(when is-hermes - (setq apollo/default-font-size 120)) - -(set-face-attribute 'default nil - :font "JetBrains Mono" - :height apollo/default-font-size) - -(set-face-attribute 'fixed-pitch nil - :font "JetBrains Mono" - :height apollo/default-font-size) - -(set-face-attribute 'variable-pitch nil - :font "JetBrains Mono" - :height apollo/default-font-size - :weight 'regular) - -(require 'dashboard) -(require 'all-the-icons) - -(dashboard-setup-startup-hook) -(setq dashboard-items '((recents . 5) - (bookmarks . 5))) - -(setq initial-buffer-choice (lambda () (get-buffer-create "*dashboard*")) - dashboard-item-names '(("Recent Files:" . "Recent Files:") - ("Bookmarks:" . "Study:"))) -;; Set the banner -(setq dashboard-startup-banner "~/dotfiles/pictures/medicine/plague-doctor-s.png") -;; Set the title -(setq dashboard-banner-logo-title "Is that a flying flower?") -;; (setq dashboard-init-info "Bring me your sick and wounded!") - -(setq dashboard-set-init-info t - dashboard-center-content t - dashboard-set-navigator t - dashboard-set-heading-icons t - dashboard-set-file-icons t - dashboard-show-shortcuts nil - dashboard-set-footer t - dashboard-footer-messages '("Welcome to the Church Of Emacs") - dashboard-footer-icon (all-the-icons-octicon "broadcast" - :height 1.15 - :v-adjust -0.05 - :face 'font-lock-keyword-face)) - -(load-theme 'doom-ayu-dark t) -(doom-modeline-mode 1) - -(setq doom-modeline-height 35) - -(use-package ivy - :diminish - :bind (("C-s" . swiper) - :map ivy-minibuffer-map - ("TAB" . ivy-alt-done) - ("C-l" . ivy-alt-done) - ("C-j" . ivy-next-line) - ("C-k" . ivy-previous-line) - :map ivy-switch-buffer-map - ("C-k" . ivy-previous-line) - ("C-l" . ivy-done) - ("C-d" . ivy-switch-buffer-kill) - :map ivy-reverse-i-search-map - ("C-k" . ivy-previous-line) - ("C-d" . ivy-reverse-i-search-kill)) - :config - (ivy-mode 1) - (setq ivy-use-selectable-prompt t)) - -(ivy-rich-mode 1) -(all-the-icons-ivy-rich-mode 1) - -(use-package helpful - :custom - (counsel-describe-function-function #'helpful-callable) - (counsel-describe-variable-function #'helpful-variable) - :bind - ([remap describe-function] . counsel-describe-function) - ([remap describe-command] . helpful-command) - ([remap describe-variable] . counsel-describe-variable) - ([remap describe-key] . helpful-key)) - -;;; all-the-icons-dired.el --- Shows icons for each file in dired mode -*- lexical-binding: t; -*- - -;;; Code: - -(require 'cl-lib) -(require 'dired) -(require 'all-the-icons) - -(defface all-the-icons-dired-dir-face - '((((background dark)) :foreground "white") - (((background light)) :foreground "black")) - "Face for the directory icon" - :group 'all-the-icons-faces) - -(defcustom all-the-icons-dired-v-adjust 0.01 - "The default vertical adjustment of the icon in the dired buffer." - :group 'all-the-icons - :type 'number) - -(defvar all-the-icons-dired-mode) - -(defun all-the-icons-dired--add-overlay (pos string) - "Add overlay to display STRING at POS." - (let ((ov (make-overlay (1- pos) pos))) - (overlay-put ov 'all-the-icons-dired-overlay t) - (overlay-put ov 'after-string string))) - -(defun all-the-icons-dired--overlays-in (beg end) - "Get all all-the-icons-dired overlays between BEG to END." - (cl-remove-if-not - (lambda (ov) - (overlay-get ov 'all-the-icons-dired-overlay)) - (overlays-in beg end))) - -(defun all-the-icons-dired--overlays-at (pos) - "Get all-the-icons-dired overlays at POS." - (apply #'all-the-icons-dired--overlays-in `(,pos ,pos))) - -(defun all-the-icons-dired--remove-all-overlays () - "Remove all `all-the-icons-dired' overlays." - (save-restriction - (widen) - (mapc #'delete-overlay - (all-the-icons-dired--overlays-in (point-min) (point-max))))) - -(defun all-the-icons-dired--refresh () - "Display the icons of files in a dired buffer." - (all-the-icons-dired--remove-all-overlays) - (save-excursion - (goto-char (point-min)) - (while (not (eobp)) - (when (dired-move-to-filename nil) - (let ((file (dired-get-filename 'relative 'noerror))) - (when file - (let ((icon (if (file-directory-p file) - (all-the-icons-icon-for-dir file - :face 'all-the-icons-dired-dir-face - :v-adjust all-the-icons-dired-v-adjust) - (all-the-icons-icon-for-file file :v-adjust all-the-icons-dired-v-adjust)))) - (if (member file '("." "..")) - (all-the-icons-dired--add-overlay (point) " \t") - (all-the-icons-dired--add-overlay (point) (concat icon "\t"))))))) - (forward-line 1)))) - -(defun all-the-icons-dired--refresh-advice (fn &rest args) - "Advice function for FN with ARGS." - (apply fn args) - (when all-the-icons-dired-mode - (all-the-icons-dired--refresh))) - -(defun all-the-icons-dired--setup () - "Setup `all-the-icons-dired'." - (when (derived-mode-p 'dired-mode) - (setq-local tab-width 1) - (advice-add 'dired-readin :around #'all-the-icons-dired--refresh-advice) - (advice-add 'dired-revert :around #'all-the-icons-dired--refresh-advice) - (advice-add 'dired-internal-do-deletions :around #'all-the-icons-dired--refresh-advice) - (advice-add 'dired-insert-subdir :around #'all-the-icons-dired--refresh-advice) - (advice-add 'dired-do-kill-lines :around #'all-the-icons-dired--refresh-advice) - (with-eval-after-load 'dired-narrow - (advice-add 'dired-narrow--internal :around #'all-the-icons-dired--refresh-advice)) - (all-the-icons-dired--refresh))) - -(defun all-the-icons-dired--teardown () - "Functions used as advice when redisplaying buffer." - (advice-remove 'dired-readin #'all-the-icons-dired--refresh-advice) - (advice-remove 'dired-revert #'all-the-icons-dired--refresh-advice) - (advice-remove 'dired-internal-do-deletions #'all-the-icons-dired--refresh-advice) - (advice-remove 'dired-narrow--internal #'all-the-icons-dired--refresh-advice) - (advice-remove 'dired-insert-subdir #'all-the-icons-dired--refresh-advice) - (advice-remove 'dired-do-kill-lines #'all-the-icons-dired--refresh-advice) - (all-the-icons-dired--remove-all-overlays)) - -;;;###autoload -(define-minor-mode all-the-icons-dired-mode - "Display all-the-icons icon for each files in a dired buffer." - :lighter " all-the-icons-dired-mode" - (when (and (derived-mode-p 'dired-mode) (display-graphic-p)) - (if all-the-icons-dired-mode - (all-the-icons-dired--setup) - (all-the-icons-dired--teardown)))) - -(add-hook 'dired-mode-hook 'all-the-icons-dired-mode) - -(use-package vterm - :ensure nil) - -(use-package multi-vterm - :ensure nil - :config - (setq multi-vterm-dedicated-window-height 25)) - -(use-package eshell - :ensure nil - :bind (("C-c e" . 'eshell)) - :config - (defvar eshell-path-env (getenv "~/.local/bin"))) - -(defun with-face (str &rest face-plist) - (propertize str 'face face-plist)) - -(defun apollo-eshell-prompt () - (let ((winter-blue "#3F3B6C") - (white-summer "#E5E5CB") - (green-night "#03C988") - (orange-summer "#FFB100") - (green-summer "#A3BB98") - (summer-sea "#2192FF") - (black "#000000")) - (concat - (with-face (concat "[" user-login-name) :foreground orange-summer :background black) - (with-face "@" :foreground orange-summer :background black) - (with-face (concat system-name "]\n") :foreground orange-summer :background black) - (with-face (concat "|" (eshell/pwd) ) :foreground "#F0E9D2" :background winter-blue) - (with-face (format-time-string " | %H:%M" (current-time)) :background winter-blue :foreground "#888") - (with-face "\n -> ")))) - -;; (setq eshell-prompt-function 'apollo-eshell-prompt) -;; (setq eshell-highlight-prompt t) - -(add-hook 'org-mode-hook 'org-make-toc-mode) - -(defun apollo/org-theme-dracula () - "Enable Dracula theme for Org headers." - (interactive) - (dolist - (face - '((org-level-1 1.7 "#8be9fd" extra-bold) - (org-level-2 1.6 "#bd93f9" extra-bold) - (org-level-3 1.5 "#50fa7b" bold) - (org-level-4 1.4 "#ff79c6" semi-bold) - (org-level-5 1.3 "#9aedfe" normal) - (org-level-6 1.2 "#caa9fa" normal) - (org-level-7 1.1 "#5af78e" normal) - (org-level-8 1.0 "#ff92d0" normal))) - (set-face-attribute (nth 0 face) nil - :font "JetBrains Mono" - :weight (nth 3 face) - :height (nth 1 face) - :foreground (nth 2 face))) - (set-face-attribute 'org-table nil - :font "JetBrains Mono" - :weight 'normal - :height 1.0 - :foreground "#bfafdf")) - -(defun apollo/org-theme-darkone () - "Enable Darkone theme for Org headers." - (interactive) - (dolist - (face - '((org-level-1 1.70 "#51afef" bold) - (org-level-2 1.55 "#7FBCD2" bold) - (org-level-3 1.40 "#da8548" bold) - (org-level-4 1.20 "#da8548" semi-bold) - (org-level-5 1.20 "#5699af" normal) - (org-level-6 1.20 "#a9a1e1" normal) - (org-level-7 1.10 "#46d9ff" normal) - (org-level-8 1.00 "#ff6c6b" normal))) - (set-face-attribute (nth 0 face) nil - :font "Jetbrains Mono" - :weight (nth 3 face) - :height (nth 1 face) - :foreground (nth 2 face))) - (set-face-attribute 'org-table nil - :font "Jetbrains Mono" - :weight 'normal - :height 1.0 - :foreground "#A66CFF")) - -(defun apollo/org-theme-gruvbox () - "Enable Darkone theme for Org headers." - (interactive) - (dolist - (face - '((org-level-1 1.70 "#fb4934" bold) - (org-level-2 1.55 "#98971a" bold) - (org-level-3 1.40 "#458588" bold) - (org-level-4 1.20 "#b16286" semi-bold) - (org-level-5 1.20 "#689d6a" normal) - (org-level-6 1.20 "#d3869b" normal) - (org-level-7 1.10 "#8ec07c" normal) - (org-level-8 1.00 "#ebdbb2" normal))) - (set-face-attribute (nth 0 face) nil - :font "Jetbrains Mono" - :weight (nth 3 face) - :height (nth 1 face) - :foreground (nth 2 face))) - (set-face-attribute 'org-table nil - :font "Jetbrains Mono" - :weight 'normal - :height 1.0 - :foreground "#A66CFF")) - -(modify-all-frames-parameters - '((right-divider-width . 5) - (internal-border-width . 5))) -(dolist (face '(window-divider - window-divider-first-pixel - window-divider-last-pixel)) - (face-spec-reset-face face) - (set-face-foreground face (face-attribute 'default :background))) -(set-face-background 'fringe (face-attribute 'default :background)) - -(setq - ;; Edit settings - org-auto-align-tags nil - org-tags-column 0 - org-catch-invisible-edits 'show-and-error - org-special-ctrl-a/e t - org-insert-heading-respect-content t - - ;; Org styling, hide markup etc. - org-hide-emphasis-markers t - org-pretty-entities t - - ;; Agenda styling - org-agenda-tags-column 0 - org-agenda-block-separator ?─ - org-agenda-time-grid - '((daily today require-timed) - (800 1000 1200 1400 1600 1800 2000) - " ┄┄┄┄┄ " "┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄") - org-agenda-current-time-string - "⭠ now ─────────────────────────────────────────────────") - -(global-org-modern-mode) - -(require 'ox-md nil t) - -(setq org-directory "~/org/" - org-agenda-files '("~/org/agenda.org") - org-default-notes-file (expand-file-name "notes.org" org-directory) - org-ellipsis " ▼ " - org-log-done 'time - org-hide-emphasis-markers nil ;;change to t to hide emphasis markers - org-table-convert-region-max-lines 20000 - org-agenda-start-log-mode t - org-log-done 'time - org-log-into-drawer t - org-indent-mode t - org-todo-keywords ;; This overwrites the default Doom org-todo-keywords - '((sequence - "TODO(t)" ;; A task that is ready to be tackled - "BLOG(b)" ;; Blog writing assignments - "GYM(g)" ;; Things to accomplish at the gym - "WAIT(w)" ;; Something is holding up this task - "|" ;; The pipe necessary to separate "active" states and "inactive" states - "DONE(d)" ;; Task has been completed - "CANCELLED(c)" )) - org-superstar-headline-bullets-list '("◉" "●" "○" "●" "○" "●" "◆") - org-superstar-itembullet-alist '((?+ . ?➤) (?- . ?✦))) ;; changes +/- symbols in item lists) - -;; Hooks -(add-hook 'org-mode-hook 'apollo/org-theme-gruvbox) -(add-hook 'org-mode-hook 'flyspell-mode) -(add-hook 'org-mode-hook 'toc-org-mode) - -(defadvice org-edit-src-code (around set-buffer-file-name activate compile) - (let ((file-name (buffer-file-name))) ;; (1) - ad-do-it ;; (2) - (setq buffer-file-name file-name))) ;; (3) - -(org-babel-do-load-languages - 'org-babel-load-languages - '((emacs-lisp . t) - (python . t))) - -(add-to-list 'org-structure-template-alist '("ex" . "SRC EXAMPLE")) -(add-to-list 'org-structure-template-alist '("b" . "src bash")) -(add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp")) -(add-to-list 'org-structure-template-alist '("py" . "src python")) -(add-to-list 'org-structure-template-alist '("li" . "src lisp")) - -;;Auto tangle -(add-hook 'org-mode-hook 'org-auto-tangle-mode) - -(defun apollo/markdown-theme () - (interactive) - (dolist - (face - '(markdown-header-face-1 :height 2.0)))) - -(setq markdown-header-scaling t) - - -(use-package markdown-mode - :ensure t - :mode (".md" . gfm-mode) - :init (setq markdown-command "multimarkdown")) - -(electric-pair-mode 1) -(global-flycheck-mode) - -(use-package company - :after lsp-mode - :hook (lsp-mode . company-mode) - :bind (:map company-active-map - ("<tab>" . company-complete-selection)) - (:map lsp-mode-map - ("<tab>" . company-indent-or-complete-common)) - :custom - (company-minimum-prefix-length 1) - (company-idle-delay 0.0)) - -(use-package dap-mode - :custom - (lsp-enable-dap-auto-configure nil) - :config - (dap-ui-mode 1)) - -(use-package company-box - :hook (company-mode . company-box-mode)) - -(use-package magit - :custom - (magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1)) - -(setq tab-always-indent 'complete) -(add-to-list 'completion-styles 'initials t) - -(add-hook 'emacs-lisp-mode-hook #'rainbow-delimiters-mode) -(add-hook 'emacs-lisp-mode-hook #'company-mode) - -(setq inferior-lisp-program "sbcl") -(slime-setup '(slime-fancy slime-company)) - -(add-hook 'lisp-mode-hook #'rainbow-delimiters-mode) -(add-hook 'lisp-mode-hook #'company-mode) - -(defun apollo/lsp-mode-setup () - (setq lsp-headerline-breadcrumb-segments '(path-up-to-project file symbols)) - (lsp-headerline-breadcrumb-mode)) - -(use-package lsp-mode - :commands (lsp lsp-deferred) - :hook (lsp-mode . apollo/lsp-mode-setup) - :init - (setq lsp-keymap-prefix "C-c l") ;; Or 'C-l', 's-l' - :config - (lsp-enable-which-key-integration t) - (setq lsp-pyls-server-command "~/.local/bin/pylsp")) - -(use-package lsp-ui - :hook (lsp-mode . lsp-ui-mode) - :custom - (lsp-ui-doc-position 'bottom)) - -(use-package python-mode - :ensure t - :mode ".py" - :hook (python-mode . lsp-deferred) - :custom - (dap-python-debugger 'debugpy) - :config - (require 'dap-python)) - -(use-package pyvenv - :config - (pyvenv-mode 1)) - -(use-package json-mode - :mode ".json" - :hook (json-mode . lsp-deferred)) - -(use-package rjsx-mode - :mode ".js" - :hook (rjsx-mode . lsp-deferred) - :config - (defadvice js-jsx-indent-line (after js-jsx-indent-line-after-hack activate) - "Workaround sgml-mode and follow airbnb component style." - (save-excursion - (beginning-of-line) - (if (looking-at-p "^ +\/?> *$") - (delete-char sgml-basic-offset))))) - -(require 'elfeed) -(require 'elfeed-goodies) -(setq elfeed-feeds (quote - ( - ("https://hackaday.com/blog/feed/" - hackaday linux) - ("https://thanosapollo.com/public/feed.xml" - me) - ("https://protesilaos.com/news.xml" - protesilaos) - ("https://protesilaos.com/codelog.xml" - proetesilaos) - ("https://guix.gnu.org/feeds/blog.atom" - gnu guix) - ("https://thanosapollo.com/posts/index.xml" - thanos me) - ("https://rss.nytimes.com/services/xml/rss/nyt/Science.xml" - NYT science news) - ("https://rss.nytimes.com/services/xml/rss/nyt/Health.xml" - NYT med news) - ("https://rss.nytimes.com/services/xml/rss/nyt/World.xml" - NYT world news) - ("https://thanosapollo.com/posts/index.xml" - thanos) - ("http://nullprogram.com/feed/" - emacs linux) - ("https://drewdevault.com/blog/index.xml" - sourcehut drewdevault) - ("https://spacepub.space/feeds/videos.xml?videoChannelId=2" - drewdevault youtube) - ("https://www.youtube.com/feeds/videos.xml?channel_id=UCVls1GmFKf6WlTraIb_IaJg" - video dt) - ("https://www.youtube.com/feeds/videos.xml?channel_id=UC7YOGHUfC1Tb6E4pudI9STA" - video mental) - ("https://www.youtube.com/feeds/videos.xml?channel_id=UCAiiOTio8Yu69c3XnR7nQBQ" - video daviwil) - ("https://videos.lukesmith.xyz/feeds/videos.atom?sort=-publishedAt&isLocal=true" - video luke) - ("https://www.youtube.com/feeds/videos.xml?channel_id=UCrc2iv2-G1FZ3VscM3zu2jg" - video zoogirl) - ("https://www.youtube.com/feeds/videos.xml?channel_id=UC0uTPqBCFIpZxlz_Lv1tk_g" - video prot) - ("https://www.youtube.com/feeds/videos.xml?channel_id=UCq6VFHwMzcMXbuKyG7SQYIg" - video moist) - ("https://www.youtube.com/feeds/videos.xml?channel_id=UC05XpvbHZUQOfA6xk4dlmcw" - video djware) - ("https://archlinux.org/feeds/news/" - ArchLinux Latest)))) - -(defun elfeed-v-mpv (url) - "Watch a video from URL in MPV" - (async-shell-command (format "mpv \"%s\"" url))) - -(defun elfeed-view-mpv (&optional use-generic-p) - "Youtube-feed link" - (interactive "P") - (let ((entries (elfeed-search-selected))) - (cl-loop for entry in entries - do (elfeed-untag entry 'unread) - when (elfeed-entry-link entry) - do (elfeed-v-mpv it)) - (mapc #'elfeed-search-update-entry entries) - (unless (use-region-p) (forward-line)))) - -(define-key elfeed-search-mode-map (kbd "v") 'elfeed-view-mpv) -(define-key elfeed-search-mode-map (kbd "U") 'elfeed-update) - -(setq elfeed-goodies/entry-pane-size 0.65) -(elfeed-goodies/setup) - -;;Add pdf-isearch-minor-mode hook, otherwise isearch will be buggy -;;Darkmode hook, cause I don't want color or light in my life, I'm a vampire. -(add-hook 'pdf-view-mode-hook 'pdf-isearch-minor-mode) -(add-hook 'pdf-view-mode-hook 'pdf-view-midnight-minor-mode) -(add-to-list 'auto-mode-alist '("\\.pdf\\'" . pdf-view-mode)) - -;; Check if we have mu4e available -;; if t load mu4e settings -(when (require 'mu4e nil 'noerror) - (setq mu4e-update-interval (* 10 60)) - (setq mu4e-get-mail-command "mbsync -a") - (setq mu4e-maildir-list "~/Mail/Inbox") - - (defun set-mu4e-context (context-name full-name mail-address signature server) - "Return a mu4e context named CONTEXT-NAME with :match-func matching - folder name CONTEXT-NAME in Maildir. The context's `user-mail-address', - `user-full-name' and `mu4e-compose-signature'`smtpmail-smpt-server' is set to MAIL-ADDRESS - FULL-NAME SIGNATURE and SERVER respectively. - Special folders are set to context specific folders." - (let ((dir-name (concat "/" context-name))) - (make-mu4e-context - :name context-name - ;; we match based on the maildir of the message - :match-func - `(lambda (msg) - (when msg - (string-match-p - ,(concat "^" dir-name) - (mu4e-message-field msg :maildir)))) - :vars - `((user-mail-address . ,mail-address) - (user-full-name . ,full-name) - (mu4e-sent-folder . ,(concat dir-name "/Sent")) - (mu4e-drafts-folder . ,(concat dir-name "/Drafts")) - (mu4e-trash-folder . ,(concat dir-name "/Trash")) - (mu4e-trash-folder . ,(concat dir-name "/Starred")) - (mu4e-refile-folder . ,(concat dir-name "/Archive")) - (smtpmail-smtp-service . ,465) - (smtpmail-smtp-server . ,server) - (mu4e-compose-signature . ,signature))))) - ;;Fixing duplicate UID errors when using mbsync and mu4e - (setq mu4e-change-filenames-when-moving t) - - (setq mu4e-maildir-shortcuts - '(("/Fastmail/Inbox" . ?i) - ("/Fastmail/Sent" . ?s) - )) - - (setq mu4e-contexts - `(, (set-mu4e-context - "Fastmail" "Thanos Apollo" - "[email protected]" "Thanos\nhttps://thanosapollo.com" - "smtp.fastmail.com"))) - - ;; (setq smtpmail-smtp-service 465 - ;; smtpmail-stream-type 'ssl - ;; smtpmail-smtp-server "smtp.fastmail.com") - - - - (setq message-send-mail-function 'smtpmail-send-it - smtpmail-stream-type 'ssl)) - -(setq mu4e-view-actions - (delete-dups - (append - '(("gapply git patches" . mu4e-action-git-apply-patch) - ("mgit am patch" . mu4e-action-git-apply-mbox) - ("bb4 am patch" . mu4e-action-git-apply-b4) - ("ssetup reword list with b4" . mu4e-action-setup-reword-b4) - ("crun checkpatch script" . my-mu4e-action-run-check-patch) - ("MCheck if merged" . my-mu4e-action-check-if-merged))))) - -;;;; sudo completion -(defun pcomplete/sudo () - "Completion rules for the `sudo' command." - (let ((pcomplete-ignore-case t)) - (pcomplete-here (funcall pcomplete-command-completion-function)) - (while (pcomplete-here (pcomplete-entries))))) - -;;;; systemctl completion -(defcustom pcomplete-systemctl-commands - '("disable" "enable" "status" "start" "restart" "stop" "reenable" - "list-units" "list-unit-files") - "p-completion candidates for `systemctl' main commands" - :type '(repeat (string :tag "systemctl command")) - :group 'pcomplete) - -(defvar pcomplete-systemd-units - (split-string - (shell-command-to-string - "(systemctl list-units --all --full --no-legend;systemctl list-unit-files --full --no-legend)|while read -r a b; do echo \" $a\";done;")) - "p-completion candidates for all `systemd' units") - -(defvar pcomplete-systemd-user-units - (split-string - (shell-command-to-string - "(systemctl list-units --user --all --full --no-legend;systemctl list-unit-files --user --full --no-legend)|while read -r a b;do echo \" $a\";done;")) - "p-completion candidates for all `systemd' user units") - -(defun pcomplete/systemctl () - "Completion rules for the `systemctl' command." - (pcomplete-here (append pcomplete-systemctl-commands '("--user"))) - (cond ((pcomplete-test "--user") - (pcomplete-here pcomplete-systemctl-commands) - (pcomplete-here pcomplete-systemd-user-units)) - (t (pcomplete-here pcomplete-systemd-units)))) - -;;;; man completion -(defvar pcomplete-man-user-commands - (split-string - (shell-command-to-string - "apropos -s 1 .|while read -r a b; do echo \" $a\";done;")) - "p-completion candidates for `man' command") - -(defun pcomplete/man () - "Completion rules for the `man' command." - (pcomplete-here pcomplete-man-user-commands)) - -;; hut completion -(defcustom pcomplete-hut-commands - '("builds" "export" "git" "graphql" "lists" "help" "hg" - "init" "meta" "pages" "paste" "todo") - "p-completion candidates for `hut' main commands" - :type '(repeat (string :tag "hut command")) - :group 'pcomplete) - -(defun pcomplete/hut () - "Completion rules for `hut' command" - (pcomplete-here (append pcomplete-hut-commands))) - -(defun apollo/html-boostrap-boilerplate () - "Insert html boilerplate with boostrap link." - (interactive) - (insert -"<!DOCTYPE html> -<html lang=\"en\"> - <head> - <meta charset=\"UTF-8\"> - <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"> - <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\"> - <title>My Title</title> - <link rel=\"stylesheet\" href=\"./style.css\"> - <link href=\"https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css\" rel=\"stylesheet\" integrity=\"sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi\" crossorigin=\"anonymous\"> - p </head> - <body> - <main> - <h1>Starting point</h1> - </main> - <script src=\"index.js\"></script> - </body> -</html>" )) - - -(defun apollo/center-buffer () - "Centers/Uncenters selected buffer" - (interactive) - (if visual-fill-column-center-text - (setq visual-fill-column-center-text nil) - (setq visual-fill-column-center-text t)) - (visual-fill-column-mode 1) - (message "General's task completed!")) - - -(defun apollo/rofi-switch-window () - "Navigate X11 buffers using rofi." - (interactive) - (start-process-shell-command - "rofi" nil "rofi -show window")) - -(defun apollo/run-in-background (command) - "Run COMMAND in the background." - (let ((command-parts (split-string command "[ ]+"))) - (apply #'call-process `(,(car command-parts) nil 0 nil ,@(cdr command-parts))))) - -(defun rofi () - "Run Rofi." - (interactive) - (apollo/run-in-background "rofi -show drun")) - -(defun apollo/volume-increase () - "Increase Volume." - (interactive) - (start-process-shell-command - "amixer" nil "amixer sset Master 5%+")) - -(defun apollo/volume-decrease () - "Decrease Volume." - (interactive) - (start-process-shell-command - "amixer" nil "amixer sset Master 5%-")) - -(defun apollo/restore-wallpaper () - "Set NAME as wallpaper." - (interactive) - (start-process-shell-command - "feh" nil "feh --bg-scale ~/dotfiles/wallpaper.png")) - -(defun apollo/emacs-keys () - "Swap caps with ctrl." - (interactive) - (start-process-shell-command - "setxkbmap" nil "setxkbmap us -option ctrl:swapcaps")) - -(defun apollo/greek-keyboard () - "Swap caps with ctrl." - (interactive) - (start-process-shell-command - "setxkbmap" nil "setxkbmap gr")) - -(defun apollo/exwm-update-class () - (exwm-workspace-rename-buffer exwm-class-name)) - -(defun eshell-new() - "Open a new instance of eshell." - (interactive) - (eshell 'N)) - -(defun make-mini-geiser () - (interactive) - (split-window-below 60) - (geiser nil)) - -(defun start-polybar () - "Check which system is running, start polybar accordingly." - (interactive) - (if (string= (system-name) "fsociety") - (start-process-shell-command - "polybar" nil "polybar main & polybar second") - (start-process-shell-command - "polybar" nil "polybar main"))) - -(defun create-keimenografos () - "create a scratch buffer" - (interactive) - (switch-to-buffer (get-buffer-create "*Keimenografos*")) - (text-mode)) - -(defun create-scratch () - (interactive) - (switch-to-buffer (get-buffer-create "*scratch*")) - (emacs-lisp-mode)) - -(defun get-mail-pass () - (interactive) - ;; Get fastmail API Key - (insert - (password-store-get-field "fastmail.com/thanosapollo.com" "API"))) - -(global-set-key (kbd "C-c p m") 'get-mail-pass) - -;; - -(define-key dired-mode-map "b" 'dired-up-directory) - -(global-set-key (kbd "<escape>") 'keyboard-escape-quit) - -(global-set-key (kbd "C-c c") 'copy-region-as-kill) - -;; Pass -(global-set-key (kbd "C-c p i") 'password-store-insert) -(global-set-key (kbd "C-c p e") 'password-store-edit) -(global-set-key (kbd "C-c p g") 'password-store-generate) - - -(define-prefix-command 'thanos/applications-map) -(define-key thanos/applications-map (kbd "q") 'chatgpt-query) -(define-key thanos/applications-map (kbd "m") 'mu4e) -(define-key thanos/applications-map (kbd "t") 'counsel-load-theme) -(define-key thanos/applications-map (kbd "f") 'elfeed) -(global-set-key (kbd "C-c a") 'thanos/applications-map) - -(define-prefix-command 'Morfi) -(define-key thanos/applications-map (kbd "c") 'Morfi) -(define-key Morfi (kbd "t") 'create-keimenografos) - - -(defvar thanos/vterm-map (make-sparse-keymap)) -(define-prefix-command 'thanos/vterm-map) -(define-key global-map (kbd "C-c v") 'thanos/vterm-map) -(define-key thanos/vterm-map (kbd "n") 'multi-vterm-next) -(define-key thanos/vterm-map (kbd "p") 'multi-vterm-prev) -(define-key thanos/vterm-map (kbd "d") 'multi-vterm-dedicated-open) -(define-key thanos/vterm-map (kbd "o") 'multi-vterm) - -;; my general's leader key! -(defconst general-key "C-c g") - -(general-create-definer general-does - :prefix general-key) - -;; Basic functions -(general-define-key - "C-d" 'kill-region - "C-k" 'copy-region-as-kill - "C-x 9" 'make-mini-buffer - "C-c l e" 'apollo/emacs-keys - ;;Change keyboard layouts/language - "C-c l g" 'apollo/greek-keyboard - "C-κ" 'apollo/emacs-keys - "C-x C-b" 'ibuffer) - - - -;; My Generals does: -(general-does - "t" 'counsel-load-theme - "l" 'display-line-numbers-mode - "v" 'multi-vterm - "e" 'eshell - "c" 'apollo/center-buffer - "m" 'mu4e - "f" 'elfeed) - -;;pdf-tools -(general-define-key - :keymaps 'pdf-view-mode-map - "C-c d" 'pdf-view-midnight-minor-mode - "C-s" 'isearch-forward - "C-o" 'pdf-isearch-occur) - -;;vterm -(general-does - :keymaps 'vterm-mode-map - "n" 'multi-vterm-next - "o" 'multi-vterm - "p" 'multi-vterm-prev) - -(general-does - :keymaps 'eshell-mode-map - "n" 'eshell-new) - -(general-does - :keymaps 'org-mode-map - "3" 'org-insert-image-size-300) - -(setq openai-key (password-store-get "chatgpt/api")) - -(use-package circe - :ensure t - :config - (setq circe-network-options - `(("Libera Chat" - :host "irc.libera.chat" :port 6697 :tls t - :nick "thanosapollo" - :sasl-username "thanos_apollo" - :channels ("#emacs" "#emacs-circe") - :sasl-password ,(password-store-get "liberachat/thanos_apollo") - ))) - (define-key thanos/applications-map (kbd "i") 'circe)) diff --git a/.emacs.d/snippets/anki-editor.el b/.emacs.d/snippets/anki-editor.el deleted file mode 100755 index 70a0270..0000000 --- a/.emacs.d/snippets/anki-editor.el +++ /dev/null @@ -1,769 +0,0 @@ -;;; anki-editor.el --- Minor mode for making Anki cards with Org -*- lexical-binding: t; -*- -;; -;; Copyright (C) 2018 Lei Tan <[email protected]> -;; -;; Description: Make Anki Cards in Org-mode -;; Author: Lei Tan -;; Version: 0.3.3 -;; Package-Requires: ((emacs "25") (request "0.3.0") (dash "2.12.0")) -;; URL: https://github.com/louietan/anki-editor -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;;; Commentary: -;; -;; This package is for people who use Anki as SRS but would like to -;; make cards in Org-mode. -;; -;; With this package, you can make cards from something like: -;; (which is inspired by `org-dirll') -;; -;; * Item :emacs:lisp:programming: -;; :PROPERTIES: -;; :ANKI_DECK: Computing -;; :ANKI_NOTE_TYPE: Basic -;; :END: -;; ** Front -;; How to hello world in elisp ? -;; ** Back -;; #+BEGIN_SRC emacs-lisp -;; (message "Hello, world!") -;; #+END_SRC -;; -;; This package extends Org-mode's built-in HTML backend to generate -;; HTML for contents of note fields with specific syntax (e.g. latex) -;; translated to Anki style, then save the note to Anki. -;; -;; For this package to work, you have to setup these external dependencies: -;; - curl -;; - AnkiConnect, an Anki addon that runs an HTTP server to expose -;; Anki functions as RESTful APIs, see -;; https://github.com/FooSoft/anki-connect#installation -;; for installation instructions -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; This program is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or (at -;; your option) any later version. -;; -;; This program is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;;; Code: -(use-package cl-lib) -(use-package dash) -(use-package json) -(use-package org-element) -(use-package ox) -(use-package ox-html) -(use-package request) - -(defconst anki-editor-prop-note-type "ANKI_NOTE_TYPE") -(defconst anki-editor-prop-note-id "ANKI_NOTE_ID") -(defconst anki-editor-prop-deck "ANKI_DECK") -(defconst anki-editor-prop-tags "ANKI_TAGS") -(defconst anki-editor-prop-tags-plus (concat anki-editor-prop-tags "+")) -(defconst anki-editor-prop-failure-reason "ANKI_FAILURE_REASON") -(defconst anki-editor-buffer-html-output "*AnkiEditor HTML Output*") -(defconst anki-editor-org-tag-regexp "^\\([[:alnum:]_@#%]+\\)+$") - -(defgroup anki-editor nil - "Customizations for anki-editor." - :group 'org) - -(defcustom anki-editor-break-consecutive-braces-in-latex - nil - "If non-nil, consecutive `}' will be automatically separated by spaces to prevent early-closing of cloze. -See https://apps.ankiweb.net/docs/manual.html#latex-conflicts.") - -(defcustom anki-editor-create-decks - nil - "If non-nil, creates deck before creating a note.") - -(defcustom anki-editor-org-tags-as-anki-tags - t - "If nil, tags of entries wont't be counted as Anki tags.") - -(defcustom anki-editor-protected-tags - '("marked" "leech") - "A list of tags that won't be deleted from Anki even though they're absent in Org entries, such as special tags `marked', `leech'." - :type '(repeat string)) - -(defcustom anki-editor-ignored-org-tags - (append org-export-select-tags org-export-exclude-tags) - "A list of Org tags that are ignored when constructing notes form entries." - :type '(repeat string)) - -(defcustom anki-editor-anki-connect-listening-address - "127.0.0.1" - "The network address AnkiConnect is listening.") - -(defcustom anki-editor-anki-connect-listening-port - "8765" - "The port number AnkiConnect is listening.") - -(defcustom anki-editor-use-math-jax nil - "Use Anki's built in MathJax support instead of LaTeX.") - -;;; AnkiConnect - -(defun anki-editor--anki-connect-action (action &optional params version) - (let (a) - (when version - (push `(version . ,version) a)) - (when params - (push `(params . ,params) a)) - (push `(action . ,action) a))) - -(defun anki-editor--anki-connect-invoke-queue () - (let (action-queue) - (lambda (&optional action params handler) - (if action - (push (cons (anki-editor--anki-connect-action action params) handler) action-queue) - (when action-queue - (apply #'anki-editor--anki-connect-invoke-multi (nreverse action-queue)) - (setq action-queue nil)))))) - -(defun anki-editor--anki-connect-invoke (action &optional params) - "Invoke AnkiConnect with ACTION and PARAMS." - (let ((request-body (json-encode (anki-editor--anki-connect-action action params 5))) - (request-backend 'curl) - (json-array-type 'list) - reply err) - - (let ((response (request (format "http://%s:%s" - anki-editor-anki-connect-listening-address - anki-editor-anki-connect-listening-port) - :type "POST" - :parser 'json-read - :data request-body - :success (cl-function (lambda (&key data &allow-other-keys) - (setq reply data))) - :error (cl-function (lambda (&key _ &key error-thrown &allow-other-keys) - (setq err (string-trim (cdr error-thrown))))) - :sync t))) - - ;; HACK: With sync set to t, `request' waits for curl process to - ;; exit, then response data becomes available, but callbacks - ;; might not be called right away but at a later time, that's - ;; why here we manually invoke callbacks to receive the result. - (unless (request-response-done-p response) - (request--curl-callback (get-buffer-process (request-response--buffer response)) "finished\n"))) - - (when err (error "Error communicating with AnkiConnect using cURL: %s" err)) - (or reply (error "Got empty reply from AnkiConnect")))) - -(defmacro anki-editor--anki-connect-invoke-result (&rest args) - "Invoke AnkiConnect with ARGS, return the result from response or raise an error." - `(let-alist (anki-editor--anki-connect-invoke ,@args) - (when .error (error .error)) - .result)) - -(defun anki-editor--anki-connect-invoke-multi (&rest actions) - (-zip-with (lambda (result handler) - (when-let ((_ (listp result)) - (err (alist-get 'error result))) - (error err)) - (and handler (funcall handler result))) - (anki-editor--anki-connect-invoke-result - "multi" `((actions . ,(mapcar #'car actions)))) - (mapcar #'cdr actions))) - -(defun anki-editor--anki-connect-map-note (note) - "Convert NOTE to the form that AnkiConnect accepts." - (let-alist note - (list (cons "id" .note-id) - (cons "deckName" .deck) - (cons "modelName" .note-type) - (cons "fields" .fields) - ;; Convert tags to a vector since empty list is identical to nil - ;; which will become None in Python, but AnkiConnect requires it - ;; to be type of list. - (cons "tags" (vconcat .tags))))) - -(defun anki-editor--anki-connect-store-media-file (path) - "Store media file for PATH, which is an absolute file name. -The result is the path to the newly stored media file." - (let* ((hash (secure-hash 'sha1 path)) - (media-file-name (format "%s-%s%s" - (file-name-base path) - hash - (file-name-extension path t))) - content) - (when (equal :json-false (anki-editor--anki-connect-invoke-result - "retrieveMediaFile" - `((filename . ,media-file-name)))) - (message "Storing media file to Anki for %s..." path) - (setq content (base64-encode-string - (with-temp-buffer - (insert-file-contents path) - (buffer-string)))) - (anki-editor--anki-connect-invoke-result - "storeMediaFile" - `((filename . ,media-file-name) - (data . ,content)))) - media-file-name)) - - -;;; Org Export Backend - -(defconst anki-editor--ox-anki-html-backend - (if anki-editor-use-math-jax - (org-export-create-backend - :parent 'html - :transcoders '((latex-fragment . anki-editor--ox-latex-for-mathjax) - (latex-environment . anki-editor--ox-latex-for-mathjax))) - (org-export-create-backend - :parent 'html - :transcoders '((latex-fragment . anki-editor--ox-latex) - (latex-environment . anki-editor--ox-latex))))) - -(defconst anki-editor--ox-export-ext-plist - '(:with-toc nil :anki-editor-mode t)) - -(defun anki-editor--translate-latex-delimiters (latex-code) - (catch 'done - (let ((delimiter-map (list (list (cons (format "^%s" (regexp-quote "$$")) "[$$]") - (cons (format "%s$" (regexp-quote "$$")) "[/$$]")) - (list (cons (format "^%s" (regexp-quote "$")) "[$]") - (cons (format "%s$" (regexp-quote "$")) "[/$]")) - (list (cons (format "^%s" (regexp-quote "\\(")) "[$]") - (cons (format "%s$" (regexp-quote "\\)")) "[/$]")) - (list (cons (format "^%s" (regexp-quote "\\[")) "[$$]") - (cons (format "%s$" (regexp-quote "\\]")) "[/$$]")))) - (matched nil)) - (save-match-data - (dolist (pair delimiter-map) - (dolist (delimiter pair) - (when (setq matched (string-match (car delimiter) latex-code)) - (setq latex-code (replace-match (cdr delimiter) t t latex-code)))) - (when matched (throw 'done latex-code))))) - latex-code)) - -(defun anki-editor--translate-latex-delimiters-to-anki-mathjax-delimiters (latex-code) - (catch 'done - (let ((delimiter-map (list (list (cons (format "^%s" (regexp-quote "$$")) "\\[") - (cons (format "%s$" (regexp-quote "$$")) "\\]")) - (list (cons (format "^%s" (regexp-quote "$")) "\\(") - (cons (format "%s$" (regexp-quote "$")) "\\)")))) - (matched nil)) - (save-match-data - (dolist (pair delimiter-map) - (dolist (delimiter pair) - (when (setq matched (string-match (car delimiter) latex-code)) - (setq latex-code (replace-match (cdr delimiter) t t latex-code)))) - (when matched (throw 'done latex-code))))) - latex-code)) - -(defun anki-editor--wrap-latex (content) - "Wrap CONTENT with Anki-style latex markers." - (format "<p><div>[latex]</div>%s<div>[/latex]</div></p>" content)) - -(defun anki-editor--wrap-latex-for-mathjax (content) - "Wrap CONTENT for Anki's native MathJax support." - (format "<p>%s</p>" content)) - -(defun anki-editor--wrap-div (content) - (format "<div>%s</div>" content)) - -(defun anki-editor--ox-latex (latex _contents _info) - "Transcode LATEX from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual information." - (let ((code (org-remove-indentation (org-element-property :value latex)))) - (setq code - (pcase (org-element-type latex) - ('latex-fragment (anki-editor--translate-latex-delimiters code)) - ('latex-environment (anki-editor--wrap-latex - (mapconcat #'anki-editor--wrap-div - (split-string (org-html-encode-plain-text code) "\n") - ""))))) - - (if anki-editor-break-consecutive-braces-in-latex - (replace-regexp-in-string "}}" "} } " code) - code))) - -(defun anki-editor--ox-latex-for-mathjax (latex _contents _info) - "Transcode LATEX from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual information." - (let ((code (org-remove-indentation (org-element-property :value latex)))) - (setq code - (pcase (org-element-type latex) - ('latex-fragment (anki-editor--translate-latex-delimiters-to-anki-mathjax-delimiters code)) - ('latex-environment (anki-editor--wrap-latex-for-mathjax - (mapconcat #'anki-editor--wrap-div - (split-string (org-html-encode-plain-text code) "\n") - ""))))) - - (if anki-editor-break-consecutive-braces-in-latex - (replace-regexp-in-string "}}" "} } " code) - code))) - -(defun anki-editor--ox-html-link (oldfun link desc info) - "When LINK is a link to local file, transcodes it to html and stores the target file to Anki, otherwise calls OLDFUN for help. -The implementation is borrowed and simplified from ox-html." - - (or (catch 'giveup - (unless (plist-get info :anki-editor-mode) - (throw 'giveup nil)) - - (let* ((type (org-element-property :type link)) - (raw-path (org-element-property :path link)) - (desc (org-string-nw-p desc)) - (path - (cond - ((string= type "file") - ;; Possibly append `:html-link-home' to relative file - ;; name. - (let ((inhibit-message nil) - (home (and (plist-get info :html-link-home) - (org-trim (plist-get info :html-link-home))))) - (when (and home - (plist-get info :html-link-use-abs-url) - (file-name-absolute-p raw-path)) - (setq raw-path (concat (file-name-as-directory home) raw-path))) - ;; storing file to Anki and return the modified path - (anki-editor--anki-connect-store-media-file (expand-file-name (url-unhex-string raw-path))))) - (t (throw 'giveup nil)))) - (attributes-plist - (let* ((parent (org-export-get-parent-element link)) - (link (let ((container (org-export-get-parent link))) - (if (and (eq (org-element-type container) 'link) - (org-html-inline-image-p link info)) - container - link)))) - (and (eq (org-element-map parent 'link 'identity info t) link) - (org-export-read-attribute :attr_html parent)))) - (attributes - (let ((attr (org-html--make-attribute-string attributes-plist))) - (if (org-string-nw-p attr) (concat " " attr) "")))) - (cond - ;; Image file. - ((and (plist-get info :html-inline-images) - (org-export-inline-image-p - link (plist-get info :html-inline-image-rules))) - (org-html--format-image path attributes-plist info)) - - ;; Audio file. - ((string-suffix-p ".mp3" path t) - (format "[sound:%s]" path)) - - ;; External link with a description part. - ((and path desc) (format "<a href=\"%s\"%s>%s</a>" - (org-html-encode-plain-text path) - attributes - desc)) - - ;; External link without a description part. - (path (let ((path (org-html-encode-plain-text path))) - (format "<a href=\"%s\"%s>%s</a>" - path - attributes - (org-link-unescape path)))) - - (t (throw 'giveup nil))))) - (funcall oldfun link desc info))) - - -;;; Core Functions - -(defun anki-editor-map-note-entries (func &optional match scope &rest skip) - "Simple wrapper that calls `org-map-entries' with `&ANKI_NOTE_TYPE<>\"\"' appended to MATCH." - ;; disable property inheritance temporarily, or all subheadings of a - ;; note heading will be counted as note headings as well - (let ((org-use-property-inheritance nil)) - (org-map-entries func (concat match "&" anki-editor-prop-note-type "<>\"\"") scope skip))) - -(defun anki-editor--insert-note-skeleton (prefix deck heading note-type fields) - "Insert a note subtree (skeleton) with HEADING, NOTE-TYPE and FIELDS. -Where the subtree is created depends on PREFIX." - (org-insert-heading prefix) - (insert heading) - - (unless (save-excursion - (org-up-heading-safe) - ;; don't insert `ANKI_DECK' if some ancestor already has - ;; the same value - (and (not (string-blank-p deck)) - (string= deck (org-entry-get-with-inheritance anki-editor-prop-deck)))) - (org-set-property anki-editor-prop-deck deck)) - - (org-set-property anki-editor-prop-note-type note-type) - - (dolist (field fields) - (save-excursion - (org-insert-heading-respect-content) - (org-do-demote) - (insert field)))) - -(defun anki-editor--push-note (note) - "Request AnkiConnect for updating or creating NOTE." - (if (= (alist-get 'note-id note) -1) - (anki-editor--create-note note) - (anki-editor--update-note note))) - -(defun anki-editor--set-note-id (id) - (unless id - (error "Note creation failed for unknown reason")) - (org-set-property anki-editor-prop-note-id (number-to-string id))) - -(defun anki-editor--create-note (note) - "Request AnkiConnect for creating NOTE." - (let ((queue (anki-editor--anki-connect-invoke-queue))) - (when anki-editor-create-decks - (funcall queue - 'createDeck - `((deck . ,(alist-get 'deck note))))) - - (funcall queue - 'addNote - `((note . ,(anki-editor--anki-connect-map-note note))) - #'anki-editor--set-note-id) - - (funcall queue))) - -(defun anki-editor--update-note (note) - "Request AnkiConnect for updating fields and tags of NOTE." - - (let ((queue (anki-editor--anki-connect-invoke-queue))) - (funcall queue - 'updateNoteFields - `((note . ,(anki-editor--anki-connect-map-note note)))) - - (funcall queue - 'notesInfo - `((notes . (,(alist-get 'note-id note)))) - (lambda (result) - ;; update tags - (let* ((existing-note (car result)) - (tags-to-add (-difference (-difference (alist-get 'tags note) - (alist-get 'tags existing-note)) - anki-editor-ignored-org-tags)) - (tags-to-remove (-difference (-difference (alist-get 'tags existing-note) - (alist-get 'tags note)) - anki-editor-protected-tags)) - (tag-queue (anki-editor--anki-connect-invoke-queue))) - - (when tags-to-add - (funcall tag-queue - 'addTags `((notes . (,(alist-get 'note-id note))) - (tags . ,(mapconcat #'identity tags-to-add " "))))) - - (when tags-to-remove - (funcall tag-queue - 'removeTags `((notes . (,(alist-get 'note-id note))) - (tags . ,(mapconcat #'identity tags-to-remove " "))))) - - (funcall tag-queue)))) - - (funcall queue))) - -(defun anki-editor--set-failure-reason (reason) - "Set failure reason to REASON in property drawer at point." - (org-entry-put nil anki-editor-prop-failure-reason reason)) - -(defun anki-editor--clear-failure-reason () - "Clear failure reason in property drawer at point." - (org-entry-delete nil anki-editor-prop-failure-reason)) - -(defun anki-editor--get-allowed-values-for-property (property) - "Get allowed values for PROPERTY." - (pcase property - ((pred (string= anki-editor-prop-deck)) (anki-editor-deck-names)) - ((pred (string= anki-editor-prop-note-type)) (anki-editor-note-types)) - ((pred (string-match-p (format "%s\\+?" anki-editor-prop-tags))) (anki-editor-all-tags)) - (_ nil))) - -(defun anki-editor-is-valid-org-tag (tag) - "Check if string TAG can be used as an Org tag." - (string-match-p anki-editor-org-tag-regexp tag)) - -(defun anki-editor-all-tags () - "Get all tags from Anki." - (anki-editor--anki-connect-invoke-result "getTags")) - -(defun anki-editor-deck-names () - "Get all decks names from Anki." - (anki-editor--anki-connect-invoke-result "deckNames")) - -(defun anki-editor--enable-tag-completion () - (and anki-editor-mode anki-editor-org-tags-as-anki-tags)) - -(defun anki-editor--before-set-tags (&optional _ just-align) - "Fetch and cache tags from Anki." - (when (and (anki-editor--enable-tag-completion) - (not just-align)) - (setq anki-editor--anki-tags-cache (anki-editor-all-tags)) - (unless (-all? #'anki-editor-is-valid-org-tag anki-editor--anki-tags-cache) - (warn "Some tags from Anki contain characters that are not valid in Org tags.")))) - -(defun anki-editor--get-buffer-tags (oldfun) - "Append tags from Anki to the result of applying OLDFUN." - (append (funcall oldfun) - (when (anki-editor--enable-tag-completion) - (mapcar #'list anki-editor--anki-tags-cache)))) - -(defun anki-editor-note-types () - "Get note types from Anki." - (anki-editor--anki-connect-invoke-result "modelNames")) - -(defun anki-editor-note-at-point () - "Construct an alist representing a note from current entry." - (let ((org-trust-scanner-tags t) - (deck (org-entry-get-with-inheritance anki-editor-prop-deck)) - (note-id (org-entry-get nil anki-editor-prop-note-id)) - (note-type (org-entry-get nil anki-editor-prop-note-type)) - (tags (anki-editor--get-tags)) - (fields (anki-editor--build-fields))) - - (unless deck (error "No deck specified")) - (unless note-type (error "Missing note type")) - (unless fields (error "Missing fields")) - - `((deck . ,deck) - (note-id . ,(string-to-number (or note-id "-1"))) - (note-type . ,note-type) - (tags . ,tags) - (fields . ,fields)))) - -(defun anki-editor--get-tags () - (let ((tags (anki-editor--entry-get-multivalued-property-with-inheritance - nil - anki-editor-prop-tags))) - (if anki-editor-org-tags-as-anki-tags - (append tags (org-get-tags-at)) - tags))) - -(defun anki-editor--entry-get-multivalued-property-with-inheritance (pom property) - "Return a list of values in a multivalued property with inheritance." - (let* ((value (org-entry-get pom property t)) - (values (and value (split-string value)))) - (mapcar #'org-entry-restore-space values))) - -(defun anki-editor--build-fields () - "Build a list of fields from subheadings of current heading, each element of which is a cons cell, the car of which is field name and the cdr of which is field content." - (save-excursion - (let (fields - (point-of-last-child (point))) - (when (org-goto-first-child) - (while (/= point-of-last-child (point)) - (setq point-of-last-child (point)) - (let* ((inhibit-message t) ;; suppress echo message from `org-babel-exp-src-block' - (field-heading (org-element-at-point)) - (field-name (substring-no-properties - (org-element-property - :raw-value - field-heading))) - (contents-begin (org-element-property :contents-begin field-heading)) - (contents-end (org-element-property :contents-end field-heading))) - - (push (cons field-name - (cond - ((and contents-begin contents-end) (or (org-export-string-as - (buffer-substring - contents-begin - ;; in case the buffer is narrowed, - ;; e.g. by `org-map-entries' when - ;; scope is `tree' - (min (point-max) contents-end)) - anki-editor--ox-anki-html-backend - t - anki-editor--ox-export-ext-plist) - - ;; 8.2.10 version of - ;; `org-export-filter-apply-functions' - ;; returns nil for an input of empty string, - ;; which will cause AnkiConnect to fail - "")) - (t ""))) - fields) - (org-forward-heading-same-level nil t)))) - (reverse fields)))) - - -;;; Minor mode - -(defvar-local anki-editor--anki-tags-cache nil) - -(defun anki-editor--concat-multivalued-property-value (prop value) - (let ((old-values (org-entry-get-multivalued-property nil prop))) - (unless (string-suffix-p prop "+") - (setq old-values (-difference old-values (org-entry-get-multivalued-property nil (concat prop "+"))))) - (mapconcat #'org-entry-protect-space - (append old-values (list value)) - " "))) - -(setq org-properties-postprocess-alist - (append org-properties-postprocess-alist - (list (cons anki-editor-prop-tags - (lambda (value) - (anki-editor--concat-multivalued-property-value anki-editor-prop-tags value))) - (cons anki-editor-prop-tags-plus - (lambda (value) - (anki-editor--concat-multivalued-property-value anki-editor-prop-tags-plus value)))))) - -;;;###autoload -(define-minor-mode anki-editor-mode - "anki-editor-mode" - :lighter " anki-editor" - (if anki-editor-mode (anki-editor-setup-minor-mode) - (anki-editor-teardown-minor-mode))) - -(defun anki-editor-setup-minor-mode () - "Set up this minor mode." - (add-hook 'org-property-allowed-value-functions #'anki-editor--get-allowed-values-for-property nil t) - (advice-add 'org-set-tags :before #'anki-editor--before-set-tags) - (advice-add 'org-get-buffer-tags :around #'anki-editor--get-buffer-tags) - (advice-add 'org-html-link :around #'anki-editor--ox-html-link)) - -(defun anki-editor-teardown-minor-mode () - "Tear down this minor mode." - (remove-hook 'org-property-allowed-value-functions #'anki-editor--get-allowed-values-for-property t)) - - -;;; Commands - -(defun anki-editor-push-notes (&optional arg match scope) - "Build notes from headings that can be matched by MATCH within SCOPE and push them to Anki. -The default search condition `&ANKI_NOTE_TYPE<>\"\"' will always -be appended to MATCH. -For notes that already exist in Anki (i.e. has `ANKI_NOTE_ID' -property), only their fields and tags will be updated, change of -deck or note type are currently not supported. -If SCOPE is not specified, the following rules are applied to -determine the scope: -- If there's an active region, it will be set to `region' -- If called with prefix `C-u', it will be set to `tree' -- If called with prefix double `C-u', it will be set to `file' -- If called with prefix triple `C-u', will be set to `agenda' -See doc string of `org-map-entries' for what these different options mean. -If one fails, the failure reason will be set in property drawer -of that heading." - (interactive "P") - - (unless scope - (setq scope (cond - ((region-active-p) 'region) - ((equal arg '(4)) 'tree) - ((equal arg '(16)) 'file) - ((equal arg '(64)) 'agenda) - (t nil)))) - - (let* ((total (progn - (message "Counting notes...") - (length (anki-editor-map-note-entries t match scope)))) - (acc 0) - (failed 0)) - (anki-editor-map-note-entries - (lambda () - (message "[%d/%d] Processing notes in buffer \"%s\", wait a moment..." - (cl-incf acc) total (buffer-name)) - (anki-editor--clear-failure-reason) - (condition-case-unless-debug err - (anki-editor--push-note (anki-editor-note-at-point)) - (error (cl-incf failed) - (anki-editor--set-failure-reason (error-message-string err))))) - match - scope) - - (message (if (= 0 failed) - (format "Successfully pushed %d notes to Anki." acc) - (format "Pushed %d notes, %d of which are failed. Check property drawers for failure reasons. Once you've fixed the issues, you could use `anki-editor-retry-failure-notes' to re-push the failed notes." - acc failed))))) - -(defun anki-editor-retry-failure-notes (&optional arg scope) - "Retry pushing notes that were failed. -This command just calls `anki-editor-submit' with match string -matching non-empty `ANKI_FAILURE_REASON' properties." - (interactive "P") - (anki-editor-push-notes arg (concat anki-editor-prop-failure-reason "<>\"\"") scope)) - -(defun anki-editor-insert-note (&optional prefix) - "Insert a note interactively. -Where the note subtree is placed depends on PREFIX, which is the -same as how it is used by `M-RET'(org-insert-heading)." - (interactive "P") - (message "Fetching note types...") - (let* ((deck (or (org-entry-get-with-inheritance anki-editor-prop-deck) - (progn - (message "Fetching decks...") - (completing-read "Choose a deck: " - (sort (anki-editor-deck-names) #'string-lessp))))) - (note-type (completing-read "Choose a note type: " - (sort (anki-editor-note-types) #'string-lessp))) - (fields (progn - (message "Fetching note fields...") - (anki-editor--anki-connect-invoke-result "modelFieldNames" `((modelName . ,note-type))))) - (note-heading (read-from-minibuffer "Enter the note heading (optional): "))) - - (anki-editor--insert-note-skeleton prefix - deck - (if (string-blank-p note-heading) - "Item" - note-heading) - note-type - fields))) - -(defun anki-editor-cloze-region (&optional arg hint) - "Cloze region with number ARG." - (interactive "p\nsHint (optional): ") - (unless (region-active-p) (error "No active region")) - (anki-editor-cloze (region-beginning) (region-end) arg hint)) - -(defun anki-editor-cloze-dwim (&optional arg hint) - "Cloze current active region or a word the under the cursor" - (interactive "p\nsHint (optional): ") - (cond - ((region-active-p) (anki-editor-cloze (region-beginning) (region-end) arg hint)) - ((thing-at-point 'word) (let ((bounds (bounds-of-thing-at-point 'word))) - (anki-editor-cloze (car bounds) (cdr bounds) arg hint))) - (t (error "Nothing to create cloze from")))) - -(defun anki-editor-cloze (begin end arg hint) - "Cloze region from BEGIN to END with number ARG." - (let ((region (buffer-substring begin end))) - (save-excursion - (delete-region begin end) - (insert (with-output-to-string - (princ (format "{{c%d::%s" (or arg 1) region)) - (unless (string-blank-p hint) (princ (format "::%s" hint))) - (princ "}}")))))) - -(defun anki-editor-export-subtree-to-html () - "Export subtree of the element at point to HTML." - (interactive) - (org-export-to-buffer - anki-editor--ox-anki-html-backend - anki-editor-buffer-html-output nil t nil t anki-editor--ox-export-ext-plist #'html-mode)) - -(defun anki-editor-convert-region-to-html () - "Convert and replace region to HTML." - (interactive) - (org-export-replace-region-by anki-editor--ox-anki-html-backend)) - -(defun anki-editor-anki-connect-upgrade () - "Upgrade AnkiConnect to the latest version. -This will display a confirmation dialog box in Anki asking if you -want to continue. The upgrading is done by downloading the latest -code in the master branch of its Github repo. -This is useful when new version of this package depends on the -bugfixes or new features of AnkiConnect." - (interactive) - (when (yes-or-no-p "NOTE: This will download the latest codebase of AnkiConnect to your system, which is not guaranteed to be safe or stable. Generally, you don't need this command, this is useful only when new version of this package requires the updates of AnkiConnect that are not released yet. Do you still want to continue?") - (let ((result (anki-editor--anki-connect-invoke-result "upgrade"))) - (when (and (booleanp result) result) - (message "AnkiConnect has been upgraded, you might have to restart Anki to make it in effect."))))) - - -(provide 'anki-editor) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; anki-editor.el ends here diff --git a/.emacs.d/snippets/workspaces.el b/.emacs.d/snippets/workspaces.el deleted file mode 100755 index ffdf993..0000000 --- a/.emacs.d/snippets/workspaces.el +++ /dev/null @@ -1,42 +0,0 @@ -;;; workspaces.el -- implemented using registers - -(defun workspace-create-new (deskid) - "Create a blank workspace at id deskid, between 1 and 9" - (interactive "cWhat ID do you want to give to blank workspace ?") - (workspace-goto ?0) - (window-configuration-to-register deskid) - (add-to-list 'workspaces-list deskid) - (workspace-goto deskid)) - - -(defun workspace-goto (deskid) - "Go to another workspace, deskid is workspace number between 1 and 9; -Workspace 0 is a template workspace, do not use it unless you know what you do; -You can kill a workspace with 'k' and fallback on 1." - (interactive "cTo which workspace do you want to go ? ") - (let (add) - (setq add (if (eq deskid ?0) "\n!-!-! This is template workspace. New workspaces are based on it. " nil)) - (cond - ((and (>= deskid ?0) (<= deskid ?9)) - (if (or (position deskid workspaces-list) (eq deskid ?0)) - (progn - (window-configuration-to-register current-workspace) - (setq current-workspace deskid) - (jump-to-register deskid)) - (if (y-or-n-p "This workspace does not exist, should it be created ? ") - (progn - (window-configuration-to-register current-workspace) - (workspace-create-new deskid)) - nil))) - ((and (eq deskid ?k) (not (or (eq current-workspace ?0) (eq current-workspace ?1)))) - (let ((deskid-to-del current-workspace)) - (workspace-goto ?1) - (setq workspaces-list (remove deskid-to-del workspaces-list)))) - (t (setq add "\n!-!-! Please specify a valid workspace number in (1-9), 0 do edit template, 'k' to kill current workspace in (2-9)"))) - (message (concat "Now on workspace " (char-to-string current-workspace) "\nWorkspaces list is : " (mapconcat 'char-to-string (sort (copy-sequence workspaces-list) '<) ", ") add)))) - -;; workspaces init -(window-configuration-to-register ?0) -(defvar workspaces-list nil) -(setq current-workspace ?0) -(workspace-create-new ?1) diff --git a/.shells/alias.sh b/.shells/alias.sh deleted file mode 100644 index f79e367..0000000 --- a/.shells/alias.sh +++ /dev/null @@ -1,36 +0,0 @@ -alias ll='ls -l' -alias grep='grep --color=auto' - -alias vim='nvim' -alias vi='nvim' - -#git -alias ga='git add' -alias gaa='git add .' -alias gc='git commit -m' -alias gp='git push -u origin' -alias gpm='git push -u origin master' -alias gpd='git push -u origin developer' -alias gs='git status' - -#pacman | yay -alias yeet='paru -Rsc' - -# weather -alias weather="curl wttr.in" - -alias ls='ls -la --color' -alias sb='sudo systemctl start bluetooth' -alias mykeys='setxkbmap -option caps:escape' -alias logout='pkill -U $USER' -#alias neofetch='neofetch | lolcat' -alias b='bluetoothctl' -alias ba='bluetooth-autoconnect' -alias music='mocp' -alias ytd="yt-dlp" -alias c="pavucontrol" -alias r="ranger" -alias klight="brightnessctl --device='tpacpi::kbd_backlight' set 1" - -##yarn -alias sweb='BROWSER="firefox" yarn start' diff --git a/.shells/exports.sh b/.shells/exports.sh deleted file mode 100644 index 0febcb1..0000000 --- a/.shells/exports.sh +++ /dev/null @@ -1,18 +0,0 @@ -# Export 'SHELL' to child processes. Programs such as 'screen' -# honor it and otherwise use /bin/sh. -export SHELL -export PATH -export EDITOR="emacsclient" -export QT_QPA_PLATFORMTHEME="qt5ct" - - -if [[ $- != *i* ]] -then - # We are being invoked from a non-interactive shell. If this - # is an SSH session (as in "ssh host command"), source - # /etc/profile so we get PATH and other essential variables. - [[ -n "$SSH_CLIENT" ]] && source /etc/profile - - # Don't do anything else. - return -fi diff --git a/.shells/prompt.sh b/.shells/prompt.sh deleted file mode 100755 index d919457..0000000 --- a/.shells/prompt.sh +++ /dev/null @@ -1,14 +0,0 @@ - -# Pormpt - - - -# Adjust the prompt depending on whether we're in 'guix environment'. -# if [ -n "$GUIX_ENVIRONMENT" ] -# then -# PS1='\u@\h \w [env]\$ ' -# else -# PS1='\u@\h \w\$ ' -# fi - - diff --git a/README.md b/README.md deleted file mode 100644 index 8719417..0000000 --- a/README.md +++ /dev/null @@ -1,66 +0,0 @@ - - - -# Table of Contents - -- [About](#orgbef8fad) -- [Installation](#org03edb65) -- [WARNING!](#org14e5e32) - - - -<a id="orgbef8fad"></a> - -# About - -Welcome to my dotfiles repository! - -Here you will find my custom configuration files for a variety of applications and utilities. All of which are written in org-mode literate configuration format. - -All of the configurations in this repository are managed using [GNU Stow](https://www.gnu.org/software/stow/), which allows me to easily manage and switch between different configurations for different systems or environments. - - -<a id="orga0373fd"></a> - -Themes I'm using: - -- [Dracula for rofi](https://github.com/dracula/rofi) -- [Dracula for nyxt](https://github.com/dracula/nyxt) -- [Dracula for Qutebrowser](https://github.com/dracula/qutebrowser) -- [mocp-themes](https://github.com/wimstefan/mocp-themes) collection - - -<a id="org03edb65"></a> - -# Installation - -- clone repository - - git clone https://git.sr.ht/~thanosapollo/dotfiles - -- Install [GNU stow](https://www.gnu.org/software/stow/) - - paru -S install stow -- Use stow - - cd dotfiles - stow . - -If you get any errors due to existing files, rename them with `_backup` at the end -e.g `mv ~/.bashrc ~/.bashrc_backup` - -- *optional* Install my system packages for Arch Linux - - paru -S - < pkglist.txt - - -<a id="org14e5e32"></a> - -# WARNING! - -It's important to note that my dotfiles in this repository are constantly evolving, as I am constantly experimenting with new configurations and settings. - -While I am happy to share my configurations, **I do not recommend using them as-is on your own system** without careful review and testing. - -It's possible that some configurations may not work as expected or may cause issues on your system. Therefore, I strongly recommend taking caution and reviewing any changes carefully before applying them to your own system. - diff --git a/pkglist.txt b/pkglist.txt deleted file mode 100644 index cb79746..0000000 --- a/pkglist.txt +++ /dev/null @@ -1,139 +0,0 @@ -0ad -adwaita-dark -adwaita-qt5 -adwaita-qt6 -alacritty -alsa-utils -amd-ucode -anki-bin -arc-gtk-theme -base -base-devel -bind -bluedevil -blueman -bluez -bluez-utils -brightnessctl -cmatrix -cowsay -dmenu-wayland-git -dnsmasq -dunst -ed -efibootmgr -emacs -ffmpegthumbnailer -firefox -flameshot -foot -fzf -git -grim -hardinfo -htop -hugo -hunspell-en_us -hut -hyprland -hyprpaper-git -intel-media-driver -inter-font -isync -iwd -iwgtk -kitty -libreoffice-fresh -libva-intel-driver -libva-mesa-driver -light -linux -linux-firmware -lolcat -lxappearance -mercurial -mkusb -moc -mpv -mu -nano -nautilus -neofetch -neovim -network-manager-applet -networkmanager -noise-suppression-for-voice -noto-fonts -noto-fonts-emoji -obs-studio -openrgb -otf-firamono-nerd -pacman-contrib -pamixer -papirus-icon-theme -paru -pass -pavucontrol -pipewire-alsa -pipewire-enable-bluez5 -pipewire-pulse -polkit-gnome -python-pip -python-pyalsa -qbittorrent -qemu-full -qt5ct -qt6ct -qtile -qutebrowser -rofi-lbonn-wayland-git -rofi-pass -slurp -smartmontools -socat -sof-firmware -starship -steam -stow -sway -swaybg -swayidle -swaylock -tdlib -telegram-desktop -tessen -tmux -ttf-fantasque-nerd -ttf-font-awesome -ttf-icomoon-feather -ttf-iosevka-nerd -ttf-jetbrains-mono -ttf-jetbrains-mono-nerd -ttf-nerd-fonts-symbols-common -tumbler -unzip -viewnior -vim -virt-manager -vulkan-intel -vulkan-radeon -waybar-hyprland -wf-recorder -wget -wireless_tools -wl-clipboard -wlrobs -wtype -xf86-video-amdgpu -xf86-video-ati -xf86-video-nouveau -xf86-video-vmware -xorg-xinit -zathura -zathura-djvu -zathura-gruvbox-git -zathura-pdf-mupdf -zram-generator -zsh -zsh-autosuggestions -zsh-syntax-highlighting |