diff --git a/config.el b/config.el index 2398d56..c192f91 100644 --- a/config.el +++ b/config.el @@ -100,41 +100,41 @@ Source: https://emacs.stackexchange.com/a/21906" ;; Copy all or text selection (defun xah-copy-all-or-region () - "Put the whole buffer content to `kill-ring', or text selection if there's one. + "Put the whole buffer content to `kill-ring', or text selection if there's one. Respects `narrow-to-region'. URL `https://ergomacs.org/emacs/emacs_copy_cut_all_or_region.html' Version 2015-08-22" - (interactive) - (if (use-region-p) - (progn - (kill-new (buffer-substring (region-beginning) (region-end))) - (message "Text selection copied.")) - (progn - (kill-new (buffer-string)) - (message "Buffer content copied.")))) + (interactive) + (if (use-region-p) + (progn + (kill-new (buffer-substring (region-beginning) (region-end))) + (message "Text selection copied.")) + (progn + (kill-new (buffer-string)) + (message "Buffer content copied.")))) ;; Cut all or text selection (defun xah-cut-all-or-region () - "Cut the whole buffer content to `kill-ring', or text selection if there's one. + "Cut the whole buffer content to `kill-ring', or text selection if there's one. Respects `narrow-to-region'. URL `https://ergomacs.org/emacs/emacs_copy_cut_all_or_region.html' Version 2015-08-22" - (interactive) - (if (use-region-p) - (progn - (kill-new (buffer-substring (region-beginning) (region-end))) - (delete-region (region-beginning) (region-end))) - (progn - (kill-new (buffer-string)) - (delete-region (point-min) (point-max))))) + (interactive) + (if (use-region-p) + (progn + (kill-new (buffer-substring (region-beginning) (region-end))) + (delete-region (region-beginning) (region-end))) + (progn + (kill-new (buffer-string)) + (delete-region (point-min) (point-max))))) -;; open URL in Firefox -(defun browse-host-firefox (url &rest ignored) - "Browse URL with the host's Firefox using distrobox-exec." - (interactive "sURL: ") - (shell-command (concat "firefox " url))) +;; open URL in Firefox/LibreWolf +(defun browse-host-web (url &rest ignored) + "Browse URL with Firefox/LibreWolf" + (interactive "sURL: ") + (shell-command (concat "librewolf " url))) -(setq browse-url-browser-function 'browse-host-firefox) +(setq browse-url-browser-function 'browse-host-web) ;; after copy Ctrl+c in Linux X11, you can paste by `yank' in emacs (setq select-enable-clipboard t) @@ -147,23 +147,23 @@ Version 2015-08-22" ;; Smart home key (defun smart-beginning-of-line () - "Move point to first non-whitespace character or beginning-of-line. + "Move point to first non-whitespace character or beginning-of-line. Move point to the first non-whitespace character on this line. If point was already at that position, move point to beginning of line." - (interactive "^") - (let ((oldpos (point))) - (back-to-indentation) - (and (= oldpos (point)) - (beginning-of-line)))) + (interactive "^") + (let ((oldpos (point))) + (back-to-indentation) + (and (= oldpos (point)) + (beginning-of-line)))) (global-set-key (kbd "") 'smart-beginning-of-line) (global-set-key (kbd "") 'end-of-line) ;; Autoformat on save (setq +format-on-save-enabled-modes - '(emacs-lisp-mode - python-mode)) + '(emacs-lisp-mode + python-mode)) ;; UTF-8 (prefer-coding-system 'utf-8) @@ -231,8 +231,9 @@ If point was already at that position, move point to beginning of line." ;; org-mode tags (setq org-tag-alist (quote (("@archiving" .?a) - ("@calendar" .?d) + ("@calendar" .?t) ("@config" . ?c) + ("@devel" . ?d) ("@errand" . ?e) ("@fedora" . ?f) ("@homelab" . ?l) @@ -368,7 +369,7 @@ If point was already at that position, move point to beginning of line." ;; set bpython as python shell interpreter (add-hook! python-mode-hook - (setq python-shell-interpreter "bpython")) + (setq python-shell-interpreter "bpython")) ;; enable elpy (elpy-enable) @@ -457,45 +458,32 @@ If point was already at that position, move point to beginning of line." (setq centaur-tabs-buffer-show-groups t) -(defun centaur-tabs-buffer-groups () - "`centaur-tabs-buffer-groups' control buffers' group rules. +(defun my-centaur-tabs-buffer-groups () + "Create centaur-tabs groups." + (cond + ((string-equal "*" (substring (buffer-name) 0 1)) + '("Emacs")) + ((eq major-mode 'erc-mode) + '("ERC")) + ((memq major-mode '(org-mode + org-agenda-clockreport-mode + org-src-mode + org-beamer-mode + org-indent-mode + org-bullets-mode + org-agenda-log-mode + diary-mode + org-roam-mode)) + '("OrgMode")) + ((memq major-mode '(dired-mode)) + '("Dired")) + ((memq major-mode '(helpful-mode + help-mode)) + '("Help")) + ((memq major-mode '(vterm-mode)) + '("VTerm")))) -Group centaur-tabs with mode if buffer is derived from `eshell-mode' -`emacs-lisp-mode' `dired-mode' `org-mode' `magit-mode' -All buffer names starting with * will group to \"Emacs\". -Other buffer groups by `centaur-tabs-get-group-name' wit project name." - (list - (cond - ((or (string-equal "*" (substring (buffer-name) 0 1)) - (memq major-mode '(magit-process-mode - magit-status-mode - magit-diff-mode - magit-log-mode - magit-file-mode - magit-blob-mode - magit-blame-mode - ))) - "Emacs") - ((derived-mode-p 'prog-mode) - "Editing") - ((derived-mode-p 'dired-mode) - "Dired") - ((memq major-mode '(helpful-mode - help-mode)) - "Help") - ((memq major-mode '(org-mode - org-agenda-clockreport-mode - org-src-mode - org-agenda-mode - org-beamer-mode - org-indent-mode - org-bullets-mode - org-agenda-log-mode - diary-mode - org-roam-mode)) - "OrgMode") - (t - (centaur-tabs-get-group-name (current-buffer)))))) +(setq centaur-tabs-buffer-groups-function 'my-centaur-tabs-buffer-groups) ;; prevent access to specified buffers (defun centaur-tabs-hide-tab (x) @@ -512,6 +500,7 @@ Other buffer groups by `centaur-tabs-get-group-name' wit project name." (string-prefix-p "*tramp" name) (string-prefix-p "*help" name) (string-prefix-p "*Help" name) + (string-prefix-p "*vterminal" name) ;; Buffer is not a magit buffer. (and (string-prefix-p "magit" name) @@ -524,7 +513,147 @@ Other buffer groups by `centaur-tabs-get-group-name' wit project name." (setq elfeed-protocol-enabled-protocols '(fever)) (elfeed-protocol-enable) (setq elfeed-protocol-fever-update-unread-only t) -(setq elfeed-feeds (list - (list "fever+https://hyperreal@rss.hyperreal.coffee" - :api-url "https://rss.hyperreal.coffee/api/fever.php" - :password (shell-command-output-string "pass show freshrss/hyperreal")))) +(setq elfeed-protocol-feeds '(("fever+https://admin@rss.hyperreal.coffee" + :api-url "https://rss.hyperreal.coffee/fever/" + :password (shell-command-output-string "pass show miniflux/admin")))) + + +;; ;; elpher + +(setq elpher-certificate-directory "~/sync/elpher/certs") +(setq elpher-default-url-type "gemini") + + +;;;; vterm + +(setq vterm-kill-buffer-on-exit t) +(setq vterm-always-compile-module t) +(setq multi-vterm-buffer-name "localhost") + +(defun hyperreal/create-mvterm-buffer () + "Create new multi-vterm buffer and rename it to localhost +and switch to it." + (interactive) + (let ((index 1) + (buffer-name "localhost")) + ;; Find the next available index number + (while (get-buffer (format "%s<%d>" buffer-name index)) + (setq index (1+ index))) + (multi-vterm) + (setq mvterm-buffer-name (format "%s<%d>" buffer-name index)) + (rename-buffer mvterm-buffer-name) + (message "Created and started: %s" mvterm-buffer-name) + (switch-to-buffer mvterm-buffer-name))) + +(defun hyperreal/setup-mvterm () + "Create a set of vterm buffers for my terminal setup." + (interactive) + (require 'vterm) + (let ((buffer-command-pairs '(("journald" . "sudo journalctl -f") + ("htop" . "htop") + ("nexus" . "autossh -M 0 jas@nexus.local") + ("apocrypha" . "autossh -M 0 jas@apocrypha.local") + ("rockpro64" . "autossh -M 0 dietpi@rockpro64.local") + ("orangepi5" . "autossh -M 0 dietpi@orangepi5.local")))) + (dolist (pair buffer-command-pairs) + (let ((buffer-name (car pair)) + (command (cdr pair))) + ;; Check if buffer exists + (unless (get-buffer buffer-name) + (multi-vterm) + (rename-buffer buffer-name) + ;; Send the command to the vterm buffer + (vterm-send-string command) + (vterm-send-return) + (message "Created and started: %s" buffer-name)))) + ;; Create and switch to default buffer + (hyperreal/create-mvterm-buffer) + (centaur-tabs-mode))) + +(defun hyperreal/kill-all-vterms () + "Kill all vterm buffers (do not ask for confirmation)." + (interactive) + (let ((kill-buffer-query-functions nil)) + (dolist (buffer (buffer-list)) + (with-current-buffer buffer + (when (eq major-mode 'vterm-mode) + (kill-buffer buffer))))) + (message "All vterm buffers killed.")) + +;;;; ERC + +(setq erc-timestamp-format "[%H:%M:%S] ") +(setq erc-insert-timestamp-function 'erc-insert-timestamp-left) +(setq erc-fill-prefix " ") +(setq erc-fill-function 'erc-fill-static) +(setq erc-hide-list '("JOIN" "PART" "QUIT")) + +(defun tilde-chat () + "Connect to irc.tilde.chat." + (interactive) + (setq erc-email-userid "hyperreal/irc.tilde.chat") + (erc-tls :server "chat.sr.ht" + :port 6697 + :nick "hyperreal" + :password (shell-command-output-string "pass show chat.sr.ht/hyperreal") + :full-name "Jeffrey Serio") + (centaur-tabs-mode)) + +(defun libera-chat () + "Connect to irc.libera.chat." + (interactive) + (setq erc-email-userid "hyperreal/irc.libera.chat") + (erc-tls :server "chat.sr.ht" + :port 6697 + :nick "hyperreal" + :password (shell-command-output-string "pass show chat.sr.ht/hyperreal") + :full-name "Jeffrey Serio") + (centaur-tabs-mode)) + +;; nickcolor funcs lifted from EmacsWiki +(defmacro unpack-color (color red green blue &rest body) + `(let ((,red (car ,color)) + (,green (car (cdr ,color))) + (,blue (car (cdr (cdr ,color))))) + ,@body)) + +(defun rgb-to-html (color) + (unpack-color color red green blue + (concat "#" (format "%02x%02x%02x" red green blue)))) + +(defun hexcolor-luminance (color) + (unpack-color color red green blue + (floor (+ (* 0.299 red) (* 0.587 green) (* 0.114 blue))))) + +(defun invert-color (color) + (unpack-color color red green blue + `(,(- 255 red) ,(- 255 green) ,(- 255 blue)))) + +(defun erc-get-color-for-nick (nick dark) + (let* ((hash (md5 (downcase nick))) + (red (mod (string-to-number (substring hash 0 10) 16) 256)) + (blue (mod (string-to-number (substring hash 10 20) 16) 256)) + (green (mod (string-to-number (substring hash 20 30) 16) 256)) + (color `(,red ,green ,blue))) + (rgb-to-html (if (if dark (< (hexcolor-luminance color) 85) + (> (hexcolor-luminance color) 170)) + (invert-color color) + color)))) + +(defun erc-highlight-nicknames () + (save-excursion + (goto-char (point-min)) + (while (re-search-forward "\\w+" nil t) + (let* ((bounds (bounds-of-thing-at-point 'symbol)) + (nick (buffer-substring-no-properties (car bounds) (cdr bounds)))) + (when (erc-get-server-user nick) + (put-text-property + (car bounds) (cdr bounds) 'face + (cons 'foreground-color (erc-get-color-for-nick nick 't)))))))) + +(add-hook 'erc-insert-modify-hook 'erc-highlight-nicknames) + +;; set the column width based on window width +(add-hook 'window-configuration-change-hook + #'(lambda () + (setq erc-fill-column (- (window-width) 2)))) diff --git a/packages.el b/packages.el index 5659688..60717f7 100644 --- a/packages.el +++ b/packages.el @@ -5,11 +5,10 @@ ;; on the command line, then restart Emacs for the changes to take effect -- or ;; use 'M-x doom/reload'. - ;; To install SOME-PACKAGE from MELPA, ELPA or emacsmirror: -;(package! some-package) -(package! artbollocks-mode :recipe - (:host nil :repo "https://github.com/sachac/artbollocks-mode")) + ;(package! some-package) +(package! artbollocks-mode + :recipe (:host github :repo "sachac/artbollocks-mode")) (package! autothemer) (package! catppuccin-theme) (package! elfeed) @@ -27,6 +26,7 @@ (package! just-mode) (package! justl) (package! license-templates) +(package! multi-vterm) (package! nov) (package! org-roam) (package! org-superstar)