From ca3d679c54680db78a5503f41ee4180a4408236e Mon Sep 17 00:00:00 2001 From: Leni Aniva Date: Sun, 17 Sep 2023 00:30:59 -0700 Subject: [PATCH 1/2] Add LaTeX relative to .latexmkrc compile hook --- doom/config.org | 33 +++++++++++++++++++++++++++++++++ doom/init.el | 6 +++--- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/doom/config.org b/doom/config.org index 965d894..650c28b 100644 --- a/doom/config.org +++ b/doom/config.org @@ -449,6 +449,37 @@ The target indentation style of ~LaTeX~ is as follows: \end{enumerate} #+end_src +The ~SPC m c~ command which by default binds to ~TeX-command-run-all~ is +modified so it runs in the directory of the nearest ~.latexmkrc~ file or the +projectile root, whichever is closer. If a ~.latexmkrc~ file is not found, we +fall back to the current directory. +#+begin_src emacs-lisp +(defun custom/TeX-compile-in-root () + "Execute ~TeX-command-run-all~ in the nearest ~.latexmkrc~ directory or + projectile project root." + (interactive) + (let* + ((dir-latexmkrc + (projectile-locate-dominating-file default-directory ".latexmkrc")) + (dir-projectile (projectile-project-root)) + (is-latexmk-child-of-projectile (string-match-p (regexp-quote dir-projectile) dir-latexmkrc)) + (dir-work (cond + ((and dir-latexmkrc is-latexmk-child-of-projectile) dir-latexmkrc) + (dir-projectile dir-projectile) + (t default-directory))) + (dir-current-rel (string-remove-prefix dir-work default-directory)) + (file-current-rel (concat dir-current-rel (TeX-master-file)))) + ; Execute in shadowed ~default-directory~ + (cl-labels ((replace-pwd () dir-work) (replace-file (&optional extension nondirectory ask) file-current-rel)) + (advice-add 'TeX-master-directory :override #'replace-pwd) + (advice-add 'TeX-master-file :override #'replace-file) + (TeX-command-run-all nil) + (advice-remove 'TeX-master-file #'replace-file) + (advice-remove 'TeX-master-directory #'replace-pwd) + ))) +#+end_src + + For some reason the keymap binding has to use ~LaTeX-mode-map~ or ~TeX-mode-map~ instead of ~latex-mode-map~. Also some original keybindings are removed so they can be displayed correctly in prompts. See e.g. ~tex-buf.el~ for an example. @@ -471,6 +502,7 @@ introduced. :desc "View Compilation Log" "l" #'TeX-recenter-output-buffer :desc "Next Error" "e" #'TeX-next-error :desc "Close Environment" "]" #'LaTeX-close-environment + :desc "Compile in root" "." #'custom/TeX-compile-in-root (:prefix ("f" . "Fold") :desc "Fold Mode" "f" #'TeX-fold-mode :desc "Environment" "e" #'TeX-fold-env @@ -486,6 +518,7 @@ introduced. ) #+end_src + *** Lean 3 #+begin_src emacs-lisp diff --git a/doom/init.el b/doom/init.el index 93760fe..d6adc36 100644 --- a/doom/init.el +++ b/doom/init.el @@ -69,7 +69,7 @@ :emacs dired ; making dired pretty [functional] electric ; smarter, keyword-based electric-indent - ;;ibuffer ; interactive buffer management + (ibuffer +icons) ; interactive buffer management undo ; persistent, smarter undo for your inevitable mistakes vc ; version-control and Emacs, sitting in a tree @@ -82,7 +82,7 @@ :checkers syntax ; tasing you for every semicolon you forget (spell +flyspell) ; tasing you for misspelling mispelling - ;;grammar ; tasing grammar mistake every you make + grammar ; tasing grammar mistake every you make :tools ;;ansible @@ -142,7 +142,7 @@ ;;idris ; a language you can depend on json ; At least it ain't XML ;;(java +lsp) ; the poster child for carpal tunnel syndrome - ;;javascript ; all(hope(abandon(ye(who(enter(here)))))) + javascript ; all(hope(abandon(ye(who(enter(here)))))) ;;julia ; a better, faster MATLAB ;;kotlin ; a better, slicker Java(Script) (latex +latexmk +lsp) ; writing papers in Emacs has never been so fun From 95932db545ad8fbfc4c8f6a1e0401a911d6ae741 Mon Sep 17 00:00:00 2001 From: Leni Aniva Date: Sun, 17 Sep 2023 10:18:50 -0700 Subject: [PATCH 2/2] Globally advise TeX-master-{directory,file} --- doom/config.org | 47 ++++++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/doom/config.org b/doom/config.org index 650c28b..ebd3201 100644 --- a/doom/config.org +++ b/doom/config.org @@ -452,31 +452,29 @@ The target indentation style of ~LaTeX~ is as follows: The ~SPC m c~ command which by default binds to ~TeX-command-run-all~ is modified so it runs in the directory of the nearest ~.latexmkrc~ file or the projectile root, whichever is closer. If a ~.latexmkrc~ file is not found, we -fall back to the current directory. +fall back to the current directory. We improve this below by decreeing that all +compilation has to happen with the ~.latexmkrc~ file's directory as PWD. #+begin_src emacs-lisp -(defun custom/TeX-compile-in-root () - "Execute ~TeX-command-run-all~ in the nearest ~.latexmkrc~ directory or - projectile project root." - (interactive) - (let* - ((dir-latexmkrc - (projectile-locate-dominating-file default-directory ".latexmkrc")) - (dir-projectile (projectile-project-root)) - (is-latexmk-child-of-projectile (string-match-p (regexp-quote dir-projectile) dir-latexmkrc)) - (dir-work (cond - ((and dir-latexmkrc is-latexmk-child-of-projectile) dir-latexmkrc) - (dir-projectile dir-projectile) - (t default-directory))) - (dir-current-rel (string-remove-prefix dir-work default-directory)) - (file-current-rel (concat dir-current-rel (TeX-master-file)))) - ; Execute in shadowed ~default-directory~ - (cl-labels ((replace-pwd () dir-work) (replace-file (&optional extension nondirectory ask) file-current-rel)) - (advice-add 'TeX-master-directory :override #'replace-pwd) - (advice-add 'TeX-master-file :override #'replace-file) - (TeX-command-run-all nil) - (advice-remove 'TeX-master-file #'replace-file) - (advice-remove 'TeX-master-directory #'replace-pwd) - ))) +(defun custom/TeX-root-directory (start) + (let* ( + (dir-latexmkrc (projectile-locate-dominating-file start ".latexmkrc")) + (dir-projectile (projectile-project-root)) + (is-latexmk-child-of-projectile (and dir-projectile dir-latexmkrc + (string-match-p (regexp-quote dir-projectile) dir-latexmkrc)))) + (cond + ((and dir-latexmkrc is-latexmk-child-of-projectile) dir-latexmkrc) + (dir-projectile dir-projectile) + (t start)))) +(defun custom/TeX-master-directory-filter (dir-master) + (custom/TeX-root-directory dir-master)) +(defun custom/TeX-master-file-filter (file-master) + (concat + (string-remove-prefix (custom/TeX-root-directory default-directory) default-directory) + file-master + )) + +(advice-add 'TeX-master-directory :filter-return #'custom/TeX-master-directory-filter) +(advice-add 'TeX-master-file :filter-return #'custom/TeX-master-file-filter) #+end_src @@ -502,7 +500,6 @@ introduced. :desc "View Compilation Log" "l" #'TeX-recenter-output-buffer :desc "Next Error" "e" #'TeX-next-error :desc "Close Environment" "]" #'LaTeX-close-environment - :desc "Compile in root" "." #'custom/TeX-compile-in-root (:prefix ("f" . "Fold") :desc "Fold Mode" "f" #'TeX-fold-mode :desc "Environment" "e" #'TeX-fold-env