如何在函数内调用query-replace-regexp?

时间:2013-08-10 12:02:03

标签: emacs elisp

我倾向于在整个缓冲区而不是当前位置使用query-replace-regexp,因此我经常使用序列C-< (缓冲区开始),然后是C-r(query-replace-repexp)。

我想创建另一个绑定到C-S-r(C-R)的函数,它为我做了这个。我想如果我把它们全部包裹在一起,例如:

(defun query-replace-regexp-whole-buffer ()
  "query-replace-regexp from the beginning of the buffer."
  (interactive)
  (beginning-of-buffer)
  (query-replace-regexp))
不幸的是,虽然我遇到了一些错误,但这还不够。

query-replace-regexp-whole-buffer: Wrong number of arguments: #[(regexp to-string &optional delimited start end) "Å Æ
Ç&  " [regexp to-string delimited start end perform-replace t nil] 10 1940879 (let ((common (query-replace-read-args (concat "Query replace" (if current-prefix-arg " word" "") " regexp" (if (and transient-mark-mode mark-active) " in region" "")) t))) (list (nth 0 common) (nth 1 common) (nth 2 common) (if (and transient-mark-mode mark-active) (region-beginning)) (if (and transient-mark-mode mark-active) (region-end))))], 0

我无法真正看到我做错了什么,希望有人可以提供帮助。

2 个答案:

答案 0 :(得分:3)

从Lisp调用时,query-replace-regexp期望传递正则表达式并将预期的替换作为参数传递。如果您想模拟交互式调用时提出的问题,则需要使用call-interactively

(defun query-replace-regexp-whole-buffer ()
  "query-replace-regexp from the beginning of the buffer."
  (interactive)
  (goto-char (point-min))
  (call-interactively 'query-replace-regexp))

另请注意,不应该从Lisp代码中调用beginning-of-buffer;它会做不必要的工作,比如推动标记和打印信息。

答案 1 :(得分:2)

您需要自己阅读参数并将其传递给query-replace-regexp ...这可以通过扩展您的交互式来完成,因此函数将类似于:

(defun query-replace-regexp-whole-buffer (regex to-string)
  "query-replace-regexp from the beginning of the buffer."
  (interactive "sRegex to search: \nsString to replace: ")
  (save-excursion
     (goto-char (point-min))
     (query-replace-regexp regex to-string)))