about summary refs log tree commit diff
path: root/init/term-setup.el
diff options
context:
space:
mode:
authorVincent Ambo <tazjin@gmail.com>2018-05-08T22·41+0200
committerVincent Ambo <tazjin@gmail.com>2018-05-08T22·46+0200
commit7b8902a36adaa8d1ca7cc70a7b9a31a46aaf37fa (patch)
treef5308d0222659b1f4b36b2eb1f0ebe6cf166658e /init/term-setup.el
parentced93e2606bbe610650e5313ab5c7cd0f0726887 (diff)
feat(term-setup): First attempt to make multi-term tolerable
I've been wanting to use in-emacs terminal buffers instead of
Alacritty as an EXWM window for a while.

In light of the recent EXWM bugs that cause overlapping X-windows
occasionally I've finally had it!

This commit introduces a new configuration file for multi-term related
settings. Primarily this does the following:

* Introduce a new `C-x t` keybinding which launches a terminal if none
  is running, or prompts the user to select one of the existing ones.
* Remap key bindings in term-mode for quick access to features I want.
* Add a `C-c C-r` key binding in term-mode to quickly rename terminal
  buffers into something sensible. Hopefully this will play nice with
  the ivy-based selector from the first point mentioned here.

I'll see how it goes!
Diffstat (limited to 'init/term-setup.el')
-rw-r--r--init/term-setup.el46
1 files changed, 46 insertions, 0 deletions
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)