about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--init.el1
-rw-r--r--init/term-setup.el46
2 files changed, 47 insertions, 0 deletions
diff --git a/init.el b/init.el
index f237d17013a1..aedee7b5dd5e 100644
--- a/init.el
+++ b/init.el
@@ -32,6 +32,7 @@
                    settings
                    modes
                    bindings
+                   term-setup
                    eshell-setup
                    haskell-setup
                    rust-setup
diff --git a/init/term-setup.el b/init/term-setup.el
new file mode 100644
index 000000000000..e8c74387150c
--- /dev/null
+++ b/init/term-setup.el
@@ -0,0 +1,46 @@
+;; Configuration for multi-term mode:
+
+(require 'multi-term)
+
+(defun open-or-create-term-buffer (buffer-name)
+  "Switch to the buffer with BUFFER-NAME or create a
+  new (multi-)term-mode buffer."
+  (let ((buffer (get-buffer buffer-name)))
+    (if (not buffer)
+        (multi-term)
+      (switch-to-buffer buffer))))
+
+(defun counsel-switch-to-term ()
+  "Switch to a (multi-)term buffer or create one."
+  (interactive)
+  (let ((terms (counsel-list-buffers-with-mode 'term-mode)))
+    (if terms
+        (ivy-read "Switch to term buffer: "
+                  (cons "New terminal" terms)
+                  :caller 'counsel-switch-to-term
+                  :require-match t
+                  :action #'open-or-create-term-buffer)
+      (multi-term))))
+
+(defun term-rename ()
+  "Rename the current terminal buffer."
+  (interactive)
+  (let* ((buffer (get-buffer (buffer-name)))
+         (mode (buffer-local-value 'major-mode buffer)))
+    (if (equal 'term-mode mode)
+        (rename-buffer (format "*terminal<%s>*" (read-string "New terminal name: ")))
+      (error "This function is only intended to rename terminal buffers."))))
+
+(global-set-key (kbd "C-x t") #'counsel-switch-to-term)
+
+;; term-mode's attempt to use isearch is not my favourite thing in the
+;; world.
+(delete '("C-r" . isearch-backward) term-bind-key-alist)
+(delete '("C-s" . isearch-forward) term-bind-key-alist)
+
+(add-to-list 'term-bind-key-alist '("C-r" . term-send-reverse-search-history))
+(add-to-list 'term-bind-key-alist '("C-c C-l" . term-line-mode))
+(add-to-list 'term-bind-key-alist '("C-s" . swiper))
+(add-to-list 'term-bind-key-alist '("C-c C-r" . term-rename))
+
+(provide 'term-setup)