| 1 | ;;; init-term.el -*- lexical-binding: t; -*- |
| 2 | |
| 3 | ;; Ghostel: libghostty-vt backed terminal. Native module downloads on first use. |
| 4 | (use-package ghostel |
| 5 | :commands (ghostel ghostel-project) |
| 6 | :init |
| 7 | (setq ghostel-timer-delay 0.01 |
| 8 | ghostel-max-scrollback (* 1024 1024))) |
| 9 | |
| 10 | (use-package evil-ghostel |
| 11 | :after (ghostel evil) |
| 12 | :hook (ghostel-mode . evil-ghostel-mode)) |
| 13 | |
| 14 | ;; Terminal perf tweaks, adapted from James Cherti (MIT): |
| 15 | (defun my/speed-up-terminal-buffer () |
| 16 | "Reduce unnecessary Emacs features in terminal buffers." |
| 17 | (let ((ghostel-buffer (derived-mode-p 'ghostel-mode))) |
| 18 | (setq-local font-lock-defaults '(nil t)) |
| 19 | |
| 20 | (setq-local scroll-conservatively most-positive-fixnum) |
| 21 | (setq-local hscroll-margin 0) |
| 22 | (setq-local scroll-margin 0) |
| 23 | (setq-local auto-hscroll-mode nil) |
| 24 | |
| 25 | (setq-local truncate-lines t) |
| 26 | (setq-local nobreak-char-display nil) |
| 27 | (setq-local bidi-paragraph-direction 'left-to-right) |
| 28 | (setq-local bidi-inhibit-bpa t) |
| 29 | |
| 30 | ;; Ghostel computes row height from ghostel-line-spacing |
| 31 | (unless ghostel-buffer |
| 32 | (setq-local line-spacing 0) |
| 33 | (setq-local mode-line-format nil)) |
| 34 | |
| 35 | (setq-local process-adaptive-read-buffering nil) |
| 36 | (let ((output-max (* 1024 1024))) |
| 37 | (when (< read-process-output-max output-max) |
| 38 | (setq-local read-process-output-max output-max))) |
| 39 | |
| 40 | (buffer-disable-undo) |
| 41 | |
| 42 | ;; Evil jump list hooks (C-o / C-i won't work in terminals) |
| 43 | (remove-hook 'pre-command-hook 'evil--jump-hook t) |
| 44 | (remove-hook 'post-command-hook 'evil--jump-handle-buffer-crossing t) |
| 45 | |
| 46 | (let ((inhibit-redisplay t) |
| 47 | (inhibit-message t) |
| 48 | (modes (list 'electric-pair-local-mode |
| 49 | 'electric-indent-local-mode |
| 50 | 'display-line-numbers-mode |
| 51 | 'display-fill-column-indicator-mode |
| 52 | 'hl-line-mode |
| 53 | 'show-paren-local-mode |
| 54 | 'flymake-mode |
| 55 | 'flycheck-mode |
| 56 | 'evil-surround-mode |
| 57 | 'yas-minor-mode |
| 58 | 'company-mode |
| 59 | 'corfu-mode))) |
| 60 | ;; Ghostel relies on eldoc (link targets) and auto-composition |
| 61 | (unless ghostel-buffer |
| 62 | (push 'eldoc-mode modes) |
| 63 | (push 'auto-composition-mode modes)) |
| 64 | (dolist (mode modes) |
| 65 | (when (fboundp mode) |
| 66 | (ignore-errors (funcall mode -1))))))) |
| 67 | |
| 68 | (add-hook 'term-mode-hook #'my/speed-up-terminal-buffer t) |
| 69 | (add-hook 'ghostel-mode-hook #'my/speed-up-terminal-buffer t) |
| 70 | |
| 71 | (provide 'init-term) |