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

时间:2013-12-05 13:15:39

标签: emacs elisp

我开始学习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 转到原始缓冲区中的给定行。

2 个答案:

答案 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-bufferinsert将其放入列表缓冲区。

要对文本进行特殊返回或使其可单击,请在其上放置带有本地键映射的text-property。

使用本指南,您应该能够在elisp-manual中找到所需的一切。

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