If browse-url-browser-function is defined as a list of pairs (REGEXP . FUNCTION), like: (setq browse-url-browser-function '(("i\.imgur\.com" browse-url-emacs) ("." browse-url-chromium))) browse-url (with an "i.imgur.com" url) will print an error saying that "(invalid-function (browse-url-chromium))". This is probably because of how browse-url handles such pairs: ;; The `function' can be an alist; look down it for first match ;; and apply the function (which might be a lambda). (catch 'done (dolist (bf function) (when (string-match (car bf) url) (apply (cdr bf) url args) ^^^^^^ (cdr bf) returns (browse-url-emacs) instead of browse-url-emacs (throw 'done t))) This can be easily fixed by replacing "(cdr bf)" with "(cadr bf)". I have attached a patch which does the same. If it looks good, I'll push it to master.