(defun my-file-exists-p (fname) (cond ((file-exists-p fname) fname) ((file-exists-p (concat fname ".js")) (concat fname ".js")) ((file-exists-p (concat fname ".jsx")) (concat fname ".jsx")) ((file-exists-p (concat fname ".css")) (concat fname ".css")) (t nil))) (defun my-file-opener () (interactive) (let (($path (if (use-region-p) (buffer-substring-no-properties (region-beginning) (region-end)) (let (p0 p1 p2) (setq p0 (point)) ;; chars that are likely to be delimiters of full path, e.g. space, tabs, brakets. (skip-chars-backward "^ \"\t\n`'|()[]{}<>〔〕“”〈〉《》【】〖〗«»‹›·。\\`") (setq p1 (point)) (goto-char p0) (skip-chars-forward "^ \"\t\n`'|()[]{}<>〔〕“”〈〉《》【】〖〗«»‹›·。\\'") (setq p2 (point)) (goto-char p0) (buffer-substring-no-properties p1 p2))))) (if (string-match-p "\\`https?://" $path) (browse-url $path) ;; It is not a website => lets assume it is a file! ;; Search for it and go a max of 15 steps upo (let ((cnt 0)) (while (and (not (my-file-exists-p (file-truename $path))) (< cnt 15)) (progn (setq $path (concat "../" $path)) (setq cnt (+ 1 cnt)))) (if (my-file-exists-p (file-truename $path)) (find-file (my-file-exists-p (file-truename $path))) (message "Could not find the specified file! `%s'" ($path))))))) (global-set-key (kbd "C-x C-g") 'my-file-opener)