Làm cách nào để tự động lưu bộ đệm chế độ org?


22

Tôi thường xuyên sử dụng org-modevà chương trình nghị sự để theo dõi danh sách việc cần làm của tôi. Vì tôi sử dụng Dropbox để đồng bộ danh sách của mình, tôi cần các tác vụ tương tự có sẵn trên tất cả các máy tính. Đôi khi trong quá trình dọn dẹp của tôi, tôi sẽ quên lưu các thay đổi của mình, để lại các emac mở tại nhà khi tôi đi vào văn phòng (do đó tôi không được nhắc lưu vào việc đóng emacs). Làm cách nào tôi có thể tự động lưu các thay đổi vào *.orgbộ đệm chương trình nghị sự được sửa đổi thông qua chương trình nghị sự?

EDIT: Để làm rõ, tôi sử dụng chế độ xem chương trình nghị sự về các nhiệm vụ của mình để hiển thị cho tôi một cái nhìn tổng quan. Từ quan điểm đó, tôi có thể thay đổi trạng thái của các nhiệm vụ. Ngoài ra, tôi sử dụng chế độ ghi nhớ để thêm các tác vụ mới, sau đó có thể được phân loại lại trong chế độ xem chương trình nghị sự. Những thay đổi này trong chương trình nghị sự dẫn đến bộ đệm chương trình nghị sự đã được sửa đổi, sau đó phải được lưu. Khi những thay đổi này được thực hiện, tôi muốn bộ đệm được lưu tự động.


Bạn có thể làm rõ "Làm cách nào tôi có thể tự động lưu các thay đổi vào * .org bộ đệm chương trình nghị sự được sửa đổi thông qua chương trình nghị sự không?" ? Tôi không thể quyết định liệu nó "tự động lưu ... thông qua chương trình nghị sự" (có vẻ như tự mâu thuẫn) hay "bộ đệm được sửa đổi thông qua chương trình nghị sự" (mà tôi không hiểu)
Sigma

@Sigma Tôi đã cập nhật câu hỏi để làm rõ.
Ryan

1
Giải pháp của tôi cho đến nay là đào tạo lại các ngón tay của tôi để gõ sphím thường xuyên khi ở chế độ xem Chương trình nghị sự.
mankoff

@mankoff Tôi nghĩ rằng tôi đã kiềm chế bản thân để đánh C-x C-sbất cứ khi nào tôi thực hiện bất kỳ thay đổi nào trong tệp chương trình nghị sự (từ chương trình nghị sự hoặc trực tiếp). Không tự động nhưng không giữ mọi thứ được lưu.
Jonathan Leech-Pepin

Câu trả lời:


16

Một bản hack nhanh, mà tôi không chắc sẽ thỏa mãn trường hợp sử dụng của bạn sẽ là

(add-hook 'org-agenda-mode-hook
          (lambda ()
            (add-hook 'auto-save-hook 'org-save-all-org-buffers nil t)
            (auto-save-mode)))

Miễn là bộ đệm chương trình nghị sự Org được mở, tất cả các bộ đệm org sẽ được lưu theo định kỳ (tương đương với những gì sẽ xảy ra nếu sđược nhấn thường xuyên từ chế độ xem chương trình nghị sự).

Điều này hơi lạm dụng auto-save-modeở chỗ bộ đệm chương trình nghị sự không có ý nghĩa nhiều như auto-saveliên quan.

Nếu bạn tình cờ sử dụng bản hack đó, tốt hơn hết bạn hãy đảm bảo rằng các tệp sao lưu được giữ cho tất cả các tệp .org của bạn, để ở bên an toàn.


1
Một vấn đề lớn với cách tiếp cận này là tự động lưu sẽ lưu bộ đệm chương trình nghị sự vào một tệp trong thư mục hoạt động. Điều này tạo ra một số lượng lớn các tệp tự động lưu mồ côi nằm rải rác trong hệ thống tệp của tôi. Không biết làm thế nào để khắc phục.
holocronweaver

7

Bạn có thể lưu tất cả các bộ đệm org bất cứ khi nào một chức năng chương trình cụ thể được gọi. Ví dụ: để lưu tất cả bộ đệm org sau khi bạn thoát khỏi chương trình nghị sự:

(advice-add 'org-agenda-quit :before 'org-save-all-org-buffers)

