emacs org 模式,仅搜索 headers
emacs org mode, search only headers
在 emacs 中,我希望能够仅搜索 org 模式文件中的 'headers'。
想法 1:仅搜索可见
我可以通过隐藏所有内容,然后仅显示轮廓 (S-TAB, S-TAB) 来实现这一点,然后搜索所有可见的内容。(在这种情况下,它将是整个 table内容)。
但是我如何只搜索可见内容呢? C-s 搜索所有内容。
思路二:使用正则表达式
我可能会做:
C-c / / //opens regex search
\*.*heading //start with * (escaped), followed by any chars, then heading.
但目前输入所有这些内容很麻烦。考虑到我大约 3 小时前就开始学习 emacs,我能以某种方式使它自动化吗?
例如,我可以编写一个函数来搜索“*.*ARGUMENT”并将其绑定到热键吗?但仍然有能力像 'next find, next find' 等.?
这个用例是搜索我的笔记。有些长约 7000 多行,我通常只搜索 headers.
[编辑解决方案 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的heading search之后,我也开始玩worf了。它就像 helm(它使用 helm)但看起来更好,我可以通过按数字键 select 一个 'level' 轮廓。我只破解了标题搜索所需的位,如果使用的话:
;; ——— 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)
worf-goto
来自 worf 可以做到这一点,
helm 中的 helm-org-in-buffer-headings
也可以。
worf-goto
实际上使用 helm
作为后端。除了 helm-org-in-buffer-headings
,您还可以获得:
- 标题的颜色与原始缓冲区中的颜色相同
- 您可以select所有具有相同级别的标题使用适当的数字
如果您安装了ivy,您可以使用counsel-org-goto
在当前缓冲区中搜索标题或counsel-org-goto-all
在所有打开的org-mode缓冲区中搜索标题。
如果您不想安装 worf 附带的其他东西,这是一个不错的选择。
如果你不想依赖外部包,org其实已经提供了这个能力:功能是org-goto
.
如果您希望它以类似于 helm-org-in-buffer-headings
的方式运行,您必须将 org-goto-interface
设置为 outline-path-completion
,例如通过添加到您的初始化文件:
(setq org-goto-interface (quote outline-path-completion))
在 emacs 中,我希望能够仅搜索 org 模式文件中的 'headers'。
想法 1:仅搜索可见
我可以通过隐藏所有内容,然后仅显示轮廓 (S-TAB, S-TAB) 来实现这一点,然后搜索所有可见的内容。(在这种情况下,它将是整个 table内容)。
但是我如何只搜索可见内容呢? C-s 搜索所有内容。
思路二:使用正则表达式
我可能会做:
C-c / / //opens regex search
\*.*heading //start with * (escaped), followed by any chars, then heading.
但目前输入所有这些内容很麻烦。考虑到我大约 3 小时前就开始学习 emacs,我能以某种方式使它自动化吗?
例如,我可以编写一个函数来搜索“*.*ARGUMENT”并将其绑定到热键吗?但仍然有能力像 'next find, next find' 等.?
这个用例是搜索我的笔记。有些长约 7000 多行,我通常只搜索 headers.
[编辑解决方案 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的heading search之后,我也开始玩worf了。它就像 helm(它使用 helm)但看起来更好,我可以通过按数字键 select 一个 'level' 轮廓。我只破解了标题搜索所需的位,如果使用的话:
;; ——— 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)
worf-goto
来自 worf 可以做到这一点,
helm 中的 helm-org-in-buffer-headings
也可以。
worf-goto
实际上使用 helm
作为后端。除了 helm-org-in-buffer-headings
,您还可以获得:
- 标题的颜色与原始缓冲区中的颜色相同
- 您可以select所有具有相同级别的标题使用适当的数字
如果您安装了ivy,您可以使用counsel-org-goto
在当前缓冲区中搜索标题或counsel-org-goto-all
在所有打开的org-mode缓冲区中搜索标题。
如果您不想安装 worf 附带的其他东西,这是一个不错的选择。
如果你不想依赖外部包,org其实已经提供了这个能力:功能是org-goto
.
如果您希望它以类似于 helm-org-in-buffer-headings
的方式运行,您必须将 org-goto-interface
设置为 outline-path-completion
,例如通过添加到您的初始化文件:
(setq org-goto-interface (quote outline-path-completion))