如何定义emacs replace-regex快捷命令?

时间:2014-04-04 19:40:50

标签: regex emacs

我不明白如何在我自己编写的命令中重复使用交互式命令。

我想创建一个总是使用replace-regexp相同参数的命令。这真是一条捷径。

所以我尝试模仿我在选定区域交互式完成的功能,即:

M-x replace-regexp  RET ^\(\s *\)\(.*\)\s *$  RET  \1 + '\2'

我通过编写这个函数来模仿它:

(defun myH2js ()
  "Converts html to an (incomplete) JavaScript String concatenation."

  (interactive)
  (let (p1 p2)
    (setq p1 "^\(\s *\)\(.*\)\s *$" )
    (setq p2 "\1 + '\2'" )
    (replace-regexp  p1 p2 )
  )
)

但我的功能"取代零次发生"选定区域,而我的交互完全按照我的意愿重写所有内容。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

你需要加倍字符串中的反斜杠,因为反斜杠既是字符串又是正则表达式转义字符:

(defun myH2js (start end)
  "Converts html to an (incomplete) JavaScript String concatenation."

  (interactive "r")
  (let ((p1 "^\\(\\s *\\)\\(.*\\)\\s *$")
        (p2 "\\1 + '\\2'"))
    (replace-regexp p1 p2 nil start end)
  )
)

请注意,建议不要在程序内部使用replace-regexp;在线文档说:

  

这个函数在Lisp程序中使用通常是错误的。   你可能想要的是这样的循环:

  (while (re-search-forward regexp nil t)
    (replace-match to-string nil nil))
     

运行速度更快,不会设置标记或打印任何内容。