(use-package vterm :ensure t :init (setq vterm-always-compile-module t vterm-max-scrollback 100000) :hook (vterm-mode . goto-address-mode) :bind (:map vterm-mode-map ("C-c C-t" . vterm-copy-mode) ("C-l" . vterm-clear)) :config (define-key vterm-mode-map (kbd "C-c C-c") (lambda () (interactive) (vterm-send-string "\C-c"))) (defun rul/vterm-copy-and-exit (beg end) "Copy region and exit `vterm-copy-mode'." (interactive "r") (kill-ring-save beg end) (vterm-copy-mode -1)) (define-key vterm-copy-mode-map (kbd "w") #'rul/vterm-copy-and-exit) (define-key vterm-copy-mode-map (kbd "M-w") #'rul/vterm-copy-and-exit)) (use-package multi-vterm :ensure t :after vterm :bind (("C-c t" . multi-vterm)) :config (setq vterm-kill-buffer-on-exit t) (defvar-local rul/vterm-close-tab-on-kill nil "When non-nil, close this buffer's tab when the vterm buffer is killed.") (defun rul/vterm-maybe-close-tab () "Close the current tab if this vterm buffer was opened in its own tab." (when rul/vterm-close-tab-on-kill (tab-close))) (defun rul/vterm-new-tab () "Create a new tab and open a new vterm." (interactive) (tab-new) (multi-vterm) (setq-local rul/vterm-close-tab-on-kill t) (add-hook 'kill-buffer-hook #'rul/vterm-maybe-close-tab nil t)) ;; Inside vterm buffers, make C-c t spawn a new tab + vterm (define-key vterm-mode-map (kbd "C-c t") #'rul/vterm-new-tab) (define-key vterm-mode-map (kbd "C-S-t") #'rul/vterm-new-tab)) (provide 'rul-terminals)