Commit 78835dd0 authored by Stefan Monnier's avatar Stefan Monnier
Browse files

* lisp/shell.el (shell-dir-cookie-re): New custom variable.

(shell-dir-cookie-watcher): New function.
parent ebff325e
...@@ -289,6 +289,9 @@ set `x-select-enable-clipboard' to nil. ...@@ -289,6 +289,9 @@ set `x-select-enable-clipboard' to nil.
* Changes in Specialized Modes and Packages in Emacs 24.1 * Changes in Specialized Modes and Packages in Emacs 24.1
** shell-mode can track your cwd by reading it from your prompt.
Just set shell-dir-cookie-re to an appropriate regexp.
** Modula-2 mode provides auto-indentation. ** Modula-2 mode provides auto-indentation.
** latex-electric-env-pair-mode keeps \begin..\end matched on the fly. ** latex-electric-env-pair-mode keeps \begin..\end matched on the fly.
...@@ -529,8 +532,6 @@ system or session bus. ...@@ -529,8 +532,6 @@ system or session bus.
** pcase.el provides the ML-style pattern matching macro `pcase'. ** pcase.el provides the ML-style pattern matching macro `pcase'.
** smie.el is a package providing a simple generic indentation engine.
** secrets.el is an implementation of the Secret Service API, an ** secrets.el is an implementation of the Secret Service API, an
interface to password managers like GNOME Keyring or KDE Wallet. The interface to password managers like GNOME Keyring or KDE Wallet. The
Secret Service API requires D-Bus for communication. The command Secret Service API requires D-Bus for communication. The command
......
2010-11-12 Stefan Monnier <monnier@iro.umontreal.ca> 2010-11-12 Stefan Monnier <monnier@iro.umontreal.ca>
   
* shell.el (shell-dir-cookie-re): New custom variable.
(shell-dir-cookie-watcher): New function.
* vc/vc.el (vc-deduce-backend): Use default-directory in shell-mode * vc/vc.el (vc-deduce-backend): Use default-directory in shell-mode
and compilation-mode (bug#7350). and compilation-mode (bug#7350).
   
......
...@@ -472,6 +472,10 @@ buffer." ...@@ -472,6 +472,10 @@ buffer."
(when (string-equal shell "bash") (when (string-equal shell "bash")
(add-hook 'comint-output-filter-functions (add-hook 'comint-output-filter-functions
'shell-filter-ctrl-a-ctrl-b nil t))) 'shell-filter-ctrl-a-ctrl-b nil t)))
(when shell-dir-cookie-re
;; Watch for magic cookies in the output to track the current dir.
(add-hook 'comint-output-filter-functions
'shell-dir-cookie-watcher nil t))
(comint-read-input-ring t))) (comint-read-input-ring t)))
(defun shell-filter-ctrl-a-ctrl-b (string) (defun shell-filter-ctrl-a-ctrl-b (string)
...@@ -619,6 +623,31 @@ Otherwise, one argument `-i' is passed to the shell. ...@@ -619,6 +623,31 @@ Otherwise, one argument `-i' is passed to the shell.
;; replace it with a process filter that watches for and strips out ;; replace it with a process filter that watches for and strips out
;; these messages. ;; these messages.
(defcustom shell-dir-cookie-re nil
"Regexp matching your prompt, including some part of the current directory.
If your prompt includes the current directory or the last few elements of it,
set this to a pattern that matches your prompt and whose subgroup 1 matches
the directory part of it.
This is used by `shell-dir-cookie-watcher' to try and use this info
to track your current directory. It can be used instead of or in addition
to `dirtrack-mode'."
:type '(choice (const nil) regexp))
(defun shell-dir-cookie-watcher (text)
;; This is fragile: the TEXT could be split into several chunks and we'd
;; miss it. Oh well. It's a best effort anyway. I'd expect that it's
;; rather unusual to have the prompt split into several packets, but
;; I'm sure Murphy will prove me wrong.
(when (and shell-dir-cookie-re (string-match shell-dir-cookie-re text))
(let ((dir (match-string 1 text)))
(cond
((file-name-absolute-p dir) (shell-cd dir))
;; Let's try and see if it seems to be up or down from where we were.
((string-match "\\`\\(.*\\)\\(?:/.*\\)?\n\\(.*/\\)\\1\\(?:/.*\\)?\\'"
(setq text (concat dir "\n" default-directory)))
(shell-cd (concat (match-string 2 text) dir)))))))
(defun shell-directory-tracker (str) (defun shell-directory-tracker (str)
"Tracks cd, pushd and popd commands issued to the shell. "Tracks cd, pushd and popd commands issued to the shell.
This function is called on each input passed to the shell. This function is called on each input passed to the shell.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment