diff --git a/lisp/doom-keybinds.el b/lisp/doom-keybinds.el index a7d64b27f..54e503f58 100644 --- a/lisp/doom-keybinds.el +++ b/lisp/doom-keybinds.el @@ -55,27 +55,23 @@ and Emacs states, and for non-evil users.") (setq w32-lwindow-modifier 'super w32-rwindow-modifier 'super))) -;; HACK: Emacs cannot distinguish between C-i from TAB. This is largely a -;; byproduct of its history in the terminal, which can't distinguish them -;; either, however, when GUIs came about Emacs created separate input events -;; for more contentious keys like TAB and RET. Therefore [return] != RET, -;; [tab] != TAB, and [backspace] != DEL. -;; -;; In the same vein, this keybind adds a [C-i] event, so users can bind to it -;; independently of TAB. Otherwise, it falls back to keys bound to C-i. -(define-key key-translation-map [?\C-i] - (cmd! (if (let ((keys (this-single-command-raw-keys))) - (and keys - (not (cl-position 'tab keys)) - (not (cl-position 'kp-tab keys)) - (display-graphic-p) - ;; Fall back if no keybind can be found, otherwise - ;; we've broken all pre-existing C-i keybinds. - (let ((key - (doom-lookup-key - (vconcat (cl-subseq keys 0 -1) [C-i])))) - (not (or (numberp key) (null key)))))) - [C-i] [?\C-i]))) +;; HACK: Emacs can't distinguish C-i from TAB in either GUI or TTY frames. This +;; is a byproduct of its history with the terminal, which can't distinguish +;; them either, however, Emacs has separate input events for many contentious +;; keys like TAB and RET (like [tab] and [return], aka "" and +;; ""), which are only triggered in GUI frames, so here, I create one +;; for C-i. Won't work in TTY frames, though. Doom's :os tty module has a +;; workaround for that though. +(define-key input-decode-map + [?\C-i] (cmd! (if (when-let ((keys (this-single-command-raw-keys))) + (and (display-graphic-p) + (not (cl-position 'tab keys)) + (not (cl-position 'kp-tab keys)) + ;; Fall back if no keybind can be found, + ;; otherwise we've broken all pre-existing C-i + ;; keybinds. + (key-binding (vconcat (cl-subseq keys 0 -1) [C-i]) nil t))) + [C-i] [?\C-i]))) ;; diff --git a/lisp/lib/projects.el b/lisp/lib/projects.el index 3a38750d9..b320f8a14 100644 --- a/lisp/lib/projects.el +++ b/lisp/lib/projects.el @@ -79,16 +79,21 @@ file will be created within it so that it will always be treated as one. This command will throw an error if a parent of DIR is a valid project (which would mask DIR)." (interactive "D") + (when-let ((proj-dir (doom-project-root dir))) + (if (file-equal-p proj-dir dir) + (user-error "ERROR: Directory is already a project: %s" proj-dir) + (user-error "ERROR: Directory is already inside another project: %s" proj-dir))) (let ((short-dir (abbreviate-file-name dir))) - (unless (file-equal-p (doom-project-root dir) dir) - (with-temp-file (doom-path dir ".project"))) - (let ((proj-dir (doom-project-root dir))) - (unless (file-equal-p proj-dir dir) - (user-error "Can't add %S as a project, because %S is already a project" - short-dir (abbreviate-file-name proj-dir))) - (message "%S was not a project; adding .project file to it" - short-dir (abbreviate-file-name proj-dir)) - (projectile-add-known-project dir)))) + (when (projectile-ignored-project-p dir) + (user-error "ERROR: Directory is in projectile's ignore list: %s" short-dir)) + (dolist (proj projectile-known-projects) + (when (file-in-directory-p proj dir) + (user-error "ERROR: Directory contains a known project: %s" short-dir)) + (when (file-equal-p proj dir) + (user-error "ERROR: Directory is already a known project: %s" short-dir))) + (with-temp-file (doom-path dir ".project")) + (message "Added directory as a project: %s" short-dir) + (projectile-add-known-project dir))) ;; diff --git a/modules/emacs/dired/config.el b/modules/emacs/dired/config.el index ea2f76900..f88f0c555 100644 --- a/modules/emacs/dired/config.el +++ b/modules/emacs/dired/config.el @@ -59,7 +59,14 @@ Fixes #3939: unsortable dired entries on Windows." (not (eq revert-buffer-function #'dired-virtual-revert))) ;; To be consistent with vertico/ivy/helm+wgrep integration - (define-key dired-mode-map (kbd "C-c C-e") #'wdired-change-to-wdired-mode)) + (define-key dired-mode-map (kbd "C-c C-e") #'wdired-change-to-wdired-mode) + + ;; On ESC, abort `wdired-mode' (will prompt) + (add-hook! 'doom-escape-hook + (defun +dired-wdired-exit-h () + (when (eq major-mode 'wdired-mode) + (wdired-exit) + t)))) (use-package! dirvish diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index fdcfc5e15..066be1492 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -128,6 +128,9 @@ If no viewer is found, `latex-preview-pane-mode' is used.") :hook (TeX-mode . +latex-TeX-fold-buffer-h) :hook (TeX-mode . TeX-fold-mode) :config + ;; Reveal folds when moving cursor into them. This saves us the trouble of + ;; having to whitelist all motion commands in `TeX-fold-auto-reveal-commands'. + (setq TeX-fold-auto-reveal t) (defun +latex-TeX-fold-buffer-h () (run-with-idle-timer 0 nil 'TeX-fold-buffer)) ;; Fold after all AUCTeX macro insertions. diff --git a/modules/os/tty/config.el b/modules/os/tty/config.el index 93cbc1a4f..36a69a188 100644 --- a/modules/os/tty/config.el +++ b/modules/os/tty/config.el @@ -46,4 +46,25 @@ ;; Add support for the Kitty keyboard protocol. (use-package! kkp - :hook (after-init . global-kkp-mode)) + :hook (after-init . global-kkp-mode) + :config + ;; HACK: Emacs falls back to RET, TAB, and/or DEL if [return], [tab], and/or + ;; [backspace] are unbound, but this isn't the case for all input events, + ;; like these, which don't fall back to M-RET, M-TAB, etc. Therefore making + ;; these keybinds inaccessible in KKP supported terminals. + ;; REVIEW: See benjaminor/kkp#13. + (define-key! local-function-key-map + [M-return] (kbd "M-RET") + [M-tab] (kbd "M-TAB") + [M-backspace] (kbd "M-DEL") + [M-delete] (kbd "M-DEL")) + + ;; HACK: Allow C-i to function independently of TAB in KKP-supported + ;; terminals. Requires the `input-decode-map' entry in + ;; lisp/doom-keybinds.el. + (define-key! key-translation-map + [?\C-i] (cmd! (if-let (((kkp--terminal-has-active-kkp-p)) + (keys (this-single-command-raw-keys)) + ((> (length keys) 2)) + ((equal (cl-subseq keys -3) [27 91 49]))) + [C-i] [?\C-i]))))