2012-12-20 35 views
8

Tôi đang sử dụng chế độ org và org đính kèm rộng rãi có nghĩa là có thể có nhiều thư mục tệp đính kèm được liên kết với một tệp org.Làm thế nào để hạn chế một chức năng cho một cây con trong chế độ org emacs?

Trên worg tôi tìm thấy một chức năng từ Matt Lundi cho phép xem tất cả tệp đính kèm thuộc về toàn bộ tệp và duyệt chúng bằng ido.

Tôi muốn hạn chế chức năng này thành một cây con để làm cho nó trở nên hữu ích hơn cho trường hợp sử dụng của tôi.

Vì tôi không quen với emacs nhưng gần như hoàn toàn không biết chữ Tôi là hỏi tại đây.

Đây là chức năng:

(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))) 
+0

Bạn có yêu cầu bao gồm các tệp đính kèm của tệp phụ hoặc thư mục con org không? –

+1

Tôi muốn có funktion chỉ xem xét một subtree org. –

Trả lời

3

Có lẽ tôi đang thiếu một cái gì đó, nhưng gọi org-narrow-to-subtree đầu tiên nên làm những gì bạn muốn (gọi widen sau đó để trở lại đó).

+0

Cách 'my-ido-find-org-attach' được viết là 'org-narrow-to-subtree' không có tác dụng vì nó sử dụng một cách mù quáng giá trị của' org-attach-directory'. – aculich

0

Tôi nghĩ rằng điều này sẽ khá darned hữu ích bản thân mình như vậy, lấy cảm hứng từ câu hỏi của bạn, tôi đã viết một phiên bản mà những gì bạn muốn cộng với một vài chuông và còi khác. Để gọi nó, bạn phải nhập C-c o. LƯU Ý: Đây là NOT trên tiền tố khóa org-attach thông thường vì hàm đó được viết một cách kỳ lạ mà không có sơ đồ bàn phím nên rất khó để thêm chức năng vào tiền tố khóa.

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

Tôi sẽ xem đây là phần chính thức của org-attach.el.

Là một sang một bên, '(4)'(16) là những con số kỳ diệu đó có nghĩa là tiền tố arg lần C-u và tiền tố arg hai lần C-u C-u trước dãy phím mà gọi lệnh tương tác.

+0

Cảm ơn vì điều này và xin lỗi vì trả lời muộn. Nhưng tiếc là tôi không thể làm việc của bạn. Khi tôi đang ở trên tiêu đề có thư mục đính kèm, nó giống như thư mục đính kèm org và o (Mở tệp đính kèm của tác vụ hiện tại.). Khi được viện dẫn trên một nhóm phụ huynh không có gì xảy ra, khi tôi dự kiến ​​sẽ tìm thấy tất cả các phần đính kèm của các tiêu đề con. Tôi phải nói rằng tôi đang ở trên các cửa sổ nhưng tôi không nghĩ rằng nó liên quan từ org-attach hoạt động hoàn hảo. –

+0

Hãy thử gọi nó bằng 'M-x ido-locate-org-attach' để đảm bảo chức năng hoạt động. Bạn đang gọi nó với 'C-c o' thay vì sử dụng tổ hợp phím org-attach của' C-c C-a o'? Tôi không ghi đè các khóa mặc định cho org-attach-open-in-emacs, chỉ cần thêm một ràng buộc khóa khác bên ngoài tiền tố đính kèm org. – aculich

+0

Tôi đã làm điều này. cả 'C-C o' và' M-x ido-locate-org-attach' đều cho kết quả tương tự. BTW Tôi đang ở trong Emacs 24.2.1 và org phiên bản 7.9.2 (từ ELPA) –

Các vấn đề liên quan