我倾向于在整个缓冲区而不是当前位置使用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
我无法真正看到我做错了什么,希望有人可以提供帮助。
答案 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)))