Ngoài ra, bạn có thể lưu tất cả các bộ đệm org sau mỗi lần chỉnh sửa, giả sử sau khi thời hạn được thêm vào:

(advice-add 'org-deadline :after 'org-save-all-org-buffers)

Điều này sẽ hoạt động cả trong bộ đệm org và chương trình org. Sử dụng org-agenda-deadlinethay thế nếu bạn muốn hạn chế tự động lưu vào chương trình nghị sự.

Bạn có thể làm tương tự cho bất kỳ chức năng org nào, vì vậy phương pháp này cho phép bạn chọn chính xác thời điểm lưu bộ đệm org. Cách tiếp cận này bao gồm một số trường hợp góc mà phương thức của @Sigma bỏ lỡ: bạn có thể lưu các thay đổi chương trình nghị sự ngay cả khi bạn rời khỏi chương trình nghị sự trước khi auto-savecó cơ hội kích hoạt hoặc thực hiện các thay đổi bên ngoài chương trình nghị sự và quên lưu chúng. Cá nhân tôi sử dụng cả hai phương pháp để bao gồm tất cả các căn cứ của tôi. [Chỉnh sửa: Xem bình luận về giải pháp @Sigma để biết lý do tại sao tôi không còn sử dụng giải pháp của anh ấy nữa.]


2
Điều này làm việc cho tôi tốt hơn so với câu trả lời được chấp nhận vì lần duy nhất tôi quên lưu là sau khi tôi lọc lại. (advice-add 'org-refile :after 'org-save-all-org-buffers)tự động lưu các tệp org sau khi tôi tinh chỉnh thành các tệp khác nhau.
NGƯỜI DÙNG NÀY CẦN GIÚP

Đây là câu trả lời tốt nhất, vì nó có thể được áp dụng cho bất kỳ chức năng org nào bạn muốn.
KevinG

Tôi thấy rằng áp dụng điều này org-refilecó nghĩa là tôi không còn có thể "Chuyển đến" một tiêu đề nhất định (trái ngược với việc tinh chỉnh cái dưới con trỏ) bằng cách gọi org-refilevới một đối số tiền tố ..
quantum285

6

Tôi thấy nhiều câu trả lời phức tạp hơn, điều này hiệu quả với tôi:

`(add-hook 'auto-save-hook 'org-save-all-org-buffers)`

Tự động lưu mặc định để chạy sau 30 giây không hoạt động (và trong các tình huống không liên quan khác được ghi lại trong hướng dẫn sử dụng )


Chính xác những gì tôi đang tìm kiếm.
LVB

4

Tôi sử dụng đoạn mã sau để tự động lưu tất cả các bộ đệm chế độ chương trình nghị sự sau khi chụp mới, nhưng bạn có thể móc nó ở bất cứ đâu bạn muốn:

(defun my/save-all-agenda-buffers ()
  "Function used to save all agenda buffers that are
currently open, based on `org-agenda-files'."
  (interactive)
  (save-current-buffer
    (dolist (buffer (buffer-list t))
      (set-buffer buffer)
      (when (member (buffer-file-name)
                    (mapcar 'expand-file-name (org-agenda-files t)))
        (save-buffer)))))

;; save all the agenda files after each capture
(add-hook 'org-capture-after-finalize-hook 'my/save-all-agenda-buffers)

Thay đổi 'org-capture-after-finalize-hookthành 'org-agenda-finalize-hook, mà tôi tin rằng được gọi ngay trước khi hiển thị bộ đệm chương trình nghị sự.


Quên đề cập đến chức năng của tôi yêu cầu dash.el phải có sẵn, vì vậy hãy ghi nhớ điều đó.
Lee H

2
Trong khi chụp, bạn có thể lập tức gửi lại các mục vào bất kỳ org-refile-targetsđích nào, vì vậy có thể việc tiết kiệm org-agenda-fileslà không đủ. Có lẽ tôi chỉ cần gọi cho org-save-all-org-buffersmình.
sanityinc

1
PS Không cần sử dụng dashở đó: mapcarđược tích hợp và thực hiện điều tương tự.
sanityinc

@sanityinc cảm ơn, tôi đã cập nhật mã để sử dụng mapcarthay vì dấu gạch ngang!
Lee H
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.