1

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

我想为我创建另一个绑定到 CSr (CR) 的函数。我想如果我简单地将它们包装在一起,例如:

(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

我真的看不出我做错了什么,希望有人能提供帮助。

4

2 回答 2

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

另请注意,永远不要beginning-of-buffer从 Lisp 代码中调用;它会做一些不必要的工作,例如推送标记和打印消息。

于 2013-08-10T12:28:39.647 回答
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)))
于 2013-08-10T12:31:35.567 回答