Difference between revisions of "Shell"

From WikEmacs
Jump to navigation Jump to search
(10 intermediate revisions by 2 users not shown)
Line 1: Line 1:
'''Shell''' is a command-line interpreter that provides text [[user interface]] for an [[Operating System]].  
+
'''Shell-mode''' gives access to a shell in a normal emacs buffer, meaning you can move around and edit it as usual. A drawback is that you can not launch programs like htop or other ncurses ones, like you would in term-mode.
  
 +
= Usage =
  
User can use shell inside Emacs, with '''shell mode''', '''eshell''' or '''term'''.
+
== basics ==
  
== shell mode ==
+
{{Command|shell}}
in this mode, Emacs run an inferior shell, with I/O through [[buffer]] (default to *shell*).
 
  
== eshell ==
+
Look at the menu: you have several keys to interact with the shell. Some of them are:
in this mode, Emacs emulate a shell. It is writen by Emacs Lisp.
+
 
 +
* {{Keys|M-p}} previous input of command line
 +
* {{Keys|M-r}} search backward a regexp in commands' history (like C-r in term). Use C-r to cycle.
 +
* {{Keys|C-c r}} go to beginning of output (useful when you have a large output and want to read through the beginning)
 +
* {{Keys|C-c-p}} go to beginning of previous output group
 +
* {{Keys|C-c-c}} send the '''C-c''' command to the shell
 +
* {{Keys|C-c-o}} delete the output of the last command
 +
 
 +
To launch a shell in the directory of the current buffer, have a look to '''shell-here''': https://github.com/ieure/shell-here (available through ELPA).
 +
 
 +
== re-execute successive commands ==
 +
 
 +
Often it is useful to reexecute several successive shell commands that were previously executed in sequence. To do this, first find and reexecute the first command of the sequence. Then type {{Keys|C-c C-x}}, that will fetch the following command--the one that follows the command you just repeated. Then type RET to reexecute this command. You can reexecute several successive commands by typing {{Keys|C-c C-x RET}} over and over.
 +
 
 +
= Customisation =
 +
 
 +
== More colors ==
 +
 
 +
