Remplacer deux barres obliques inversées avec un seul anti-slash dans Emacs

voix
1

J'ai créé une expression régulière avec re-constructeur dans Emacs. J'utilise Cc Cw pour le copier dans le kill-ring.

Les spectacles kill-ring:

\\ (defun \\)

Tout d'abord, j'ai modifié la fonction de copie pour se débarrasser de la « ».

\\ (\\ defun)

Mon autre problème est l'expression régulière dans le kill-ring contient backslashes double, ce qui rend inutilisable pour des fonctions comme query-replace-regexp , que je veux tirer sur ce retour dans le kill-ring.

Ces fonctions attendent antislashs, comme

\ (Defun \)

Donc, je pensais que je pouvais remplacer le « \\ » avec le « \ » avant de le copier à la kill-ring en faisant ceci:

(Replace-regexp-in-string \\\\ \\ \\ (\\ defun) nil t)

Lors de l'exécution de la fonction du mini-tampon indique « \\ (defun \\) » au lieu de « \ (defun \) » en conséquence.

Qu'est-ce que je fais mal?

Créé 27/08/2009 à 05:59
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
2

Cela fonctionne pour moi:

(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)
Créé 27/08/2009 à 15:19
source utilisateur

voix
2

En passant votre chaîne par 'insertou 'princfait la substitution pour vous.

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

Je ne vois pas la façon évidente de le faire directement, voici une façon vraiment alambiquée qui semble fonctionner avec les chaînes de test pour moi:

(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)))
Créé 27/08/2009 à 07:07
source utilisateur

voix
1

re-constructeur + .el a quelques extensions de re-constructeur qui fournit des fonctions pour l' utilisation de re-constructeur avec query-replace-regexpetreplace-regexp.

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

Créé 27/08/2009 à 15:03
source utilisateur

voix
0

Un pas en arrière, vous pouvez définir la variable reb-re-syntaxà la stringplace de la valeur par défaut read. Cela va changer le comportement re-builderà usage unique antislashs au lieu de deux .

Pour ce faire, utilisez personnaliser:

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

Vous pouvez également ajouter à votre fichier .emacs:

(set reb-re-syntax 'string)

Ensuite, pour sauter directement dans le remplacement, vous pouvez utiliser cette 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)))
Créé 06/04/2016 à 20:41
source utilisateur

voix
0

Quelque chose comme ça?

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

(Merci à Trey pour le (current-kill 0)bit.)

Créé 27/08/2009 à 14:40
source utilisateur

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