Move eshell, term & vterm modules to :term

This commit is contained in:
Henrik Lissner 2019-05-18 23:41:18 -04:00
parent 42ba2a22b8
commit 8c65a63b1c
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395
18 changed files with 41 additions and 30 deletions

View file

@ -0,0 +1,91 @@
#+TITLE: term/vterm
#+DATE: January 16, 2019
#+SINCE: 2.1
#+STARTUP: inlineimages
* Table of Contents :TOC_3:noexport:
- [[#description][Description]]
- [[#module-flags][Module Flags]]
- [[#plugins][Plugins]]
- [[#prerequisites][Prerequisites]]
- [[#dynamic-module-support][Dynamic Module support]]
- [[#libvterm][libvterm]]
- [[#compilation-tools-for-vterm-moduleso][Compilation tools for vterm-module.so]]
* Description
This module provides a terminal emulator powered by libvterm. It is still in
alpha and requires a component be compiled (=vterm-module.sh=).
The following commands are available to open it:
+ ~+vterm/open~ (=SPC o t=): Opens vterm in the current window.
+ ~+vterm/open-popup~ (no keybind): Opens vterm in a pop up window.
+ ~+vterm/open-popup-in-project~ (=SPC o T=): Opens vterm from the project root
in a pop up window.
** Module Flags
This module provides no flags.
** Plugins
+ [[https://github.com/akermu/emacs-libvterm][vterm]]
* Prerequisites
+ Emacs must be built with dynamic module support, i.e. compiled with the
=--with-modules= option.
+ You need =libvterm= installed on your system.
+ You need =make=, =cmake= and a C compiler such as =gcc= so that vterm can
build =vterm-module.so=.
** Dynamic Module support
To check if your build of Emacs was built with dynamic module support, check
~bin/doom info~ for ~MODULES~ next to "System features". If it's there, you're
good to go.
You can also check for =--with-modules= in the ~system-configuration-options~
variable (=SPC h v system-configuration-options=).
- Archlinux or Manjaro users who installed Emacs through pacman will have
support baked in.
- MacOS users:
- If you use [[https://emacsformacosx.com/][Emacs For Mac OS X]], this option is enabled.
- If you use [[https://github.com/d12frosted/homebrew-emacs-plus][emacs-plus]], this option is enabled by default.
- If you use [[https://github.com/railwaycat/homebrew-emacsmacport][emacs-mac]], this options is *not* enabled by default. You may have
to reinstall emacs with the option: ~brew install emacs-mac --with-modules~
** libvterm
+ Ubuntu or Debian users: ~apt-get install libvterm-dev~
+ ArchLinux or Manjaro: ~pacman -S libvterm~
+ MacOS: ~libvterm~
** Compilation tools for vterm-module.so
When you first load vterm, it will compile =vterm-module.so= for you. For this
to succeed, you need the following:
+ =make=
+ =cmake=
+ A C compiler like =gcc=
+ An internet connection (=cmake= will download needed libraries)
There are several ways to manually install the module:
1. You can use =M-x vterm-module-compile= to let emacs automatically compile and
install the module.
*WARNING*: Emacs will hang during the compilation. It may take a while.
2. You can compile and install the module yourself. Go to the vterm installation
directory (usually =~/.emacs.d/.local/packages/elpa/vterm-<version>=) and run
the following:
#+BEGIN_SRC sh
mkdir -p build
cd build
cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ..
make
#+END_SRC
3. You can also compile =vterm-module.sh= elsewhere, but the module must be
moved/symlinked to
=~/.emacs.d/.local/packages/elpa/vterm-<version>/vterm-module.so=
=vterm-module.so=. Keep in mind that this folder will be deleted whenever the
vterm package is updated.

View file

@ -0,0 +1,37 @@
;;; term/vterm/autoload.el -*- lexical-binding: t; -*-
;;;###autoload
(defun +vterm/open (arg)
"Open a terminal buffer in the current window. If ARG (universal argument) is
non-nil, cd into the current project's root."
(interactive "P")
(unless (fboundp 'module-load)
(user-error "Your build of Emacs lacks dynamic modules support and cannot load vterm"))
;; This hack forces vterm to redraw, fixing strange artefacting in the tty.
;; Don't ask me why it works.
(save-window-excursion
(pop-to-buffer "*scratch*"))
(let ((default-directory
(if arg
(or (doom-project-root) default-directory)
default-directory)))
(vterm)))
;;;###autoload
(defun +vterm/open-popup (arg)
"Open a terminal popup window. If ARG (universal argument) is
non-nil, cd into the current project's root."
(interactive "P")
(unless (fboundp 'module-load)
(user-error "Your build of Emacs lacks dynamic modules support and cannot load vterm"))
(let ((default-directory
(if arg
(or (doom-project-root) default-directory)
default-directory)))
(vterm-other-window)))
;;;###autoload
(defun +vterm/open-popup-in-project ()
"Open a terminal popup window in the root of the current project."
(interactive)
(+vterm/open-popup t))

View file

@ -0,0 +1,44 @@
;;; term/vterm/config.el -*- lexical-binding: t; -*-
(def-package! vterm
:when (fboundp 'module-load)
:defer t
:preface (setq vterm-install t)
:config
(set-popup-rule! "^vterm" :size 0.25 :vslot -4 :select t :quit nil :ttl 0)
(add-hook 'vterm-mode-hook #'doom|mark-buffer-as-real)
;; Automatically kill buffer when vterm exits.
(add-to-list 'vterm-exit-functions (lambda (buffer) (if buffer (kill-buffer buffer))))
;; Modeline serves no purpose in vterm
(add-hook 'vterm-mode-hook #'hide-mode-line-mode)
;; Don't prompt about processes when killing vterm
(setq-hook! 'vterm-mode-hook confirm-kill-processes nil)
(when (featurep! :editor evil)
(evil-set-initial-state 'vterm-mode 'insert)
;; Go back to normal state but don't move cursor backwards. Moving cursor
;; backwards is the default Vim behavior but it is not appropriate in some
;; cases like terminals.
(setq-hook! 'vterm-mode-hook evil-move-cursor-back nil)
;; Those keys are commonly needed by terminals.
(evil-define-key* 'insert vterm-mode-map
(kbd "C-a") #'vterm--self-insert
(kbd "C-b") #'vterm--self-insert ; Should not be necessary.
(kbd "C-d") #'vterm--self-insert
(kbd "C-e") #'vterm--self-insert
(kbd "C-f") #'vterm--self-insert ; Should not be necessary.
(kbd "C-k") #'vterm--self-insert
(kbd "C-l") #'vterm--self-insert ; Should not be necessary.
(kbd "C-n") #'vterm--self-insert
(kbd "C-o") #'vterm--self-insert
(kbd "C-p") #'vterm--self-insert
(kbd "C-q") #'vterm--self-insert ; Should not be necessary.
(kbd "C-r") #'vterm--self-insert
(kbd "C-s") #'vterm--self-insert ; Should not be necessary.
(kbd "C-t") #'vterm--self-insert
(kbd "C-u") #'vterm--self-insert ; Should not be necessary.
(kbd "C-v") #'vterm--self-insert ; Should not be necessary.
(kbd "C-w") #'vterm--self-insert
(kbd "C-y") #'vterm--self-insert
(kbd "C-z") #'vterm--self-insert)))

View file

@ -0,0 +1,13 @@
;;; term/vterm/doctor.el -*- lexical-binding: t; -*-
(unless (executable-find "vterm-ctrl")
(warn! "Couldn't find libvterm. Vterm module won't compile"))
(unless (executable-find "make")
(warn! "Couldn't find make command. Vterm module won't compile"))
(unless (executable-find "cmake")
(warn! "Couldn't find cmake command. Vterm module won't compile"))
(unless (fboundp 'module-load)
(warn! "Your emacs doesn't have MODULES support. Vterm module won't work"))

View file

@ -0,0 +1,4 @@
;; -*- no-byte-compile: t; -*-
;;; term/vterm/packages.el
(package! vterm)