我的很多工作包括搜索和删除不必要的代码行。所以我创建了一个宏,然后选择所有行(C-x h),然后运行命令(apply-macro-to-region-lines)。我设法保存了该命令,并将其放在我的.emacs文件中;我将其命名为cut_it_now。但是现在我的函数不再是宏,所以我不能再使用(apply-macro-to-region-lines)函数。你知道在什么地方实现了(apply-function-to-region-lines)吗?
非常感谢,
D
发布于 2011-06-30 19:42:50
我同意@Lindydancer的回答,我还想补充说,也许有一种更容易的方法来实现你的目标。例如,内置函数delete-matching-lines。:-)
发布于 2011-06-30 19:38:30
一个简单的解决方案是定义一个宏来调用您的函数,然后使用良好的ol‘apply-macro-to-region-lines。
除此之外,我认为你可以用几行elisp编写一个循环,它完全按照你的要求来做。如果您愿意,您甚至可以提示用户输入函数的名称。我认为这对elisp来说是一个很好的练习,如果你想亲自尝试的话,我可以给你一些建议。
发布于 2011-07-01 03:15:52
下面的函数应该可以执行您想要的操作:
(defun apply-function-to-region-lines (fn)
(interactive "aFunction to apply to lines in region: ")
(save-excursion
(goto-char (region-end))
(let ((end-marker (copy-marker (point-marker)))
next-line-marker)
(goto-char (region-beginning))
(if (not (bolp))
(forward-line 1))
(setq next-line-marker (point-marker))
(while (< next-line-marker end-marker)
(let ((start nil)
(end nil))
(goto-char next-line-marker)
(save-excursion
(setq start (point))
(forward-line 1)
(set-marker next-line-marker (point))
(setq end (point)))
(save-excursion
(let ((mark-active nil))
(narrow-to-region start end)
(funcall fn)
(widen)))))
(set-marker end-marker nil)
(set-marker next-line-marker nil))))因此,如果您希望对缓冲区中的行应用以下函数:
(defun test()
(insert "> "))并且,如果您的缓冲区包含以下内容:
Line 1: blah, blah
Line 2: blah, blah
Line 3: blah, blah
Line 4: blah, blah如果您选择了一个仅包含第2行和第3行的区域,输入"M-x apply- function -to- region - lines ",并在出现提示时输入"test“作为函数名,您将在缓冲区中得到以下结果:
Line 1: blah, blah
> Line 2: blah, blah
> Line 3: blah, blah
Line 4: blah, blahhttps://stackoverflow.com/questions/6532898
复制相似问题