Substitua barra invertida dupla com uma única barra invertida no Emacs

votos
1

Eu criei uma expressão regular com re-construtor em Emacs. Eu uso Cc CW para copiá-lo para o matar-ring.

Os mostra a morte de anel:

\\ (defun \\)

Primeiro, eu modifiquei a função de cópia para se livrar do .

\\ (defun \\)

Meu outro problema é que a regex no kill-anel contém barras invertidas duplas, tornando-o inutilizável para funções como query-replace-regexp , o que eu quero arrancar-lo de volta a partir do kill-anel.

Estas funções esperam barras invertidas simples, como

\ (Defun \)

Então eu pensei que poderia substituir o '\\' com o '\' antes de copiá-lo para o matar-ring, fazendo isso:

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

Ao executar a função de minibuffer mostra \\ (defun \\) em vez de \ (defun \) como resultado.

O que estou fazendo de errado?

Publicado 27/08/2009 em 05:59
fonte usuário
Em outras línguas...                            


5 respostas

votos
2

Isso funciona para mim:

(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)
Respondeu 27/08/2009 em 15:19
fonte usuário

votos
2

Passando sua corda através 'insertou 'princfaz a substituição para você.

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

Eu não vejo a maneira mais óbvia de fazer isso diretamente, aqui está uma maneira realmente complicado que parece funcionar com as cordas de teste para mim:

(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)))
Respondeu 27/08/2009 em 07:07
fonte usuário

votos
1

re-construtor + .El tem algumas extensões para re-construtor que fornece as funções para utilizar re-construtor com query-replace-regexpereplace-regexp.

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

Respondeu 27/08/2009 em 15:03
fonte usuário

votos
0

Dando um passo para trás, você pode definir a variável reb-re-syntaxque stringem vez do padrão read. Isso vai mudar o comportamento re-builderda utilizar barras invertidas simples em vez de duplo .

Para fazer isso usando personalizar:

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

Ou adicionar ao seu arquivo .emacs:

(set reb-re-syntax 'string)

Então, para saltar directamente para substituição, você poderia usar esta 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)))
Respondeu 06/04/2016 em 20:41
fonte usuário

votos
0

Algo assim?

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

(Graças a Trey para o (current-kill 0)bit.)

Respondeu 27/08/2009 em 14:40
fonte usuário

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