diff options
author | Michael Albinus <albinus@detlef> | 2010-02-14 10:23:52 +0100 |
---|---|---|
committer | Michael Albinus <albinus@detlef> | 2010-02-14 10:23:52 +0100 |
commit | da1df31e003d780fb32cdd8e2b41c78e07e8a3e1 (patch) | |
tree | ad01e1534c76d9a133e05021467e38c08dbfadac /lisp/net | |
parent | a43138ebfab03a74c87babb9777798f4f64f4013 (diff) | |
download | emacs-da1df31e003d780fb32cdd8e2b41c78e07e8a3e1.tar.gz |
* files.el (insert-directory): When WILDCARD-REGEXP and
FULL-DIRECTORY-P are nil, insert the file entry instead of the
whole directory. (Bug#5551)
* net/ange-ftp.el (ange-ftp-insert-directory): Insert " " for
dired's alignment sanity. (Bug#5516)
Diffstat (limited to 'lisp/net')
-rw-r--r-- | lisp/net/ange-ftp.el | 86 |
1 files changed, 48 insertions, 38 deletions
diff --git a/lisp/net/ange-ftp.el b/lisp/net/ange-ftp.el index 97a334a50ff..6e468386749 100644 --- a/lisp/net/ange-ftp.el +++ b/lisp/net/ange-ftp.el @@ -4517,44 +4517,54 @@ NEWNAME should be the name to give the new compressed or uncompressed file.") ;; because some FTP servers react to "ls foo" by listing the symlink foo ;; rather than the directory it points to. Now that ange-ftp-ls uses ;; "cd foo; ls" instead, this is not necesssary any more. - (insert - (cond - (wildcard - (let ((default-directory (file-name-directory file))) - (ange-ftp-ls (file-name-nondirectory file) switches nil nil t))) - (full - (ange-ftp-ls file switches 'parse)) - (t - ;; If `full' is nil we're going to do `ls' for a single file. - ;; Problem is that for various reasons, ange-ftp-ls needs to cd and - ;; then do an ls of current dir, which obviously won't work if we - ;; want to ls a file. So instead, we get a full listing of the - ;; parent directory and extract the line corresponding to `file'. - (when (string-match "-?d\\'" switches) - ;; Remove "d" which dired added to `switches'. - (setq switches (substring switches 0 (match-beginning 0)))) - (setq file (directory-file-name file)) - (let* ((dirlist (ange-ftp-ls (or (file-name-directory file) ".") - switches 'parse)) - (filename (file-name-nondirectory file)) - (case-fold-search nil)) - ;; FIXME: This presumes a particular output format, which is - ;; basically Unix. - (if (string-match (concat "^.+[^ ] " (regexp-quote filename) - "\\( -> .*\\)?[@/*=]?\n") dirlist) - (match-string 0 dirlist) - ""))))) - - ;; The inserted file could be from somewhere else. - (when (and (not wildcard) (not full) - (search-backward - (if (zerop (length (file-name-nondirectory - (expand-file-name file)))) - "." - (file-name-nondirectory file)) - nil 'noerror)) - (replace-match (file-relative-name (expand-file-name file)) t) - (goto-char (point-max))))) + (let ((beg (point)) + (end (point-marker))) + (set-marker-insertion-type end t) + (insert + (cond + (wildcard + (let ((default-directory (file-name-directory file))) + (ange-ftp-ls (file-name-nondirectory file) switches nil nil t))) + (full + (ange-ftp-ls file switches 'parse)) + (t + ;; If `full' is nil we're going to do `ls' for a single file. + ;; Problem is that for various reasons, ange-ftp-ls needs to cd and + ;; then do an ls of current dir, which obviously won't work if we + ;; want to ls a file. So instead, we get a full listing of the + ;; parent directory and extract the line corresponding to `file'. + (when (string-match "-?d\\'" switches) + ;; Remove "d" which dired added to `switches'. + (setq switches (substring switches 0 (match-beginning 0)))) + (setq file (directory-file-name file)) + (let* ((dirlist (ange-ftp-ls (or (file-name-directory file) ".") + switches 'parse)) + (filename (file-name-nondirectory file)) + (case-fold-search nil)) + ;; FIXME: This presumes a particular output format, which is + ;; basically Unix. + (if (string-match (concat "^.+[^ ] " (regexp-quote filename) + "\\( -> .*\\)?[@/*=]?\n") dirlist) + (match-string 0 dirlist) + ""))))) + + ;; Insert " " for dired's alignment sanity. + (goto-char beg) + (while (re-search-forward "^\\(\\S-\\)" end 'move) + (replace-match " \\1")) + + ;; The inserted file could be from somewhere else. + (when (and (not wildcard) (not full) + (search-backward + (if (zerop (length (file-name-nondirectory + (expand-file-name file)))) + "." + (file-name-nondirectory file)) + nil 'noerror)) + (replace-match (file-relative-name (expand-file-name file)) t) + (goto-char end)) + + (set-marker end nil)))) (defun ange-ftp-dired-uncache (dir) (if (ange-ftp-ftp-name (expand-file-name dir)) |