Как ограничить функцию поддеревом в организационном режиме emacs?

Я широко использую org-mode и org-attach, что означает, что с одним org-файлом может быть связано много каталогов вложений.

На worg я нашел функцию от Matt Lundi, которая позволяет видеть все вложения, принадлежащие ко всему файлу, и просматривать их с помощью ido.

Я хотел бы ограничить эту функцию поддеревом, что сделало бы ее гораздо более полезной для моего варианта использования.

Поскольку я не новичок в emacs, но почти полностью неграмотен, я спрашиваю здесь.

Это функция:

(defun my-ido-find-org-attach ()
  "Find files in org-attachment directory"
  (interactive)
  (let* ((enable-recursive-minibuffers t)
         (files (find-lisp-find-files org-attach-directory "."))
         (file-assoc-list
          (mapcar (lambda (x)
                    (cons (file-name-nondirectory x)
                          x))
                  files))
         (filename-list
          (remove-duplicates (mapcar #'car file-assoc-list)
                             :test #'string=))
         (filename (ido-completing-read "Org attachments: " filename-list nil t))
         (longname (cdr (assoc filename file-assoc-list))))
    (ido-set-current-directory
     (if (file-directory-p longname)
         longname
       (file-name-directory longname)))
    (setq ido-exit 'refresh
          ido-text-init ido-text
          ido-rotate-temp t)
    (exit-minibuffer)))

person Otto Pichlhoefer    schedule 20.12.2012    source источник
comment
Вы просите включить вложения файлового поддерева или организационного поддерева?   -  person Diego Sevilla    schedule 20.12.2012
comment
Я хотел бы, чтобы функция учитывала только поддерево организации.   -  person Otto Pichlhoefer    schedule 20.12.2012


Ответы (2)


Возможно, я что-то упускаю, но вызов org-narrow-to-subtree сначала должен делать то, что вы хотите (вызовите widen потом, чтобы отменить это).

person pokita    schedule 22.12.2012
comment
То, как my-ido-find-org-attach записывается как org-narrow-to-subtree, не имеет никакого значения, поскольку оно слепо использует значение org-attach-directory. - person aculich; 23.12.2012

Я подумал, что это будет чертовски полезно для меня, поэтому, вдохновленный вашим вопросом, я написал версию, которая делает то, что вы хотите, плюс пару других наворотов. Чтобы вызвать его, вы должны набрать C-c o. ПРИМЕЧАНИЕ. Это НЕ относится к обычному префиксу клавиши org-attach, потому что эта функция странно написана без раскладки клавиатуры, поэтому сложно добавить функциональность к префиксу клавиши.

(autoload 'org-attach-dir "org-attach")
(autoload 'find-lisp-find-files "find-lisp")
(defcustom ido-locate-org-attach-all-files nil
  "Non-nil means `ido-locate-org-attach' returns all files.
Otherwise the default behavior only returns files attached to the
current entry."
  :group 'ido
  :type 'boolean)

(defun ido-locate-org-attach (&optional find-all)
  "Find files in org-attachment directory for current entry.
When called with a prefix argument, include all files in
`org-attach-directory'. With a double `C-u' prefix arg the value
of `ido-locate-org-attach-all-files' will be toggled for the
session. If you want to save it permanently for future session
then customize the variable `ido-locate-org-attach-all-files'."
  (interactive "P")
  (when (org-attach-dir nil)
    (when (equal find-all '(16))
      (setq ido-locate-org-attach-all-files
        (not ido-locate-org-attach-all-files)))
    (let* ((enable-recursive-minibuffers t)
       (dir (if (org-xor ido-locate-org-attach-all-files
                 (equal find-all '(4)))
            org-attach-directory
          (org-attach-dir nil)))
       (files (find-lisp-find-files dir "."))
       (file-assoc-list
        (mapcar (lambda (x)
              (cons (file-name-nondirectory x)
                x))
            files))
       (filename-list
        (remove-duplicates (mapcar #'car file-assoc-list)
                   :test #'string=))
       (filename (ido-completing-read "Org attachments: " filename-list nil t))
       (longname (cdr (assoc filename file-assoc-list))))
      (ido-set-current-directory
       (if (file-directory-p longname)
       longname
     (file-name-directory longname)))
      (setq ido-exit 'refresh
        ido-text-init ido-text
        ido-rotate-temp t)
      (exit-minibuffer))))

;; Run ido-locate-org-attach when using org-open-at-point (C-c C-o) in
;; the current entry (except if you're on the header line itself it
;; will use the default behavior to open/close the entry.
(add-hook 'org-open-at-point-functions 'ido-locate-org-attach)

;; C-c o           will locate files for the current entry
;; C-u C-c o       will locate files for the whole file
;; C-u C-u C-c o   will toggle the default current entry / whole file
(define-key org-mode-map "\C-co" 'ido-locate-org-attach)

Я рассмотрю возможность отправки этого в качестве официальной части org-attach.el.

Кроме того, '(4) и '(16) — это магические числа, которые означают префикс arg один раз C-u и дважды префикс arg C-u C-u перед последовательностью клавиш, вызывающей команду в интерактивном режиме.

person aculich    schedule 23.12.2012
comment
Спасибо за это и извините за поздний ответ. Но, к сожалению, я не могу заставить вас работать. Когда я нахожусь в заголовке с каталогом вложений, он делает то же самое, что и org-attach и o (Открыть вложения текущей задачи.). При вызове родительского заголовка ничего не происходит, хотя я ожидал найти все вложения дочерних заголовков. Я должен сказать, что я на Windows, но я не думаю, что это связано, так как org-attach работает безупречно. - person Otto Pichlhoefer; 28.12.2012
comment
Попробуйте вызвать его с помощью M-x ido-locate-org-attach, чтобы убедиться, что функция работает. Вы вызываете его с помощью C-c o вместо использования комбинации клавиш org-attach C-c C-a o? Я не переопределяю ключи по умолчанию для org-attach-open-in-emacs, просто добавляю другую привязку ключа вне префикса org-attach. - person aculich; 28.12.2012
comment
Я уже сделал это. и C-C o, и M-x ido-locate-org-attach дают одинаковый результат. Кстати, я использую Emacs 24.2.1 и org версии 7.9.2 (из ELPA) - person Otto Pichlhoefer; 29.12.2012
comment
Можете ли вы создать суть с содержимым вашего файла *.org и примером каталога вложений, чтобы я мог попытаться воссоздать то, что вы видите? Я также использую Org-mode версии 7.9.2 (от ELPA), но использую GNU Emacs 24.1.1. - person aculich; 29.12.2012