[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [patch] Emacs cygwin path completion support
From: |
Jari Aalto+mail.emacs |
Subject: |
Re: [patch] Emacs cygwin path completion support |
Date: |
02 Jan 2001 02:06:56 +0200 |
User-agent: |
Gnus/5.090001 (Oort Gnus v0.01) Emacs/20.6 (i386-*-windows98.1998) |
* Mon 2001-01-01 Eli Zaretskii <eliz@is.elta.co.il> gnu.emacs.bug
*
<http://search.dejanews.com/msgid.xp?MID=%3C6480-Mon01Jan2001210526+0200-eliz@is.elta.co.il%3E&format=threaded>
| [+]
| > From: jari.aalto@poboxes.com (Jari Aalto+mail.emacs)
| > Newsgroups: gnu.emacs.bug
| > Date: 01 Jan 2001 18:49:24 +0200
| >
| > + (defun w32-cygwin-path-to-dos (path)
| > + ((or (string-match "^//\\([a-z]\\)\\(.*\\)" path)
| > + (string-match "^/cygdrive/\\([a-z]\\)\\(.*\\)" path))
|
| The last two regexps are still too general, I think. For example,
| "^/cygdrive/\\([a-z]\\)\\(.*\\)" will let "/cygdrive/foobar" be
| converted to "f:oobar". That's not what you want, I think.
|
| I see the note you put in the comment above, but I think it only
| pertains to the case like "/cygdrive/c" which you test in the first
| part of `cond'. Wouldn't using "^/cygdrive/\\([a-z]\\)\\(/.*\\)", and
| similar for the "//c/foo" syntax, be better in the second part?
Yes. Fixed in this latest patch. I also noticed flaws in the
`comint-dynamic-complete-as-filename-1' which now
handles cygwin paths.
I should note that the "/cygdrive/c" is the correct traslation
in w32-dos-path-to-cygwin, the "//c" is an old and depricated B19 and B20
feature, but still supported in latest V1.1+ release.
Jari
cvs diff: Diffing .
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.5
diff -u -IId: -b -w -c -r1.1.1.1 -r1.1.1.1.2.5
cvs diff: conflicting specifications of output style
*** ChangeLog 2000/12/10 19:53:54 1.1.1.1
--- ChangeLog 2001/01/01 23:56:16 1.1.1.1.2.5
***************
*** 1,3 ****
--- 1,75 ----
+ 2001-01-02 Tue Jari Aalto <jari.aalto@poboxes.com>
+
+ * comint.el (comint-dynamic-complete-as-filename):
+ Rearranged the code to take into account dirtrack.el
+ which must be called before comint-dynamic-complete-as-filename-1
+ or that function will die on error trying to complete
+ cygwin //c/temp name:
+ (file-error (Opening directory invalid argument //c/))
+ (comint-dynamic-complete-as-filename-1): handle special
+ case: cygwin-p
+
+
+ * w32-fns.el (w32-cygwin-path-to-dos):
+ Made regexps more strict Based on Eli's comment.
+ Now a slash is required after drive letter in cygwin
+ path. path like /cygdrive/some or //some are illegal
+ (w32-dos-path-to-cygwin): New.
+ (w32-cygwin-path-p): New.
+
+ 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.5
diff -u -IId: -b -w -c -r1.1.1.1 -r1.1.1.1.2.5
cvs diff: conflicting specifications of output style
*** comint.el 2000/12/10 19:53:54 1.1.1.1
--- comint.el 2001/01/01 23:59:45 1.1.1.1.2.5
***************
*** 147,152 ****
--- 147,157 ----
;; comint-completion-autolist boolean completion
behavior
;; comint-completion-recexact boolean ...
+ (eval-and-compile
+ (autoload 'w32-system-shell-p "w32-fns")
+ (autoload 'w32-cygwin-path-p "w32-fns")
+ (autoload 'w32-cygwin-path-to-dos "w32-fns"))
+
(defgroup comint nil
"General command interpreter in a window stuff."
:group 'processes)
***************
*** 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.
--- 2136,2193 ----
(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 Cygwin 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."
+ (if (not (fboundp 'dirtrack))
+ (comint-dynamic-complete-as-filename-1)
+ (let* ((point (point))
+ (path (buffer-substring
+ (save-excursion
+ (skip-chars-backward "^ \t\r\n")
+ (point))
+ point))
+ )
+ ;; It is possible that user uses an shell alias that changes 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.
+ ;;
+ (cond
+ ((not (string-match "^/" path))
+ ;; this is relative completion, calculate ROOT
+ (dirtrack (buffer-substring
+ (line-beginning-position)
+ (line-end-position)))))
+
+ ;; Now the default-directory is ready, but user may be now requesting
+ ;; and absolute CD. The PATH-HERE was fixed by dirtrack for relative
+ ;; completions.
+ ;;
+ ;; promt PATH-HERE > cd //c/temp[TAB]
+ ;;
+ (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)
--- 2199,2205 ----
(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)
***************
*** 2155,2162 ****
(t
(cdr comint-completion-addsuffix))))
(filename (or (comint-match-partial-filename) ""))
! (pathdir (file-name-directory filename))
! (pathnondir (file-name-nondirectory filename))
(directory (if pathdir (comint-directory pathdir) default-directory))
(completion (file-name-completion pathnondir directory)))
(cond ((null completion)
--- 2209,2224 ----
(t
(cdr comint-completion-addsuffix))))
(filename (or (comint-match-partial-filename) ""))
! (cygwin-p (and (memq system-type '(windows-nt ms-dos))
! (w32-cygwin-path-p filename)))
! (pathdir (file-name-directory
! (if cygwin-p
! (w32-cygwin-path-to-dos filename)
! filename)))
! (pathnondir (file-name-nondirectory
! (if cygwin-p
! (w32-cygwin-path-to-dos filename)
! filename)))
(directory (if pathdir (comint-directory pathdir) default-directory))
(completion (file-name-completion pathnondir directory)))
(cond ((null completion)
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.3
diff -u -IId: -b -w -c -r1.1.1.1 -r1.1.1.1.2.3
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 23:47:58 1.1.1.1.2.3
***************
*** 63,68 ****
--- 63,108 ----
(and (w32-using-nt) "cmd.exe")
"command.com"))
+
+ (defun w32-cygwin-path-p (path)
+ "Check if PATH is like cygwin //c /cygdrive/c."
+ (and path
+ (string-match "^//[a-z]\\|^/cygdrive/" path)))
+
+ (defun w32-dos-path-to-cygwin (path)
+ "Convert dos PATH c:/temp to cygwin v1.1+ like /cygdrive/c/temp."
+ (and path
+ (if (not (string-match "^\\([a-z]\\):\\(.*\\)" path))
+ path
+ (setq path (format "/cygdrive/%s%s"
+ (match-string 1 path)
+ (match-string 2 path)))
+ (subst-char-in-string ?\\ ?/ path))))
+
+ (defun w32-cygwin-path-to-dos (path)
+ "Convert cygwin like //c/temp or /cygdrive/c/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)))
+ ((string-match "^(/cygdrive/./\\|//" path)
+ ;; if previous regexps couldn't handle it, this is severe error.
+ (error "Invalid path format for cygwin %s" path))
+ (t
+ path)))
+
+
+
(defun w32-system-shell-p (shell-name)
(and shell-name
(member (downcase (file-name-nondirectory shell-name))