在整个Emacs缓冲区中突出显示一个名称



我开始学习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-bufferinsert将其放入列表缓冲区。

要使返回在文本上特别或使其可点击,请在其上放置一个带有本地键映射的文本属性。

有了这个指南,你应该能够在elisp手册中找到你需要的一切。

关于您的代码,您可以使用(interactive "r")获得当前区域的开始和结束。如果没有活动区域,您还会收到错误消息。

最新更新