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?

5 Answers 5

64

M-p does the job

2
  • Thanks! I searched a bit, but couldn't find it.
    – Lidmith
    May 11, 2010 at 5:35
  • Small note for anyone else struggling with DrRacket: you may need to (require readline) before some Emacs shortcuts work in the REPL. Jun 14, 2022 at 19:53
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.

4
  • 1
    Ah, ty. That seems more natural.
    – Lidmith
    May 12, 2010 at 17:56
  • 1
    Even though it was not put in the initial question, I have to admit that [C-up] and [C-down] do not work in Emacs via terminal (PuTTY).
    – avp
    Jun 13, 2014 at 9:01
  • 3
    It also doesn't seem to work on my Mac; C-up is mapped to a Mac-specific function.
    – amo
    Jul 22, 2014 at 18:23
  • For me too C-up is mapped to expose. And M-p feels more natural to me. Oct 8, 2014 at 9:32
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)
0
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))
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))
1
  • 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, 2017 at 7:16

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.