Emacs: project.el open project files TODO, README, LICENSE, NOTES, HOURS

This commit is contained in:
Joseph Ferano 2024-02-14 12:09:18 +08:00
parent eadf75cbe8
commit 10c62e541f

View File

@ -14,9 +14,10 @@ Skipping a bunch of regular expression searching in the file-name-handler-alist
#+end_src #+end_src
*** Garbage Collection *** Garbage Collection
The default Garbage Collector is triggered at 800 KB, way too conservative, let's bump to 512 MB. The default Garbage Collector is triggered at 800 KB, way too conservative,
Garbage collection is a big contributor to startup times. This fends it off, then is reset later by let's bump to 512 MB. Garbage collection is a big contributor to startup times.
enabling `gcmh-mode'. Not resetting it will cause stuttering/freezes. This fends it off, then is reset later by enabling `gcmh-mode'. Not resetting it
will cause stuttering/freezes.
#+begin_src emacs-lisp :tangle ./early-init.el #+begin_src emacs-lisp :tangle ./early-init.el
;; -*- lexical-binding: t -*- ;; -*- lexical-binding: t -*-
@ -161,9 +162,6 @@ Finish up
("elpa-devel" . "https://elpa.gnu.org/devel/") ("elpa-devel" . "https://elpa.gnu.org/devel/")
("nongnu" . "https://elpa.nongnu.org/nongnu/") ("nongnu" . "https://elpa.nongnu.org/nongnu/")
("melpa" . "https://melpa.org/packages/"))) ("melpa" . "https://melpa.org/packages/")))
;; Add MELPA to `package-archives'
(add-to-list 'package-archives
'("melpa" . "https://melpa.org/packages/"))
;; Proof-of-concept to install a list of packages ;; Proof-of-concept to install a list of packages
@ -1366,27 +1364,75 @@ Ace Window will show a hint if there are more than 2 windows, but I don't really
(define-key 'ctl-x-5-prefix (kbd "RET") #'joe/select-frame) (define-key 'ctl-x-5-prefix (kbd "RET") #'joe/select-frame)
#+end_src #+end_src
** Projects ** Projects
Basic enhancements to project.el
#+begin_src emacs-lisp #+begin_src emacs-lisp
(with-eval-after-load 'project (with-eval-after-load 'project
(setq project-vc-ignores '("target/" "bin/" "obj/")) (setq project-vc-ignores '("target/" "bin/" "obj/"))
(add-to-list 'project-switch-commands '(magit-project-status "Magit" ?m)) (add-to-list 'project-switch-commands '(magit-project-status "Magit" ?m))
;; TODO: This doesn't start in the correct working directory ;; TODO: This doesn't start in the correct working directory
(add-to-list 'project-switch-commands '(joe/vterm-here "VTerm" ?s)) (add-to-list 'project-switch-commands '(joe/vterm-here "VTerm" ?s))
(add-to-list 'project-vc-extra-root-markers ".dir-locals.el") (add-to-list 'project-vc-extra-root-markers ".dir-locals.el"))
#+end_src
(defun joe/project-root-override (dir) These are functions to load a project specific file given the conventions I use.
(let ((proj-name (project-try-vc dir)))
(when (and proj-name
(not (frame-parameter (selected-frame) 'explicit-name)))
(progn
(set-frame-name (file-name-nondirectory (directory-file-name (nth 2 proj-name)))))
proj-name)))
;; TODO: There's an issue with this and it's causing some weird nesting/recursion #+begin_src emacs-lisp
;; (add-hook 'project-find-functions #'joe/project-root-override) (defun joe/project-open-project-file (FILENAME)
(when (project-current)
(let ((proj-dir (project-root (project-current t))))
(find-file-other-window (expand-file-name FILENAME proj-dir)))))
(define-key 'ctl-x-5-prefix "n" #'set-frame-name)) (defun joe/project-open-project-todo ()
(interactive)
(joe/project-open-project-file "TODO.org"))
(defun joe/project-open-project-hours ()
(interactive)
(joe/project-open-project-file "HOURS.org"))
(defun joe/project-open-project-notes ()
(interactive)
(joe/project-open-project-file "NOTES.org"))
(defun joe/project-open-project-readme ()
(interactive)
(when (project-current)
(if (file-exists-p (expand-file-name "README.org" (project-root (project-current))))
(joe/project-open-project-file "README.org")
(joe/project-open-project-file "README.md"))))
(defun joe/project-open-project-license ()
(interactive)
(joe/project-open-project-file "LICENSE"))
(defun joe/project-dirvish-dwim ()
(interactive)
(when (project-current)
(dirvish-dwim (project-root (project-current)))))
(evil-define-key 'normal joe/evil-space-mode-map (kbd "_") #'joe/project-dirvish-dwim)
(define-key project-prefix-map "t" #'joe/project-open-project-todo)
(define-key project-prefix-map "h" #'joe/project-open-project-hours)
(define-key project-prefix-map "n" #'joe/project-open-project-notes)
(define-key project-prefix-map "r" #'joe/project-open-project-readme)
(define-key project-prefix-map "l" #'joe/project-open-project-license)
;; Remape this
(define-key project-prefix-map "C-r" #'project-query-replace-regexp)
#+end_src
If you want to try and incorporate something a bit more robust, try this
#+begin_src emacs-lisp :tangle no
(defun +project-todo ()
"Edit the to-do file at the root of the current project."
(interactive)
(let* ((project (project-root (project-current t)))
(todo (car (directory-files project t "^TODO\\(\\..*\\)?$"))))
(cond ((and todo (file-exists-p todo)) (find-file todo))
(t (message "Project does not contain a TODO file.")))))
#+end_src #+end_src
Stuff to immediately switch to Jetbrains for debugging Stuff to immediately switch to Jetbrains for debugging