Is there a fast way (keyboard shortcut) to open a terminal emulator (in my case urxvt) in the same directory as the file in the current emacs buffer?

7 Answers 7


The combination M-! allows you to launch shell commands. You could use it to launch a separate urxvt.

M-! urxvt RET

I just tried it with xterm (I don't have urxvt) and it did open in the same directory as the file in the buffer.

If you want to define a shortcut add something similar in your init file:

(global-set-key (kbd "C-c s") (kbd "M-! urxvt RET"))

In my case I bound the shortcut to: Ctrl+C - S.


I usually use M-x term.

You can also checkout:

  • M-x terminal
  • M-x shell

M-x term is effectively launching a terminal emulator written in elisp. From the help:

M-x ... RET Start a terminal-emulator in a new buffer. (term PROGRAM)

term is an interactive compiled Lisp function in `term.el'.

Start a terminal-emulator in a new buffer. The buffer is in Term mode; see `term-mode' for the commands to use in that buffer.

Type C-c b to switch to another buffer.

  • 1
    Thanks, I didn't know M-x term, it seems nice but is not exactly what I want. I want to start not a shell (for example bash or zsh in an emacs buffer but a terminal emulator (xterm or urxvt...).
    – student
    Aug 7, 2012 at 12:50
  • 1
    @student have a look at multi-term Aug 7, 2012 at 14:10

The emacs command M-x shell will start a shell in a new buffer (or switch to an existing shell buffer, if there is one). If it's a new shell buffer, it'll be started in the directory of the file being visited in the current buffer. If it's an existing shell buffer, it'll still be in the directory where you left it after last using it. In order to always get the behaviour you want, remember to kill the shell buffer when you're done with it (C-x k)

If M-x shell is too much typing, you can set a global key to start a shell for you. Something like (global-set-key (kbd "C-x S") 'shell) in your startup file should do it (but be careful not to mask another useful command with your shortcut!)

Also, be aware this is a "dumb terminal" so some commands like git commit need options like -m and passwords will be in plaintext on your screen.


I wanted to run a dedicated terminal application, konsole. I wanted to open a new tab in konsole if it is running, or fire-up one if it is not.

Since I was younger back then I split the implementation between emacs and bash. I call the following defun from emacs:

(defun bk-konsoles ()
  "Calls: bk_konsoles.bash -- which starts new tab in a running konsole,"
  (let ((curDir default-directory))
    (shell-command (concat "bk_konsoles.bash \"" curDir "\" 2>&1 > /dev/null & disown") nil nil)
    (kill-buffer "*Shell Command Output*")))

The defun calls bash script, bk_konsoles.bash:


myPath=`echo $@ | sed 's/.$//'`

runningKonsole=`ps -e | grep konsole`
if [ "$runningKonsole"!="" ]; then
    if [ "$@"!="" ]; then
        konsole --new-tab --workdir "$myPath" 2>&1 > /dev/null
        konsole --new-tab 2>&1 > /dev/null
    wmctrl -a " – Konsole"

If you have the helm completion framework installed, you can use helm-run-external-command (C-x c C-c C-x) to run a terminal-emulator of your choice or any other external program in the directory of the current buffer.


Most of the time I use shell-mode. So I heavily use shell-here. But when I need external terminal. I use urxvt-client with tmux using this:

  • Create file named 'term-here' in /usr/local/bin/ containing
urxvtc -e bash -c "tmux -q has-session && exec tmux attach-session -d || exec tmux new-session -n$USER -s$USER@$HOSTNAME"
  • Create new function in emacs
(defun term-here ()
  (start-process "" nil "term-here"))
  • Bind to your favorite key

This will open urxvt-client (with tmux) in your current directory. I bind it in dired-mode-map.

(use-package dired
  :ensure nil
  :ensure-system-package urxvt
  :bind ((:map dired-mode-map
           ("," . term-here))))

I choose urxvt-client because it is fast and simple. Don't forget to run your urxvt-daemon at startup.


My solution directly bears the functionality of emacs in fact, I defined a macro that works quite well, the macro is the follower and uses the elisp

(global-set-key (kbd "C-c s") (kbd "C-x 2 M-x shell"))

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .