Put everything into init.el

This commit is contained in:
Marcus Kammer 2024-08-25 09:42:16 +02:00
parent c25d20ab91
commit 31ea1a9e79
Signed by: marcuskammer
GPG key ID: C374817BE285268F
11 changed files with 2487 additions and 2097 deletions

View file

@ -1,50 +0,0 @@
(setq holiday-oriental-holidays nil)
(setq holiday-islamic-holidays nil)
(setq holiday-bahai-holidays nil)
(setq holiday-hebrew-holidays nil)
(setq holiday-general-holidays
'((holiday-fixed 1 1 "Neujahr")
(holiday-fixed 5 1 "1. Mai")
(holiday-fixed 10 3 "Tag der Deutschen Einheit")))
(setq holiday-christian-holidays
'((holiday-float 12 0 -4 "1. Advent" 24)
(holiday-float 12 0 -3 "2. Advent" 24)
(holiday-float 12 0 -2 "3. Advent" 24)
(holiday-float 12 0 -1 "4. Advent" 24)
(holiday-fixed 12 25 "1. Weihnachtstag")
(holiday-fixed 12 26 "2. Weihnachtstag")
(holiday-fixed 1 6 "Heilige Drei Könige")
(holiday-easter-etc -48 "Rosenmontag")
;; (holiday-easter-etc -3 "Gründonnerstag")
(holiday-easter-etc -2 "Karfreitag")
(holiday-easter-etc 0 "Ostersonntag")
(holiday-easter-etc +1 "Ostermontag")
(holiday-easter-etc +39 "Christi Himmelfahrt")
(holiday-easter-etc +49 "Pfingstsonntag")
(holiday-easter-etc +50 "Pfingstmontag")
(holiday-easter-etc +60 "Fronleichnam")
(holiday-fixed 8 15 "Mariae Himmelfahrt")
(holiday-fixed 11 1 "Allerheiligen")
;; (holiday-float 11 3 1 "Buss- und Bettag" 16)
(holiday-float 11 0 1 "Totensonntag" 20)))
(use-package calendar
:ensure nil
:config
(setq calendar-latitude 49.4)
(setq calendar-longitude 11.0)
(setq calendar-location-name "Nuremberg, DE")
:custom
(european-calendar-style t)
(calendar-christian-all-holidays-flag t)
(calendar-date-style (quote iso))
(calendar-view-diary-initially-flag t)
(calendar-week-start-day 1)
(calendar-intermonth-text
'(propertize
(format "%2d"
(car
(calendar-iso-from-absolute
(calendar-absolute-from-gregorian
(list month day year )))))
'font-lock-face 'font-lock-function-name-face)))

View file

