48

I am in terminal mode on Ubuntu, and I'm running emacs with 2 buffers open, one is a ruby file, and the other is a shell (opened by typing M-x shell ), and when I switch to the shell buffer, I want to run the same command that I ran before. I would normally just hit the up arrow in a terminal window, but in emacs, it simply puts the cursor up one line.

Does anyone know of keystroke to run the previous shell command from within an emacs shell?

Lidmith
  • 583
  • 1
  • 4
  • 5

5 Answers5

64

M-p does the job

vava
  • 5,878
  • 5
  • 41
  • 46
26

In addition to M-p, you can also use C-up, which I find preferable. The complementary keys M-n or C-down will get you the next command in history.

Prakash K
  • 421
  • 3
  • 4
5

You might also add this to your emacs init file:

(define-key comint-mode-map (kbd "<up>") 'comint-previous-input)
(define-key comint-mode-map (kbd "<down>") 'comint-next-input)
thiagowfx
  • 1,718
  • 1
  • 16
  • 17
2

thiagowfx solution is preferable to me, since I usually try to avoid context-dependency. However, in order for it to work I had to add loading comint mode first:

(progn(require 'comint)
(define-key comint-mode-map (kbd "<up>") 'comint-previous-input)
(define-key comint-mode-map (kbd "<down>") 'comint-next-input))
DeLorean88
  • 141
  • 7
0

DeLorean88's answer worked for me, but only with a second closing bracket on the "progn" line:

(progn(require 'comint))
(define-key comint-mode-map (kbd "<up>") 'comint-previous-input)
(define-key comint-mode-map (kbd "<down>") 'comint-next-input))
  • Check your file again. The second define-key should cause a syntax error as the last closing bracket is not matched by a first. – vfclists Aug 26 '17 at 07:16