как перейти прямо к заголовку org?


16

Если я нахожусь в файле org, мне нужна команда, которая сужает список кандидатов в стиле ivy / helm, состоящий из всех заголовков org в файле, и позволяет мне выбрать заголовок посредством нечеткого поиска, к которому я хочу перейти к. Есть способ сделать это?

Ответы:


13

Узел Org Manual в Motion дает несколько лаконичное описание встроенной команды org-goto(связывание по умолчанию:) C-c C-j, поведение которой можно легко настроить для достижения желаемого эффекта:

  1. Проверьте документацию настраиваемой переменной, перечисленной в конце этого узла: C-h v org-goto-interface RET
  2. Если вы счастливы отказаться от org-gotoповедения по умолчанию при постепенном поиске по схеме буфера, вы можете переключиться на выбор заголовка через завершение:

    (setq org-goto-interface 'outline-path-completion)
  3. Пользователи пакетов завершения, такие как ido/ ivy/ helm, вероятно, захотят изменить следующую настройку, чтобы сразу увидеть весь целевой путь:

    (setq org-outline-path-complete-in-steps nil)

    Смотрите здесь для дальнейшего обсуждения.

Такой подход имеет дополнительное преимущество ( по сравнению с использованием, скажем, helm-специфическая функциональностью) работой со всеми рамками завершения этой вилки в значении по умолчанию completing-read, в том числе, как я могу лично подтвердить, ivy.

ДОПОЛНЕНИЕ:

При использовании outline-path-completionинтерфейса с org-gotoкомандой, как описано в этом ответе, настраиваемая переменная org-goto-max-levelопределяет максимальную глубину заголовков, которые можно предложить.

РЕДАКТИРОВАТЬ:

Я нашел более старый, актуальный вопрос с полезными ответами: /programming//q/15011703/3084001

УТОЧНЕНИЕ (как подсказано комментарием Атта Рая):

Установка org-goto-interfaceодного из двух распознанных значений не означает жертвование альтернативным интерфейсом. Вызов org-gotoс префиксным аргументом (т. Е. C-u C-c C-jИли C-u M-x org-goto RET) автоматически выбирает альтернативный интерфейс для текущего завершения. Таким образом, вы можете установить org-goto-interfaceинтерфейс, который вы, вероятно, будете использовать чаще всего, и использовать префиксный аргумент, если вы хотите временно изменить поведение. Если даже это не соответствует вашим потребностям, вы всегда можете написать свою собственную обертку org-goto, как в примере с Att Righ.


> Отказавшись от поведения org-goto по умолчанию, вы можете обойти это, используя привязку let к функциональному вызову(defun my-org-goto () (let ((org-goto-interface 'outline-path-completion)) (org-goto)))
Att Righ

outline-path-completionне очень хорошо играет helmна моем боксе (он не может пройти более одного уровня - достигается нажатием <TAB>if helm is disabled: see helm-completing-read-handlers-alist)
Att Righ

@AttRigh Конечно, letвыражения могут быть использованы для любого вида временной привязки; этот вопрос больше о соответствующих настройках / функциональности / пакетах. Более общим способом достижения временного переключения интерфейса является вызов org-gotoс префиксным аргументом. Я добавлю примечание к этому ответу.
Василий

@AttRigh Я помню, что видел что-то похожее ivy, но только при рефилировании и с неправильной настройкой глубины org-refile-targets, поскольку org-gotoвременно адаптирует релевантные для рефиллинга настройки в соответствии со своими потребностями. К сожалению, я не в состоянии изучить helmфункциональность в данный момент, может быть, другой пользователь может подключиться?
Василий

1
спасибо @Basil за подробный ответ. К сожалению, завершение в этом подходе не работает так же хорошо, как worfили counsel-imenu.
нинрод

8

Я использую пакет worf , но связываю только одну из его функций:

 (use-package worf
    :diminish worf-mode
    :bind (:map org-mode-map ("C-c h" . worf-goto)))

worf-goto выдает список заголовков в буфере в мини-буфере, который затем можно отфильтровать.

Пакет сделан автором ivy , поэтому если вам нравится ivy, вам может понравиться worf.

Некоторые соответствующие фрагменты из worf.el:

;;  - "g" (`worf-goto'): select an outline in the current buffer, with
;;    completion.  It's very good when you want to search/navigate to
;;    a heading by word or level. See https://github.com/abo-abo/lispy
;;    for a package that uses this method to navigate Lisp code.

(defun worf-goto-action (x)
  (with-ivy-window
    (goto-char (cdr x))
    (outline-show-children 1000)
    (worf-more)))

(defun worf-goto ()
  "Jump to a heading with completion."
  (interactive)
  (let ((cands (worf--goto-candidates)))
    (cond ((eq worf-completion-method 'helm)
           (require 'helm-multi-match)
           (let (helm-update-blacklist-regexps
                 helm-candidate-number-limit)
             (helm :sources
                   `((name . "Headings")
                     (candidates . ,cands)
                     (action . worf-goto-action)
                     (pattern-transformer . worf--pattern-transformer)))))
          ((eq worf-completion-method 'ivy)
           (ivy-read "Heading: " cands
                     :action 'worf-goto-action)))))

1
спасибо @tirocinium. counsel-imenuзавершение работает лучше, чем worf, но не может искать в заголовках org уровня 1. worfs ищет все уровни, поэтому я думаю, что это то, что я ищу.
нинрод

@ninrod Вы пробовали установить org-imenu-depthчто-то большее, чем значение по умолчанию 2?
Сэм

5

Я считаю рулевую винтовку особенно приятной. Также все, что берет источник imenu, сможет отображать заголовки (например, Helm with imenu).


Следует отметить, что helm-org-rifleпоиск по содержанию записей орг в дополнение к их заголовкам. Я не нашел способа изменить это поведение. helm-org-rifleссылки, org-search-gotoкоторые ищут все заголовки, но не поддерживают нечеткий поиск.
Att Righ

Атт Риг прав, helm-org-rifleне ищет только заголовки. Его можно расширить, чтобы сделать это, но для этого нет особых причин, поскольку helm-org-in-buffer-headingsв самом Хелме существует и т. Д.
Блюджей,

4

imenuвстроен в Emacs и может быть соединен с helm / ivy для обеспечения нечеткого поиска. Я бы порекомендовал, helm-org-rifleесли вы используете шлем, однако.


4

Самореклама вопиющая, но вы можете попробовать orgnav . Это мой альфа-проект (но активно используемый мной) для этой цели.

orgnav ищет заголовки, а не содержимое, может варьировать глубину поиска, искать поддеревья, а не весь файл (хотя это также может быть достигнуто с помощью сужения).

Вот видео некоторых функций: https://asciinema.org/a/1r0fp33xgwh48lfgsh7mllw4u

Вам, вероятно, также следует знать о helm-orgпакете, частью helmкоторого явилась идея этого пакета (точнее, чьи ограничения были источником вдохновения для этого пакета), а также helm-org-rifleобсуждаться в других постах.

(Предоставлено ответы здесь: https://www.reddit.com/r/emacs/comments/69mc6l/how_to_jump_directly_to_an_orgheadline/ ) Также потенциально представляет интерес worf-gotoфункция как часть worf(режим навигации org, который применяет другой набор сочетаний клавиш над "*" перед заголовками). Это выглядит очень похоже на helm-org.


4

В библиотеке swiper появилась новая функция 0.9.0, которая дополняет заголовки файлов в ваших файлах org-повестки дня.

адвокат-орг-Agenda-заголовки

Просто нужно настроить список файлов повестки дня в org init.

(setq org-agenda-files (list "~/org/work.org"
                             "~/org/school.org" 
                             "~/org/home.org"))

Что касается ответа @ tirocinium, то это то же самое, но для многих файлов повестки дня.


3

Я использую counsel-imenu; в нем будут перечислены различные заголовки, вы можете ввести несколько букв, чтобы сузить свой выбор, а затем просто нажать <return>.


привет @gnuvince. это не позволяет мне переходить к файлам org уровня 1, верно?
нинрод

2

Я рекомендую helm-org-in-buffer-headings. Он встроен в Helm и учитывает суженные буферы, что важно, если вы используете косвенные буферы для независимого редактирования поддеревьев. Существует также helm-org-parent-headingsдля навигации по дереву, а также helm-org-agenda-files-headingsдля навигации по всем файлам повестки дня.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.