emacs 组织模式,仅搜索标题

问题描述 投票:0回答:4

在 emacs 中,我希望能够仅搜索组织模式文件中的“标题”。

想法 1:仅搜索可见
我可以通过隐藏所有内容,然后仅显示大纲(S-TAB,S-TAB),然后搜索所有可见的内容来实现此目的。(在这种情况下,它将是整个目录)。 但如何只搜索可见内容呢? C-s 搜索所有内容。

想法 2:使用正则表达式
我可以做:

C-c / /             //opens regex search
\*.*heading        //start with * (escaped), followed by any chars, then heading.

但目前输入所有这些内容很麻烦。考虑到我 3 小时前就开始学习 emacs,我可以以某种方式自动化它吗?
例如,我可以编写一个函数来使用“*.*ARGUMENT”进行搜索并将其绑定到热键吗?但仍然有能力进行“下一个查找,下一个查找”等操作?

此用途的用例是搜索我的笔记。有些大约有 7000 多行长,我通常只搜索标题。

[编辑解决方案1]
@abo-abo 的回答对我来说效果很好。我现在用

helm-org-in-buffer-headings

即,我安装了 Melpa: https://github.com/milkypostman/melpa#usage

然后我从包列表中安装了 helm:

M-x package-list-packages

然后我编辑了 .emacs 并为其绑定了一个热键:

(global-set-key (kbd "C-=")  'helm-org-in-buffer-headings)  ;Outline search.

我重新加载了 emacs,现在当按下 Ctrl+= 时,会弹出一个可搜索的大纲,当我输入其他字符时,它会自动缩小范围。常用的 C-n、C-p 按钮用于导航。

谢谢!

[编辑解决方案2] 好奇心战胜了我。在享受了 helm 的航向搜索之后,我也玩弄了 worf。它就像舵(它使用舵)但看起来更好,我可以通过按数字键选择轮廓的“级别”。我只删除了标题搜索所需的部分(如果有用的话):

;; ——— WORF Utilities ———————————————————————————————————————————————————————————————
;; https://github.com/abo-abo/worf/blob/master/worf.el
(defun worf--pretty-heading (str lvl)
  "Prettify heading STR or level LVL."
  (setq str (or str ""))
  (setq str (propertize str 'face (nth (1- lvl) org-level-faces)))
  (let (desc)
    (while (and (string-match org-bracket-link-regexp str)
                (stringp (setq desc (match-string 3 str))))
      (setq str (replace-match
                 (propertize desc 'face 'org-link)
                 nil nil str)))
    str))
(defun worf--pattern-transformer (x)
  "Transform X to make 1-9 select the heading level in `worf-goto'."
  (if (string-match "^[1-9]" x)
      (setq x (format "^%s" x))
    x))

(defun worf-goto ()
  "Jump to a heading with `helm'."
  (interactive)
  (require 'helm-match-plugin)
  (let ((candidates
         (org-map-entries
          (lambda ()
            (let ((comp (org-heading-components))
                  (h (org-get-heading)))
              (cons (format "%d%s%s" (car comp)
                            (make-string (1+ (* 2 (1- (car comp)))) ?\ )
                            (if (get-text-property 0 'fontified h)
                                h
                              (worf--pretty-heading (nth 4 comp) (car comp))))
                    (point))))))
        helm-update-blacklist-regexps
        helm-candidate-number-limit)
    (helm :sources
          `((name . "Headings")
            (candidates . ,candidates)
            (action . (lambda (x) (goto-char x)
                         (call-interactively 'show-branches)
                         (worf-more)))
            (pattern-transformer . worf--pattern-transformer)))))

然后将其绑定到热键:

(global-set-key (kbd "<f3>") 'worf-goto)
regex search emacs header org-mode
4个回答
8
投票
来自

worf

worf-goto 可以做到这一点,
helm-org-in-buffer-headings
helm 也可以。

worf-goto
实际上使用
helm
作为后端。除了
helm-org-in-buffer-headings
之外,您还可以获得:

  • 标题的颜色与原始缓冲区中的颜色相同
  • 您可以使用适当的数字选择所有具有相同级别的标题

4
投票

如果安装了 ivy,则可以使用

counsel-org-goto
在当前缓冲区中搜索标题,或使用
counsel-org-goto-all
在所有打开的组织模式缓冲区中搜索标题。

如果您不想安装 worf 附带的其他东西,这是一个不错的选择。


4
投票

如果你不想依赖外部包,org其实已经提供了这个能力:功能是

org-goto

如果您希望它的行为方式与

helm-org-in-buffer-headings
类似,您必须将
org-goto-interface
设置为
outline-path-completion
,例如通过添加到您的初始化文件中:

(setq org-goto-interface (quote outline-path-completion))

0
投票

有两种方法可以做到这一点,仅使用内置的 Emacs 功能。

  • 搜索时,可以按
    M-s i
    切换是否搜索不可见的身体线条,这适用于一镜到底。
  • 如果你想让 Emacs 默认不搜索不可见文本,你可以自定义
    search invisible
    选项,将其设置为“不匹配隐藏文本”。

此解决方案适用于所有其他模式,这可能是您想要的,也可能不是。

另外,我正在使用版本 29,我不知道下面的自定义选项何时变得可用,所以也可能适用于旧版本。

© www.soinside.com 2019 - 2024. All rights reserved.