summaryrefslogtreecommitdiff
path: root/lisp/ido.el
diff options
context:
space:
mode:
authorKim F. Storm <storm@cua.dk>2006-03-31 23:47:02 +0000
committerKim F. Storm <storm@cua.dk>2006-03-31 23:47:02 +0000
commit4c2ee078aaa8d5690578dfd22f725c61195c0737 (patch)
tree79d0b89e2e7a7f4b07239a3cd28f8ef45ea38ea8 /lisp/ido.el
parente701756a5a36a451e97ae12c50059f718cd725b8 (diff)
downloademacs-4c2ee078aaa8d5690578dfd22f725c61195c0737.tar.gz
(ido-unc-hosts-cache): New defvar.
(ido-unc-hosts): If value of defcustom is a function, call it to get list of UNC hosts. Add function-item choices to specify ido-unc-hosts-net-view or user function. (ido-ignore-unc-host-regexps): New defcustom. (ido-unc-hosts-net-view, ido-unc-hosts): New functions. (ido-is-unc-root, ido-is-unc-host, ido-file-name-all-completions) (ido-exhibit): Call ido-unc-hosts to get list of UNC hosts.
Diffstat (limited to 'lisp/ido.el')
-rw-r--r--lisp/ido.el71
1 files changed, 65 insertions, 6 deletions
diff --git a/lisp/ido.el b/lisp/ido.el
index 3de76a36e07..e4ec2be700d 100644
--- a/lisp/ido.el
+++ b/lisp/ido.el
@@ -630,9 +630,28 @@ equivalent function, e.g. `find-file' rather than `ido-find-file'."
:type '(repeat regexp)
:group 'ido)
+(defvar ido-unc-hosts-cache t
+ "Cached value from ido-unc-hosts function.")
+
(defcustom ido-unc-hosts nil
- "*List of known UNC host names to complete after initial //."
- :type '(repeat string)
+ "*List of known UNC host names to complete after initial //.
+If value is a function, that function is called to search network for
+hosts on first use of UNC path."
+ :type '(choice (repeat :tag "List of UNC host names" string)
+ (function-item :tag "Use `NET VIEW'"
+ :value ido-unc-hosts-net-view)
+ (function :tag "Your own function"))
+ :set #'(lambda (symbol value)
+ (set symbol value)
+ (setq ido-unc-hosts-cache t))
+ :group 'ido)
+
+(defcustom ido-ignore-unc-host-regexps nil
+ "*List of regexps matching UNC hosts to ignore."
+ :type '(repeat regexp)
+ :set #'(lambda (symbol value)
+ (set symbol value)
+ (setq ido-unc-hosts-cache t))
:group 'ido)
(defcustom ido-cache-unc-host-shares-time 8.0
@@ -1111,18 +1130,58 @@ it doesn't interfere with other minibuffer usage.")
(pop-to-buffer b t t)
(setq truncate-lines t)))))
+(defun ido-unc-hosts (&optional query)
+ "Return list of UNC host names."
+ (cond
+ ((listp ido-unc-hosts)
+ ido-unc-hosts) ;; static list or nil
+ ((listp ido-unc-hosts-cache)
+ ido-unc-hosts-cache) ;; result of net search
+ ((and query (fboundp ido-unc-hosts))
+ (message "Searching for UNC hosts...")
+ (let ((hosts (funcall ido-unc-hosts)) host re-list re)
+ (setq ido-unc-hosts-cache nil)
+ (while hosts
+ (setq host (downcase (car hosts))
+ hosts (cdr hosts)
+ re-list ido-ignore-unc-host-regexps)
+ (while re-list
+ (setq re (car re-list)
+ re-list (cdr re-list))
+ (if (string-match re host)
+ (setq re-list nil
+ host nil)))
+ (if host
+ (setq ido-unc-hosts-cache (cons host ido-unc-hosts-cache)))))
+ (message nil)
+ (setq ido-unc-hosts-cache
+ (sort ido-unc-hosts-cache #'string<)))
+ (query
+ (setq ido-unc-hosts-cache nil))
+ (t (fboundp ido-unc-hosts))))
+
+(defun ido-unc-hosts-net-view ()
+ "Query network for list of UNC host names using `NET VIEW'."
+ (let (hosts)
+ (with-temp-buffer
+ (shell-command "net view" t)
+ (goto-char (point-min))
+ (while (re-search-forward "^\\\\\\\\\\([[:graph:]]+\\)" nil t)
+ (setq hosts (cons (match-string 1) hosts))))
+ hosts))
+
(defun ido-is-tramp-root (&optional dir)
(and ido-enable-tramp-completion
(string-match "\\`/[^/]+[@:]\\'"
(or dir ido-current-directory))))
(defun ido-is-unc-root (&optional dir)
- (and ido-unc-hosts
+ (and (ido-unc-hosts)
(string-equal "//"
(or dir ido-current-directory))))
(defun ido-is-unc-host (&optional dir)
- (and ido-unc-hosts
+ (and (ido-unc-hosts)
(string-match "\\`//[^/]+/\\'"
(or dir ido-current-directory))))
@@ -3238,7 +3297,7 @@ for first matching file."
(mapcar
(lambda (host)
(if (string-match "/\\'" host) host (concat host "/")))
- ido-unc-hosts))
+ (ido-unc-hosts t)))
((and (numberp ido-max-dir-file-cache) (> ido-max-dir-file-cache 0)
(stringp dir) (> (length dir) 0)
(ido-may-cache-directory dir))
@@ -4026,7 +4085,7 @@ For details of keybindings, do `\\[describe-function] ido-find-file'."
((and (ido-is-tramp-root) (string-equal contents "/"))
(ido-set-current-directory ido-current-directory contents)
(setq refresh t))
- ((and ido-unc-hosts (string-equal contents "/")
+ ((and (ido-unc-hosts) (string-equal contents "/")
(let ((ido-enable-tramp-completion nil))
(ido-is-root-directory)))
(ido-set-current-directory "//")