2010-03-19 13 views
12

Istnieje wiele sposobów na złożenie kodu w Emacs, a ja zdecydowałem się na używanie trybu minor mode ... działa świetnie!Emacs persistent folding mode

Jednak naprawdę chcę, aby moje składanie było zachowywane po zamknięciu i ponownym otwarciu plików. Dosyć frustrujące jest składanie plików w taki sposób, jak mi się podoba, tylko utrata tego po ponownym uruchomieniu Emacsa.

Czy ktoś znalazł sposób na utrzymanie trwałości pliku składanego?

+1

nie jest dokładną odpowiedź, ale można użyć org-mode z [orgfold.el] (http://www.emacswiki.org/emacs/orgfold.el) lub [orgfold-separate-file.el] (http://www.emacswiki.org/emacs/orgfold-separate-file.el) - choć byłoby miło, gdyby ta ostatnia działała z jednym globalnym magazynem stanów plik (jak w [saveplace.el] (http://git.savannah.gnu.org/cgit/emacs.git/tree/lisp/saveplace.el)). – Mark

Odpowiedz

4

Edit: Teraz rozumiem pytanie ...

Jak o czymś takim następującym nippet kodu. Wydaje się, że działa to dla mnie, chociaż nie wymyśliłem, jak za każdym razem unikać monitu o lokalną zmienną pliku.

(defvar omm-state nil 
    "file local variable storing outline overlays") 
(defun omm-state-mode (&optional arg) 
    "poor man's minor mode to re-apply the outline overlays " 
    (interactive) 
    (omm-re-enable-outline-state) 
    (add-hook 'before-save-hook 'omm-state-save)) 
(defun omm-get-all-overlays() 
    "return a list of outline information for all the current buffer" 
    (save-excursion 
    (let ((all-overlays (overlays-in (point-min) (point-max)))) 
     (mapcar (lambda (o) 
       (list (overlay-start o) (overlay-end o) (overlay-get o 'invisible))) 
       (reverse all-overlays))))) 
(defun omm-re-enable-outline-state (&optional arg) 
    "turn on outline-minor-mode and re-apply the outline information" 
    (outline-minor-mode 1) 
    (when (listp omm-state) 
    (mapcar (lambda (p) 
       (apply 'outline-flag-region p)) 
      omm-state))) 
(defun omm-state-save() 
    "save the outline state in a file local variable 
Note: this just replaces the existing value, you need to start 
it off by adding something like this to your file: 

# Local Variables: 
# omm-state:() 
# mode:omm-state 
# End:    
" 
    (ignore-errors 
    (save-excursion 
     (goto-char (point-max)) 
     (when (search-backward "omm-state:" nil t) 
     (goto-char (match-end 0)) 
     (kill-sexp) 
     (princ (omm-get-all-overlays) (current-buffer))))) 
    nil) 

To rozwiązanie wymaga „zaszczepienie” plik z czymś takim:

# Local Variables: 
# omm-state:() 
# mode:omm-state 
# End:    
+0

Dzięki za opinie Trey. Dla jasności - jestem w stanie włączyć tryb pomniejszony dla dowolnego typu pliku, który mi się podoba z hakiem. Czego szukam, to złożyć wpis kodu, zamknąć bufor, a później, gdy ponownie otworzę plik, chcę, aby ten wpis był nadal złożony. –

+1

@ Chris rozumiem teraz ... nie wiem, że to jest możliwe. –

+0

Gdzie zachowałaby się ta trwałość? W samym pliku? Kiepski pomysł; jakiś inny plik? możliwe, ale nie ma jeszcze takich haczyków, by to zrobić. I nadal będę podejrzewał, że upuszczę te pliki w różne miejsca. Jeśli zebrane w jednym folderze .. sheesh, to byłoby ogromne. –

0

Zdaję sobie sprawę, że jest to stary post ale FWIW Stworzyłem niewielki tryb, który uzupełnia HS-moll-mode, zarysie -mode itp. "Naprawdę chcę, aby moje składanie było zachowywane po zamknięciu i ponownym otwarciu plików". :)

Pakiet jest w MELPA od dzisiaj i nosi nazwę trwałych nakładek.

Jest również dostępna bezpośrednio na github: https://github.com/mneilly/Emacs-Persistent-Overlays