2011-09-22 9 views
11

Chciałbym wykonać jedno proste zadanie, ale wydaje się, że nie ma dla niego oczywiste rozwiązanie:Jak przenieść do innego poddrzewie poddrzewo w emacs org-mode

Mam strukturę poddrzew tak:

* Tree A 
** Subtree A1 
** Subtree A2 
* Tree B 
** Subtree B1 
** Subtree B2 

Chciałbym założyć jeden klawisz skrótu, aby przenieść poddrzewa z drzewa na drzewo B. A przeprowadzce do archiwum wydaje się być proste, ale masz jakikolwiek trop, jak to zrobić w ciągu jednego pliku?

Każda pomoc doceniona! Dzięki!

+0

Aby ponownie składać sub drzewa do pracy (C-C, C-W) wcięcia muszą wcięcie przez 2. np *** SubtreeA1. Ustawiłem wcięcia tak jak twoje i nie mogłem go uruchomić, dopóki się nie zorientowałem. – 79E09796

+0

[To] (http://stackoverflow.com/questions/22200312/refile-from-one- file- to-other) pytanie może być pomocne. Możesz (tymczasowo) dodać bieżący plik do 'org-refile-targets' z ustawieniem': maxlevel' of> = 2 przy każdym ponownym uzupełnianiu. Jednak moje lisp-fu nie jest jeszcze wystarczająco silne, aby ci w tym pomóc. – Alex

Odpowiedz

7

Możesz spróbować uzupełnić poddrzewo za pomocą C-c C-w (działa również w celu przeniesienia poddrzewa do innego pliku).

Innym sposobem jest złożenie poddrzewa, a następnie zabicie go za pomocą C-k C-k i wklejenie go tam, gdzie powinno być.

Trzecie rozwiązanie używam trochę czasu jest zmiana poziomu poddrzewie z M-lewo, a następnie przenieść go z M-up i M-down, potem M-prawy put znowu na właściwym poziomie. Trzeci sposób ma tę wadę, że jakiś czas sprawia, że ​​porusza się inna część drzewa.

4

używam M-lewo, M-up/down a następnie M-prawy jeśli struktura pliku nie jest zbyt skomplikowane. Należy jednak pamiętać, że jeśli chcesz przenieść Subtree A1 do Tree B przy użyciu tej metody, stracisz swoje dziecko Subsubtree A1.1, chyba go przenieść z MS-lewo/prawo:

* Tree A 
** Subtree A1    <=== move this heading with M-S-left 
*** Subsubtree A1.1  <=== or you will leave this heading behind 
** Subtree A2 

* Tree B 
** Subtree B1 
** Subtree B2 
4

You można refile poddrzewa przy użyciu Cc Cw, w zależności od tego, jak masz skonfigurowany refile. W zależności od głębokości miejsca docelowego może nie być możliwe użycie go jako prawidłowego miejsca docelowego.

można zabić lub kopiowanie poddrzewa bez konieczności krotnie strukturę przy użyciu poleceń poddrzewie zabitych/kopiowania: Cc Cx Cw i Cc Cx Mw odpowiednio, szarpiąc poddrzewo jest albo Cc Cx Cy lub po prostu Cy

6

chciałem też sposób na org-refile łatwo ponownie składać do poddrzewa, więc napisałem jakiś kod i uogólnić go tak, że będzie ustawić dowolny cel natychmiastowe wszędzie (nie tylko w tym samym pliku).

Podstawowe użycie jest przenieść gdzieś w Tree B i wpisz Cc Cx Cm oznaczyć cel dla ponownego dołączania, a następnie przenieść się do wejścia w Tree A że chcesz ponownie składać i wpisz Cc Cw który natychmiast ponownie składać do lokalizacja docelowa ustawiona w Tree B bez pytania, chyba że wywołałeś org-refile-immediate-target z prefiksem arg Cu Cc Cx Cm.

Zauważ, że po naciśnięciu Cc Cw w krótkim odstępie czasu, aby ponownie składać wiele wpisów będzie zachować kolejność zgłoszeń nawet jeśli org-reverse-note-order jest ustawiony na t, ale można ją wyłączyć respektować ustawienia org-reverse-note-order z podwójny przedrostek arg Cu Cu Cc Cx Cm.

(defvar org-refile-immediate nil 
    "Refile immediately using `org-refile-immediate-target' instead of prompting.") 
(make-local-variable 'org-refile-immediate) 

(defvar org-refile-immediate-preserve-order t 
    "If last command was also `org-refile' then preserve ordering.") 
(make-local-variable 'org-refile-immediate-preserve-order) 

(defvar org-refile-immediate-target nil) 
"Value uses the same format as an item in `org-refile-targets'." 
(make-local-variable 'org-refile-immediate-target) 

(defadvice org-refile (around org-immediate activate) 
    (if (not org-refile-immediate) 
     ad-do-it 
    ;; if last command was `org-refile' then preserve ordering 
    (let ((org-reverse-note-order 
      (if (and org-refile-immediate-preserve-order 
        (eq last-command 'org-refile)) nil org-reverse-note-order))) 
     (ad-set-arg 2 (assoc org-refile-immediate-target (org-refile-get-targets))) 
     (prog1 ad-do-it 
     (setq this-command 'org-refile))))) 

(defadvice org-refile-cache-clear (after org-refile-history-clear activate) 
    (setq org-refile-targets (default-value 'org-refile-targets)) 
    (setq org-refile-immediate nil) 
    (setq org-refile-immediate-target nil) 
    (setq org-refile-history nil)) 

;;;###autoload 
(defun org-refile-immediate-target (&optional arg) 
    "Set current entry as `org-refile' target. 
Non-nil turns off `org-refile-immediate', otherwise `org-refile' 
will immediately refile without prompting for target using most 
recent entry in `org-refile-targets' that matches 
`org-refile-immediate-target' as the default." 
    (interactive "P") 
    (if (equal arg '(16)) 
     (progn 
     (setq org-refile-immediate-preserve-order 
       (not org-refile-immediate-preserve-order)) 
     (message "Order preserving is turned: %s" 
       (if org-refile-immediate-preserve-order 
        "on" "off"))) 

    (setq org-refile-immediate (unless arg t)) 
    (make-local-variable 'org-refile-targets) 
    (let* ((components (org-heading-components)) 
      (level (first components)) 
      (heading (nth 4 components)) 
      (string (substring-no-properties heading))) 
     (add-to-list 'org-refile-targets 
        (append (list (buffer-file-name)) 
          (cons :regexp 
           (format "^%s %s$" 
             (make-string level ?*) 
             string)))) 
     (setq org-refile-immediate-target heading)))) 

(define-key org-mode-map "\C-c\C-x\C-m" 'org-refile-immediate-target) 

Trudno było znaleźć klucz, który był wolny od Cc Cx prefiksu, więc użyłem m z mnemoników i * mm * ediate

+0

Pracuję nad zautomatyzowaniem tego dla wielu todo i mam już działającą wersję 'auto-refl listu prawników': http://superuser.com/questions/613968/how-to-automate-org-refile-for- multiple-todo Na pewno byłoby pomocne, gdyby 'aculich' lub inny maven mógł utworzyć zmienną podobną do' (setq org-archive-location "~/0.todo.org :: * Zarchiwizowane zadania") 'abyśmy mogli określ plik i nagłówek, który jest już częścią funkcji 'org-archive-subtree'. Robię wyszukiwania i znak, ponieważ nie mam środków, aby utworzyć coś takiego jak "org-archive-location" dla tej konfiguracji. – lawlist

1
(require 'org-archive)                    
(setq org-archive-save-context-info nil)                
(setq org-archive-location "::* Archived Tasks") 

run (org-archive-subtree) w podtekście, które chcesz przenieść, zostanie przeniesiony do "Zarchiwizowanych zadań" pod nagłówkiem

2

Przenoszenie poddrzewa w tym samym buforze może być wykonywane ne z org-refile. Podczas przenoszenia możesz nawet zmienić hierarchię oryginału (liczbę gwiazdek). Jednak może nie działać po wyjęciu z pudełka, ponieważ bufor, z którym pracujesz, nie znajduje się w stanie org-refile-targets. Możesz dodać plik do celów refillując przy użyciu C-[, a następnie uruchomić org-refile z C-c C-w i ostatecznie usunąć plik z celów refilowania przy pomocy C-]. Może to być za dużo (i może zawieść, jeśli twoje ustawienie maxlevel jest zbyt niskie - co i tak możesz zmienić). Alternatywnie, w celu zautomatyzowania tej procedury w jednym zamachem, najpierw trzeba zdefiniować funkcję tak:

(defun refile-in-current() 
"refile current item in current buffer" 
(interactive) 
(let ((org-refile-use-outline-path t) 
    (org-refile-targets '((nil . (:maxlevel . 5))))) 
(org-refile))) 

The nil tam środków „bufora”. let ponownie definiuje zmienne tylko lokalnie. Będziesz wtedy musiał dodać skrót, aby uruchomić funkcję. Tu jest jednym ze sposobów wiązania do C-c m:

(add-hook 'org-mode-hook (lambda() 
     (local-set-key "\C-c m" 'refile-in-current) 
+0

Dziękuję, to jest doskonały sposób. – gsl

Powiązane problemy