Заменить двойную обратную косую черту на одну в Emacs - PullRequest
2 голосов
/ 27 августа 2009

Я создал регулярное выражение с перестройкой в ​​Emacs. Я использую C-c C-w, чтобы скопировать его в список убийц.

Кольцо убийств показывает:

"\\(defun\\)"

Сначала я изменил функцию копирования, чтобы избавиться от "".

\\(defun\\)

Моя другая проблема заключается в том, что регулярное выражение в kill-ring содержит двойные обратные слэши, что делает его непригодным для таких функций, как query-replace-regexp , в которые я хочу вернуть его из kill-ring ,

Эти функции ожидают одиночные обратные слеши, как

\(defun\)

Поэтому я подумал, что смогу заменить '\\' на '\', прежде чем скопировать его в список уничтожений, выполнив следующее:

(replace-regexp-in-string "\\\\" "\\" "\\(defun\\)" nil t)

При выполнении функции минибуфер показывает «\\ (defun \\)» вместо «\ (defun \)» в результате.

Что я делаю не так?

Ответы [ 5 ]

2 голосов
/ 27 августа 2009

Это работает для меня:

(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)
2 голосов
/ 27 августа 2009

Передача вашей строки через 'insert или 'princ заменяет вас.

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

Я не вижу очевидного способа сделать это напрямую, вот действительно запутанный способ, который, кажется, работает для меня с тестовыми строками:

(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)))
1 голос
/ 27 августа 2009

re-builder + .el имеет некоторые расширения для re-builder, которые предоставляют функции для использования re-buildder с query-replace-regexp и replace-regexp.

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

0 голосов
/ 06 апреля 2016

Сделав шаг назад, вы можете установить переменную reb-re-syntax в string вместо значения по умолчанию read. Это изменит поведение re-builder на , используя одиночные обратные слеши вместо двойных .

Для этого используйте customize:

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

Или добавьте в свой файл .emacs:

(set reb-re-syntax 'string)

Затем, чтобы перейти непосредственно к замене, вы можете использовать this 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)))
0 голосов
/ 27 августа 2009

Как то так?

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

(Спасибо Трею за бит (current-kill 0).)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...