Fix +evil-resolve-vim-path-a not removing excess backslashes

This commit is contained in:
Henrik Lissner 2020-02-20 00:51:55 -05:00
parent 10623868b8
commit dbf9c92b48
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395

View file

@ -15,36 +15,31 @@ support for most vim file modifiers, as well as:
See http://vimdoc.sourceforge.net/htmldoc/cmdline.html#filename-modifiers for See http://vimdoc.sourceforge.net/htmldoc/cmdline.html#filename-modifiers for
more information on modifiers." more information on modifiers."
(let* (case-fold-search (let (case-fold-search)
(regexp (concat "\\(?:^\\|[^\\\\]\\)" (with-temp-buffer
"\\(\\([#%]\\)" (save-excursion (insert file-name))
"\\(\\(?::\\(?:[PphtreS~.]\\|g?s[^:\t\n ]+\\)\\)*\\)\\)")) (while (re-search-forward "\\(^\\|[^\\\\]\\)\\(\\([%#]\\)\\(:\\([PphtreS~.]\\|g?s\\)\\)*\\)" nil t)
(matches (catch 'continue
(cl-loop with i = 0 (unless buffer-file-name
while (and (< i (length file-name)) (replace-match (match-string 1) t t nil 2)
(string-match regexp file-name i)) (throw 'continue t))
do (setq i (1+ (match-beginning 0))) (let ((beg (match-beginning 2))
and collect (end (match-end 3))
(cl-loop for j to (/ (length (match-data)) 2) (path (pcase (match-string 3)
collect (match-string j file-name)))))
(dolist (match matches)
(let ((flags (split-string (cadddr match) ":" t))
(path (and buffer-file-name
(pcase (caddr match)
("%" (file-relative-name buffer-file-name)) ("%" (file-relative-name buffer-file-name))
("#" (save-excursion (other-window 1) (file-relative-name buffer-file-name)))))) ("#" (and (other-buffer)
flag global) (buffer-file-name (other-buffer)))))))
(if (not path) (save-match-data
(setq path "") (goto-char beg)
(while flags (while (re-search-forward ":\\([PphtreS~.]\\|g?s\\)" (+ (point) 3) t)
(setq flag (pop flags)) (let* ((modifier (match-string 1))
(when (string-suffix-p "\\" flag) (global (string-prefix-p "gs" modifier)))
(setq flag (concat flag (pop flags)))) (when global
(when (string-prefix-p "gs" flag) (setq modifier (substring modifier 1)))
(setq global t (setq end (match-end 1)
flag (substring flag 1))) path
(setq path (or (when path
(or (pcase (substring flag 0 1) (pcase (substring modifier 0 1)
("p" (expand-file-name path)) ("p" (expand-file-name path))
("~" (concat "~/" (file-relative-name path "~"))) ("~" (concat "~/" (file-relative-name path "~")))
("." (file-relative-name path default-directory)) ("." (file-relative-name path default-directory))
@ -54,14 +49,13 @@ more information on modifiers."
("S" (shell-quote-argument path)) ("S" (shell-quote-argument path))
("h" ("h"
(let ((parent (file-name-directory (expand-file-name path)))) (let ((parent (file-name-directory (expand-file-name path))))
(unless (equal (file-truename path) (unless (file-equal-p path parent)
(file-truename parent))
(if (file-name-absolute-p path) (if (file-name-absolute-p path)
(directory-file-name parent) (directory-file-name parent)
(file-relative-name parent))))) (file-relative-name parent)))))
("s" ("s"
(if (featurep 'evil) (if (featurep 'evil)
(when-let (args (evil-delimited-arguments (substring flag 1) 2)) (when-let (args (evil-delimited-arguments (substring modifier 1) 2))
(let ((pattern (evil-transform-vim-style-regexp (car args))) (let ((pattern (evil-transform-vim-style-regexp (car args)))
(replace (cadr args))) (replace (cadr args)))
(replace-regexp-in-string (replace-regexp-in-string
@ -73,18 +67,14 @@ more information on modifiers."
(let ((project-root (doom-project-root (file-name-directory (expand-file-name path))))) (let ((project-root (doom-project-root (file-name-directory (expand-file-name path)))))
(unless project-root (unless project-root
(user-error "Not in a project")) (user-error "Not in a project"))
(abbreviate-file-name project-root))) (abbreviate-file-name project-root)))))
(_ path)) ""))
"")))
;; strip trailing slash, if applicable ;; strip trailing slash, if applicable
(when (and (not (string= path "")) (equal (substring path -1) "/")) (or (string-empty-p path)
(setq path (substring path 0 -1)))) (not (equal (substring path -1) "/"))
(setq file-name (setq path (substring path 0 -1))))))
(replace-regexp-in-string (replace-match path t t nil 2))))
(format "\\(?:^\\|[^\\\\]\\)\\(%s\\)" (replace-regexp-in-string "\\\\\\([#%]\\)" "\\1" (buffer-string) t))))
(regexp-quote (cadr match)))
path file-name t t 1))))
(replace-regexp-in-string regexp "\\1" file-name t)))
(defun +evil--insert-newline (&optional above _noextranewline) (defun +evil--insert-newline (&optional above _noextranewline)
(let ((pos (save-excursion (beginning-of-line-text) (point))) (let ((pos (save-excursion (beginning-of-line-text) (point)))