summaryrefslogtreecommitdiff
path: root/config.org
diff options
context:
space:
mode:
authorcashmere <cashmere@autistici.org>2026-09-03 15:50:28 +0200
committercashmere <cashmere@autistici.org>2026-09-03 15:50:28 +0200
commit91ee05480922ed885973ece11a13ed7cf0b43f16 (patch)
tree447e42bee33ea03b8b55340bb4be787ca88fa08a /config.org
parenta44f66e0b6ea0a6fafa5d998a338baea724ed7f3 (diff)
downloademacs-91ee05480922ed885973ece11a13ed7cf0b43f16.tar.gz
md: 2026-09-03T15:50:32+02:00
Diffstat (limited to 'config.org')
-rw-r--r--config.org168
1 files changed, 103 insertions, 65 deletions
diff --git a/config.org b/config.org
index 3013e21..dd3f2ee 100644
--- a/config.org
+++ b/config.org
@@ -144,6 +144,7 @@ normal package updates cannot silently rewrite pinned revisions.
(warning-minimum-level :emergency) ;; Set the minimum level of warnings to display.
:hook ;; Add hooks to enable specific features in certain modes.
(prog-mode . display-line-numbers-mode)
+ (conf-mode . display-line-numbers-mode)
(markdown-mode . display-line-numbers-mode)
(text-mode . visual-line-mode) ;; Soft-wrap prose/text files at window edge.
(conf-mode . visual-line-mode) ;; Soft-wrap .conf and similar config files.
@@ -2531,13 +2532,45 @@ Auto switch silos (different workspaces/folders) based on preconfigured director
:demand t
:hook (after-init . global-company-mode)
:custom
- (company-idle-delay nil)
- ;; (company-minimum-prefix-length 2)
+ (company-idle-delay 0.1)
+ (company-minimum-prefix-length 2)
(company-require-match nil)
- ;; Limit the visible menu, not the candidate set. Truncating candidates
- ;; here made valid mu4e contacts and IRC nicks impossible to select.
- (company-tooltip-limit 4)
- (company-backends '(company-capf)))
+ (company-insertion-on-trigger nil)
+ (company-tooltip-limit 8)
+ (company-tooltip-align-annotations t)
+ (company-selection-wrap-around t)
+ (company-backends '(company-capf))
+ (company-frontends '(my/company-popup-frontend company-echo-metadata-frontend))
+ :config
+ (require 'company-childframe)
+ (defun my/company-popup-frontend (command)
+ "Use an aligned child frame in graphical Emacs and an overlay in terminals."
+ (cond
+ ((eq command 'hide)
+ (company-childframe-hide)
+ (company-pseudo-tooltip-hide))
+ ((display-graphic-p)
+ (company-childframe-frontend command))
+ (t
+ (company-pseudo-tooltip-frontend command))))
+ (setq company-selection-default 0)
+ (defun my/company-abort-and-normal-state ()
+ "Close completion and leave Evil insert state."
+ (interactive)
+ (company-abort)
+ (when (bound-and-true-p evil-local-mode)
+ (evil-normal-state)))
+ (defun my/company-navigation-keys (&rest _)
+ "Keep completion navigation consistent after Evil Collection loads."
+ (dolist (key '("TAB" "<tab>" "C-n" "C-j"))
+ (keymap-set company-active-map key #'company-select-next))
+ (dolist (key '("<backtab>" "S-TAB" "C-p" "C-k"))
+ (keymap-set company-active-map key #'company-select-previous))
+ (keymap-set company-active-map "RET" #'company-complete-selection)
+ (keymap-set company-active-map "<return>" #'company-complete-selection)
+ (keymap-set company-active-map "<escape>" #'my/company-abort-and-normal-state))
+ (my/company-navigation-keys)
+ (add-hook 'evil-collection-setup-hook #'my/company-navigation-keys))
#+end_src
* which-key
@@ -2651,65 +2684,47 @@ Auto switch silos (different workspaces/folders) based on preconfigured director
(citre-default-create-tags-file-location 'in-dir)
(citre-edit-ctags-options-manually nil)
(citre-auto-enable-citre-mode-modes '(prog-mode))
+ (citre-completion-backends '(my-index))
+ (citre-find-definition-backends '(my-index))
+ (citre-identifier-list-backends '(my-index))
+ (citre-tags-in-buffer-backends '(my-index))
+ (citre-find-reference-backends '(global))
+ (citre-capf-optimize-for-popup t)
:config
- (defvar my/project-ctags-program
- (expand-file-name "bin/project-ctags" user-emacs-directory))
-
- (defvar-local my/project-ctags-arguments nil)
-
- (put 'my/project-ctags-arguments 'safe-local-variable
- (lambda (value)
- (and (listp value) (seq-every-p #'stringp value))))
-
- (defun my/project-ctags-root ()
- (or (projectile-project-root)
- (user-error "Not in a Projectile project")))
-
- (defun my/project-ctags-enable-citre (root)
- (dolist (buffer (buffer-list))
- (with-current-buffer buffer
- (when (and buffer-file-name
- (file-in-directory-p buffer-file-name root))
- (citre-mode 1)))))
-
- (defun my/project-ctags-sentinel (process _event)
- (when (memq (process-status process) '(exit signal))
- (let ((root (process-get process 'project-root)))
- (if (and (eq (process-status process) 'exit)
- (zerop (process-exit-status process)))
- (progn
- (citre-clear-tags-file-cache)
- (my/project-ctags-enable-citre root)
- (message "Ctags ready for %s" root))
- (display-buffer (process-buffer process))
- (message "Ctags failed for %s; see %s"
- root
- (buffer-name (process-buffer process)))))))
-
- (defun my/project-ctags-start (root arguments)
- (unless (file-executable-p my/project-ctags-program)
- (user-error "Project Ctags generator is not executable: %s"
- my/project-ctags-program))
- (let ((output (get-buffer-create "*project-ctags*")))
- (with-current-buffer output
- (erase-buffer))
- (let ((process
- (make-process
- :name (format "ctags:%s"
- (file-name-nondirectory
- (directory-file-name root)))
- :buffer output
- :command (append (list my/project-ctags-program root)
- arguments)
- :connection-type 'pipe
- :sentinel #'my/project-ctags-sentinel)))
- (process-put process 'project-root root)))
- (message "Generating Ctags for %s..." root))
-
- (defun my/project-ctags-setup ()
- (interactive)
- (my/project-ctags-start (my/project-ctags-root)
- my/project-ctags-arguments)))
+ (require 'citre-index)
+ (require 'citre-backend)
+ (setq my/project-ctags-program (expand-file-name "bin/project-ctags" user-emacs-directory)
+ my/citre-index-cache-directory (expand-file-name "citre-cache/" user-emacs-directory)
+ my/citre-index-idle-delay 0.1
+ my/citre-index-refresh-delay 0.2
+ my/citre-index-check-interval 30
+ my/citre-index-dependency-check-interval 300
+ my/citre-index-max-buffer-size (* 2 1024 1024)
+ my/citre-index-max-watches 256
+ my/citre-index-process-timeout 120
+ my/citre-index-excluded-directories
+ '(".git" ".hg" ".svn" ".direnv" ".venv" ".pixi" "__pycache__"
+ "node_modules" "target" "build" "dist" "citre-cache"
+ "elpaca" "elpa" "eln-cache" "tree-sitter" "workspaces"))
+ (defun my/citre-completion-at-point ()
+ "Allow buffer-word fallback when Citre has no matching completion."
+ (when-let* ((completion (citre-completion-at-point)))
+ (append completion '(:exclusive no))))
+ (defun my/citre-completion-sources ()
+ "Use file completion before language sources and buffer words as a fallback."
+ (when (derived-mode-p 'prog-mode)
+ (setq-local completion-at-point-functions
+ (cl-subst #'my/citre-completion-at-point #'citre-completion-at-point completion-at-point-functions))
+ (add-hook 'completion-at-point-functions #'cape-file nil t)
+ (add-hook 'completion-at-point-functions #'cape-dabbrev 90 t)))
+ (defun my/citre-auto-enable ()
+ "Let Citre enable unmanaged buffers without toggling an already active mode."
+ (unless (bound-and-true-p citre-mode)
+ (citre-auto-enable-citre-mode)))
+ (remove-hook 'find-file-hook #'citre-auto-enable-citre-mode)
+ (add-hook 'find-file-hook #'my/citre-auto-enable 90)
+ (add-hook 'citre-mode-hook #'my/citre-completion-sources)
+ (my/citre-index-mode 1))
#+end_src
* nov
@@ -3365,6 +3380,7 @@ Native =undo-redo= (via =evil-undo-system='undo-redo=); just raise the undo limi
** display-time
#+begin_src emacs-lisp
+(setq display-time-default-load-average nil)
(display-time-mode 1)
#+end_src
@@ -3722,7 +3738,6 @@ This function records the time when `window-setup-hook' runs."
(message "Startup time was not recorded.")))
#+end_src
-
* ibuffer hide
#+begin_src emacs-lisp
@@ -4061,6 +4076,22 @@ place. `C-c C-c' commits, `C-c C-k' aborts."
(list (cons 'persp t))))))
#+end_src
+** quick-access
+
+#+begin_src emacs-lisp
+(use-package my-quick-access
+ :ensure nil
+ :after persp-mode
+ :demand t
+ :custom
+ (my/quick-access-recent-count 5) ; Recent buffers, excluding the active buffer.
+ (my/quick-access-selection-keys '("f" "j" "d" "k" "g" "h")) ; Recent selection and initial collisions.
+ (my/quick-access-page-size 6) ; Maximum visible entries before paging.
+ (my/quick-access-max-height 0.48) ; At most 48% of the frame height.
+ :config
+ (my/quick-access-mode 1))
+#+end_src
+
* pass
#+begin_src emacs-lisp
@@ -4256,6 +4287,7 @@ place. `C-c C-c' commits, `C-c C-k' aborts."
(keymap-set my/leader-project-map "i" #'projectile-invalidate-cache)
(keymap-set my/leader-project-map "t" #'projectile-run-task)
(keymap-set my/leader-project-map "c" #'my/project-ctags-setup)
+(keymap-set my/leader-project-map "C" #'my/citre-index-status)
(keymap-set my/leader-map "g" my/leader-git-map)
(keymap-set my/leader-git-map "c" #'magit-clone)
@@ -4428,7 +4460,12 @@ place. `C-c C-c' commits, `C-c C-k' aborts."
(evil-define-key 'insert 'global (kbd "C-w") evil-window-map)
+(keymap-global-set "M-b" #'my/quick-access)
+(evil-define-key '(normal visual motion insert emacs) 'global
+ (kbd "M-b") #'my/quick-access)
+
(evil-define-key 'normal 'global
+ (kbd "t") #'my/toggle-header-line-workspaces
(kbd "K") #'my/eldoc-and-jump
(kbd "] d") #'flycheck-next-error
(kbd "[ d") #'flycheck-previous-error
@@ -4683,6 +4720,7 @@ place. `C-c C-c' commits, `C-c C-k' aborts."
(evil-define-key '(normal insert) helm-map
(kbd "C-j") #'helm-next-line
(kbd "C-k") #'helm-previous-line
+ (kbd "C-z") #'helm-toggle-full-frame
(kbd "C-g") #'helm-keyboard-quit)
(evil-define-key 'normal helm-map
(kbd "<escape>") #'helm-keyboard-quit