我开始学习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 转到原始缓冲区中的给定行。
答案 0 :(得分:4)
只是想向您展示我的occur-dwim
版本。
我记得花一些时间来了解regexp-history
变量。
第一个功能类似于您的get-selected-text
。
(defun region-str-or-symbol ()
"Return the contents of region or current symbol."
(if (region-active-p)
(buffer-substring-no-properties
(region-beginning)
(region-end))
(thing-at-point 'symbol)))
(defun occur-dwim ()
"Call `occur' with a sane default."
(interactive)
(push (region-str-or-symbol) regexp-history)
(call-interactively 'occur))
答案 1 :(得分:2)
要显示列表缓冲区,请使用get-buffer-create
并使用erase-buffer
清除它(它可能已经被取消)。
要输出您在当前缓冲区中搜索的行,请将该行保存在字符串中,并通过with-current-buffer
和insert
将其放入列表缓冲区。
要对文本进行特殊返回或使其可单击,请在其上放置带有本地键映射的text-property。
使用本指南,您应该能够在elisp-manual中找到所需的一切。
关于您的代码,您可以使用(interactive "r")
获取当前区域的开头和结尾。因此,如果没有活动区域,您还会收到错误消息。