summaryrefslogtreecommitdiff
path: root/lisp/url/url-handlers.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/url/url-handlers.el')
-rw-r--r--lisp/url/url-handlers.el18
1 files changed, 14 insertions, 4 deletions
diff --git a/lisp/url/url-handlers.el b/lisp/url/url-handlers.el
index 1fe0af65ff2..3802c39b785 100644
--- a/lisp/url/url-handlers.el
+++ b/lisp/url/url-handlers.el
@@ -28,6 +28,7 @@
;; (require 'url-util)
(eval-when-compile (require 'mm-decode))
;; (require 'mailcap)
+(eval-when-compile (require 'subr-x))
;; The following are autoloaded instead of `require'd to avoid eagerly
;; loading all of URL when turning on url-handler-mode in the .emacs.
(autoload 'url-expand-file-name "url-expand" "Convert url to a fully specified url, and canonicalize it.")
@@ -41,6 +42,9 @@
(declare-function mm-decode-string "mm-bodies" (string charset))
;; mm-decode loads mail-parse.
(declare-function mail-content-type-get "mail-parse" (ct attribute))
+;; mm-decode loads mm-bodies, which loads mm-util.
+(declare-function mm-charset-to-coding-system "mm-util"
+ (charset &optional lbt allow-override silent))
;; Implementation status
;; ---------------------
@@ -98,10 +102,7 @@
;;;###autoload
(define-minor-mode url-handler-mode
- "Toggle using `url' library for URL filenames (URL Handler mode).
-With a prefix argument ARG, enable URL Handler mode if ARG is
-positive, and disable it otherwise. If called from Lisp, enable
-the mode if ARG is omitted or nil."
+ "Toggle using `url' library for URL filenames (URL Handler mode)."
:global t :group 'url
;; Remove old entry, if any.
(setq file-name-handler-alist
@@ -183,6 +184,7 @@ the arguments that would have been passed to OPERATION."
(put 'file-name-absolute-p 'url-file-handlers (lambda (&rest ignored) t))
(put 'expand-file-name 'url-file-handlers 'url-handler-expand-file-name)
(put 'directory-file-name 'url-file-handlers 'url-handler-directory-file-name)
+(put 'file-name-directory 'url-file-handlers 'url-handler-file-name-directory)
(put 'unhandled-file-name-directory 'url-file-handlers 'url-handler-unhandled-file-name-directory)
(put 'file-remote-p 'url-file-handlers 'url-handler-file-remote-p)
;; (put 'file-name-as-directory 'url-file-handlers 'url-handler-file-name-as-directory)
@@ -228,6 +230,14 @@ the arguments that would have been passed to OPERATION."
;; a local process.
nil)))
+(defun url-handler-file-name-directory (dir)
+ (let ((url (url-generic-parse-url dir)))
+ ;; Do not attempt to handle `file' URLs which are local.
+ (if (and (not (equal (url-type url) "file"))
+ (string-empty-p (url-filename url)))
+ (url-handler-file-name-directory (concat dir "/"))
+ (url-run-real-handler 'file-name-directory (list dir)))))
+
(defun url-handler-file-remote-p (filename &optional identification _connected)
(let ((url (url-generic-parse-url filename)))
(if (and (url-type url) (not (equal (url-type url) "file")))