我开始学习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-xCtrl-b执行list-buffers
,然后显示每个行号和行上的文本,用户可以选择给定的行,然后按Enter转到原始缓冲区中的给定行。。
我只是想向您展示我的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))
要显示列表缓冲区,请使用get-buffer-create
并用erase-buffer
清除它(可能是它已经退出)。
要输出在当前缓冲区中搜索的行,请将该行保存为字符串,并通过with-current-buffer
和insert
将其放入列表缓冲区。
要使返回在文本上特别或使其可点击,请在其上放置一个带有本地键映射的文本属性。
有了这个指南,你应该能够在elisp手册中找到你需要的一切。
关于您的代码,您可以使用(interactive "r")
获得当前区域的开始和结束。如果没有活动区域,您还会收到错误消息。