【问题标题】:Highlight a name throughout an Emacs buffer突出显示整个 Emacs 缓冲区中的名称
【发布时间】: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 具有很大的优势。

标签: emacs elisp


【解决方案1】:

只是想向您展示我的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)) 

【讨论】:

  • 谢谢!我会看看这个,但首先:如何安装occur 模式?我用谷歌搜索了occur.el,但找不到任何东西?
  • 它与 Emacs 捆绑在一起。你已经有了。试试 M-x occur
  • 是的,我有!但是在加载occur 模式后,fortran 模式发生了一些事情。现在没有语法高亮了..
  • 你需要一个普通的occur,而不是occur-mode
  • 您的代码运行良好。非常感谢您的帮助!
【解决方案2】:

要显示列表缓冲区,您使用get-buffer-create 并使用erase-buffer 清除它(它可能已经存在)。

要输出您在当前缓冲区中搜索的行,请将该行保存在一个字符串中,并通过with-current-bufferinsert 将其放入列表缓冲区。

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

通过本指南,您应该能够在 elisp 手册中找到所需的一切。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多