Elisp用于替换当前行中空格的下划线

时间:2014-09-19 12:00:08

标签: elisp

我尝试编写一个非常简单的函数来替换当前行中的所有下划线以获得白色步调。 这就是我到目前为止所拥有的

  (select-current-line)
  (exit-minibuffer)
  (query-replace "_" " " nil (if (and transient-mark-mode mark-active) (region-beginning)) (if (and transient-mark-mode mark-active) (region-end)))

但我收到以下消息:

No catch for tag: exit, nil

我不太相信在主动选择中使用查询替换是最好的方法,但我根本不是一个elisp程序员。

有什么想法吗?

由于

更新

根据以下答案,这是我最终使用的片段代码:

  (let ((end (copy-marker (line-end-position))))
    (while (re-search-forward "_" end t)
      (replace-match " " nil nil)))

1 个答案:

答案 0 :(得分:1)

C-h f query-replace RET没有说出我想引用的内容,但C-h f perform-replace RET确实如此:

Don't use this in your own program unless you want to query and set the mark
just as `query-replace' does.  Instead, write a simple loop like this:

  (while (re-search-forward \"foo[ \\t]+bar\" nil t)
    (replace-match \"foobar\" nil nil))

至于将其限制为当前行,最好的方法是使用re-search-forward的第二个arg:

(let ((end (copy-marker (line-end-position))))
  (while (re-search-forward \"foo[ \\t]+bar\" end t)
    (replace-match \"foobar\" nil nil)))

请注意copy-marker的使用,因为在您修改线条时,行尾的位置会不断变化,因此您不希望将该位置保持为普通整数而是作为标记(这与文本中的某个地方相关联。 一种常见的替代方法是倒退(因为插入/删除仅影响更改后的位置):

(end-of-line)
(let ((beg (line-beginning-position)))
  (while (re-search-backward \"foo[ \\t]+bar\" beg t)
    (replace-match \"foobar\" nil nil)))