259 lines
9.8 KiB
Org Mode
259 lines
9.8 KiB
Org Mode
#+title: Aner's Emacs Lauretta Configuration
|
|
#+property: header-args :results silent
|
|
|
|
* Base setup
|
|
** Require
|
|
|
|
#+begin_src emacs-lisp
|
|
(require 'azos-emacs-base)
|
|
(require 'azos-emacs-dev)
|
|
(require 'azos-emacs-editor)
|
|
(require 'azos-emacs-exwm)
|
|
(require 'azos-emacs-station)
|
|
#+end_src
|
|
|
|
* Lauretta specific
|
|
|
|
** LLM
|
|
|
|
#+begin_src emacs-lisp
|
|
(setq
|
|
gptel-model 'openai/gpt-oss-120b
|
|
gptel-backend
|
|
(gptel-make-openai "Groq"
|
|
:host "api.groq.com"
|
|
:endpoint "/openai/v1/chat/completions"
|
|
:stream t
|
|
:key "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"
|
|
:models '(openai/gpt-oss-120b)))
|
|
#+end_src
|
|
|
|
** Agent Shell
|
|
|
|
#+begin_src emacs-lisp
|
|
(setq agent-shell-opencode-default-model-id "opencode/big-pickle")
|
|
;; (setq agent-shell-preferred-agent-config (agent-shell-opencode-make-agent-config))
|
|
#+end_src
|
|
|
|
** Headphones
|
|
|
|
#+begin_src emacs-lisp
|
|
(defun azos/connect-headphones ()
|
|
(interactive)
|
|
(start-process-shell-command "connect-headphones" nil "azos-connect-headphones-whmx4000"))
|
|
|
|
(define-key azos/global-minor-mode/open-keymap
|
|
(kbd "h") 'azos/connect-headphones)
|
|
#+end_src
|
|
|
|
** Storage
|
|
|
|
#+begin_src emacs-lisp
|
|
(defun azos/storage--lsblk-field (dev field)
|
|
"Get FIELD from lsblk DEV hash table."
|
|
(when (hash-table-p dev)
|
|
(gethash field dev)))
|
|
|
|
(defun azos/storage--list-devices ()
|
|
"Return flat list of partitions/devices from lsblk, with bare disks included."
|
|
(let* ((json-str (shell-command-to-string
|
|
"lsblk --json -o NAME,SIZE,LABEL,MOUNTPOINT,TYPE"))
|
|
(data (condition-case nil (json-parse-string json-str) (error nil)))
|
|
(devs '()))
|
|
(when (hash-table-p data)
|
|
(seq-do
|
|
(lambda (dev)
|
|
(let ((children (azos/storage--lsblk-field dev "children")))
|
|
(if (and (vectorp children) (> (length children) 0))
|
|
(seq-do (lambda (child) (push child devs)) children)
|
|
(push dev devs))))
|
|
(gethash "blockdevices" data)))
|
|
(nreverse devs)))
|
|
|
|
(defun azos/storage--null-p (val)
|
|
"Return t if VAL is a JSON null (i.e. :null)."
|
|
(eq val :null))
|
|
|
|
(defun azos/storage--label-str (dev)
|
|
"Format label for DEV, returning empty string if absent."
|
|
(let ((label (azos/storage--lsblk-field dev "label")))
|
|
(if (and label (not (azos/storage--null-p label)))
|
|
(format " [%s]" label)
|
|
"")))
|
|
|
|
(defun azos/storage/mount ()
|
|
"Mount an unmounted block device using udisksctl."
|
|
(interactive)
|
|
(let* ((devs (azos/storage--list-devices))
|
|
(unmounted (seq-filter
|
|
(lambda (d)
|
|
(let ((mp (azos/storage--lsblk-field d "mountpoint"))
|
|
(type (azos/storage--lsblk-field d "type")))
|
|
(and (member type '("part" "disk"))
|
|
(or (null mp) (azos/storage--null-p mp)))))
|
|
devs))
|
|
(choices (mapcar
|
|
(lambda (d)
|
|
(let ((name (azos/storage--lsblk-field d "name"))
|
|
(size (azos/storage--lsblk-field d "size")))
|
|
(cons (format "/dev/%s %s%s" name size (azos/storage--label-str d))
|
|
(format "/dev/%s" name))))
|
|
unmounted)))
|
|
(if choices
|
|
(let* ((selected (completing-read "Mount device: " (mapcar #'car choices) nil t))
|
|
(device (cdr (assoc selected choices))))
|
|
(message "%s" (string-trim
|
|
(shell-command-to-string
|
|
(format "udisksctl mount -b %s" device)))))
|
|
(message "No unmounted partitions found."))))
|
|
|
|
(defun azos/storage/unmount ()
|
|
"Unmount a mounted block device using udisksctl."
|
|
(interactive)
|
|
(let* ((devs (azos/storage--list-devices))
|
|
(mounted (seq-filter
|
|
(lambda (d)
|
|
(let ((mp (azos/storage--lsblk-field d "mountpoint")))
|
|
(and mp
|
|
(not (azos/storage--null-p mp))
|
|
(not (string-prefix-p "/nix" mp))
|
|
(not (string-prefix-p "/boot" mp))
|
|
(not (equal mp "/")))))
|
|
devs))
|
|
(choices (mapcar
|
|
(lambda (d)
|
|
(let ((name (azos/storage--lsblk-field d "name"))
|
|
(size (azos/storage--lsblk-field d "size"))
|
|
(mp (azos/storage--lsblk-field d "mountpoint")))
|
|
(cons (format "/dev/%s %s -> %s%s" name size mp (azos/storage--label-str d))
|
|
(format "/dev/%s" name))))
|
|
mounted)))
|
|
(if choices
|
|
(let* ((selected (completing-read "Unmount device: " (mapcar #'car choices) nil t))
|
|
(device (cdr (assoc selected choices))))
|
|
(message "%s" (string-trim
|
|
(shell-command-to-string
|
|
(format "udisksctl unmount -b %s" device)))))
|
|
(message "No mounted user partitions found."))))
|
|
|
|
(define-key azos/global-minor-mode/open-keymap (kbd "s m") 'azos/storage/mount)
|
|
(define-key azos/global-minor-mode/open-keymap (kbd "s u") 'azos/storage/unmount)
|
|
#+end_src
|
|
|
|
** Tab bar setup
|
|
|
|
#+begin_src emacs-lisp
|
|
(when (fboundp #'azos/bat/enable-tab-display)
|
|
(azos/bat/enable-tab-display))
|
|
|
|
(when (fboundp #'azos/network/enable-tab-display)
|
|
(azos/network/enable-tab-display))
|
|
|
|
(when (fboundp #'azos/audio/enable-tab-display)
|
|
(azos/audio/enable-tab-display))
|
|
#+end_src
|
|
|
|
** Nixpkgs Search
|
|
|
|
#+begin_src emacs-lisp
|
|
(defun azos/nixpkgs-parse-json-lines (str)
|
|
"Parse JSON Lines format (one JSON object per line) from STR."
|
|
(mapcar (lambda (line)
|
|
(and (not (string-empty-p line))
|
|
(string-match "^{" line)
|
|
(condition-case nil
|
|
(json-parse-string line)
|
|
(error nil))))
|
|
(split-string (string-trim str) "\n" t)))
|
|
|
|
(defun azos/nixpkgs-g (key hash)
|
|
"Get KEY from HASH table."
|
|
(when (hash-table-p hash)
|
|
(gethash key hash)))
|
|
|
|
(defun azos/nixpkgs-search ()
|
|
"Search for a nixpkgs package and show its info."
|
|
(interactive)
|
|
(let* ((pattern (read-string "Search pattern: "))
|
|
(json-output (shell-command-to-string
|
|
(format "nix-search --json --max-results 50 '%s'" pattern)))
|
|
(results (and json-output
|
|
(not (string-empty-p json-output))
|
|
(azos/nixpkgs-parse-json-lines json-output)))
|
|
(packages (delq nil (mapcar (lambda (item)
|
|
(let ((pname (azos/nixpkgs-g "package_pname" item)))
|
|
(when pname
|
|
(cons pname item))))
|
|
results))))
|
|
(if packages
|
|
(let* ((selected (completing-read "Package: " (mapcar #'car packages) nil t))
|
|
(package-data (cdr (assoc-string selected packages))))
|
|
(let ((buf (get-buffer-create "*nixpkgs-package-info*")))
|
|
(with-current-buffer buf
|
|
(erase-buffer)
|
|
(if package-data
|
|
(progn
|
|
(insert (format "Package: %s\n\n" selected))
|
|
(insert (format "Version: %s\n" (or (azos/nixpkgs-g "package_pversion" package-data) "unknown")))
|
|
(insert (format "Attr: %s\n" (or (azos/nixpkgs-g "package_attr_name" package-data) "unknown")))
|
|
(insert (format "\nDescription: %s\n"
|
|
(or (azos/nixpkgs-g "package_description" package-data) "none")))
|
|
(let ((programs (azos/nixpkgs-g "package_programs" package-data)))
|
|
(when (vectorp programs)
|
|
(insert (format "\nPrograms: %s\n"
|
|
(mapconcat #'identity (append programs nil) " ")))))
|
|
(let ((homepage (let ((h (azos/nixpkgs-g "package_homepage" package-data)))
|
|
(when (vectorp h) (aref h 0)))))
|
|
(when homepage
|
|
(insert (format "\nHomepage: %s\n" homepage))))
|
|
(let ((licenses (azos/nixpkgs-g "package_license" package-data)))
|
|
(when (vectorp licenses)
|
|
(insert (format "\nLicense: %s\n"
|
|
(mapconcat (lambda (l)
|
|
(or (azos/nixpkgs-g "fullName" l) ""))
|
|
(append licenses nil) ", ")))))
|
|
(insert (format "Package: %s\n\n" selected)
|
|
"\nNo additional info available.")))
|
|
(goto-char (point-min)))
|
|
(display-buffer buf)))
|
|
(message "No packages found matching '%s'" pattern))))
|
|
|
|
(define-key azos/global-minor-mode/open-keymap
|
|
(kbd "n") 'azos/nixpkgs-search)
|
|
#+end_src
|
|
|
|
** CalDAV / Org Sync
|
|
|
|
#+begin_src emacs-lisp
|
|
(require 'org-caldav)
|
|
|
|
(defvar azos/lauretta/nextcloud-user "aner"
|
|
"Nextcloud username for CalDAV sync.")
|
|
|
|
(setq org-caldav-url "https://nextcloud.zakobar.com/remote.php/dav/calendars/1ddd03a6-4c2d-103c-9f7b-27b20313341d"
|
|
org-caldav-calendar-id "personal"
|
|
org-caldav-inbox "~/org/caldav-inbox.org"
|
|
org-caldav-files '("~/org/todo.org")
|
|
org-icalendar-timezone "Asia/Jerusalem")
|
|
|
|
(defun azos/caldav-sync ()
|
|
"Sync org-caldav with Nextcloud calendar, reading password from pass."
|
|
(interactive)
|
|
(let* ((password (string-trim
|
|
(shell-command-to-string
|
|
(format "pass zakobar.com/users/%s" azos/lauretta/nextcloud-user))))
|
|
(url-http-real-basic-auth-storage
|
|
(list (list "nextcloud.zakobar.com:443"
|
|
(cons azos/lauretta/nextcloud-user password)))))
|
|
(org-caldav-sync)))
|
|
|
|
(define-key azos/global-minor-mode/open-keymap
|
|
(kbd "C") 'azos/caldav-sync)
|
|
#+end_src
|
|
|
|
* Provide
|
|
|
|
#+begin_src emacs-lisp
|
|
(provide 'azos-emacs-lauretta)
|
|
#+end_src
|