aboutsummaryrefslogtreecommitdiff
path: root/.emacs.d/rul-lisp/packages/rul-terminals.el
blob: f6a89138533bdbc1b6f654e95ae153fea8dde55a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
(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)
nihil fit ex nihilo