代码之家  ›  专栏  ›  技术社区  ›  cschol

在Emacs中将双反斜杠替换为单反斜杠

  •  2
  • cschol  · 技术社区  · 15 年前

    我在emacs中创建了一个带有re-builder的正则表达式。我用C-C C-W把它复制到杀死戒指上。

    压井环显示:

    "\\(defun\\)"

    首先,我修改了copy函数以去掉“”。

    \\(defun\\)

    我的另一个问题是,kill环中的regex包含两个反斜杠,这使得它不能用于类似的函数 查询替换regexp 我想把它从杀人戒指里拽出来。

    这些函数需要一个反斜杠,比如

    \(defun\)

    所以我想在复制到杀死戒指之前,我可以用‘’’替换‘\’’:

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

    当执行函数时,minibuffer会显示\(defun \\)而不是\(defun \)结果。

    我做错什么了?

    5 回复  |  直到 8 年前
        1
  •  2
  •   scottfrazer    15 年前

    这对我很有用:

    (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
  •  2
  •   Trey Jackson    15 年前

    把你的绳子穿过去 '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)))
    
        3
  •  1
  •   cms    15 年前

    Re-Builder+.el对Re-Builder有一些扩展,提供了使用Re-Builder的函数 query-replace-regexp replace-regexp.

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

        4
  •  0
  •   legoscia    15 年前

    像这样?

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

    (多亏了特雷 (current-kill 0) 比特)

        5
  •  0
  •   Brigham    8 年前

    后退一步,可以设置变量 reb-re-syntax string 而不是默认值 read .这将改变 re-builder use single backslashes instead of double .

    要使用“自定义”执行此操作,请执行以下操作:

    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)))