2015-12-02 14:23:39 +00:00
|
|
|
|
#+TITLE: Shell layer
|
2015-06-10 16:44:30 +00:00
|
|
|
|
|
|
|
|
|
[[file:img/shell.png]]
|
|
|
|
|
|
2018-09-19 03:54:47 +00:00
|
|
|
|
* Table of Contents :TOC_4_gh:noexport:
|
2017-05-22 14:16:12 +00:00
|
|
|
|
- [[#description][Description]]
|
2017-09-03 18:42:17 +00:00
|
|
|
|
- [[#features][Features:]]
|
2017-05-22 14:16:12 +00:00
|
|
|
|
- [[#install][Install]]
|
|
|
|
|
- [[#configuration][Configuration]]
|
|
|
|
|
- [[#default-shell][Default shell]]
|
2018-05-27 21:50:16 +00:00
|
|
|
|
- [[#default-shell-position-width-and-height][Default shell position, width, and height]]
|
2017-05-22 14:16:12 +00:00
|
|
|
|
- [[#set-shell-for-term-and-ansi-term][Set shell for term and ansi-term]]
|
2018-10-11 07:09:58 +00:00
|
|
|
|
- [[#set-shell-for-multi-term][Set shell for multi-term]]
|
2017-05-22 14:16:12 +00:00
|
|
|
|
- [[#width-of-the-shell-popup-buffers][Width of the shell popup buffers]]
|
|
|
|
|
- [[#enable-em-smart-in-eshell][Enable em-smart in Eshell]]
|
|
|
|
|
- [[#protect-your-eshell-prompt][Protect your Eshell prompt]]
|
|
|
|
|
- [[#fish-shell-and-ansi-term][Fish shell and ansi-term]]
|
|
|
|
|
- [[#eshell][Eshell]]
|
|
|
|
|
- [[#key-bindings][Key bindings]]
|
|
|
|
|
- [[#multi-term][Multi-term]]
|
|
|
|
|
- [[#eshell-1][Eshell]]
|
2015-06-10 16:44:30 +00:00
|
|
|
|
|
|
|
|
|
* Description
|
|
|
|
|
This layer configures the various shells available in Emacs.
|
|
|
|
|
|
2017-09-03 18:42:17 +00:00
|
|
|
|
** Features:
|
2018-09-19 03:54:47 +00:00
|
|
|
|
- Shell integration
|
2017-09-03 18:42:17 +00:00
|
|
|
|
|
2015-06-10 16:44:30 +00:00
|
|
|
|
* Install
|
2016-01-06 05:21:55 +00:00
|
|
|
|
To use this configuration layer, add it to your =~/.spacemacs=. You will need to
|
|
|
|
|
add =shell= to the existing =dotspacemacs-configuration-layers= list in this
|
|
|
|
|
file.
|
2015-06-10 16:44:30 +00:00
|
|
|
|
|
2016-06-23 00:16:46 +00:00
|
|
|
|
* Configuration
|
2015-06-10 16:44:30 +00:00
|
|
|
|
** Default shell
|
|
|
|
|
Emacs supports three types of shell:
|
|
|
|
|
- the Emacs shell
|
|
|
|
|
- the inferior shell
|
|
|
|
|
- the terminal emulator
|
|
|
|
|
- the ANSI terminal emulator
|
|
|
|
|
|
2015-06-10 21:16:01 +00:00
|
|
|
|
You can find a quick introductions to them [[https://www.masteringemacs.org/article/running-shells-in-emacs-overview][here]].
|
2015-06-10 16:44:30 +00:00
|
|
|
|
|
|
|
|
|
To define the default shell you can set the layer variable =shell-default-shell=
|
|
|
|
|
to the following variables:
|
|
|
|
|
- =eshell=
|
|
|
|
|
- =shell=
|
|
|
|
|
- =term=
|
|
|
|
|
- =ansi-term=
|
|
|
|
|
- =multi-term=
|
|
|
|
|
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
2018-09-19 03:54:47 +00:00
|
|
|
|
(setq-default dotspacemacs-configuration-layers
|
|
|
|
|
'((shell :variables shell-default-shell 'eshell)))
|
2015-06-10 16:44:30 +00:00
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2016-02-29 09:23:14 +00:00
|
|
|
|
The default shell is quickly accessible via a the default shortcut key ~SPC '~.
|
2015-06-10 16:44:30 +00:00
|
|
|
|
|
2018-01-22 19:55:21 +00:00
|
|
|
|
** Default shell position, width, and height
|
2015-06-10 21:16:01 +00:00
|
|
|
|
It is possible to choose where the shell should pop up by setting the variable
|
2016-03-17 01:27:25 +00:00
|
|
|
|
=shell-default-position= to either =top=, =bottom=, =left=, =right=, or =full=.
|
|
|
|
|
Default value is =bottom=. It is also possible to set the default height in
|
2018-01-22 19:55:21 +00:00
|
|
|
|
percents with the variable =shell-default-height=. Default value is =30=. You
|
|
|
|
|
can also set a default width in percents with the variable
|
|
|
|
|
=shell-default-width=, which has a default value of 30 and will take effect if
|
|
|
|
|
your shell is positioned on the left or the right.
|
2015-06-10 16:44:30 +00:00
|
|
|
|
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-configuration-layers
|
2016-05-29 17:10:13 +00:00
|
|
|
|
'((shell :variables
|
|
|
|
|
shell-default-position 'bottom
|
|
|
|
|
shell-default-height 30)))
|
2018-01-22 19:55:21 +00:00
|
|
|
|
|
|
|
|
|
(setq-default dotspacemacs-configuration-layers
|
|
|
|
|
'((shell :variables
|
|
|
|
|
shell-default-position 'right
|
|
|
|
|
shell-default-width 40)))
|
2015-06-10 16:44:30 +00:00
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** Set shell for term and ansi-term
|
|
|
|
|
The default shell can be set by setting the variable =shell-default-term-shell=.
|
|
|
|
|
Default value is =/bin/bash=.
|
|
|
|
|
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-configuration-layers
|
2016-05-29 17:10:13 +00:00
|
|
|
|
'((shell :variables shell-default-term-shell "/bin/bash")))
|
2015-06-10 16:44:30 +00:00
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2018-10-11 07:09:58 +00:00
|
|
|
|
** Set shell for multi-term
|
|
|
|
|
The default shell can be set by setting the variable =multi-term-program=.
|
|
|
|
|
Default value is =/bin/bash=.
|
|
|
|
|
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-configuration-layers
|
|
|
|
|
'((shell :variables multi-term-program "/bin/bash")))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2016-04-29 22:20:59 +00:00
|
|
|
|
** Width of the shell popup buffers
|
|
|
|
|
By default the popup buffer spans the full width of the current frame, if
|
|
|
|
|
you prefer to spans only the width of the current window then set the
|
|
|
|
|
layer variable =shell-default-full-span= to nil.
|
|
|
|
|
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-configuration-layers
|
2016-05-29 17:10:13 +00:00
|
|
|
|
'((shell :variables shell-default-full-span nil)))
|
2016-04-29 22:20:59 +00:00
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2015-07-08 04:57:15 +00:00
|
|
|
|
** Enable em-smart in Eshell
|
|
|
|
|
From the =em-smart= documentation:
|
|
|
|
|
|
|
|
|
|
#+BEGIN_QUOTE
|
2018-09-19 03:54:47 +00:00
|
|
|
|
The best way to get a sense of what this code is trying to do is by
|
2018-10-23 14:18:21 +00:00
|
|
|
|
using it. Basically, the philosophy represents a blend between the
|
2018-09-19 03:54:47 +00:00
|
|
|
|
ease of use of modern day shells, and the review-before-you-proceed
|
|
|
|
|
mentality of Plan 9’s 9term.
|
2015-07-08 04:57:15 +00:00
|
|
|
|
#+END_QUOTE
|
|
|
|
|
|
2018-09-19 03:54:47 +00:00
|
|
|
|
In a nutshell, when =em-smart= is enabled point won’t jump at the end of the
|
2016-01-27 14:15:34 +00:00
|
|
|
|
buffer when a command is executed, it will stay at the same command prompt used
|
|
|
|
|
to execute the command. This allows to quickly edit the last command in the case
|
|
|
|
|
of a mistake. If there is no mistake and you directly type a new command then
|
|
|
|
|
the prompt will jump to the next prompt at the end of the buffer.
|
2015-07-08 04:57:15 +00:00
|
|
|
|
|
|
|
|
|
To enable =em-smart= put the following layer variable to non-nil:
|
|
|
|
|
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-configuration-layers
|
2016-05-29 17:10:13 +00:00
|
|
|
|
'((shell :variables shell-enable-smart-eshell t)))
|
2015-07-08 04:57:15 +00:00
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2015-07-10 23:58:13 +00:00
|
|
|
|
** Protect your Eshell prompt
|
|
|
|
|
Comint mode (Shell mode) has good support for Evil mode as it inhibits movement
|
|
|
|
|
commands over the prompt. This has the added benefit that Evil mode functions
|
|
|
|
|
work sensibly. E.g. you can press ~cc~ in normal state i.e.
|
|
|
|
|
=evil-change-whole-line= to kill the current input and start typing a new
|
|
|
|
|
command. In Eshell you also kill the prompt, which is often unintended.
|
|
|
|
|
|
2016-05-21 16:27:01 +00:00
|
|
|
|
By default this layer also protects the =eshell= prompt. If you want to
|
2015-07-26 06:41:26 +00:00
|
|
|
|
disable this protection you can set the variable =shell-protect-eshell-prompt=
|
|
|
|
|
to nil.
|
2015-07-10 23:58:13 +00:00
|
|
|
|
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-configuration-layers
|
2016-05-29 17:10:13 +00:00
|
|
|
|
'((shell :variables shell-protect-eshell-prompt nil)))
|
2015-07-10 23:58:13 +00:00
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2016-06-23 00:16:46 +00:00
|
|
|
|
** Fish shell and ansi-term
|
|
|
|
|
Making =fish= shell to work with =ansi-term= may be a challenge, here are
|
|
|
|
|
some pointers to save you time to setup your environment correctly.
|
|
|
|
|
|
|
|
|
|
First be sure =~/.terminfo= is setup correctly by running:
|
|
|
|
|
|
|
|
|
|
#+BEGIN_SRC fish
|
2018-09-19 03:54:47 +00:00
|
|
|
|
tic -o ~/.terminfo $TERMINFO/e/eterm-color.ti
|
2016-06-23 00:16:46 +00:00
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
You can locate the =eterm-colors.ti= file with:
|
|
|
|
|
|
|
|
|
|
#+BEGIN_SRC fish
|
2018-09-19 03:54:47 +00:00
|
|
|
|
locate eterm-color.ti
|
2016-06-23 00:16:46 +00:00
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Then setup your fish configuration file (usually at =~/.config/fish/config.fish=)
|
|
|
|
|
|
|
|
|
|
#+BEGIN_SRC fish
|
2018-09-19 03:54:47 +00:00
|
|
|
|
# emacs ansi-term support
|
|
|
|
|
if test -n "$EMACS"
|
|
|
|
|
set -x TERM eterm-color
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
# this function may be required
|
|
|
|
|
function fish_title
|
|
|
|
|
true
|
|
|
|
|
end
|
2016-06-23 00:16:46 +00:00
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Finally you may need to toggle truncated lines for some prompts to work
|
|
|
|
|
correctly, in the function =dotspacemacs/user-config= of your dotfile add:
|
|
|
|
|
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
2018-09-19 03:54:47 +00:00
|
|
|
|
(add-hook 'term-mode-hook 'spacemacs/toggle-truncate-lines-on)
|
2016-06-23 00:16:46 +00:00
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2015-07-08 04:57:15 +00:00
|
|
|
|
* Eshell
|
|
|
|
|
Some advanced configuration is setup for =eshell= in this layer:
|
|
|
|
|
- some elisp functions aliases for quick access
|
|
|
|
|
- =s= for =magit-status= in the current directory (when the =git= layer is
|
|
|
|
|
installed)
|
|
|
|
|
- =d= for =dired=
|
|
|
|
|
- =e= to find a file via a new buffer
|
2016-01-08 20:45:56 +00:00
|
|
|
|
- =z= for quickly jumping to a previously visited directory
|
2015-07-08 04:57:15 +00:00
|
|
|
|
- optional configuration for =em-smart= (see =Install= section for more info)
|
|
|
|
|
- support for visual commands via =em-term=
|
2017-04-25 15:42:58 +00:00
|
|
|
|
- working directory sensitive prompt via [[https://github.com/kaihaosw/eshell-prompt-extras][eshell-prompt-extras]]
|
2015-07-08 04:57:15 +00:00
|
|
|
|
- advanced help support via =esh-help= (enable =el-doc= support in eshell)
|
|
|
|
|
- add support for auto-completion via =company= (when the =auto-completion=
|
|
|
|
|
layer is installed)
|
|
|
|
|
- pressing ~i~ in normal state will automatically jump to the prompt
|
|
|
|
|
|
2015-06-10 16:44:30 +00:00
|
|
|
|
* Key bindings
|
|
|
|
|
|
2018-12-05 03:03:03 +00:00
|
|
|
|
| Key binding | Description |
|
2015-06-10 16:44:30 +00:00
|
|
|
|
|-------------+------------------------------------------------------------|
|
2016-02-29 09:23:14 +00:00
|
|
|
|
| ~SPC '~ | Open, close or go to the default shell |
|
2018-09-19 03:54:47 +00:00
|
|
|
|
| ~SPC p '~ | Open a shell in the project’s root |
|
2015-06-10 16:44:30 +00:00
|
|
|
|
| ~SPC a s e~ | Open, close or go to an =eshell= |
|
|
|
|
|
| ~SPC a s i~ | Open, close or go to a =shell= |
|
|
|
|
|
| ~SPC a s m~ | Open, close or go to a =multi-term= |
|
|
|
|
|
| ~SPC a s t~ | Open, close or go to a =ansi-term= |
|
|
|
|
|
| ~SPC a s T~ | Open, close or go to a =term= |
|
2015-09-15 23:10:05 +00:00
|
|
|
|
| ~SPC m H~ | browse history with =helm= (works in =eshell= and =shell=) |
|
2015-06-10 16:44:30 +00:00
|
|
|
|
| ~C-j~ | next item in history |
|
|
|
|
|
| ~C-k~ | previous item in history |
|
|
|
|
|
|
2015-06-10 21:16:01 +00:00
|
|
|
|
*Note:* You can open multiple shells using a numerical prefix argument,
|
2016-02-29 09:23:14 +00:00
|
|
|
|
for instance pressing ~2 SPC '~ will a second default shell, the
|
2015-06-10 16:44:30 +00:00
|
|
|
|
number of shell is indicated on the mode-line.
|
|
|
|
|
|
2016-04-07 18:52:41 +00:00
|
|
|
|
*Note:* Use the universal prefix argument ~SPC u SPC '~ to open the shell
|
|
|
|
|
in the current buffer instead of a popup.
|
|
|
|
|
|
2015-06-10 16:44:30 +00:00
|
|
|
|
** Multi-term
|
|
|
|
|
|
2019-04-05 22:17:13 +00:00
|
|
|
|
| Key binding | Description |
|
|
|
|
|
|------------------------+--------------------------------|
|
|
|
|
|
| ~SPC m c~ | create a new multi-term |
|
|
|
|
|
| ~SPC m C~ | switch multi-term char mode |
|
|
|
|
|
| ~SPC m l~ | switch multi-term to line mode |
|
|
|
|
|
| ~SPC m n~ | go to next multi-term |
|
|
|
|
|
| ~SPC m N~ or ~SPC m p~ | go to previous multi-term |
|
|
|
|
|
| ~SPC p $ t~ | run multi-term shell in root |
|
2015-07-08 04:57:15 +00:00
|
|
|
|
|
|
|
|
|
** Eshell
|
|
|
|
|
|
2018-12-05 03:03:03 +00:00
|
|
|
|
| Key binding | Description |
|
2015-07-08 04:57:15 +00:00
|
|
|
|
|--------------------+--------------------------------------------|
|
|
|
|
|
| ~SPC m H~ or ~M-l~ | shell commands history using a helm buffer |
|