[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[patch] Emacs cygwin path completion support
From: |
Jari Aalto+mail.emacs |
Subject: |
[patch] Emacs cygwin path completion support |
Date: |
01 Jan 2001 18:49:24 +0200 |
User-agent: |
Gnus/5.090001 (Oort Gnus v0.01) Emacs/20.6 (i386-*-windows98.1998) |
According to Eli's last comments here is improved patch to
complete paths in w32 Cygwin shell. I moved the cygwin related
conversion function to w32-fns.el.
Jari
Index: ChangeLog
===================================================================
RCS file:
/cygdrive/K/data/version-control/cvsroot/emacs/gnu-emacs/lisp/ChangeLog,v
retrieving revision 1.1.1.1
retrieving revision 1.1.1.1.2.2
diff -u -IId: -b -w -c -r1.1.1.1 -r1.1.1.1.2.2
cvs diff: conflicting specifications of output style
*** ChangeLog 2000/12/10 19:53:54 1.1.1.1
--- ChangeLog 2001/01/01 16:35:07 1.1.1.1.2.2
***************
*** 1,3 ****
--- 1,56 ----
+ 2000-12-19 Tue Jari Aalto <jari.aalto@poboxes.com>
+
+ * comint.el (comint-dynamic-complete-as-filename-1): was
+ `comint-dynamic-complete-as-filename'
+ (comint-dynamic-complete-as-filename): New. The completion
+ fails to see the changed directory if user calls an shell alias to
+ change the directory. The path however will show the changed
+ location. This function calls dirtrack (if available) to make
+ a second guess before giving up.
+
+ 2000-12-17 Sun Jari Aalto <jari.aalto@poboxes.com>
+
+ * w32-fns.el (w32-cygwin-path-to-dos): New.
+ Corrected handling of special cases //c and //c/ in addition
+ to /cygdrive/c and /cygdrive/c/
+
+ * dirtrack.el (dirtrack): Remove `dirtrack-path-to-standard'
+ and moved to w32-fns.el under name `w32-cygwin-path-to-dos'
+ Added test for w32 based Emacs where the function is only
+ used.
+
+ 2000-12-15 Fri Jari Aalto <jari.aalto@poboxes.com>
+
+ * w32-fns.el (w32-cygwin-path-to-dos): New.
+
+ * dirtrack.el (dirtrack-path-to-standard): Fixed the
+ regexps to be more accurate. Require [a-z] drive letter
+ after cygwin paths. Anchored to the beginning.
+ (dirtrack-path-to-standard): Moved to w32-fns.el
+ (dirtrack): Call `w32-cygwin-path-to-dos'.
+
+ * comint.el (comint-directory-sep-char): Changed to use
+ `w32-system-shell-p' to check if running under DOS type
+ command shell.
+
+ 2000-12-14 Thu Jari Aalto <jari.aalto@poboxes.com>
+
+ * dirtrack.el (dirtrack): Call `dirtrack-path-to-standard'
+ (dirtrack-path-to-standard): New. When running Cygwin inside
+ NTEmacs, the ptah name can be //c/temp or /cygdrive/d/temp. This
+ function converts them to understandable c:/temp which can
+ be tested with `file-accessible-directory-p' in function
+ `dirtrack'
+
+ * comint.el (comint-directory-sep-char): New.
+ Added w32 support for completing directorynames with \
+ in the comint shell buffer when `comint-completion-addsuffix'
+ was set to true.
+ (comint-dynamic-complete-as-filename): Call ´comint-directory-sep-char'
+ to find out the
+ (comint-dos-shell-file-name-regexp): New. Regexp to match
+ sos based shell named like cmd.*\\.exe
+
2000-02-26 Gerd Moellmann <gerd@gnu.org>
* Version 20.6 released.
Index: comint.el
===================================================================
RCS file:
/cygdrive/K/data/version-control/cvsroot/emacs/gnu-emacs/lisp/comint.el,v
retrieving revision 1.1.1.1
retrieving revision 1.1.1.1.2.2
diff -u -IId: -b -w -c -r1.1.1.1 -r1.1.1.1.2.2
cvs diff: conflicting specifications of output style
*** comint.el 2000/12/10 19:53:54 1.1.1.1
--- comint.el 2001/01/01 16:35:09 1.1.1.1.2.2
***************
*** 147,152 ****
--- 147,155 ----
;; comint-completion-autolist boolean completion
behavior
;; comint-completion-recexact boolean ...
+ (eval-and-compile
+ (autoload 'w32-system-shell-p "w32-fns"))
+
(defgroup comint nil
"General command interpreter in a window stuff."
:group 'processes)
***************
*** 361,366 ****
--- 364,373 ----
(defvar comint-mode-map nil)
+ (defvar comint-dos-shell-file-name-regexp "cmd.*\\.exe$"
+ "*Regexp to match a dos based shell filename in `shell-file-name'.
+ This affects the choice between \ and / in the directory completions.")
+
(defvar comint-ptyp t
"Non-nil if communications via pty; false if by pipe. Buffer local.
This is to work around a bug in Emacs process signaling.")
***************
*** 2131,2139 ****
(message "Completing file name..."))
(comint-dynamic-complete-as-filename)))
(defun comint-dynamic-complete-as-filename ()
"Dynamically complete at point as a filename.
! See `comint-dynamic-complete-filename'. Returns t if successful."
(let* ((completion-ignore-case (memq system-type '(ms-dos windows-nt)))
(completion-ignored-extensions comint-completion-fignore)
;; If we bind this, it breaks remote directory tracking in rlogin.el.
--- 2138,2179 ----
(message "Completing file name..."))
(comint-dynamic-complete-as-filename)))
+ (defun comint-directory-sep-char ()
+ "Return appropriate `directory-sep-char' which see.
+ The value depends on the current value of `shell-file-name'.
+ If this is cmd.*exe, then suppose w32 type dos shell."
+ ;; The shel may also be Vygwin based bash.exe, but for
+ ;; cmd.exe, cmdproxy.exe and the like, the separatr must be \
+ (if (w32-system-shell-p (file-name-nondirectory shell-file-name))
+ ?\\
+ ?/))
+
+
(defun comint-dynamic-complete-as-filename ()
+ "Call `comint-dynamic-complete-as-filename-1'. Return t on success."
+ (when (and (not (comint-dynamic-complete-as-filename-1))
+ (fboundp 'dirtrack))
+ ;; It is possible that user used an shell alist that changed the
+ ;; the current directory and the dirtrack.el didn't have a chance
+ ;; to see the "cd ..." prompt to set correct directory.
+ ;;
+ ;; bashrc: alias goemacs='cd $EMACS_HOME'
+ ;;
+ ;; But after this command, the path hopefully shows the current location
+ ;; and we can make a second guess abount completion.
+ ;;
+ (dirtrack (buffer-substring
+ (line-beginning-position)
+ (line-end-position)))
+ ;; Now, perhaps the directory was set and we can make a second guess
+ (comint-dynamic-complete-as-filename-1)))
+
+
+
+
+ (defun comint-dynamic-complete-as-filename-1 ()
"Dynamically complete at point as a filename.
! See `comint-dynamic-complete-filename'. Return message string id succesful."
(let* ((completion-ignore-case (memq system-type '(ms-dos windows-nt)))
(completion-ignored-extensions comint-completion-fignore)
;; If we bind this, it breaks remote directory tracking in rlogin.el.
***************
*** 2145,2151 ****
(dirsuffix (cond ((not comint-completion-addsuffix)
"")
((not (consp comint-completion-addsuffix))
! (char-to-string directory-sep-char))
(t
(car comint-completion-addsuffix))))
(filesuffix (cond ((not comint-completion-addsuffix)
--- 2185,2191 ----
(dirsuffix (cond ((not comint-completion-addsuffix)
"")
((not (consp comint-completion-addsuffix))
! (char-to-string (comint-directory-sep-char)))
(t
(car comint-completion-addsuffix))))
(filesuffix (cond ((not comint-completion-addsuffix)
Index: dirtrack.el
===================================================================
RCS file:
/cygdrive/K/data/version-control/cvsroot/emacs/gnu-emacs/lisp/dirtrack.el,v
retrieving revision 1.1.1.1
retrieving revision 1.1.1.1.2.2
diff -u -IId: -b -w -c -r1.1.1.1 -r1.1.1.1.2.2
cvs diff: conflicting specifications of output style
*** dirtrack.el 2000/12/10 19:53:54 1.1.1.1
--- dirtrack.el 2001/01/01 16:35:09 1.1.1.1.2.2
***************
*** 119,124 ****
--- 119,125 ----
;;; Code:
(eval-when-compile
+ (autoload 'w32-cygwin-path-to-dos "w32-fns")
(require 'comint)
(require 'shell))
***************
*** 271,277 ****
"
(if (null dirtrackp)
nil
! (let (prompt-path
matched
(current-dir default-directory)
(dirtrack-regexp (nth 0 dirtrack-list))
--- 272,279 ----
"
(if (null dirtrackp)
nil
! (let (prompt-path1
! prompt-path
matched
(current-dir default-directory)
(dirtrack-regexp (nth 0 dirtrack-list))
***************
*** 298,312 ****
(and dirtrack-debug
(dirtrack-debug-message "Match is empty string"))
;; Transform prompts into canonical forms
! (setq prompt-path (funcall dirtrack-directory-function
prompt-path))
(setq current-dir (funcall dirtrack-canonicalize-function
current-dir))
(and dirtrack-debug
(dirtrack-debug-message
(format
! "Prompt is %s\nCurrent directory is %s"
! prompt-path current-dir)))
;; Compare them
(if (or (string= current-dir prompt-path)
(string= current-dir
--- 300,317 ----
(and dirtrack-debug
(dirtrack-debug-message "Match is empty string"))
;; Transform prompts into canonical forms
! (setq prompt-path1 (funcall dirtrack-directory-function
prompt-path))
+ (if (memq system-type '(windows-nt ms-dos))
+ (setq prompt-path (w32-cygwin-path-to-dos prompt-path1))
+ (setq prompt-path prompt-path1))
(setq current-dir (funcall dirtrack-canonicalize-function
current-dir))
(and dirtrack-debug
(dirtrack-debug-message
(format
! "Prompt is %s -> %s\nCurrent directory is %s"
! prompt-path1 prompt-path current-dir)))
;; Compare them
(if (or (string= current-dir prompt-path)
(string= current-dir
Index: w32-fns.el
===================================================================
RCS file:
/cygdrive/K/data/version-control/cvsroot/emacs/gnu-emacs/lisp/w32-fns.el,v
retrieving revision 1.1.1.1
retrieving revision 1.1.1.1.2.1
diff -u -IId: -b -w -c -r1.1.1.1 -r1.1.1.1.2.1
cvs diff: conflicting specifications of output style
*** w32-fns.el 2000/12/10 19:54:01 1.1.1.1
--- w32-fns.el 2001/01/01 16:35:09 1.1.1.1.2.1
***************
*** 63,68 ****
--- 63,91 ----
(and (w32-using-nt) "cmd.exe")
"command.com"))
+
+
+ (defun w32-cygwin-path-to-dos (path)
+ "Convert cygwin like //c/temp or /cygdrive/d/temp path to
+ dos notation c:/temp."
+ ;; NOTE for cygwin and bash shell prompt
+ ;; We can't require a slash after the drive letter, because
+ ;; //c and /cygdrive/c are all top level roots.
+ ;;
+ ;; The bash shell's PS1 setting \w (The current working directory)
+ ;; Does not add trailing slash.
+ (cond
+ ((or (string-match "^//\\([a-z]\\)/?$" path)
+ (string-match "^/cygdrive/\\([a-z]\\)/?$" path))
+ (concat (match-string 1 path) ":/"))
+ ((or (string-match "^//\\([a-z]\\)\\(.*\\)" path)
+ (string-match "^/cygdrive/\\([a-z]\\)\\(.*\\)" path))
+ (concat (match-string 1 path) ":" (match-string 2 path)))
+ (t
+ path)))
+
+
+
(defun w32-system-shell-p (shell-name)
(and shell-name
(member (downcase (file-name-nondirectory shell-name))
- [patch] Emacs cygwin path completion support,
Jari Aalto+mail.emacs <=