Added hl-line externally plus automount

This commit is contained in:
2026-05-11 14:50:45 +03:00
parent 9780d69f25
commit a89f5ca015
6 changed files with 138 additions and 2 deletions
+94
View File
@@ -46,6 +46,100 @@
(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