Compare commits
2
Commits
b9913d968b
..
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6f4690bba0 | ||
|
|
80ca830bf8 |
+61
-2
@@ -298,6 +298,9 @@ EMACS-ALTERNATIVE is the Emacs equivalent (e.g., 'C-s')."
|
|||||||
:init
|
:init
|
||||||
(vertico-mode)
|
(vertico-mode)
|
||||||
(vertico-multiform-mode 1)
|
(vertico-multiform-mode 1)
|
||||||
|
;; Preserve project.el's most-recently-used order in the project chooser.
|
||||||
|
(add-to-list 'vertico-multiform-commands
|
||||||
|
'(project-switch-project (vertico-sort-function . nil)))
|
||||||
(add-to-list 'vertico-multiform-categories
|
(add-to-list 'vertico-multiform-categories
|
||||||
'(jinx grid (vertico-grid-annotate . 20))))
|
'(jinx grid (vertico-grid-annotate . 20))))
|
||||||
|
|
||||||
@@ -551,14 +554,16 @@ EMACS-ALTERNATIVE is the Emacs equivalent (e.g., 'C-s')."
|
|||||||
"\\*Flycheck errors\\*"
|
"\\*Flycheck errors\\*"
|
||||||
help-mode
|
help-mode
|
||||||
compilation-mode
|
compilation-mode
|
||||||
|
"\\`\\*gd-tmux\\*\\'"
|
||||||
"eshell-popup\\*$"))
|
"eshell-popup\\*$"))
|
||||||
|
|
||||||
(defun my/popper-window-height (window)
|
(defun my/popper-window-height (window)
|
||||||
"Resize eshell popups to half the frame height; fit other popups."
|
"Resize terminal popups to half the frame height; fit other popups."
|
||||||
(let ((buffer (window-buffer window)))
|
(let ((buffer (window-buffer window)))
|
||||||
(if (with-current-buffer buffer
|
(if (with-current-buffer buffer
|
||||||
;; Eshell displays a new buffer before enabling `eshell-mode'.
|
;; Eshell displays a new buffer before enabling `eshell-mode'.
|
||||||
(or (derived-mode-p 'eshell-mode)
|
(or (derived-mode-p 'eshell-mode)
|
||||||
|
(equal (buffer-name) "*gd-tmux*")
|
||||||
(string-match-p "eshell-popup\\*$" (buffer-name))))
|
(string-match-p "eshell-popup\\*$" (buffer-name))))
|
||||||
;; A functional `window-height' action must resize the window.
|
;; A functional `window-height' action must resize the window.
|
||||||
(let ((height (/ (frame-height (window-frame window)) 2)))
|
(let ((height (/ (frame-height (window-frame window)) 2)))
|
||||||
@@ -656,6 +661,7 @@ EMACS-ALTERNATIVE is the Emacs equivalent (e.g., 'C-s')."
|
|||||||
;;;; Project
|
;;;; Project
|
||||||
(use-package project
|
(use-package project
|
||||||
:custom
|
:custom
|
||||||
|
(project-prompter #'my/project-prompt)
|
||||||
(project-switch-commands
|
(project-switch-commands
|
||||||
'((project-find-file "Find file")
|
'((project-find-file "Find file")
|
||||||
(consult-ripgrep "Ripgrep")
|
(consult-ripgrep "Ripgrep")
|
||||||
@@ -664,7 +670,27 @@ EMACS-ALTERNATIVE is the Emacs equivalent (e.g., 'C-s')."
|
|||||||
(project-any-command "Other")))
|
(project-any-command "Other")))
|
||||||
:config
|
:config
|
||||||
;; Make project.el recognize directories with a .project file as project roots
|
;; Make project.el recognize directories with a .project file as project roots
|
||||||
(add-to-list 'project-vc-extra-root-markers ".project"))
|
(add-to-list 'project-vc-extra-root-markers ".project")
|
||||||
|
|
||||||
|
(defcustom my/project-search-path '("~/Projects/")
|
||||||
|
"Directories whose immediate children are scanned for projects."
|
||||||
|
:type '(repeat directory)
|
||||||
|
:group 'project)
|
||||||
|
|
||||||
|
(defun my/project-refresh ()
|
||||||
|
"Remember recognized projects directly under `my/project-search-path'."
|
||||||
|
(interactive)
|
||||||
|
(dolist (directory my/project-search-path)
|
||||||
|
(let ((directory (expand-file-name directory)))
|
||||||
|
(when (file-directory-p directory)
|
||||||
|
(project-remember-projects-under directory)))))
|
||||||
|
|
||||||
|
(defun my/project-prompt (&optional prompt predicate require-known)
|
||||||
|
"Refresh known projects, then prompt using the standard project chooser.
|
||||||
|
Pass PROMPT, PREDICATE and REQUIRE-KNOWN through to the chooser."
|
||||||
|
(let ((inhibit-message t))
|
||||||
|
(my/project-refresh))
|
||||||
|
(project-prompt-project-dir prompt predicate require-known)))
|
||||||
|
|
||||||
;;;; hl-todo
|
;;;; hl-todo
|
||||||
(use-package hl-todo
|
(use-package hl-todo
|
||||||
@@ -1139,15 +1165,48 @@ any directory proffered by `consult-dir'."
|
|||||||
;;;; Eat
|
;;;; Eat
|
||||||
(use-package eat
|
(use-package eat
|
||||||
:ensure t
|
:ensure t
|
||||||
|
:bind (("C-o g" . my/gd-tmux-toggle))
|
||||||
:custom
|
:custom
|
||||||
(eat-term-name "xterm-256color")
|
(eat-term-name "xterm-256color")
|
||||||
:init
|
:init
|
||||||
|
(defun my/gd-tmux-toggle ()
|
||||||
|
"Show or hide the tmux terminal on gd.
|
||||||
|
Connect the Tubnix tunnel in WireGuard first. Hiding the popup keeps
|
||||||
|
SSH alive; opening it after SSH exits reconnects to the existing tmux
|
||||||
|
session. With multiple sessions, tmux chooses its default session."
|
||||||
|
(interactive)
|
||||||
|
(if-let* ((window (get-buffer-window "*gd-tmux*")))
|
||||||
|
(quit-window nil window)
|
||||||
|
(require 'eat)
|
||||||
|
;; Always launch local SSH, even when called from a TRAMP buffer.
|
||||||
|
(let* ((default-directory (expand-file-name "~/"))
|
||||||
|
(buffer (eat-make "gd-tmux" "ssh" nil
|
||||||
|
"-t" "-o" "ConnectTimeout=10"
|
||||||
|
"-o" "ServerAliveInterval=15"
|
||||||
|
"-o" "ServerAliveCountMax=3"
|
||||||
|
"gd" "tmux attach-session")))
|
||||||
|
(with-current-buffer buffer
|
||||||
|
(use-local-map (copy-keymap (current-local-map)))
|
||||||
|
(local-set-key (kbd "q") #'quit-window)
|
||||||
|
;; Eat's input modes take precedence over the major-mode map.
|
||||||
|
(dolist (mode '(eat--semi-char-mode eat--char-mode))
|
||||||
|
(let ((map (make-sparse-keymap)))
|
||||||
|
(set-keymap-parent map (alist-get mode minor-mode-map-alist))
|
||||||
|
(define-key map (kbd "q") #'quit-window)
|
||||||
|
(setq-local minor-mode-overriding-map-alist
|
||||||
|
(cons (cons mode map)
|
||||||
|
(assq-delete-all
|
||||||
|
mode minor-mode-overriding-map-alist))))))
|
||||||
|
(pop-to-buffer buffer))))
|
||||||
|
|
||||||
(eval-after-load 'eshell #'eat-eshell-mode)
|
(eval-after-load 'eshell #'eat-eshell-mode)
|
||||||
(eval-after-load 'eshell #'eat-eshell-visual-command-mode)
|
(eval-after-load 'eshell #'eat-eshell-visual-command-mode)
|
||||||
:config
|
:config
|
||||||
(defun advise-eat-keymap (map)
|
(defun advise-eat-keymap (map)
|
||||||
(define-key map [?\C-o] nil)
|
(define-key map [?\C-o] nil)
|
||||||
(define-key map (vector meta-prefix-char ?`) nil)
|
(define-key map (vector meta-prefix-char ?`) nil)
|
||||||
|
;; Let Popper dismiss terminal windows without sending M-o remotely.
|
||||||
|
(define-key map (vector meta-prefix-char ?o) nil)
|
||||||
(define-key map [S-v] #'eat-yank))
|
(define-key map [S-v] #'eat-yank))
|
||||||
|
|
||||||
(define-advice eat-eshell-semi-char-mode
|
(define-advice eat-eshell-semi-char-mode
|
||||||
|
|||||||
Reference in new issue
Block a user