(defun xah-open-file-at-cursor ()
"Open the file path under cursor.
If there is text selection, uses the text selection for path.
If the path starts with “http://”, open the URL in browser.
Input path can be {relative, full path, URL}.
Path may have a trailing “:‹n›” that indicates line number. If so, jump to that line number.
If path does not have a file extension, automatically try with “.el” for elisp files.
This command is similar to `find-file-at-point' but without prompting for confirmation.
URL `http://ergoemacs.org/emacs/emacs_open_file_path_fast.html'
Version 2018-10-08"
(interactive)
(let* (($inputStr (if (use-region-p)
(buffer-substring-no-properties (region-beginning) (region-end))
(let ($p0 $p1 $p2
;; chars that are likely to be delimiters of file path or url, e.g. space, tabs, brakets. The colon is a problem. cuz it's in url, but not in file name. Don't want to use just space as delimiter because path or url are often in brackets or quotes as in markdown or html
($pathStops "^ \t\n\"`'‘’“”|()[]{}「」<>〔〕〈〉《》【】〖〗«»‹›❮❯❬❭〘〙·。\\"))
(setq $p0 (point))
(skip-chars-backward $pathStops)
(setq $p1 (point))
(goto-char $p0)
(skip-chars-forward $pathStops)
(setq $p2 (point))
(goto-char $p0)
(buffer-substring-no-properties $p1 $p2))))
($path
(replace-regexp-in-string
"^file:///" "/"
(replace-regexp-in-string
":\\'" "" $inputStr))))
(if (string-match-p "\\`https?://" $path)
(if (fboundp 'xahsite-url-to-filepath)
(let (($x (xahsite-url-to-filepath $path)))
(if (string-match "^http" $x )
(browse-url $x)
(find-file $x)))
(progn (browse-url $path)))
(if ; not starting “http://”
(string-match "^\\`\\(.+?\\):\\([0-9]+\\)\\'" $path)
(let (
($fpath (match-string 1 $path))
($line-num (string-to-number (match-string 2 $path))))
(if (file-exists-p $fpath)
(progn
(find-file $fpath)
(goto-char 1)
(forward-line (1- $line-num)))
(when (y-or-n-p (format "file no exist: 「%s」. Create?" $fpath))
(find-file $fpath))))
(if (file-exists-p $path)
(progn ; open f.ts instead of f.js
(let (($ext (file-name-extension $path))
($fnamecore (file-name-sans-extension $path)))
(if (and (string-equal $ext "js")
(file-exists-p (concat $fnamecore ".ts")))
(find-file (concat $fnamecore ".ts"))
(find-file $path))))
(if (file-exists-p (concat $path ".el"))
(find-file (concat $path ".el"))
(when (y-or-n-p (format "file no exist: 「%s」. Create?" $path))
(find-file $path ))))))))