9

私は org-mode とorg-attachを広範囲に使用しています。つまり、1 つの組織ファイルに関連付けられた多くの添付ファイル ディレクトリが存在する可能性があります。

worg で、ファイル全体に属するすべての添付ファイルを表示し、ido で参照できる Matt Lundi の関数を見つけました。

この関数をサブツリーに制限したいと思います。これにより、私のユースケースでより便利になります。

私はemacsを初めて使用するわけではありませんが、ほぼ完全にelispの読み書きができないため、ここで質問しています。

これは機能です:

(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)))
4

2 に答える 2

3

多分私は何かが欠けているかもしれませんが、org-narrow-to-subtree最初に呼び出すことはあなたが望むことをするべきです(widenそれを元に戻すために後で呼び出します)。

于 2012-12-22T10:04:30.917 に答える
1

私はこれが非常に便利だと思ったので、あなたの質問に触発されて、あなたが望むことを行うバージョンといくつかの他の機能を追加したバージョンを書きました。それを呼び出すには、タイプする必要があります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)とは、コマンドを対話的に呼び出したキー シーケンスの前にarg を 1 回プレフィックスし、arg を 2 回プレフィックス'(16)することを意味するマジック ナンバーです。C-uC-u C-u

于 2012-12-23T06:30:48.667 に答える