@ -1,123 +0,0 @@
;;; bundle--email
(setq mml-default-sign-method "pgpmime"
mml-default-encrypt-method "pgpmime"
mml-secure-openpgp-sign-with-sender t
mail-user-agent 'message-user-agent
compose-mail-user-agent-warnings nil)
(defun mk/sign-email ()
;; Sign an Email using the key of the sender.
(interactive)
(mml-secure-message-sign-pgpmime))
(defun mk/encrypt-email ()
;; Encrypt an Email using the key of the recipient.
(interactive)
(mml-secure-message-encrypt-pgpmime))
(defvar mk/gps-location
(eval '(let ((float-output-format "%.1f"))
(format "%s%s, %s%s"
(if (numberp calendar-latitude)
(abs calendar-latitude)
(+ (aref calendar-latitude 0)
(/ (aref calendar-latitude 1) 60.0)))
(if (numberp calendar-latitude)
(if (> calendar-latitude 0) "N" "S")
(if (eq (aref calendar-latitude 2) 'north) "N" "S"))
(if (numberp calendar-longitude)
(abs calendar-longitude)
(+ (aref calendar-longitude 0)
(/ (aref calendar-longitude 1) 60.0)))
(if (numberp calendar-longitude)
(if (> calendar-longitude 0) "E" "W")
(if (eq (aref calendar-longitude 2) 'east) "E" "W"))))))
(defvar mk/signature-name
(concat "Cheers, "
user-full-name
" ("
calendar-location-name
", "
mk/gps-location
")\n"))
(defvar mk/signature-gpg "GnuPG Key: https://meta.sr.ht/~marcuskammer.pgp\nFingerprint: 86DB 0F30 F9F1 661A 54E2 1664 C374 817B E285 268F")
(defun mk/signature-time ()
(format-time-string "Written on: %a, %d %b %Y %R %z\n"))
(defun mk/signature ()
(concat
;mk/signature-name
;(mk/signature-time)
mk/signature-gpg))
(use-package smtpmail
:custom
(smtpmail-smtp-server "smtp.mailbox.org")
(smtpmail-smtp-service 465)
(smtpmail-stream-type 'ssl)
(smtpmail-auth-credentials (expand-file-name "~/.authinfo.gpg")))
(add-hook 'message-signature-setup-hook (lambda () (setf message-signature (mk/signature))))
;; (add-hook 'mail-send-hook #'ispell-message)
;; (add-hook 'message-send-hook #'ispell-message)
(add-hook 'message-mode-hook 'turn-on-auto-fill)
(setq message-directory "~/Maildir")
(setq message-auto-save-directory "~/Maildir/Drafts")
(setq message-send-mail-function 'smtpmail-send-it)
(use-package gnus
:custom
(gnus-use-full-window nil)
(gnus-summary-line-format "%O%U%R%z%d %B%(%[%4L: %-22,22f%]%) %s\n")
(gnus-summary-mode-line-format "Gnus: %p [%A / Sc:%4z] %Z")
(gnus-summary-same-subject "")
(gnus-summary-make-false-root 'adopt)
(gnus-summary-make-false-root-always nil)
(gnus-sum-thread-tree-indent " ")
(gnus-sum-thread-tree-root "* ")
(gnus-sum-thread-tree-false-root "")
(gnus-sum-thread-tree-single-indent "")
(gnus-sum-thread-tree-leaf-with-other "+-+> ")
(gnus-sum-thread-tree-vertical "|")
(gnus-sum-thread-tree-single-leaf "=--> ")
(gnus-thread-sort-functions '(gnus-thread-sort-by-subject gnus-thread-sort-by-most-recent-date))
(gnus-large-newsgroup nil)
(gnus-inhibit-startup-message t)
(gnus-check-new-newsgroups nil)
(gnus-select-method '(nnnil ""))
(gnus-secondary-select-methods
'((nntp "news.eternal-september.org"
(nntp-open-connection-function nntp-open-ssl-stream)
(nntp-port-number 563)
(nntp-authinfo-file "~/.authinfo.gpg"))
(nnimap "mailbox"
(nnimap-address "imap.mailbox.org")
(nnimap-inbox "INBOX")
(nnimap-server-port 993)
(nnimap-stream ssl)
(nnimap-authinfo-file "~/.authinfo.gpg"))))
:config
(add-hook 'gnus-summary-prepare-hook 'gnus-summary-sort-by-most-recent-date))
(when (eq system-type 'gnu/linux)
(let ((mu4e-dir (expand-file-name "/usr/share/emacs/site-lisp/mu4e/")))
(when (file-directory-p mu4e-dir)
(add-to-list 'load-path mu4e-dir)
(use-package mu4e
:ensure nil
:hook (mu4e-compose-pre . (lambda () (setf mu4e-compose-signature (mk/signature))))
:custom
(mu4e-confirm-quit nil)
(mu4e-change-filenames-when-moving t)
(mu4e-drafts-folder "/Drafts")
(mu4e-get-mail-command "mbsync -a")
(mu4e-headers-date-format "%Y-%m-%d %H:%M")
(mu4e-refile-folder "/Archive")
(mu4e-sent-folder "/Sent")
(mu4e-trash-folder "/Trash")
(mu4e-split-view 'horizontal)
(mu4e-update-interval (* 10 60))))))

View file

@ -1,139 +0,0 @@
(global-hl-line-mode 1)
(display-time-mode 1)
(global-prettify-symbols-mode -1)
;;(setq display-time-format "W%V %a %d %b %Y %R %z")
(setq display-time-format "W%V %a %d %b %R")
(setq display-time-24hr-format t)
;; Cursor and mouse
(column-number-mode 1)
(mouse-wheel-mode 1)
(blink-cursor-mode -1)
(setq grep-command "grep -i -nH -e ")
(when (eq system-type 'gnu/linux)
(setq shell-file-name "/bin/bash")
(setq tex-shell-file-name "/bin/bash"))
;; Files and sessions
(setq auto-save-timeout 60)
;; Tabs, spaces, lines and parenthesis
(show-paren-mode 1)
(setq-default tab-width 4)
(setq-default indent-tabs-mode nil)
(setq-default line-spacing nil)
(setq-default make-backup-files nil)
(setq-default next-line-add-newlines t)
;; Miscellaneous
(require 'cl-lib)
(setq default-major-mode 'text-mode)
(setq inhibit-startup-buffer-menu t inhibit-startup-screen t)
(put 'narrow-to-region 'disabled nil)
(put 'narrow-to-page 'disabled nil)
(add-hook 'text-mode-hook 'turn-on-auto-fill)
(defalias 'yes-or-no-p 'y-or-n-p)
(add-hook 'after-save-hook
'executable-make-buffer-file-executable-if-script-p)
(global-set-key (kbd "M-i") 'imenu)
(global-set-key (kbd "C-x C-b") 'ibuffer-list-buffers)
;;(global-set-key (kbd "M-[") 'tab-bar-history-back)
;;(global-set-key (kbd "M-]") 'tab-bar-history-forward)
(add-hook 'diary-display-hook 'fancy-diary-display)
(add-hook 'today-visible-calendar-hook 'calendar-mark-today)
(add-hook 'write-file-hooks 'delete-trailing-whitespace)
(add-hook 'diary-list-entries-hook 'diary-include-other-diary-files)
(add-hook 'diary-mark-entries-hook 'diary-mark-included-diary-files)
(setq compilation-ask-about-save nil)
(setq vc-handled-backends '(Git Hg)) ;; Only use Git and Hg for VC
(setq horizontal-scroll-bar nil)
(setq vertical-scroll-bar nil)
(setq mouse-wheel-scroll-amount '(1 ((shift) . 1) ((meta)) ((control) . text-scale)))
;;; SIMPLE
(setq completion-auto-wrap t)
(setq completion-auto-select nil)
;;; MINIBUFFER
(setq completions-format 'one-column)
(setq completions-header-format nil)
(setq completions-max-height 20)
;; (require 'ido)
;; (setq ido-enable-flex-matching t)
;; (setq ido-everywhere t)
;; (setq ido-create-new-buffer 'always)
;(setq ido-file-extensions-order '(".org" ".lisp" ".py" ".txt" ".el" ".epub"))
(ido-mode t)
;(fido-mode 1) ; replace icomplete mode
;(fido-vertical-mode 1)
;;;
;;; bundle--encoding
;; UTF-8 FTW
(prefer-coding-system 'utf-8-unix)
(set-default-coding-systems 'utf-8-unix)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(setq default-buffer-file-coding-system 'utf-8-unix)
(setenv "PYTHONIOENCODING" "UTF-8")
;;; bundle--customfile
(when (eq system-type 'gnu/linux)
(setq custom-file "~/.emacs.d/bundle/custom_gnu.el"
browse-url-secondary-browser-function 'browse-url-firefox)
(unless (file-directory-p "~/cl-sites/")
(async-shell-command "git clone git@git.sr.ht:~marcuskammer/cl-sites ~/cl-sites")))
(when (eq system-type 'windows-nt)
(setq explicit-shell-file-name
(seq-find 'file-executable-p
'("C:\\Program Files\\PowerShell\\7\\pwsh.exe"
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe")))
(setq explicit-powershell.exe-args '("-NoProfile" "-InputFormat" "Text"))
(setq custom-file "~/.emacs.d/bundle/custom_win32.el")
(when (string= system-name "XPS-8930")
(cd "~/")
(setq custom-file "~/.emacs.d/bundle/custom_win32_XPS8930.el"))
(when (string= system-name "EVG03435NB")
(cd "~/OneDrive - Siemens AG/")
(setq custom-file "~/.emacs.d/bundle/custom_win32_EVG03435NB.el")))
(load custom-file :noerror)
(setq package-archives
'(("melpa" . "https://melpa.org/packages/")
("org" . "https://orgmode.org/elpa/")
("elpa" . "https://elpa.gnu.org/packages/")
("nongnu" . "https://elpa.nongnu.org/nongnu/")))
(package-initialize)
(unless package-archive-contents
(package-refresh-contents))
(unless (package-installed-p 'use-package)
(package-install 'use-package))
(require 'use-package)
(setq use-package-always-ensure t)
(use-package doom-themes
:init
(load-theme 'doom-one t)
:config
(setq doom-themes-enable-bold t
doom-themes-enable-italic t))
(tool-bar-mode -1)
(menu-bar-mode -1)
(scroll-bar-mode -1)
(fringe-mode 10)
(horizontal-scroll-bar-mode -1)

View file

@ -1,181 +0,0 @@
(setq-default mode-line-format
'("%e" mode-line-front-space "%b %*%n %I %l:%c %p" (vc-mode vc-mode) " " mode-line-modes mode-line-misc-info mode-line-end-spaces))
(unless (memq 'hs-headline mode-line-format)
(setq mode-line-format
(append '(" " hs-headline) mode-line-format)))
(set-face-attribute 'mode-line nil
:slant 'italic
:weight 'bold
:background (face-attribute 'default :background)
:foreground
(cond ((member 'doom-one custom-enabled-themes) "#5B6268")
((member 'doom-nord custom-enabled-themes) "#9099AB")
(t (face-attribute 'mode-line-inactive :foreground)))
:box '(:line-width (1 . 8) :style flat-button))
(set-face-attribute 'mode-line-inactive nil
:inherit 'mode-line
:weight 'normal
:box '(:line-width (1 . 8) :style flat-button))
(use-package tab-bar
:custom
(tab-bar-auto-width nil)
(tab-bar-auto-width-max '(250 25))
(tab-bar-format '(tab-bar-format-history tab-bar-format-tabs-groups))
(tab-bar-tab-name-function 'tab-bar-tab-name-truncated)
(tab-bar-close-button-show nil)
(tab-bar-new-button-show nil)
:config
(set-face-attribute 'tab-bar nil
:inherit 'mode-line-inactive
:background (face-attribute 'mode-line-inactive :background))
(set-face-attribute 'tab-bar-tab nil
:inherit 'mode-line
:foreground (face-attribute 'mode-line :foreground)
:box '(:line-width 8 :style flat-button))
(set-face-attribute 'tab-bar-tab-inactive nil
:inherit 'mode-line-inactive
:box '(:line-width 8 :style flat-button)))
(setq default-frame-alist
`((font . "MonoLisa-11")
(width . 85)
(height . 50)
(vertical-scroll-bars)
,@(cond ((eq system-type 'gnu/linux)
'((fullscreen . maximized)
(undecorated . t))))))
(setq frame-resize-pixelwise t)
(defun center-frame (&optional frame)
"Center FRAME on the screen."
(interactive)
(let ((frame (or frame (selected-frame))))
(let ((frame-width (frame-pixel-width frame))
(frame-height (frame-pixel-height frame))
(display-width (display-pixel-width))
(display-height (display-pixel-height)))
(set-frame-position frame
(/ (- display-width frame-width) 2)
(/ (- display-height frame-height) 2)))))
(add-hook 'after-make-frame-functions #'center-frame)
(use-package all-the-icons
:commands all-the-icons-install-fonts
:init
(unless (find-font (font-spec :name "all-the-icons"))
(all-the-icons-install-fonts t)))
(use-package all-the-icons-dired
:after all-the-icons
:hook (dired-mode . all-the-icons-dired-mode))
(use-package emojify
:hook (erc-mode . emojify-mode)
:commands emojify-mode
:config
(when (member "Segoe UI Emoji" (font-family-list))
;; https://ianyepan.github.io/posts/emacs-emojis/
(set-fontset-font t 'symbol (font-spec :family "Segoe UI Emoji") nil 'prepend)
(setq emojify-display-style 'unicode)
(setq emojify-emoji-styles '(unicode))))
;; (defun my-vc-info ()
;; (when vc-mode
;; (concat (substring vc-mode 5)
;; " ["
;; (substring (vc-working-revision (buffer-file-name)) 0 8)
;; "] ")))
;; (defun my-project-name ()
;; (let ((proj (project-current)))
;; (if proj (file-name-base (directory-file-name (project-root proj)))
;; "NoProject")))
;; (setq-default header-line-format
;; (list "-%M"
;; '(:eval (my-project-name)) " "
;; system-name " " user-login-name " "
;; "-%-"))
;; (setq-default mode-line-format
;; (list "-%b %*%n %I %l:%c %p "
;; '(:eval mode-name) " "
;; '(:eval (my-vc-info))
;; '(:eval (if mode-line-process (concat ":" mode-line-process " ") ""))
;; 'default-directory
;; "-%-"))
;; (set-face-attribute 'mode-line nil :weight 'bold)
;; (set-face-attribute 'header-line nil :weight 'bold)
;; (use-package doom-modeline
;; :hook (after-init . doom-modeline-mode)
;; :custom
;; (doom-modeline-height 30)
;; (doom-modeline-bar-width 4)
;; (doom-modeline-icon nil)
;; (doom-modeline-major-mode-icon nil)
;; (doom-modeline-unicode-fallback nil)
;; (doom-modeline-minor-modes nil)
;; (doom-modeline-buffer-encoding nil)
;; (doom-modeline-battery nil))
(use-package helpful
:commands (helpful-callable helpful-variable helpful-command helpful-key)
:bind ([remap describe-command] . helpful-command) ([remap describe-key] . helpful-key))
(use-package rainbow-delimiters
:hook (prog-mode . rainbow-delimiters-mode))
(use-package olivetti
:custom (olivetti-body-width 83)
:bind ("<f6>" . olivetti-mode))
(add-hook 'Info-mode-hook
(lambda ()
(make-local-variable 'olivetti-body-width)
(setq olivetti-body-width 75)
(olivetti-mode)))
(use-package ace-window :init (global-set-key (kbd "M-o") 'ace-window))
;; (use-package vertico :init (vertico-mode))
(use-package webjump
:bind ("C-c j" . webjump)
:custom
(webjump-sites
(append '(("Wikipedia_de" . [simple-query "de.wikipedia.org" "https://de.wikipedia.org/wiki/" ""])
("leo.org" . [simple-query "dict.leo.org" "https://dict.leo.org/german-english/" ""]))
webjump-sample-sites)))
(use-package doc-view
:ensure nil
:custom
(doc-view-dvipdfm-program "mutool")
(doc-view-odf->odf-converter-program "soffice")
(dov-view-odf->pdf-converter-function 'doc-view-odf->pdf-converter-soffice)
(doc-view-pdf->png-converter-function 'doc-view-pdf->png-converter-mupdf)
(doc-view-resolution 300))
(use-package yasnippet
:init
(yas-global-mode 1))
;(pixel-scroll-precision-mode +1)
(use-package hideshow
:hook ((prog-mode . (lambda () (hs-minor-mode 1))))
:bind (:map prog-mode-map
("M-<return>" . hs-toggle-hiding))
:custom
(hs-allow-nesting t))
(add-hook 'prog-mode-hook (lambda () (setq line-spacing 4)))

View file

@ -1,54 +0,0 @@
(defun mk/start-irc (nick)
(interactive "sTell me your nick please: ")
(erc-tls :server "irc.libera.chat"
:port 6697
:nick nick
:full-name "Jay Edgar Hoover"))
(use-package erc
:defer t
:custom
(erc-track-exclude '("#emacs"))
(erc-track-exclude-types '("JOIN" "NICK" "QUIT" "MODE" "AWAY"))
(erc-hide-list '("JOIN" "NICK" "QUIT" "MODE" "AWAY"))
(erc-track-exclude-server-buffer t)
(erc-fill-column 80)
(erc-fill-function 'erc-fill-static)
(erc-fill-static-center 20)
(erc-prompt-for-nickserv-password nil)
(erc-track-shorten-start 8)
(erc-auto-query 'bury)
(erc-network-hide-list '(("libera.chat" "JOIN" "PART" "QUIT")))
(erc-rename-buffers t)
(erc-interpret-mirc-color t)
(erc-kill-buffer-on-part t)
(erc-kill-queries-on-quit t)
(erc-kill-server-buffer-on-quit t)
(erc-modules
'(autojoin ; Set away status automatically
button ; Join channels automatically
completion ; Complete nicknames and commands (programmable)
fill ; Wrap long lines
irccontrols ; Highlight or remove IRC control characters
match ; Highlight pals, fools, and other keywords
menu ; Display a menu in ERC buffers
netsplit ; Detect netsplits
noncommands ; Dont display non-IRC commands after evaluation
readonly ; Make displayed lines read-only
ring ; Enable an input history
services ; Identify to Nickserv (IRC Services) automatically
smiley ; Convert smileys to pretty icons
stamp ; Add timestamps to messages
truncate ; Truncate buffers to a certain size
)))
(use-package erc-hl-nicks
:after erc
:config
(add-to-list 'erc-modules 'hl-nicks))
(use-package erc-image
:after erc
:config
(setq erc-image-inline-rescale 300)
(add-to-list 'erc-modules 'image))

View file

@ -1,268 +0,0 @@
;;; bundle--linux.el --- A bundle of useful Linux information
;;; Commentary:
;; This file contains a variety of Emacs Lisp functions that provide
;; helpful descriptions for Linux directories, commands, and options.
;;; Code:
(defvar linux-filesystem-alist
'(( "/" . "Root directory, the base of the filesystem hierarchy")
("/bin" . "Essential command binaries, needed for booting")
("/boot" . "Bootloader files, kernel, and other files needed during booting")
("/dev" . "Device files representing hardware components")
("/etc" . "System-wide configuration files")
("/home" . "User home directories")
("/lib" . "Shared libraries and kernel modules")
("/media" . "Mount points for removable media like CDs and USBs")
("/mnt" . "Temporary mount points for filesystems")
("/opt" . "Optional application software packages")
("/proc" . "Virtual filesystem providing info about processes and system")
("/root" . "Home directory for the root user")
("/sbin" . "Essential system binaries, usually for the root user")
("/srv" . "Data directories for services like HTTP, FTP, etc.")
("/sys" . "Virtual filesystem for kernel objects")
("/tmp" . "Temporary files, cleared on reboot")
("/usr" . "User binaries, documentation, libraries, etc.")
("/var" . "Variable files like logs, databases, etc."))
"Alist mapping Linux directories to their descriptions.")
(defun describe-linux-directory (dirname)
"Describe the purpose of a Linux directory.
Takes DIRNAME as an argument and prints its description."
(interactive "sEnter Linux directory name (e.g., /bin): ")
(let ((description (assoc-default dirname linux-filesystem-alist)))
(if description
(message "%s: %s" dirname description)
(message "Unknown directory: %s" dirname))))
(defvar bash-regex-alist
'(("empty line" . "^$")
("backslash" . "\\\\")
("line starts with a dot" . "^\\.")
("line ends with a dot" . "\\.$")
("line starts with a dollar sign" . "^\\$")
("line starts with a caret" . "^\\^")
("left square bracket" . "\\[")
("right square bracket" . "\\]")
("entire line" . "^.*$")
("any alphanumeric character" . "[a-zA-Z0-9]")
("IP Address" . "\\b(?:[0-9]{1,3}\\.){3}[0-9]{1,3}\\b")
("email" . "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}")
("hex color code" . "#[a-fA-F0-9]{6}")
("date in yyyy-mm-dd" . "\\b\\d{4}-\\d{2}-\\d{2}\\b")
("time in hh:mm:ss" . "\\b\\d{2}:\\d{2}:\\d{2}\\b")
("words without vowels" . "\\b[^aeiou\s]+\\b"))
"Alist mapping Bash regular expressions to their descriptions.")
(defun describe-bash-regex (regex)
"Describe the purpose of a Bash regular expression.
Takes REGEX as an argument and prints its description."
(interactive "sEnter Bash regex (e.g., empty line): ")
(let ((description (assoc-default regex bash-regex-alist)))
(if description
(message "%s: %s" regex description)
(message "Unknown regular expression: %s" regex))))
(defvar linux-process-commands-alist
'(("ps" . "Shows a snapshot of the current processes")
("top" . "Displays dynamic real-time view of system stats and processes")
("htop" . "An interactive process viewer, similar to top but more feature-rich")
("pgrep" . "Looks up processes based on name and other attributes")
("pstree" . "Displays the process tree in a tree-like diagram")
("ps -e" . "Lists all the processes running on the system")
("ps aux" . "Displays detailed information about all processes")
("kill" . "Terminates processes by sending signals")
("killall" . "Kills all processes that match the given name")
("pkill" . "Send signals to processes based on name and other attributes"))
"Alist mapping Linux process-checking commands to their descriptions.")
(defun describe-linux-process-command (command)
"Describe the purpose of a Linux process-checking command.
Takes COMMAND as an argument and prints its description."
(interactive "sEnter Linux process command (e.g., ps): ")
(let ((description (assoc-default command linux-process-commands-alist)))
(if description
(message "%s: %s" command description)
(message "Unknown command: %s" command))))
(defvar linux-logfiles-alist
'(("/var/log/syslog" . "System messages, including the messages that are logged during system startup")
("/var/log/auth.log" . "Security/authorization information, including user logins and authentication")
("/var/log/kern.log" . "Kernel logs")
("/var/log/cron.log" . "Logs for cron jobs")
("/var/log/messages" . "General system activity logs")
("/var/log/boot.log" . "System boot log")
("/var/log/daemon.log" . "Background daemon log messages")
("/var/log/dpkg.log" . "Logs for package installations and removals")
("/var/log/mail.log" . "Mail server logs")
("/var/log/user.log" . "User-level messages"))
"Alist mapping Linux log files to their descriptions.")
(defun describe-linux-logfile (logfile)
"Describe the purpose of a Linux log file.
Takes LOGFILE as an argument and prints its description."
(interactive "sEnter Linux log file path (e.g., /var/log/syslog): ")
(let ((description (assoc-default logfile linux-logfiles-alist)))
(if description
(message "%s: %s" logfile description)
(message "Unknown log file: %s" logfile))))
(defvar linux-basic-commands-alist
'(("list directory contents" . "ls")
("change directory" . "cd")
("move or rename files" . "mv")
("copy files" . "cp")
("remove files or directories" . "rm")
("print working directory" . "pwd")
("display variable value" . "echo")
("create an empty file" . "touch")
("change file permissions" . "chmod")
("change file ownership" . "chown"))
"Alist mapping basic Linux command descriptions to their commands.")
(defun describe-basic-linux-command (command)
"Describe the purpose of a basic Linux command.
Takes COMMAND as an argument and prints its description."
(interactive "sEnter basic Linux command (e.g., ls): ")
(let ((description (assoc-default command linux-basic-commands-alist)))
(if description
(message "%s: %s" command description)
(message "Unknown command: %s" command))))
(defvar chown-options-alist
'(("-R" . "Operate on files and directories recursively")
("--from" . "Change the owner and/or group of each file only if its current owner and/or group match specified values")
("--no-dereference" . "Affect symbolic links instead of the files they point to")
("--preserve-root" . "Fail when attempting to operate recursively on '/'")
("--reference" . "Use owner and group of a reference file")
("-c" . "Report when a change is made")
("-f" . "Suppress most error messages")
("-v" . "Output a diagnostic for every file processed"))
"Alist mapping chown command options to their descriptions.")
(defun describe-chown-option (option)
"Describe the purpose of a chown option.
Takes OPTION as an argument and prints its description."
(interactive "sEnter chown option (e.g., -R): ")
(let ((description (assoc-default option chown-options-alist)))
(if description
(message "%s: %s" option description)
(message "Unknown chown option: %s" option))))
(defvar chmod-options-alist
'(("-R" . "Operate on files and directories recursively")
("--preserve-root" . "Avoid operating recursively on '/'")
("-c" . "Report when a change is made")
("-f" . "Suppress most error messages")
("-v" . "Output a diagnostic for every file processed")
("--reference" . "Use mode of a reference file")
("-w" . "Remove write permission")
("-x" . "Remove execute permission")
("-u" . "Set user ID on execution")
("-g" . "Set group ID on execution"))
"Alist mapping chmod command options to their descriptions.")
(defun describe-chmod-option (option)
"Describe the purpose of a chmod option.
Takes OPTION as an argument and prints its description."
(interactive "sEnter chmod option (e.g., -R): ")
(let ((description (assoc-default option chmod-options-alist)))
(if description
(message "%s: %s" option description)
(message "Unknown chmod option: %s" option))))
(defvar ssh-use-cases-alist
'(("remote login" . "ssh user@host")
("run command" . "ssh user@host 'command'")
("file transfer" . "scp file.txt user@host:/path/")
("secure ftp" . "sftp user@host")
("port forwarding" . "ssh -L local_port:remote_host:remote_port user@host")
("dynamic port forwarding" . "ssh -D port user@host")
("remote port forwarding" . "ssh -R remote_port:local_host:local_port user@host")
("tunneling" . "ssh -L local_port:remote_host:remote_port user@host -f -N")
("agent forwarding" . "ssh -A user@host")
("ssh multiplexing" . "ssh -M -S /tmp/ssh_socket user@host; ssh -S /tmp/ssh_socket user@host"))
"Alist mapping SSH use cases to their corresponding commands.")
(defun describe-ssh-use-case (use-case)
"Describe the SSH command for a given use case."
(interactive "sEnter the SSH use case: ")
(let ((command (assoc-default use-case ssh-use-cases-alist)))
(if command
(message "Command for %s: %s" use-case command)
(message "Use case not found"))))
(defvar mk/remote-*host-aliases*
'(("website" . "marcus@www.marcuskammer.dev")
("survey" . "cl@survey.metalisp.dev")
("pihole" . "ubuntu@pi-hole.fritz.box"))
"Alist mapping friendly host names to actual SSH-compatible host strings.")
(defun mk/remote--get-real-host (alias)
"Lookup the real host name based on a given ALIAS."
(or (cdr (assoc alias mk/remote-*host-aliases*)) alias))
(defun mk/remote--systemctl-service (alias service command)
"Execute a systemctl COMMAND on a systemd SERVICE on a remote host identified by ALIAS.
ALIAS is a string that specifies the remote host; it can be an
alias defined in `mk/remote-*host-aliases*'.
SERVICE is the name of the systemd service to operate on.
COMMAND is the systemctl command to execute on the service (e.g.,
'start', 'stop', 'status')."
(let* ((host (mk/remote--get-real-host alias))
(buffer (generate-new-buffer (format "*%s-%s-%s*" alias service command)))
(process-name (format "systemctl-%s-%s" command service)))
(make-process :name process-name
:buffer buffer
:command `("ssh" ,host "sudo" "systemctl" ,command ,service)
:sentinel (lambda (process signal)
(when (memq (process-status process) '(exit signal))
(message "Process: %s %s" process signal))))))
(defmacro mk/remote-define-systemctl-functions (&rest actions)
"Dynamically create functions to interact with systemd services on a remote host.
Each function will be named `mk/remote-ACTION-service', where
ACTION is one of the symbols in ACTIONS. The functions will take
an ALIAS and SERVICE as arguments and call
`mk/remote--systemctl-service' accordingly."
`(progn
,@(mapcar
(lambda (action)
`(defun ,(intern (format "mk/remote-%s-service" action)) (alias service)
(interactive "sEnter the host alias or name: \nsEnter the service name: ")
(mk/remote--systemctl-service alias service ,(symbol-name action))))
actions)))
(mk/remote-define-systemctl-functions start stop status)
(defun mk/remote--log (alias service filename)
(let* ((filepath (concat "/var/log/" service (unless (string-empty-p filename) (concat "/" filename))))
(host (mk/remote--get-real-host alias))
(buffer (generate-new-buffer (format "*%s-%s-%s*" alias service filename)))
(process-name (format "log-%s-%s" service filename)))
(make-process :name process-name
:buffer buffer
:command `("ssh" ,host "sudo" "tail -f" ,filepath)
:sentinel (lambda (process signal)
(when (memq (process-status process) '(exit signal))
(message "Process: %s %s" process signal))))))
(defmacro mk/define-remote-log-function (alias service &optional filename)
"Define a function to asynchronously tail a remote log file."
(let ((fname (if filename filename "")))
`(defun ,(intern (format "mk/remote-log-%s-%s-%s" alias service filename)) ()
,(format "Tail the remote log file: %s" filename)
(interactive)
(mk/remote--log ,alias ,service ,fname))))
(mk/define-remote-log-function "website" "nginx" "access.csv")
(mk/define-remote-log-function "website" "nginx" "error.log")
(mk/define-remote-log-function "website" "syslog")
(mk/define-remote-log-function "survey" "nginx" "access.csv")
(mk/define-remote-log-function "survey" "syslog")
(mk/define-remote-log-function "pihole" "pihole" "pihole.log")

View file

@ -1,382 +0,0 @@
(defvar mk/hyperspec-dir-locations
'("~/cl-sites/HyperSpec-7-0/HyperSpec/"
"~/HyperSpec-7-0/HyperSpec/")
"List of possible locations where the local HyperSpec could reside.")
(defun mk/hyperspec-dir ()
"Finds and returns the URI of the local HyperSpec directory.
Uses `mk/hyperspec-dir-locations' to find the directory."
(let ((dir (seq-find 'file-directory-p mk/hyperspec-dir-locations)))
(if dir
(concat "file://" (and (eq system-type 'windows-nt) "/") (expand-file-name dir))
nil)))
(setq common-lisp-hyperspec-root (mk/hyperspec-dir))
(use-package slime
:custom
(slime-autodoc-use-multiline-p 1)
:config
(define-key slime-mode-map (kbd "C-c C-q") 'slime-close-all-parens-in-sexp)
(slime-setup '(slime-autodoc
slime-tramp
slime-fancy
slime-asdf
slime-indentation
slime-editing-commands
slime-sbcl-exts))
;; To create a slime specific sbcl image:
;; shell$ sbcl
;; * (mapc 'require '(sb-bsd-sockets sb-posix sb-introspect sb-cltl2 asdf))
;; * (save-lisp-and-die "sbcl.core-for-slime")
;; Stop SLIME's REPL from grabbing DEL,
;; which is annoying when backspacing over a '('
;; (defun override-slime-repl-bindings-with-paredit ()
;; (define-key slime-repl-mode-map
;; (read-kbd-macro paredit-backward-delete-key) nil))
;; (add-hook 'slime-repl-mode-hook 'override-slime-repl-bindings-with-paredit)
(setq common-lisp-hyperspec-symbol-table
(concat common-lisp-hyperspec-root "Data/Map_Sym.txt"))
(setq common-lisp-hyperspec-issuex-table
(concat common-lisp-hyperspec-root "Data/Map_IssX.txt"))
(let ((image-path (expand-file-name "~/sbcl.core-for-slime")))
(if (file-exists-p image-path)
(setq slime-lisp-implementations
`((sbcl ("sbcl" "--noinform" "--core" ,image-path) :coding-system utf-8-unix)))
(setq slime-lisp-implementations
`((sbcl ("sbcl" "--noinform") :coding-system utf-8-unix)))))
(defvar mk/slime-remote-instances
'((:machine-instance "survey-metalisp"
:remote-host "survey.metalisp.dev"
:username "cl")
(:machine-instance "u1-marcsukammer"
:remote-host "u1.marcsukammer.dev"
:username "marcus")))
(mapc (lambda (instance)
(push (slime-create-filename-translator
:machine-instance (plist-get instance :machine-instance)
:remote-host (plist-get instance :remote-host)
:username (plist-get instance :username))
slime-filename-translations))
mk/slime-remote-instances)
;; syntax highlighting
(defvar slime-repl-font-lock-keywords lisp-font-lock-keywords-2)
(defun slime-repl-font-lock-setup ()
(setq font-lock-defaults
'(slime-repl-font-lock-keywords
;; From lisp-mode.el
nil nil (("+-*/.<>=!?$%_&~^:@" . "w")) nil
(font-lock-syntactic-face-function . lisp-font-lock-syntactic-face-function))))
(add-hook 'slime-repl-mode-hook 'slime-repl-font-lock-setup)
(defadvice slime-repl-insert-prompt (after font-lock-face activate)
(let ((inhibit-read-only t))
(add-text-properties
slime-repl-prompt-start-mark (point)
'(font-lock-face
slime-repl-prompt-face
rear-nonsticky
(slime-repl-prompt read-only font-lock-face intangible))))))
(use-package elisp-mode
:ensure nil
:hook ((emacs-lisp-mode . prettify-symbols-mode)
(emacs-lisp-mode . (lambda ()
(face-remap-add-relative 'font-lock-function-name-face nil :underline t)
(face-remap-add-relative 'font-lock-keyword-face nil :slant 'italic))))
:mode (("\\.el$" . emacs-lisp-mode))
:config
(setq-local lisp-indent-function 'lisp-indent-function)
(setq-local fill-column 84))
(use-package lisp-mode
:ensure nil
:hook ((lisp-mode . (lambda ()
(face-remap-add-relative 'font-lock-function-name-face nil :underline t)
(face-remap-add-relative 'font-lock-keyword-face nil :slant 'italic))))
:mode (("\\.lisp$" . lisp-mode)
("\\.lsp$" . lisp-mode)
("\\.cl$" . lisp-mode))
:init
(setq inferior-lisp-program "sbcl --noinform")
:config
(setq-local lisp-indent-function 'common-lisp-indent-function)
(setq-local fill-column 84)
(defvar g-cl-function-names
'("*" "+" "-" "/" "/=" "1+" "1-" "<" "<=" "=" ">"
">=" "abort" "abs" "acons" "acos" "acosh" "add-method" "adjoin"
"adjust-array" "adjustable-array-p" "allocate-instance" "alpha-char-p"
"alphanumericp" "and" "append" "apply" "apropos" "apropos-list" "aref"
"arithmetic-error-operands" "arithmetic-error-operation" "array-dimension"
"array-dimensions" "array-displacement" "array-element-type"
"array-has-fill-pointer-p" "array-in-bounds-p" "array-rank"
"array-row-major-index" "array-total-size" "arrayp" "ash" "asin" "asinh"
"assert" "assoc" "assoc-if" "assoc-if-not" "atan" "atanh" "atom" "bit"
"bit-and" "bit-andc1" "bit-andc2" "bit-eqv" "bit-ior" "bit-nand" "bit-nor"
"bit-not" "bit-orc1" "bit-orc2" "bit-vector-p" "bit-xor" "block" "boole"
"both-case-p" "boundp" "break" "broadcast-stream-streams" "butlast" "byte"
"byte-position" "byte-size" "caaaar" "caaadr" "caaar" "caadar" "caaddr"
"caadr" "caar" "cadaar" "cadadr" "cadar" "caddar" "cadddr" "caddr" "cadr"
"call-method" "car" "case" "catch" "ccase" "cdaaar" "cdaadr" "cdaar"
"cdadar" "cdaddr" "cdadr" "cdar" "cddaar" "cddadr" "cddar" "cdddar" "cddddr"
"cdddr" "cddr" "cdr" "ceiling" "cell-error-name" "cerror" "change-class"
"char" "char-code" "char-downcase" "char-equal" "char-greaterp" "char-int"
"char-lessp" "char-name" "char-not-equal" "char-not-greaterp"
"char-not-lessp" "char-upcase" "char/=" "char<" "char<=" "char=" "char>"
"char>=" "character" "characterp" "check-type" "cis" "class-name" "class-of"
"clear-input" "clear-output" "close" "clrhash" "code-char" "coerce"
"compile" "compile-file" "compile-file-pathname" "compiled-function-p"
"compiler-macro-function" "complement" "complex" "complexp"
"compute-applicable-methods" "compute-restarts" "concatenate"
"concatenated-stream-streams" "cond" "conjugate" "cons" "consp" "constantly"
"constantp" "continue" "copy-alist" "copy-list" "copy-pprint-dispatch"
"copy-readtable" "copy-seq" "copy-structure" "copy-symbol" "copy-tree" "cos"
"cosh" "count" "count-if" "count-if-not" "ctypecase" "decf" "declaim"
"decode-float" "decode-universal-time" "defclass" "defconstant" "defgeneric"
"define-compiler-macro" "define-condition" "define-method-combination"
"define-modify-macro" "define-setf-expander" "define-symbol-macro"
"defmacro" "defmethod" "defpackage" "defparameter" "defsetf" "defstruct"
"deftype" "defun" "defvar" "delete" "delete-duplicates" "delete-file"
"delete-if" "delete-if-not" "delete-package" "denominator" "deposit-field"
"describe" "describe-object" "destructuring-bind" "digit-char"
"digit-char-p" "directory" "directory-namestring" "disassemble" "do" "do*"
"do-all-symbols" "do-external-symbols" "do-symbols" "documentation" "dolist"
"dotimes" "dpb" "dribble" "ecase" "echo-stream-input-stream"
"echo-stream-output-stream" "ed" "eighth" "elt" "encode-universal-time"
"endp" "enough-namestring" "ensure-directories-exist"
"ensure-generic-function" "eq" "eql" "equal" "equalp" "error" "etypecase"
"eval" "eval-when" "evenp" "every" "exp" "export" "expt" "fboundp"
"fceiling" "fdefinition" "ffloor" "fifth" "file-author"
"file-error-pathname" "file-length" "file-namestring" "file-position"
"file-string-length" "file-write-date" "fill" "fill-pointer" "find"
"find-all-symbols" "find-class" "find-if" "find-if-not" "find-method"
"find-package" "find-restart" "find-symbol" "finish-output" "first" "flet"
"float" "float-digits" "float-precision" "float-radix" "float-sign" "floatp"
"floor" "fmakunbound" "force-output" "format" "formatter" "fourth"
"fresh-line" "fround" "ftruncate" "funcall" "function" "function-keywords"
"function-lambda-expression" "functionp" "gcd" "gensym" "gentemp" "get"
"get-decoded-time" "get-dispatch-macro-character" "get-internal-real-time"
"get-internal-run-time" "get-macro-character" "get-output-stream-string"
"get-properties" "get-setf-expansion" "get-universal-time" "getf" "gethash"
"go" "graphic-char-p" "handler-bind" "handler-case" "hash-table-count"
"hash-table-p" "hash-table-rehash-size" "hash-table-rehash-threshold"
"hash-table-size" "hash-table-test" "host-namestring" "identity" "if"
"ignore-errors" "imagpart" "import" "in-package" "incf"
"initialize-instance" "input-stream-p" "inspect" "integer-decode-float"
"integer-length" "integerp" "interactive-stream-p" "intern" "intersection"
"invalid-method-error" "invoke-debugger" "invoke-restart"
"invoke-restart-interactively" "isqrt" "keywordp" "labels" "lambda" "last"
"lcm" "ldb" "ldb-test" "ldiff" "length" "let" "let*"
"lisp-implementation-type" "lisp-implementation-version" "list" "list*"
"list-all-packages" "list-length" "listen" "listp" "load"
"load-logical-pathname-translations" "load-time-value" "locally" "log"
"logand" "logandc1" "logandc2" "logbitp" "logcount" "logeqv"
"logical-pathname" "logical-pathname-translations" "logior" "lognand"
"lognor" "lognot" "logorc1" "logorc2" "logtest" "logxor" "long-site-name"
"loop" "loop-finish" "lower-case-p" "machine-instance" "machine-type"
"machine-version" "macro-function" "macroexpand" "macroexpand-1" "macrolet"
"make-array" "make-broadcast-stream" "make-concatenated-stream"
"make-condition" "make-dispatch-macro-character" "make-echo-stream"
"make-hash-table" "make-instance" "make-instances-obsolete" "make-list"
"make-load-form" "make-load-form-saving-slots" "make-package"
"make-pathname" "make-random-state" "make-sequence" "make-string"
"make-string-input-stream" "make-string-output-stream" "make-symbol"
"make-synonym-stream" "make-two-way-stream" "makunbound" "map" "map-into"
"mapc" "mapcan" "mapcar" "mapcon" "maphash" "mapl" "maplist" "mask-field"
"max" "member" "member-if" "member-if-not" "merge" "merge-pathnames"
"method-combination-error" "method-qualifiers" "min" "minusp" "mismatch"
"mod" "muffle-warning" "multiple-value-bind" "multiple-value-call"
"multiple-value-list" "multiple-value-prog1" "multiple-value-setq"
"name-char" "namestring" "nbutlast" "nconc" "nintersection" "ninth"
"no-applicable-method" "no-next-method" "not" "notany" "notevery" "nreconc"
"nreverse" "nset-difference" "nset-exclusive-or" "nstring-capitalize"
"nstring-downcase" "nstring-upcase" "nsublis" "nsubst" "nsubst-if"
"nsubst-if-not" "nsubstitute" "nsubstitute-if" "nsubstitute-if-not" "nth"
"nth-value" "nthcdr" "null" "numberp" "numerator" "nunion" "oddp" "open"
"open-stream-p" "or" "output-stream-p" "package-error-package"
"package-name" "package-nicknames" "package-shadowing-symbols"
"package-use-list" "package-used-by-list" "packagep" "pairlis"
"parse-integer" "parse-namestring" "pathname" "pathname-device"
"pathname-directory" "pathname-host" "pathname-match-p" "pathname-name"
"pathname-type" "pathname-version" "pathnamep" "peek-char" "phase" "plusp"
"pop" "position" "position-if" "position-if-not" "pprint" "pprint-dispatch"
"pprint-exit-if-list-exhausted" "pprint-fill" "pprint-indent"
"pprint-linear" "pprint-logical-block" "pprint-newline" "pprint-pop"
"pprint-tab" "pprint-tabular" "prin1" "prin1-to-string" "princ"
"princ-to-string" "print" "print-not-readable-object" "print-object"
"print-unreadable-object" "probe-file" "proclaim" "prog" "prog*" "prog1"
"prog2" "progn" "progv" "provide" "psetf" "psetq" "push" "pushnew" "quote"
"random" "random-state-p" "rassoc" "rassoc-if" "rassoc-if-not" "rational"
"rationalize" "rationalp" "read" "read-byte" "read-char" "read-char-no-hang"
"read-delimited-list" "read-from-string" "read-line"
"read-preserving-whitespace" "read-sequence" "readtable-case" "readtablep"
"realp" "realpart" "reduce" "reinitialize-instance" "rem" "remf" "remhash"
"remove" "remove-duplicates" "remove-if" "remove-if-not" "remove-method"
"remprop" "rename-file" "rename-package" "replace" "require" "rest"
"restart-bind" "restart-case" "restart-name" "return" "return-from"
"revappend" "reverse" "room" "rotatef" "round" "row-major-aref" "rplaca"
"rplacd" "sbit" "scale-float" "schar" "search" "second" "set"
"set-difference" "set-dispatch-macro-character" "set-exclusive-or"
"set-macro-character" "set-pprint-dispatch" "set-syntax-from-char" "setf"
"setq" "seventh" "shadow" "shadowing-import" "shared-initialize" "shiftf"
"short-site-name" "signal" "signum" "simple-bit-vector-p"
"simple-condition-format-arguments" "simple-condition-format-control"
"simple-string-p" "simple-vector-p" "sin" "sinh" "sixth" "sleep"
"slot-boundp" "slot-exists-p" "slot-makunbound" "slot-missing"
"slot-unbound" "slot-value" "software-type" "software-version" "some" "sort"
"special-operator-p" "sqrt" "stable-sort" "standard-char-p" "step"
"store-value" "stream-element-type" "stream-error-stream"
"stream-external-format" "streamp" "string" "string-capitalize"
"string-downcase" "string-equal" "string-greaterp" "string-left-trim"
"string-lessp" "string-not-equal" "string-not-greaterp" "string-not-lessp"
"string-right-trim" "string-trim" "string-upcase" "string/=" "string<"
"string<=" "string=" "string>" "string>=" "stringp" "sublis" "subseq"
"subsetp" "subst" "subst-if" "subst-if-not" "substitute" "substitute-if"
"substitute-if-not" "subtypep" "svref" "sxhash" "symbol-function"
"symbol-macrolet" "symbol-name" "symbol-package" "symbol-plist"
"symbol-value" "symbolp" "synonym-stream-symbol" "tagbody" "tailp" "tan"
"tanh" "tenth" "terpri" "the" "third" "throw" "time" "trace"
"translate-logical-pathname" "translate-pathname" "tree-equal" "truename"
"truncate" "two-way-stream-input-stream" "two-way-stream-output-stream"
"type-error-datum" "type-error-expected-type" "type-of" "typecase" "typep"
"unbound-slot-instance" "unexport" "unintern" "union" "unless" "unread-char"
"untrace" "unuse-package" "unwind-protect"
"update-instance-for-different-class" "update-instance-for-redefined-class"
"upgraded-array-element-type" "upgraded-complex-part-type" "upper-case-p"
"use-package" "use-value" "user-homedir-pathname" "values" "values-list"
"vector" "vector-pop" "vector-push" "vector-push-extend" "vectorp" "warn"
"when" "wild-pathname-p" "with-accessors" "with-compilation-unit"
"with-condition-restarts" "with-hash-table-iterator"
"with-input-from-string" "with-open-file" "with-open-stream"
"with-output-to-string" "with-package-iterator" "with-simple-restart"
"with-slots" "with-standard-io-syntax" "write" "write-byte" "write-char"
"write-line" "write-sequence" "write-string" "write-to-string" "y-or-n-p"
"yes-or-no-p" "zerop"))
(defvar g-cl-value-names
'("*" "**" "***" "*break-on-signals*"
"*compile-file-pathname*" "*compile-file-truename*" "*compile-print*"
"*compile-verbose*" "*debug-io*" "*debugger-hook*"
"*default-pathname-defaults*" "*error-output*" "*features*"
"*gensym-counter*" "*load-pathname*" "*load-print*" "*load-truename*"
"*load-verbose*" "*macroexpand-hook*" "*modules*" "*package*"
"*print-array*" "*print-base*" "*print-case*" "*print-circle*"
"*print-escape*" "*print-gensym*" "*print-length*" "*print-level*"
"*print-lines*" "*print-miser-width*" "*print-pprint-dispatch*"
"*print-pretty*" "*print-radix*" "*print-readably*" "*print-right-margin*"
"*query-io*" "*random-state*" "*read-base*" "*read-default-float-format*"
"*read-eval*" "*read-suppress*" "*readtable*" "*standard-input*"
"*standard-output*" "*terminal-io*" "*trace-output*" "+" "++" "+++" "-" "/"
"//" "///" "array-dimension-limit" "array-rank-limit"
"array-total-size-limit" "boole-1" "boole-2" "boole-and" "boole-andc1"
"boole-andc2" "boole-c1" "boole-c2" "boole-clr" "boole-eqv" "boole-ior"
"boole-nand" "boole-nor" "boole-orc1" "boole-orc2" "boole-set" "boole-xor"
"call-arguments-limit" "char-code-limit" "double-float-epsilon"
"double-float-negative-epsilon" "internal-time-units-per-second"
"lambda-list-keywords" "lambda-parameters-limit"
"least-negative-double-float" "least-negative-long-float"
"least-negative-normalized-double-float"
"least-negative-normalized-long-float"
"least-negative-normalized-short-float"
"least-negative-normalized-single-float" "least-negative-short-float"
"least-negative-single-float" "least-positive-double-float"
"least-positive-long-float" "least-positive-normalized-double-float"
"least-positive-normalized-long-float"
"least-positive-normalized-short-float"
"least-positive-normalized-single-float" "least-positive-short-float"
"least-positive-single-float" "long-float-epsilon"
"long-float-negative-epsilon" "most-negative-double-float"
"most-negative-fixnum" "most-negative-long-float"
"most-negative-short-float" "most-negative-single-float"
"most-positive-double-float" "most-positive-fixnum"
"most-positive-long-float" "most-positive-short-float"
"most-positive-single-float" "multiple-values-limit" "nil" "pi"
"short-float-epsilon" "short-float-negative-epsilon" "single-float-epsilon"
"single-float-negative-epsilon" "t"))
(defface g-cl-character-face
'((default :inherit font-lock-constant-face))
"The face used to highlight Common Lisp character literals.")
(defface g-cl-standard-function-face
'((default :inherit font-lock-keyword-face))
"The face used to highlight standard Common Lisp function symbols.")
(defface g-cl-standard-value-face
'((default :inherit font-lock-variable-name-face))
"The face used to highlight standard Common Lisp value symbols.")
(defvar g-cl-font-lock-keywords
(let* ((character-re (concat "#\\\\" lisp-mode-symbol-regexp "\\_>"))
(function-re (concat "(" (regexp-opt g-cl-function-names t) "\\_>"))
(value-re (regexp-opt g-cl-value-names 'symbols)))
`((,character-re . 'g-cl-character-face)
(,function-re
(1 'g-cl-standard-function-face))
(,value-re . 'g-cl-standard-value-face))))
(defvar g-cl-font-lock-defaults
'((g-cl-font-lock-keywords)
nil ; enable syntaxic highlighting
t ; case insensitive highlighting
nil ; use the lisp-mode syntax table
(font-lock-mark-block-function . mark-defun)
(font-lock-extra-managed-props help-echo)
(font-lock-syntactic-face-function
. lisp-font-lock-syntactic-face-function)))
(defun g-init-lisp-font-lock ()
(setq font-lock-defaults g-cl-font-lock-defaults))
(add-hook 'lisp-mode-hook 'g-init-lisp-font-lock))
(use-package common-lisp-snippets
:after yasnippet)
(when (eq system-type 'gnu/linux)
(use-package geiser
:init
(setq geiser-repl-prompt-read-only t)
(setq geiser-repl-highlight-error-messages t)
(setq geiser-active-implementations '(racket guile))
(setq geiser-default-implementation 'guile)
:hook (scheme-mode . geiser-mode)))
;; (use-package racket-mode
;; :mode "\\.rkt\\'")
;; (use-package geiser-racket
;; :defer t
;; :after geiser
;; :config
;; (when (eq system-type 'windows-nt)
;; (setq geiser-racket-binary "c:/Program Files/Racket/Racket.exe")))
(when (eq system-type 'gnu/linux)
(use-package geiser-guile
:defer t
:after geiser
:custom (geiser-guile-binary "guile")))
;; (use-package ac-slime
;; :after (slime auto-complete)
;; :config
;; (add-hook 'slime-mode-hook 'set-up-slime-ac)
;; (add-hook 'slime-repl-mode-hook 'set-up-slime-ac))
(use-package paredit
:hook ((emacs-lisp-mode . paredit-mode)
(eval-expression-minibuffer-setup . paredit-mode)
(ielm-mode . paredit-mode)
(lisp-mode . paredit-mode)
(lisp-interaction-mode . paredit-mode)
(scheme-mode . paredit-mode))
:bind (:map paredit-mode-map
("M-s" . nil)
("C-M-s" . paredit-splice-sexp)))

View file

@ -1,226 +0,0 @@
(defvar mk/useful-websites
'(("https://regexr.com/" regex debug)
("https://regex101.com/" regex debug)
("https://www.regextester.com/" regex debug)
("https://extendsclass.com/regex-tester.html#python" regex debug)
("https://everything.curl.dev/" curl tool)))
(defvar mk/mirror-website
"Locally mirror a website using `wget -mkEpnp <url>`")
(defvar mk/useful-regex
'(("match any word or space that precedes the :" . "[\\w\\s]+:")
("search for anything in square brackets" . "\\[.*\\]")
("upper and lowercase English alphabet" . "[A-Za-z]+")
("numbers from 0 to 9" . "[0-9]")
("upper and lowercase English alphabet, - and ." . "[A-Za-z\\-\\.]+")
("a, - and z" . "(a-z)")
("spaces or a comma" . "(\\s+|,)")
("find hashtags" . "#\\w+")
("matches both mentions (@) and hashtags" . "([@|#]\\w+)")
("email regex" . "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$")
("matching decimal numbers" . "-?\\d+(\\.\\d*)?")
("matching urls" . "(?:http|https|ftp|mailto|file|data|irc):\\/\\/[A-Za-z0-9\\-]{0,63}(\\.[A-Za-z0-9\\-]{0,63})+(:\\d{1,4})?\\/*(\\/*[A-Za-z0-9\\-._]+\\/*)*(\\?.*)?(#.*)?")
("matching dates yyyy/mm/dd" . "^\\d{4}/(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01])$")
("matching dates mm/dd/yyyy" . "^(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01])/\\d{4}$")
("matching dates dd/mm/yyyy" . "^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[0-2])/\\d{4}$")
("matching HTML" . "<.+>")
("matching specific tags" . "</?(?:p|a|b|img)(?: /)?>")
("ISO 8601 Date Format (YYYY-MM-DD)" . "\\([0-9]{4}\\)-\\([0-1][0-9]\\)-\\([0-3][0-9]\\)")))
;; (defun mk-show-modeline ()
;; (interactive)
;; (setq mode-line-format
;; '(("-" mode-line-mule-info
;; mode-line-modified
;; mode-line-frame-identification
;; mode-line-buffer-identification " "
;; mode-line-position
;; mode-line-modes
;; (which-func-mode
;; ("" which-func-format "--"))
;; (global-mode-string
;; ("--" global-mode-string)) "-%-")))
;; (defvar mode-line-format-current
;; (symbol-value 'mode-line-format)))
;; (defun mk-hide-modeline ()
;; (interactive)
;; (setq mode-line-format nil))
;; (defun mk-write-mode-enable ()
;; (setq olivetti-body-width 73)
;; (olivetti-mode)
;; (mk-hide-modeline))
;; (defun mk-write-mode-disable ()
;; (olivetti-mode)
;; (mk-show-modeline))
(defun mk/split-windows-horizontal (count-windows)
"Split windows horizontal by equal width."
(interactive "nHow many splits? ")
(delete-other-windows)
(let ((width (/ (window-total-width) count-windows)))
(dotimes (i (1- count-windows))
(split-window-right (- width)))))
(defun mk/split-windows-vertical (count-windows)
"Split windows vertical by equal width."
(interactive "nHow many splits? ")
(delete-other-windows)
(let ((height (/ (window-total-height) count-windows)))
(dotimes (i (1- count-windows))
(split-window-below (- height)))))
(defun mk/split-h3 ()
(interactive)
(mk/split-windows-horizontal 3))
(defun mk/split-v3 ()
(interactive)
(mk/split-windows-vertical 3))
;; Set transparency of emacs
(defun transparency (value)
"Sets the transparency of the frame window. 0=transparent/100=opaque"
(interactive "nTransparency Value 0 - 100 opaque: ")
(set-frame-parameter (selected-frame) 'alpha value))
(defun mk/show-agenda-list ()
(if (display-graphic-p)
(add-hook 'after-init-hook (lambda () (org-agenda-list) (me/split-h3)))
(org-agenda-list)))
(defun mk/list-files (folder suffix)
(let ((regexp (concat "\\." suffix "$")))
(directory-files folder nil regexp)))
(defun mk/build-file-suffix ())
(defun mk/copy-files (src-dir dst-dir suffix)
(let ((src-files '())
(src-dir (expand-file-name src-dir))
(dst-dir (expand-file-name dst-dir)))
(dolist (file (mk/list-files src-dir suffix) src-files)
(let ((src-file (expand-file-name (concat src-dir "/" file)))
(dst-file (expand-file-name (concat dst-dir "/" file))))
(add-to-list 'src-files src-file)
(copy-file src-file dst-file t)))))
(defun mk/delete-files (lst)
(dolist (file lst)
(delete-file file t)))
;; (defun shr-insert (text)
;; (when (and (not (bolp))
;; (get-text-property (1- (point)) 'image-url))
;; (insert "\n"))
;; (cond
;; ((eq shr-folding-mode 'none)
;; (let ((start (point)))
;; (insert text)
;; (save-restriction
;; (narrow-to-region start (point))
;; (shr--translate-insertion-chars)
;; (goto-char (point-max)))))
;; (t
;; (let ((font-start (point)))
;; (when (and (string-match "\\`[ \t\n\r]" text)
;; (not (bolp))
;; (not (eq (char-after (1- (point))) ? )))
;; (insert " "))
;; (let ((start (point))
;; (bolp (bolp)))
;; (insert text)
;; (save-restriction
;; (narrow-to-region start (point))
;; (goto-char start)
;; (when (looking-at "[\t\n\r]+")
;; (replace-match "" t t))
;; (while (re-search-forward "[\t\n\r]+" nil t)
;; (replace-match " " t t))
;; (goto-char start)
;; (while (re-search-forward " +" nil t)
;; (replace-match " " t t))
;; (shr--translate-insertion-chars)
;; (goto-char (point-max)))
;; ;; We may have removed everything we inserted if it was just
;; ;; spaces.
;; (unless (= font-start (point))
;; ;; Mark all lines that should possibly be folded afterwards.
;; (when bolp
;; (shr-mark-fill start))
;; (when shr-use-fonts
;; (put-text-property font-start (point)
;; 'face
;; (or shr-current-font 'variable-pitch)))))))))
(defun mk/get-current-time-formatted ()
(concat "#+DATE: "
(format "[%s]" (format-time-string "%Y-%m-%d %R" (current-time)))))
(defun mk/generate-unique-id ()
(interactive)
(let ((random-number-1 (random 9999))
(random-number-2 (random 9999)))
(let ((unique-id (format "DE-%04d-%04d" random-number-1 random-number-2)))
(message "ID: %s" unique-id) unique-id)))
(defmacro mk/open-html-page (name path buffer-name)
"Make interactive functions to call important docs"
`(defun ,name ()
(interactive)
(eww (concat "file://"
(and (eq system-type 'windows-nt)
"/")
(expand-file-name ,path)))
(rename-buffer ,buffer-name)))
(mk/open-html-page mk/clsite-clm
"~/cl-sites/www.cs.cmu.edu/Groups/AI/html/cltl/clm/node1.html"
"*mk/clsite-clm*")
(mk/open-html-page mk/clsite-pcl
"~/cl-sites/gigamonkeys.com/book/index.html"
"*mk/clsite-pcl*")
(mk/open-html-page mk/clsite-clcb
"~/cl-sites/lispcookbook.github.io/cl-cookbook/index.html"
"*mk/clsite-clcb*")
(mk/open-html-page mk/clsite-sqlite
"~/cl-sites/sqlite-doc-3440000/index.html"
"*mk/clsite-sqlite*")
(mk/open-html-page mk/clsite-asdf
"~/cl-sites/asdf.common-lisp.dev/index.html"
"*mk/clsite-asdf*")
(mk/open-html-page mk/clsite-lisp-docs
"~/cl-sites/lisp-docs.github.io/index.html"
"*mk/clsite-lisp-docs*")
(mk/open-html-page mk/clsite-bgnet
"~/cl-sites/bgnet/index.html"
"*mk/clsite-bgnet*")
(mk/open-html-page mk/clsite-tbnl
"~/cl-sites/edicl.github.io/hunchentoot/index.html"
"*mk/clsite-tbnl*")
(defun mk/wget-mirror-site (url)
"Use wget to mirror a website for offline use. Takes a URL as argument."
(interactive "sEnter the URL to mirror: ")
(let ((cmd (format "wget --mirror --convert-links --adjust-extension --page-requisites --no-parent %s" url)))
(async-shell-command cmd)))
(defun mk/get-auth-source-key (host key)
"Retrieve the API key using 'auth-source'."
(require 'auth-source)
(let* ((auth-source-creation-prompts
'((secret . (format "API key for %s@%s: " key host))))
(found (nth 0 (auth-source-search
:max 1
:host host
:user key
:require '(:secret)
:create t)))
(secret (plist-get found :secret)))
(if (functionp secret)
(funcall secret)
secret)))

View file

@ -1,98 +0,0 @@
(use-package elfeed
:bind ("C-x w" . elfeed)
:init
(setq elfeed-feeds
'(("https://netzpolitik.org/feed/" netz politik news)
("https://www.marcuskammer.dev/weblog/index.xml" personal)
("https://www.guyrutenberg.com/feed/" linux blog)
("https://blog.mozilla.org/en/feed/" browser web)
("https://blog.chromium.org/feeds/posts/default" browser web)
("https://hacks.mozilla.org/feed/" browser web)
("https://mailbox.org/share/feed-de-mailbox.xml" email mailbox web)
("https://feeds.feedburner.com/GoogleWebFonts" fonts blog google)
("https://twobithistory.org/feed.xml" history blog coding)
("https://blog.getbootstrap.com/feed.xml" web bootstrap blog)
("https://blog.mozilla.org/en/feed/" web firefox blog)
("https://fsfe.org/news/news.de.rss" fsfe news free-software)
("https://planet.lisp.org/rss20.xml" planet lisp)
("https://emacsconf.org/index.atom" emacs lisp conference)
("https://jameshunt.us/feeds/main" lisp blog)
("https://xenodium.com/rss.xml" emacs blog)
("https://stevelosh.com/rss.xml" lisp blog personal)
("https://planet.lisp.org/rss20.xml" lisp blogs)
("https://m-x-erlangen.gitlab.io/atom.xml" lisp meetup)
("https://takeonrules.com/index.atom" lisp emacs blog)
("https://emacsredux.com/atom.xml" emacs blog)
("https://planet.emacslife.com/atom.xml" emacs)
("https://yiming.dev/rss.xml" coding emacs lisp blog)
("https://endlessparentheses.com/atom.xml" emacs elisp blog)
("https://www.philnewton.net/blog/feed/" emacs blog)
("https://emacsredux.com/atom.xml" emacs blog)
("https://marcus3santos.github.io/index.xml" emacs blog)
("https://olddeuteronomy.github.io/index.xml" emacs blog)
("https://www.colinmclear.net/posts/index.xml" research emacs blog)
("https://howardism.org/index.xml" emacs blog)
("https://www.timmons.dev/rss.xml" lisp blog)
("https://batsov.com/atom.xml" lisp emacs blog)
("https://notes.eatonphil.com/rss.xml" lisp emacs blog)
("https://stackoverflow.com/feeds/tag?tagnames=hunchentoot&sort=newest" lisp stackoverflow)
("https://stackoverflow.com/feeds/tag?tagnames=common-lisp&sort=newest" lisp stackoverflow)
("https://stackoverflow.com/feeds/tag?tagnames=elisp&sort=newest" lisp emacs stackoverflow)
("https://stackoverflow.com/feeds/tag?tagnames=org-mode&sort=newest" emacs orgmode stackoverflow)
("https://stackoverflow.com/feeds/tag?tagnames=xmpp&sort=newest" xmpp stackoverflow)
;("https://stackoverflow.com/feeds/tag?tagnames=postgresql&sort=newest" sql stackoverflow)
;("https://stackoverflow.com/feeds/tag?tagnames=mariadb&sort=newest" sql stackoverflow)
("https://stackoverflow.com/feeds/tag?tagnames=guile&sort=newest" guile scheme lisp stackoverflow)
("https://stackoverflow.com/feeds/tag?tagnames=sbcl&sort=newest" sbcl lisp stackoverflow)
("https://stackoverflow.com/feeds/tag?tagnames=sbcl+emacs&sort=newest" sbcl emacs lisp stackoverflow)
("https://stackoverflow.com/feeds/tag?tagnames=sbcl+common-lisp+linux&sort=newest" sbcl lisp linux stackoverflow)
("https://sourceforge.net/p/sbcl/activity/feed" lisp sbcl)
("https://fukamachi.hashnode.dev/rss.xml" lisp blog)
("https://sourceforge.net/projects/sbcl/rss?path=/sbcl" lisp sbcl sourceforge)
("https://threatpost.com/feed/" security)
("https://krebsonsecurity.com/feed/" security blog)
("https://www.schneier.com/feed/atom/" security blog)
("https://userlutions.com/feed/" ux usability blog)
("https://www.nngroup.com/feed/rss/" ux design)
("https://feedpress.me/UXmatters" ux design)
("https://uxmovement.com/feed" ux design)
("https://www.uxbeginner.com/feed/" ux design)
("https://jeffgothelf.com/feed/" lean ux design blog)
("https://uxwritinghub.com/feed/" ux writing blog)
("https://www.w3.org/WAI/feed.xml" ux wai aria w3c)
("https://measuringu.com/feed/" ux blog)
("https://ux.stackexchange.com/feeds" ux stackexchange)
("https://emacs.stackexchange.com/feeds" emacs stackexchange)
("https://www.mdr.de/nachrichten/podcast/general/russland-angriff-krieg-ukraine100-podcast.xml" krieg ukraine podcast)
("https://www.deutschlandfunk.de/umwelt-und-verbraucher-100.rss" umwelt verbraucher klima podcast)
("https://jung-naiv.podigee.io/feed/mp3" politik podcast)
("https://www.ndr.de/nachrichten/info/podcast4696.xml" podcast umwelt klima)
("https://ct-uplink.podigee.io/feed/mp3" podcast technik computer)
("https://feeds.soundcloud.com/users/soundcloud:users:261098918/sounds.rss" podcast osint)
("https://hacks.mozilla.org/feed/" blog firefox web)
("https://karthinks.com/index.xml" blog emacs)
("https://www.destatis.de/SiteGlobals/Functions/RSSFeed/DE/RSSNewsfeed/Aktuell.xml" destatis aktuelles presse)
("http://www.umweltbundesamt.de/rss/presse" uba aktuelles presse)
("https://www.test.de/rss/geldanlage-banken/" test geld finanzen)
("https://www.test.de/rss/steuern-recht/" test steuern recht)
("https://thefetishistas.com/feed/" latex fetish news)
("https://tonsky.me/atom.xml" blog computer)
("https://www.copernicus.eu/news/rss" klima)
("https://gegenblende.dgb.de/@@rss?count=10&feed=b3b8f76e-53f1-11e6-a380-525400e5a74a" arbeit gewerkschaft news)
("https://drewdevault.com/blog/index.xml" blog programming computer)
("https://www.inverse.com/rss" culture magazin journalism)
("https://inkppl.com/en/rss.xml" tattoo magazin people culture)
("https://novaramedia.com/feed/" politics capitalism climate left media)
("https://www.youtube.com/feeds/videos.xml?channel_id=UCN29LJGZ8FY30ysxdTnDsaw" youtube video)
("https://www.youtube.com/feeds/videos.xml?channel_id=UC5Ghe5TBQGYIOANuiNW4hDQ" youtube video)
("https://www.youtube.com/feeds/videos.xml?channel_id=UC0p5jTq6Xx_DosDFxVXnWaQ" youtube video)
("https://www.youtube.com/feeds/videos.xml?channel_id=UC0p5jTq6Xx_DosDFxVXnWaQ" youtube video)
("https://www.vag.de/rss/meldungen" ubahn opnv vag)
("https://feeds.feedblitz.com/sethsblog" management author blog)
("https://ourworldindata.org/atom-data-insights.xml" data world)
("https://ourworldindata.org/atom.xml" data world)
))
(setq elfeed-search-filter "@7-day-ago +unread")
(let ((feeds (expand-file-name "~/feeds.el")))
(when (file-exists-p feeds)
(load-file feeds))))

View file

@ -1,560 +0,0 @@
(use-package org
:ensure nil
:hook ((org-mode . turn-on-auto-fill))
:init (org-clock-persistence-insinuate)
:bind
(("C-c l" . org-store-link)
("C-c a" . org-agenda)
("C-c c" . org-capture)
("C-c b" . org-switchb))
:init
(org-babel-lob-ingest "~/.emacs.d/library-of-babel.org")
(setq org-capture-templates '())
:custom
(abbrev-suggest t)
(org-hide-block-startup t)
(org-hide-emphasis-markers nil)
(org-default-notes-file "notes.org")
(org-insert-mode-line-in-empty-file t)
(org-adapt-indentation nil)
(org-agenda-prefix-format
'((agenda . " %i %-12:c%?-12t%-6e% s")
(todo . " %i %-12:c %-6e")
(tags . " %i %-12:c")
(search . " %i %-12:c")))
(org-agenda-dim-blocked-tasks nil)
(org-agenda-inhibit-startup nil)
(org-agenda-span 14)
(org-agenda-start-on-weekday 1)
(org-agenda-include-diary t)
(org-clock-out-remove-zero-time-clocks t)
(org-clock-persist t)
(org-clock-rounding-minutes 30)
(org-confirm-babel-evaluate nil)
(org-duration-format (quote h:mm))
(org-export-dispatch-use-expert-ui nil)
(org-export-default-language "en")
(org-export-with-smart-quotes t)
(org-export-with-emphasize t)
(org-export-with-special-strings t)
(org-export-with-fixed-width t)
(org-export-with-timestamps nil)
(org-export-preserve-breaks nil)
(org-export-with-sub-superscripts nil)
(org-export-with-archived-trees nil)
(org-export-with-author t)
(org-export-with-broken-links t)
(org-export-with-clocks nil)
(org-export-with-creator nil)
(org-export-with-drawers nil)
(org-export-with-date t)
(org-export-with-entities t)
(org-export-with-email t)
(org-export-with-footnotes t)
(org-export-headline-levels 3)
(org-export-with-inlinetasks nil)
(org-export-with-section-numbers t)
(org-export-with-planning nil)
(org-export-with-priority nil)
(org-export-with-properties nil)
(org-export-with-statistics-cookies nil)
(org-export-with-tags nil)
(org-export-with-tasks nil)
(org-export-with-latex t)
(org-export-time-stamp-file nil)
(org-export-with-title t)
(org-export-with-toc t)
(org-export-with-todo-keywords nil)
(org-export-with-tables t)
(org-export-date-timestamp-format "%a, %d %b %Y %R %z")
(org-export-backends '(ascii html latex md odt texinfo))
(org-global-properties '(("EFFORT_ALL" . "0:30 1:00 2:00 3:00 5:00 8:00")))
(org-html-doctype "html5")
(org-html-html5-fancy t)
(org-log-done (quote time))
(org-refile-targets '((nil :maxlevel . 3)))
(org-startup-folded t)
(org-startup-truncated nil)
(org-src-fontify-natively t)
(org-src-tab-acts-natively t)
(org-src-window-setup 'other-window)
(org-time-stamp-rounding-minutes '(30 30))
(org-todo-keywords
'((sequence "TODO" "DOING(!)" "DONE(!)")
(sequence "RECRUIT" "INTERVIEW" "QDA" "DOC" "REVIEW")))
(org-use-property-inheritance nil)
(org-attach-store-link-p 'attached)
(org-agenda-custom-commands
'(("p" "Projects"
((tags "PROJECT")))))
(org-latex-packages-alist
'(("" "listings")
("" "booktabs")
("AUTO" "polyglossia" t ("xelatex" "lualatex"))
("" "grffile")
("" "unicode-math")
("" "xcolor")
("expansion,protrusion=true" "microtype")))
;; Define the process to convert Org to PDF using XeLaTeX
(org-latex-pdf-process '("latexmk -lualatex -shell-escape -quiet -f %f"))
;; Set the compiler to XeLaTeX
(org-latex-compiler "lualatex")
(org-latex-tables-booktabs t)
(org-latex-images-centered t)
;; Enable listings and other table-related features
(org-latex-listings t)
;; Customize the appearance of listings (source code blocks)
(org-latex-listings-options
'(("basicstyle" "\\ttfamily\\color[rgb]{0.30, 0.34, 0.42}") ; nord3
("showstringspaces" "false")
("keywordstyle" "\\color[rgb]{0.23, 0.26, 0.32}\\textbf") ; nord1
("commentstyle" "\\color[rgb]{0.26, 0.30, 0.37}") ; nord2
("stringstyle" "\\color[rgb]{0.18, 0.20, 0.25}") ; nord0
("frame" "single")
("numbers" "left")
("numbersep" "5pt")
("numberstyle" "\\ttfamily\\color[rgb]{0.30, 0.34, 0.42}") ; nord3
("keepspaces" "true")
("showspaces" "false")
("showstringspaces" "false")
("showtabs" "false")
("breaklines" "true")
("breakatwhitespace" "false")
("tabsize" "2")
("columns" "fullflexible")))
(org-latex-inputenc-alist '((\"utf8\" . \"utf8x\")))
:config
(if (eq system-type 'windows-nt)
(setq org-babel-python-command "python")
(setq org-babel-python-command "python3"))
(setq time-stamp-active t
time-stamp-start "#\\+[dD][aA][tT][eE]: [\t]*"
time-stamp-end "$"
time-stamp-inserts t
time-stamp-format "[%Y-%m-%d %H:%M]")
(add-hook 'before-save-hook 'time-stamp nil)
;; (when (eq system-type 'windows-nt)
;; (setq org-babel-sqlite3-command "c:/msys64/ucrt64/bin/sqlite3.exe"))
(org-babel-do-load-languages
'org-babel-load-languages
'((emacs-lisp . t)
(lisp . t)
(gnuplot . t)
(python . t)
(sqlite . t)
(shell . t)
(plantuml . t)
(C . t)
(js . t)
(scheme . t)))
;; work with org-agenda dispatcher [c] "Today Clocked Tasks" to view today's clocked tasks.
(defun org-agenda-log-mode-colorize-block ()
"Set different line spacing based on clock time duration."
(save-excursion
(let* ((colors (cl-case (alist-get 'background-mode (frame-parameters))
('light (list "#d8dee9" "#e5e9f0" "#eceff4"))
('dark (list "#bf616a" "#d08770" "#ebcb8b" "#a3be8c" "#b48ead"))))
pos
duration)
(nconc colors colors)
(goto-char (point-min))
(while (setq pos (next-single-property-change (point) 'duration))
(goto-char pos)
(when (and (not (equal pos (point-at-eol)))
(setq duration (org-get-at-bol 'duration)))
;; larger duration bar height
(let ((line-height (if (< duration 15) 1.0 (+ 0.5 (/ duration 30))))
(ov (make-overlay (point-at-bol) (1+ (point-at-eol)))))
(overlay-put ov 'face `(:background ,(car colors) :foreground "black"))
(setq colors (cdr colors))
(overlay-put ov 'line-height line-height)
(overlay-put ov 'line-spacing (1- line-height))))))))
(add-hook 'org-agenda-finalize-hook #'org-agenda-log-mode-colorize-block))
;; Define custom LaTeX class with specific formatting
(with-eval-after-load 'ox-latex
(add-to-list 'org-latex-classes
'("koma-general"
"\\documentclass[a4paper,10pt,captions=tableheading,twoside=false]{scrartcl}
\\linespread{1.25}
% ~/.emacs.d/texmf/tex/latex/mycustomstyles/
\\usepackage{komageneral}"
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\subsubsection{%s}" . "\\subsubsection*{%s}")
("\\paragraph{%s}" . "\\paragraph*{%s}")
("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
(setq org-latex-default-class "koma-general"))
(setq org-html-protect-char-alist
'(("&" . "&amp;")
("<" . "&lt;")
(">" . "&gt;")
(":lambda:" . "&#955;")
(":python:" . "&#128013;")
(":whale:" . "&#128051;")
(":turtle:" . "&#x1f422;")
(":dash:" . "&#x1f4a8;")
(":party:" . "&#129395;")
(":see-no-evil:" . "&#128584;")
(":cloud:" . "&#9729;&#65039;")
(":abacus:" . "&#129518;")
(":desktop:" . "&#128421;&#65039;")
(":rocket:" . "&#128640;")
(":unicorn:" . "&#129412;")
(":recycling:" . "&#9851;")
(":crystalball:" . "&#128302;")
(":photography:" . "&#128247;")
(":money:" . "&#128181;")
(":-)" . "&#x1f60a;")
(":-(" . "&#x1f61e;")))
(defun mk/link-to-current-task ()
"Return an Org link to the current clocked-in task, if any, or prompt for manual entry."
(if (org-clock-is-active)
(with-current-buffer (marker-buffer org-clock-marker)
(save-excursion
(goto-char org-clock-marker)
(format ":TASK_ID: [[id:%s][%s]]" (org-id-get) (org-get-heading t t))))
(let ((manual-id (read-string "Enter Task ID (leave empty if not applicable): ")))
(unless (string-empty-p manual-id)
(format ":TASK_ID: [[id:%s][Task]]\n" manual-id)))))
;; Note Capture Template
;; Purpose: To capture general notes. These notes can optionally be linked to a currently clocked-in task.
;; Fields: Heading, optional task link, initial content, and a timestamp.
(add-to-list 'org-capture-templates
`("n" "Note" entry (file "notes.org")
,(concat "* %? :NOTE:\n"
":PROPERTIES:\n"
":ID: %(org-id-new)\n"
"%(mk/link-to-current-task)"
":END:\n"
"Entered on: %U\n")))
;; Task Capture Template
;; Purpose: To capture tasks and automatically assign a unique ID to each task.
;; Fields: Heading, unique ID, timestamp, and link to where the capture was made.
(add-to-list 'org-capture-templates
`("t" "Task" entry (file "agenda/tasks.org")
,(format "* TODO %%? :TASK:\n:PROPERTIES:\n:ID: %s\n:Project: %%^{Project}\n:END:\nEntered on %%U\n" (org-id-new))))
;; Journal Capture Template
;; Purpose: To capture end-of-day reflections.
;; Fields: Heading, timestamp, and prompts for what went well, what could be improved, and focus for tomorrow.
(add-to-list 'org-capture-templates
'("j" "Journal" entry (file+olp+datetree "agenda/journal.org")
"* %T - End of Day Reflection :JOURNAL:\n- Was ist heute gut gelaufen?\n %?\n- Was könnte verbessert werden?\n \n- Worauf konzentriere ich mich morgen?\n "
:empty-lines 1))
;; Appointment Capture Template
;; Purpose: To capture important events and appointments.
;; Fields: Heading, timestamp.
(add-to-list 'org-capture-templates
'("a" "Appointment" entry (file "agenda/appt.org")
"* %? \n%^{Date}t\n"))
;; Meeting Capture Template
;; Purpose: To capture meeting notes and automatically start a clock for time tracking.
;; Fields: Topic, timestamp, and additional notes.
(add-to-list 'org-capture-templates
'("m" "Meeting" entry (file "agenda/meetings.org")
"* %^{Topic} \n%T\n%?"
:clock-in t
:empty-lines 1))
;; Log Capture Template
;; Purpose: To capture activities in a chronological order and automatically start a clock for time tracking.
;; Fields: Timestamp, activity description.
(add-to-list 'org-capture-templates
'("l" "Log" entry (file+olp+datetree "logbook.org")
"* %T - %^{Activity} :LOG:\n%?"
:clock-in t
:empty-lines 1))
;; UTM Parameters Capture Template
;; Purpose: To capture UTM parameters for marketing tracking.
;; Fields: Campaign name, source, medium, term, and content.
(add-to-list 'org-capture-templates
'("u" "UTM Parameters" entry (file+headline "utm.org" "UTM Parameters")
"* %^{Campaign Name}\n:PROPERTIES:\n:Source: %^{utm_source}\n:Medium: %^{utm_medium}\n:Term: %^{utm_term}\n:Content: %^{utm_content}\n:END:\n"))
;; Bookmark Capture Template
;; Purpose: To capture bookmarks with tags and a timestamp.
;; Fields: URL, tags, timestamp.
(add-to-list 'org-capture-templates
'("b" "Bookmark" table-line (file+headline "bookmarks.org" "Bookmarks")
"| %^{URL} | %^{Tags} | %u |" :prepend t))
;; Code Snippet Capture Template
;; Purpose: To capture code snippets and specify the programming language.
;; Fields: Code snippet, language specification.
(add-to-list 'org-capture-templates
'("c" "Code Snippet" entry (file+headline "code.org" "Snippets")
"* %?\n#+begin_src %^{language}\n%i\n#+end_src"))
;; Capture Templates for Interviews
;;
;; The following capture templates are designed to facilitate the collection
;; of questions and insights for user interviews. Given the importance of
;; user-centered design in experience architecture, these templates aim to
;; streamline the preparation process for interviews.
;; Interview Sub-menu
;;
;; This entry serves as a sub-menu for all interview-related capture templates.
(add-to-list 'org-capture-templates
'("i" "Interviews"))
;; How Might We (HMW) Template
;;
;; This template is designed to capture "How Might We" questions that are often
;; used to frame problems and opportunities in user interviews. These questions
;; can be crucial for guiding the interview in a direction that yields
;; actionable insights.
(add-to-list 'org-capture-templates
'("ih" "How Might We" entry (file+headline "interviews.org" "HMW Questions")
"* WKW/HMW %? :HMW:\n%U\n:PROPERTIES:\n:Interviewee: %^{Interviewee}\n:Context: %^{Context}\n:END:"))
;; Interview Question Template
;;
;; Use this template to quickly capture questions that you intend to ask during
;; user interviews. The template prompts for the topic of the interview and
;; the project it is associated with, allowing for easy categorization and
;; retrieval later.
(add-to-list 'org-capture-templates
'("iq" "Interview Question" entry (file+headline "interviews.org" "Interview Questions")
"* %^{Interview Topic} :INTERVIEW:\n:PROPERTIES:\n:Project: %^{Project Name}\n:Date: %T\n:END:\n- %?\n"))
;; User Interview Quotes Capture Template
;; Purpose: To capture important quotes from user interviews.
;; Fields: Quote, Interviewee, Timestamp in Video, Project, Context
(add-to-list 'org-capture-templates
'("io" "Quote from User Interview" entry (file+headline "interviews.org" "Quotes")
"* %^{Quote} :QUOTE:\n:PROPERTIES:\n:Interviewee: %^{Interviewee}\n:Timestamp: %^{Timestamp in Video}\n:Project: %^{Project}\n:Context: %^{Context}\n:END:\n"))
;; Capture Templates for Project Management and Achievements
;;
;; These templates are designed to facilitate the tracking of project details
;; and individual achievements. Given the focus on agile methodologies and
;; continuous improvement, these templates aim to provide a structured way
;; to capture essential information.
;; Project Template
;;
;; This template captures the essential details of a new project. It prompts
;; for the project name, start date, and end date, and provides sections for
;; outlining the project's objectives and challenges. Each project is assigned
;; a unique ID for easy referencing.
(add-to-list 'org-capture-templates
`("p" "Project" entry (file "agenda/projects.org")
,(format "* %%^{Project Name} :PROJECT:\n:PROPERTIES:\n:ID: %s\n:Start Date: %%T\n:End Date: %%^{End Date}\n:END:\n** Objective\n%%?\n** Challenges\n- [ ] %%^{Challenge 1}\n- [ ] %%^{Challenge 2}\n" (org-id-new))))
;; Achievement Template
;;
;; This template is designed to capture individual achievements. It prompts for
;; the title of the achievement, the project it is associated with, and the date.
;; Additionally, it provides fields for describing the achievement, its impact,
;; and any associated tasks. This can be particularly useful for end-of-year
;; reviews or for maintaining a portfolio of accomplishments.
(add-to-list 'org-capture-templates
`("v" "Achievement" entry (file+olp+datetree "achievements.org")
,(concat "* %^{Achievement Title} :ACHIEVEMENT:\n"
":PROPERTIES:\n"
":Project: %^{Project}\n"
":Date: %T\n"
":END:\n"
"- Description: %?\n"
"- Impact: %^{Impact}\n"
"- Associated Tasks: %^{Tasks}\n")))
(add-to-list 'org-capture-templates
'("A" "Accounting"))
;; Expense Tracking
;; Purpose: To capture individual expenses for accounting in a table.
;; Fields: Amount, Category, Note, Date
(add-to-list 'org-capture-templates
'("Ae" "Expense" table-line (file+headline "accounting.org" "Expenses")
"| %U | %^{Amount} | %^{Category} | %? |"))
;; Income Tracking
;; Purpose: To capture instances of income for accounting in a table.
;; Fields: Amount, Source, Date
(add-to-list 'org-capture-templates
'("Ai" "Income" table-line (file+headline "accounting.org" "Income")
"| %U | %^{Amount} | %^{Source} | %? |"))
;; Invoice Tracking
;; Purpose: To capture invoices sent for services or products in a table.
;; Fields: Client, Amount, Due Date
(add-to-list 'org-capture-templates
'("AI" "Invoice" table-line (file+headline "accounting.org" "Invoices")
"| %T | %^{Client} | %^{Amount} | %^{Due Date} | %? |"))
;; Budget Planning
;; Purpose: To capture budget plans for personal or business accounting in a table.
;; Fields: Estimated Income, Estimated Expenses
(add-to-list 'org-capture-templates
`("Ab" "Budget" table-line (file+headline "accounting.org" "Budget")
,(concat "| " (format-time-string "%Y") " | " (format-time-string "%B") " | %^{Estimated Income} | %^{Estimated Expenses} | %? |")))
;; Investment Tracking
;; Purpose: To capture investment details for accounting in a table.
;; Fields: Type, Amount, Notes
(add-to-list 'org-capture-templates
'("Av" "Investment" table-line (file+headline "accounting.org" "Investments")
"| %U | %^{Type} | %^{Amount} | %? |"))
;; Stock Recommendation Capture Template
;; Purpose: To capture stock recommendations for potential investment.
;; Fields: Stock Symbol, Recommender, Notes, Date
(add-to-list 'org-capture-templates
'("s" "Stock Recommendation" entry (file+headline "stocks.org" "Stock Recommendations")
"* %^{Stock Name} :STOCK:\n:PROPERTIES:\n:Date: %T\n:WKN: %^{WKN}\n:ISIN: %^{ISIN}\n:END:\n%?"))
(add-to-list 'org-capture-templates
'("B" "Bücherliste" table-line
(file+headline "books.org" "Meine Bücherliste")
"| %^{Buchtitel} | %^{Autor} | %^{Status||Geplant|In Bearbeitung|Fertig} | %U |" :kill-buffer t))
(require 'request)
(defun fetch-gitlab-issue-and-capture ()
(interactive)
(let ((project-id (read-string "Enter GitLab Project ID: "))
(issue-id (read-string "Enter GitLab Issue ID: "))
(gitlab-token (getenv "GITLAB_TOKEN")))
(unless gitlab-token
(error "GITLAB_TOKEN environment variable not set"))
(request
(format "https://code.siemens.com/api/v4/projects/%s/issues/%s" project-id issue-id)
:headers `(("Private-Token" . ,gitlab-token))
:parser 'json-read
:success (cl-function
(lambda (&key data &allow-other-keys)
(org-capture nil "g")
(let ((title (assoc-default 'title data))
(description (assoc-default 'description data)))
(insert (format "%s\n%s" title description))))))))
(add-to-list 'org-capture-templates
'("g" "GitLab Issue" entry (file "gitlab_issues.org")
"* %?"))
;; (global-set-key (kbd "C-c g") 'fetch-gitlab-issue-and-capture)
(use-package org-roam
:after org
:init
(setq org-roam-db-autosync-mode t)
(setq org-roam-v2-ack t)
(setq org-roam-db-location "~/org-roam.db")
(require 'org-roam-dailies)
:bind (("C-c r l" . org-roam-buffer-toggle)
("C-c r f" . org-roam-node-find)
("C-c r g" . org-roam-graph)
("C-c r i" . org-roam-node-insert)
("C-c r c" . org-roam-capture)
("C-c r j" . org-roam-dailies-map)
:map org-roam-dailies-map
("t" . org-roam-dailies-capture-today)
("y" . org-roam-dailies-capture-yesterday)
("T" . org-roam-dailies-capture-tomorrow)
:map org-mode-map
("C-M-i" . completion-at-point))
:custom
(org-roam-completion-everywhere nil)
(org-roam-dailies-capture-templates
'(("d" "default" entry "* %<%R> %?"
:if-new (file+head "%<%F>.org" "#+title: %<%F>\n"))))
(org-roam-capture-templates
'(("d" "default" plain
"%?"
:if-new (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n")
:unnarrowed t)
("r" "Research" plain
"* Hypothesis:\n%?\n* Methodology:\n* Results:\n* Conclusions:\n"
:if-new (file+head "research/%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n")
:unnarrowed t)
("m" "Meeting" plain
"* Participants:\n%?\n* Discussion topics:\n* Action points:\n"
:if-new (file+head "meetings/%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n")
:unnarrowed t)
("p" "Project" plain
"* Goals:\n%?\n* Milestones:\n* Resources:\n"
:if-new (file+head "projects/%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n")
:unnarrowed t)
("l" "Literature" plain
"* Authors:\n%?\n* Main theses:\n* Own thoughts:\n"
:if-new (file+head "literature/%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n")
:unnarrowed t))))
(use-package org-tree-slide
:bind ("<f5>" . org-tree-slide-mode)
:custom
(org-image-actual-width nil))
(use-package org-web-tools
:defer t
:custom (org-web-tools-pandoc-sleep-time 0.4))
;; (use-package ob-go
;; :after org)
(use-package ox-reveal
:after org)
;; (use-package ox-pandoc
;; :after org
;; :custom
;; (org-pandoc-options-for-beamer-pdf '((pdf-engine . "xelatex"))))
;; (defun me/write-readme-md-on-save ()
;; ;; when README.org, also write README.md on save
;; (when (string-match "README" (buffer-file-name))
;; (make-local-variable 'after-save-hook)
;; (add-hook 'after-save-hook
;; (lambda () (let ((outfile (org-export-output-file-name ".md")))
;; (org-export-to-file 'md outfile))))))
;; (add-hook 'org-mode-hook 'me/write-readme-md-on-save)
;; (use-package ob-go
;; :after org
;; :config
;; (append '((go . t)) org-babel-load-languages))
(use-package ob-http
:after org
:config
(append '((http . t)) org-babel-load-languages))
;; (use-package ob-racket
;; :after org
;; :pin manual
;; :config
;; (append '((racket . t) (scribble . t)) org-babel-load-languages))
;; (use-package ox-rss
;; :after org)
;; (use-package ob-restclient
;; :after org
;; :config
;; (append '((restclient . t)) org-babel-load-languages))
(defun mk/extract-headlines-by-tag (tag)
"Extract headlines and their content from current buffer by TAG."
(interactive "sEnter tag: ")
(save-excursion
(let ((result-buffer (generate-new-buffer (concat "*Extracted Headlines " tag "*"))))
(with-current-buffer result-buffer
(org-mode)
(insert "* Extracted Headlines by Tag: " tag " *\n\n"))
(org-element-map (org-element-parse-buffer) 'headline
(lambda (headline)
(when (member tag (org-element-property :tags headline))
(with-current-buffer result-buffer
(insert (org-element-interpret-data headline) "\n")))))
(pop-to-buffer result-buffer))))

2503
init.el

File diff suppressed because it is too large Load diff