If you have bad colors in the output, try using '''ansi-mode''':
 +
 
 +
    (require 'ansi-color)
 +
    (defun colorize-compilation-buffer ()
 +
    (toggle-read-only)
 +
    (ansi-color-apply-on-region (point-min) (point-max))
 +
      (toggle-read-only))
 +
      (add-hook 'compilation-filter-hook 'colorize-compilation-buffer)
 +
 
 +
You can highlight some text based on regexp (useful to see "OK" or warnings):
 +
 
 +
      (add-hook 'shell-mode-hook (lambda () (highlight-regexp "\\[OK\\]" "hi-green-b")))
 +
 
 +
 
 +
== Make URLs clikable ==
 +
 
 +
   
 +
    (add-hook 'shell-mode-hook (lambda () (goto-address-mode )))
 +
 
 +
 
 +
== Make file paths clickable ==
 +
 
 +
Every line representing a path to a file will be colorized and made clickable, so that you can jump to that file and that line, like in compilation-mode (specially useful when compiling a program or running tests):
 +
 
 +
    (add-hook 'shell-mode-hook 'compilation-shell-minor-mode)
 +
 
 +
Now you can use key bindings from the mode: use {{CommandKeys|C-x `|next-error}} (backquote) to go to the next error detected in the shell. You can't do that in an xterm !
 +
 
 +
== Change directory with ido-mode ==
 +
 
 +
Using [[ido]]'s completion system for changing directories is a big gain in usability and efficiency for emacs' shell. I urge you to check this Stack Overflow question: http://stackoverflow.com/questions/20952995/emacs-shell-change-directory-with-ido
 +
 
 +
== Shared and persistent history ==
 +
 
 +
By default a shell session inside emacs via '''shell-mode''' won't persist accross sessions and won't read your shell's history. The '''history''' shell command works as expected, but you can't search (with '''M-r''') a command that you typed in shell-mode in another emacs instance or in a term. The following fixes that.
 +
 
 +
For '''comint-mode''' and derivatives (including '''shell-mode''') the searchable history is read in via '''comint-read-input-ring''', which uses '''comint-input-ring-file-name''' which you can set in a mode hook. However I would suggest that you actually set your HISTFILE environment variable to ~/.zsh_history because shell-mode automatically defers to that.
 +
 
 +
The documentation suggests that:
 +
 
 +
<source lang="lisp">
 +
    (add-hook 'shell-mode-hook 'my-shell-mode-hook)
 +
    (defun my-shell-mode-hook ()
 +
      (setq comint-input-ring-file-name "~/.zsh_history")  ;; or bash_history
 +
      (comint-read-input-ring t))
 +
</source>
 +
 
 +
Note that if you want to persist more variables (mini-buffer history,…), enable '''savehist-mode''' and configure the variables you wish to persist between sessions. See {{Command|customize-group RET savehist RET}}.
 +
 
 +
= See also =
 +
 
 +
'''shell-pop''' to pop up and pop out a shell buffer window easily (installable via ELPA).  
  
== term ==
 
in this mode, Emacs emulate a terminal, then Emacs invoke a shell that you choose,  then link to the terminal.
 
  
 
[[Category:Shell]]
 
[[Category:Shell]]

Revision as of 16:04, 15 April 2014

Shell-mode gives access to a shell in a normal emacs buffer, meaning you can move around and edit it as usual. A drawback is that you can not launch programs like htop or other ncurses ones, like you would in term-mode.

Usage

basics

M-x shell

Look at the menu: you have several keys to interact with the shell. Some of them are:

  • [M-p] previous input of command line
  • [M-r] search backward a regexp in commands' history (like C-r in term). Use C-r to cycle.
  • [C-c r] go to beginning of output (useful when you have a large output and want to read through the beginning)
  • [C-c-p] go to beginning of previous output group
  • [C-c-c] send the C-c command to the shell
  • [C-c-o] delete the output of the last command

To launch a shell in the directory of the current buffer, have a look to shell-here: https://github.com/ieure/shell-here (available through ELPA).

re-execute successive commands

Often it is useful to reexecute several successive shell commands that were previously executed in sequence. To do this, first find and reexecute the first command of the sequence. Then type [C-c C-x], that will fetch the following command--the one that follows the command you just repeated. Then type RET to reexecute this command. You can reexecute several successive commands by typing [C-c C-x RET] over and over.

Customisation

More colors

If you have bad colors in the output, try using ansi-mode:

    (require 'ansi-color)
    (defun colorize-compilation-buffer ()
    (toggle-read-only)
    (ansi-color-apply-on-region (point-min) (point-max))
      (toggle-read-only))
      (add-hook 'compilation-filter-hook 'colorize-compilation-buffer)

You can highlight some text based on regexp (useful to see "OK" or warnings):

      (add-hook 'shell-mode-hook (lambda () (highlight-regexp "\\[OK\\]" "hi-green-b")))


Make URLs clikable

   (add-hook 'shell-mode-hook (lambda () (goto-address-mode ))) 


Make file paths clickable

Every line representing a path to a file will be colorized and made clickable, so that you can jump to that file and that line, like in compilation-mode (specially useful when compiling a program or running tests):

   (add-hook 'shell-mode-hook 'compilation-shell-minor-mode)

Now you can use key bindings from the mode: use [C-x `] (or M-x next-error) (backquote) to go to the next error detected in the shell. You can't do that in an xterm !

Change directory with ido-mode

Using ido's completion system for changing directories is a big gain in usability and efficiency for emacs' shell. I urge you to check this Stack Overflow question: http://stackoverflow.com/questions/20952995/emacs-shell-change-directory-with-ido

Shared and persistent history

By default a shell session inside emacs via shell-mode won't persist accross sessions and won't read your shell's history. The history shell command works as expected, but you can't search (with M-r) a command that you typed in shell-mode in another emacs instance or in a term. The following fixes that.

For comint-mode and derivatives (including shell-mode) the searchable history is read in via comint-read-input-ring, which uses comint-input-ring-file-name which you can set in a mode hook. However I would suggest that you actually set your HISTFILE environment variable to ~/.zsh_history because shell-mode automatically defers to that.

The documentation suggests that:

    (add-hook 'shell-mode-hook 'my-shell-mode-hook)
    (defun my-shell-mode-hook ()
      (setq comint-input-ring-file-name "~/.zsh_history")  ;; or bash_history
      (comint-read-input-ring t))

Note that if you want to persist more variables (mini-buffer history,…), enable savehist-mode and configure the variables you wish to persist between sessions. See M-x customize-group RET savehist RET.

See also

shell-pop to pop up and pop out a shell buffer window easily (installable via ELPA).