як перейти безпосередньо до орг-заголовка?


17

Якщо я перебуваю у org-файлі, я хочу, щоб команда, яка звужує список кандидатів, у стилі плюща / керма, що складалася з усіх заголовків org у файлі та дозволила мені вибрати заголовок шляхом нечіткого пошуку, до якого я хочу перейти до. Чи є спосіб це зробити?

Відповіді:


13

Вузол Org Manual on 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.


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

outline-path-completionне грає добре helmна моєму полі (він не може завершити минулий рівень - досягнуто натисканням, <TAB>якщо helm вимкнено: див. helm-completing-read-handlers-alist)
Att Righ

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

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

1
дякую @Basil за детальну відповідь. На жаль, завершення цього підходу працює не так добре, worfабо counsel-imenu.
ninrod

8

Я використовую пакетну верфу , але я пов'язую лише одну з її функцій:

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

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

Пакет виготовлений автором плюща , тож якщо вам подобається плющ, вам може сподобатися черв'як.

Деякі відповідні фрагменти з 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, але не може здійснювати пошук за заголовками level1 org. черв'яки здійснюють пошук на всіх рівнях, тому я думаю, що це те, що я шукаю.
ninrod

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

5

Мені здається, що штурвал-орг-гвинтівка є особливо приємним. Також все, що потребує джерела імені, зможе відображати заголовки (напр., Helm with name).


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

Att Righ має рацію, helm-org-rifleне шукає лише рубрик. Це можна розширити для цього, але причин для цього мало, оскільки helm-org-in-buffer-headingsтощо існують у самому Хелмі.
блюджай

4

imenuвбудований в Emacs і може поєднуватися з кермом / плющем, щоб забезпечити необхідний нечіткий пошук. Я б рекомендував, 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_direct_to_an_orgheadline/ ) Також потенційно представляє інтерес worf-gotoфункція як частина worf(орган навігації в режимі org, який застосовує інший набір клавіш "*" перед заголовками). Це здається дуже аналогічним helm-org.


4

Бібліотека swiper має нову функцію в 0.9.0, яка є завершенням до заголовків файлів у ваших org-порядку денного-файлах.

адвокатська організація-заголовки порядку денного

Просто потрібно налаштувати список файлів порядку денного в org init.

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

Що стосується відповіді @ tirocinium, це забезпечує те саме, але для багатьох файлів порядку денного.


3

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


привіт @gnuvince. це не дозволяє мені перейти до файлів org 1 рівня, правильно?
ninrod

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.