Commit ed6c4a2fa115

Vincent Demeester <vincent@sbr.pm>
2025-01-14 15:58:32
tools/emacs: add a function to run in vterm.
This commit adds a function to run a command in a vterm buffer, a-la-compile but using `vterm`. For things like `gh pr create` and other interactive commands that needs a TTY, it will be very good. Signed-off-by: Vincent Demeester <vincent@sbr.pm>
1 parent 2626a20
Changed files (2)
tools/emacs/config/config-projects.el
@@ -18,7 +18,7 @@ It will search for README.org, README.md or README in that order"
 (use-package project
   :bind (("C-x p v" . vde-project-magit-status)
          ("C-x p s" . vde-project-vterm)
-         ("C-x p X" . vde/run-in-project-vterm))
+         ("C-x p X" . vde-project-run-in-vterm))
   :config
   (setq vde/project-local-identifier '(".project")) ;; "go.mod"
   (setq project-switch-commands
@@ -72,12 +72,6 @@ switch to it. Otherwise, create a new vterm shell."
       (when command
         (vterm-send-string command)
         (vterm-send-return))))
-  (defun vde/run-in-project-vterm ()
-    (interactive)
-    (let* ((default-directory (vde-project--project-current))
-           (default-project-vterm-name (project-prefixed-buffer-name "vterm"))
-           (vterm-buffer (get-buffer default-project-vterm-name)))
-      (vde-project-vterm (read-string "Command: "))))
   )
 
 (use-package conner
tools/emacs/lisp/project-func.el
@@ -10,6 +10,7 @@
       (project-root (project-current))
     (cdr (project-current))))
 
+;;;###autoload
 (defun vde-project--project-root-or-default-directory ()
   "Return path to the project root *or* the default-directory."
   (cond
@@ -17,5 +18,26 @@
     (project-root (project-current)))
    (t default-directory)))
 
+;;;##autoload
+(defun vde-project-run-in-vterm (command &optional directory)
+  "Run the given `COMMAND' in a new vterm buffer in `project-root' or the
+given `DIRECTORY'.
+
+This is similar to `compile' but with vterm.
+One reason for this is to be able to run commands that needs a TTY."
+  (interactive "sCommand: ")
+  (let* ((cwd (or directory (vde-project--project-root-or-default-directory)))
+	 (default-directory cwd)
+	 (buffer-name (format "*vterm %s: %s*" cwd command))
+         (buffer (get-buffer buffer-name))
+         (vterm-kill-buffer-on-exit nil)
+	 (vterm-shell (concat "bash -c '" command ";exit'")))
+    (when buffer
+      (kill-buffer buffer))
+    (let ((buffer (generate-new-buffer buffer-name)))
+      (pop-to-buffer buffer)
+      (with-current-buffer buffer
+        (vterm-mode)))))
+
 (provide 'project-func)
 ;;; project-func.el ends here