我不明白如何在我自己编写的命令中重复使用交互式命令。
我想创建一个总是使用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 )
)
)
但我的功能"取代零次发生"选定区域,而我的交互完全按照我的意愿重写所有内容。
我做错了什么?
答案 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))
运行速度更快,不会设置标记或打印任何内容。