【发布时间】:2013-12-05 13:15:39
【问题描述】:
我开始学习 Emacs Lisp,作为第一个项目,我想改进 Emacs 中的 fortran 模式。我想在缓冲区中标记一个子程序的名称,然后按一个快捷键。调出一个缓冲区,其中包含给定源代码中提到子例程名称的所有行。
我发现我可以使用:
(defun get-selected-text (beg end)
(interactive
(if (use-region-p)
(list (region-beginning) (region-end))
(list nil nil)))
(message "%s" (if (and beg end)
(buffer-substring-no-properties beg end) "")))
并且可以使用以下方式存储子例程的行号:
(defun get-line-numbers (str)
(interactive "sEnter string: ")
(save-excursion
(goto-char 0)
(let (( sok 1) (list nil) pp)
(while sok
(setq pp (search-forward str nil t))
(if pp (push (line-number-at-pos pp) list)
(setq sok nil)))
(message "%s" list))))
我现在想打开一个新缓冲区,类似于我使用 Ctrl-x Ctrl-b 执行list-buffers 然后显示每个行号以及行上的文本,并且用户可以选择给定的行,然后按 Enter 转到原始缓冲区中的给定行..
【问题讨论】:
-
所以你要重新实现
occur? -
感谢您告诉我。我会查看 Emacs
occur模式的信息。它看起来很有希望,如果我让发生模式工作,我可能会放弃我的项目。。 -
Emacs 是一个旧的 lisp 解释器,被许多程序员用作编辑器。因此,很难找到尚未实现的通用有用功能。考虑到这一点,我下面的回答必须被理解为一个编程练习——而且只有这样。不过,如果您需要非常特殊的功能,而这些功能在 emacs 中当然不存在,当然在其他编辑器中也不存在,那么成为 lisper 具有很大的优势。