Nahradit dvojité lomítko s jedním zpětným lomítkem v Emacsu

hlasů
1

Vytvořil jsem si regulární výraz s re-stavitel v Emacsu. Používám Cc CW ji zkopírovat do kill-kroužek.

Kill-kroužek ukazuje:

\\ (defun \\)

Za prvé, jsem upravil funkci kopírování, jak se zbavit toho „“.

\\ (defun \\)

Můj druhý problém je, regex v kill-kroužek obsahuje dvojité lomítka jeho nepoužitelnost pro funkce, jako je dotaz-replace-regexp , které chci ji vytrhnout zpět do z kill-kroužek.

Tyto funkce očekávat, že jednotlivé zpětná lomítka, jako

\ (Defun \)

Tak jsem myslel, že by mohlo nahradit ‚\\‘ s ‚\‘ před zkopírováním do kill-kroužek tím, že dělá toto:

(Nahradí-regexp-in-řetězce \\\\ \\ \\ (Defun \\) nulová t)

Po spuštění funkce přiřazená minibuffer ukazuje \\ (defun \\) namísto \ (defun \) jako výsledek.

Co dělám špatně?

Položena 27/08/2009 v 05:59
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
2

Absolvování svůj řetězec skrze 'insertnebo 'princdělá substituce za vás.

(princ "\\(defun\\)")
->
\(defun\)

Nevidím zřejmý způsob, jak to udělat přímo, tady je opravdu spletitý způsob, zdá se, pracuje s testovacími řetězců pro mě:

(defun my-insert-kill ()
  "convoluted way to replace \\ in strings"
  (interactive)
  (princ (with-temp-buffer
           (insert "(progn (princ ")
           (insert (current-kill 0))
           (insert ") (insert \"\n\") nil)")
           (eval-print-last-sexp)
           (backward-sexp) (backward-char)
           (let ((p (point)))
             (goto-char (point-min))
             (forward-sexp) (forward-char)
             (buffer-substring (point) p)))
         (current-buffer)))
Odpovězeno 27/08/2009 v 07:07
zdroj uživatelem

hlasů
0

Něco takového?

(defun my-yank-unstring ()
  (interactive)
  (insert (car (read-from-string (current-kill 0)))))

(Díky Trey pro (current-kill 0)bit).

Odpovězeno 27/08/2009 v 14:40
zdroj uživatelem

hlasů
1

re-builder + .el má některá rozšíření znovu stavitele, který poskytuje funkce pro použití re-stavitel s query-replace-regexpareplace-regexp.

http://www.emacswiki.org/emacs/re-builder+.el

Odpovězeno 27/08/2009 v 15:03
zdroj uživatelem

hlasů
2

To funguje pro mě:

(defun my-reb-copy ()
  "Copy current RE into the kill ring without quotes and single
backslashes for later insertion."
  (interactive)
  (reb-update-regexp)
  (let* ((re (with-output-to-string
               (print (reb-target-binding reb-regexp))))
         (str (substring re 2 (- (length re) 2))))
    (with-temp-buffer
      (insert str)
      (goto-char (point-min))
      (while (search-forward "\\\\" nil t)
        (replace-match "\\" nil t))
      (kill-new (buffer-substring (point-min) (point-max))))
    (message "Regexp copied to kill-ring")))

(define-key reb-mode-map "\C-c\C-t" 'my-reb-copy)
Odpovězeno 27/08/2009 v 15:19
zdroj uživatelem

hlasů
0

Udělal krok zpět, můžete nastavit proměnnou reb-re-syntaxna stringmísto výchozího read. Tím se změní chování re-builderse použít jednoduché zpětné lomítko namísto double .

Chcete-li to provést pomocí přizpůsobit:

M-x customize-variable RET rev-re-syntax RET

Nebo přidat do svého souboru .emacs:

(set reb-re-syntax 'string)

Poté skočit přímo do náhrady, můžete použít tento Defun :

(defun reb-query-replace (to-string)
  "Replace current RE from point with `query-replace-regexp'."
  (interactive
   (progn (barf-if-buffer-read-only)
          (list (query-replace-read-to (reb-target-binding reb-regexp)
                                       "Query replace"  t))))
  (with-current-buffer reb-target-buffer
    (query-replace-regexp (reb-target-binding reb-regexp) to-string)))
Odpovězeno 06/04/2016 v 20:41
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more