0

I use shell mode, often. I use the c-xc-f. Most of the time, the start directory for looking for file, correspond to the PWD of the emacs shell buffer. Can i set that it is always the case/or reset it?

3
  • shell-dirtrack-mode ought to be enabled and providing this behaviour by default in shell buffers. Do you have it disabled?
    – phils
    Commented Jan 29, 2019 at 19:35
  • If it is enabled, but not working, see if M-x shell-resync-dirs helps (use when the shell buffer is at the shell prompt).
    – phils
    Commented Jan 29, 2019 at 19:40
  • Failing all of that, see C-h f shell-directory-tracker and C-h i g (emacs)Directory Tracking and start investigating the related variables -- chances will be that your particular shell output is not being recognised by Emacs, and you'll need to do some tweaking to resolve that.
    – phils
    Commented Jan 29, 2019 at 19:44

1 Answer 1

1

If you want the shell to always start from a specific directory, you can use the shell-mode-hook. Code stored in a mode hook is executed after the mode is loaded.

We want to send a command to change the directory once the shell process has started. There isn't a stock function to send commands to a shell process. However, there's a great StackOverflow response which provides one1:

(defun sh-send-command (command)
  "Send COMMAND to current shell process.  Create shell process
if none exists."
  (let ((proc (get-process "shell"))
        pbuf)
    (unless proc
      (let ((currbuff (current-buffer)))
        (shell)
        (switch-to-buffer currbuff)
        (setq proc (get-process "shell"))
        ))
    (setq pbuff (process-buffer proc))
    (setq command-and-go (concat command "\n"))
    (with-current-buffer pbuff
      (goto-char (process-mark proc))
      (insert command-and-go)
      (move-marker (process-mark proc) (point))
      )
    (process-send-string proc command-and-go)
    ))

This can be used in the shell-mode-hook like:

(add-hook 'shell-mode-hook (lambda () (interactive) (sh-send-command "cd /path/to/start/at")))

This creates an anonymous function which calls the shell command cd to change directory to the given path. Note that you'll need to quote a path containing spaces. To do this, escape the inner quotes using a backslash: \".

If you're interested in setting a default directory across all of Emacs, and not just shell, you might be interested in this SO question: set a global default directory.


1If you like this function, give user VitoshKa an upvote!

5
  • Hi. My apolgies. I want that if I change a directory in the shell, and, from the shell, execute open file, that the directory shall be the new directory that the shell is. Commented Jan 30, 2019 at 9:04
  • No need to apologize! Thank you for more detail. I'm confused now, though. How does the standard behavior differ from what you expect? Do you want the find-file prompt to always match what directory *shell* is in? Commented Jan 30, 2019 at 13:48
  • Hi Lorem, this is exactly what I want. Thanks. Commented Feb 4, 2019 at 10:27
  • Fantastic! I'm glad I could help! Commented Feb 4, 2019 at 12:59
  • If the answer worked for you, please click the check mark ✓ beneath the up/down vote arrows to accept it. That gives me points which make me happy! :) Commented Feb 5, 2019 at 14:21

Your Answer

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

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