diff --git a/init/init-regex.el b/init/init-regex.el index 8b2572e88..c25d7c851 100644 --- a/init/init-regex.el +++ b/init/init-regex.el @@ -15,7 +15,36 @@ (after "evil" (evil-set-initial-state 'reb-mode 'insert) - (evil-ex-define-cmd "re[gex]" 're-builder)))) + (evil-ex-define-cmd "re[gex]" 'my:regex) + ;; Either a) converts selected (or entered-in) pcre regex into elisp + ;; regex, OR b) opens up re-builder. + (evil-define-operator my:regex (beg end type &optional regexstr bang) + :move-point nil + :type inclusive + :repeat nil + (interactive "") + (if (reb-mode-buffer-p) + (if regexstr + (let ((regexstr (s-trim (buffer-string)))) + (if bang + (rxt-explain-pcre regexstr) + (rxt-pcre-to-elisp (s-trim (buffer-string))))) + (erase-buffer) + (insert (concat "/" regexstr "/"))) + (cond ((and beg end (/= beg (1- end))) ; Convert selection from pcre regex to elisp + (let ((regexstr (buffer-substring-no-properties beg end))) + (if bang + (rxt-explain-pcre (concat "/" regexstr "/")) + (delete-region beg end) + (insert (rxt-pcre-to-elisp regexstr))))) + (regexstr ; Convert input regex into elisp regex + (let ((newregex (rxt-pcre-to-elisp regexstr))) + (when bang + (setq newregex (s-replace "\\" "\\\\" newregex))) + (kill-new newregex) + (message "Copied regex to kill ring: %s" newregex))) + (t + (re-builder)))))))) (use-package pcre2el :config