org-mobile.el: More flexibility to add files

The new variable org-mobile-files can now be configured to include
non-agenda files into the staging area for MobileOrg.  Furthermore,
files that are located in a subdirectory of `org-directory' will also
end up in a sub-directory in the staging area.
This commit is contained in:
Carsten Dominik 2009-09-28 19:25:50 +01:00
parent 7baa702f65
commit d90df8b147
4 changed files with 105 additions and 21 deletions

View File

@ -1,3 +1,7 @@
2009-09-28 Carsten Dominik <carsten.dominik@gmail.com>
* org.texi (Pushing to MobileOrg): Document `org-mobile-files'.
2009-09-26 Carsten Dominik <carsten.dominik@gmail.com> 2009-09-26 Carsten Dominik <carsten.dominik@gmail.com>
* org.texi (Processing LaTeX fragments): Document that the size of * org.texi (Processing LaTeX fragments): Document that the size of

View File

@ -11680,10 +11680,10 @@ operation of @i{MobileOrg} itself (see @uref{http://ncogni.to/mobileorg/}).
@node Setting up the staging area, Pushing to MobileOrg, MobileOrg, MobileOrg @node Setting up the staging area, Pushing to MobileOrg, MobileOrg, MobileOrg
@section Setting up the staging area @section Setting up the staging area
Org-mode has commands to prepare a directory with files for @i{MobileOrg}, and to Org-mode has commands to prepare a directory with files for @i{MobileOrg},
read captured notes from there. If Emacs can directly write to the WebDAV and to read captured notes from there. If Emacs can directly write to the
directory accessed by @i{MobileOrg}, all you need to do is to point to this WebDAV directory accessed by @i{MobileOrg}, all you need to do is to point to
directory using the variable @code{org-mobile-directory}. this directory using the variable @code{org-mobile-directory}.
If Emacs cannot access the WebDAV directory directly, you can use a local If Emacs cannot access the WebDAV directory directly, you can use a local
directory for staging. Other means must then be used to keep this directory directory for staging. Other means must then be used to keep this directory
@ -11707,18 +11707,22 @@ from the WebDAV directory using @file{scp}.
@node Pushing to MobileOrg, Pulling from MobileOrg, Setting up the staging area, MobileOrg @node Pushing to MobileOrg, Pulling from MobileOrg, Setting up the staging area, MobileOrg
@section Pushing to MobileOrg @section Pushing to MobileOrg
This operation copies all files currently listed in @code{org-mobile-files}
This operation copies all files currently listed in @code{org-agenda-files} to the directory @code{org-mobile-directory}. By default this list contains
to the directory @code{org-mobile-directory}. It also creates (in the same all agenda files (as listed in @code{org-agenda-files}), but additional files
directory) a special Org file @file{agendas.org}. This file is an Org-mode can be included by customizing @code{org-mobiles-files}. The push operation
style outline, containing every custom agenda view defined by the user. also creates (in the same directory) a special Org file @file{agendas.org}.
While creating the agendas, Org-mode will force@footnote{See the variable This file is an Org-mode style outline, containing every custom agenda view
@code{org-mobile-force-id-on-agenda-items}.} an ID property on all entries defined by the user. While creating the agendas, Org-mode will
referenced by the agendas, so that these entries can be uniquely identified force@footnote{See the variable @code{org-mobile-force-id-on-agenda-items}.}
if @i{MobileOrg} flags them for further action. Finally, Org writes the file an ID property on all entries referenced by the agendas, so that these
@file{index.org}, containing links to all other files. If @i{MobileOrg} is entries can be uniquely identified if @i{MobileOrg} flags them for further
configured to request this file from the WebDAV server, all agendas and Org action. Finally, Org writes the file @file{index.org}, containing links to
files will be downloaded to the iPhone. all other files. If @i{MobileOrg} is configured to request this file from
the WebDAV server, all agendas and Org files will be downloaded to the
iPhone. To speed up the download, MobileOrg will only read files whose
checksums@footnote{stored automatically in the file @file{checksums.dat}}
have changed.
@node Pulling from MobileOrg, , Pushing to MobileOrg, MobileOrg @node Pulling from MobileOrg, , Pushing to MobileOrg, MobileOrg
@section Pulling from MobileOrg @section Pulling from MobileOrg

View File

@ -2,6 +2,15 @@
* org-mobile.el (org-mobile-files-alist): Add the list of tags to * org-mobile.el (org-mobile-files-alist): Add the list of tags to
the index file. the index file.
(org-mobile-files): New option.
(org-mobile-files-alist, org-mobile-checksum-files): New variable.
(org-mobile-prepare-file-lists, org-mobile-files-alist): New
functions.
(org-mobile-push): Start by creating the files lists.
(org-mobile-copy-agenda-files): Move killing the buffer to after
the save-excursion has exited.
(org-mobile-write-checksums): Write checksums also for files in
sub-directories.
* org.el (org-ctrl-c-ctrl-c): Pass prefix arg to * org.el (org-ctrl-c-ctrl-c): Pass prefix arg to
org-table-recalculate when cursor is in TBLFM line. org-table-recalculate when cursor is in TBLFM line.

View File

@ -27,7 +27,9 @@
;; ;;
;; This file contains the code to interact with Richard Moreland's iPhone ;; This file contains the code to interact with Richard Moreland's iPhone
;; application MobileOrg. This code is documented in Appendix B of the ;; application MobileOrg. This code is documented in Appendix B of the
;; Org-mode manual. ;; Org-mode manual. The code is not specific for the iPhone, however.
;; Any external viewer and flagging application that uses the same
;; conventions could be used.
(require 'org) (require 'org)
(require 'org-agenda) (require 'org-agenda)
@ -37,6 +39,26 @@
:tag "Org Mobile" :tag "Org Mobile"
:group 'org) :group 'org)
(defcustom org-mobile-files '(org-agenda-files)
"Files to be staged for MobileOrg.
This is basically a list of filesand directories. Files will be staged
directly. Directories will be search for files with the extension `.org'.
In addition to this, the list may also contain the following symbols:
org-agenda-files
This means, include the complete, unrestricted list of files given in
the variable `org-agenda-files'.
org-agenda-text-search-extra-files
Include the files given in the variable
`org-agenda-text-search-extra-files'"
:group 'org-mobile
:type '(list :greedy t
(option (const :tag "org-agenda-files" org-agenda-files))
(option (const :tag "org-agenda-text-search-extra-files"
org-agenda-text-search-extra-files))
(repeat :inline t :tag "Additional files"
(file))))
(defcustom org-mobile-directory "" (defcustom org-mobile-directory ""
"The WebDAV directory where the interaction with the mobile takes place." "The WebDAV directory where the interaction with the mobile takes place."
:group 'org-mobile :group 'org-mobile
@ -115,6 +137,43 @@ using `rsync' or `scp'.")
(defvar org-mobile-last-flagged-files nil (defvar org-mobile-last-flagged-files nil
"List of files containing entreis flagged in the latest pull.") "List of files containing entreis flagged in the latest pull.")
(defvar org-mobile-files-alist nil)
(defvar org-mobile-checksum-files nil)
(defun org-mobile-prepare-file-lists ()
(setq org-mobile-files-alist (org-mobile-files-alist))
(setq org-mobile-checksum-files (mapcar 'cdr org-mobile-files-alist)))
(defun org-mobile-files-alist ()
"Expand the list in `org-mobile-files' to a list of existing files."
(let* ((files
(apply 'append (mapcar
(lambda (f)
(cond
((eq f 'org-agenda-files) (org-agenda-files t))
((eq f 'org-agenda-text-search-extra-files)
org-agenda-text-search-extra-files)
((and (stringp f) (file-directory-p f))
(directory-files f 'full "\\.org\\'"))
((and (stringp f) (file-exists-p f))
(list f))
(t nil)))
org-mobile-files)))
(orgdir-uname (file-name-as-directory (file-truename org-directory)))
(orgdir-re (concat "\\`" (regexp-quote orgdir-uname)))
uname seen rtn)
;; Make the files unique, and determine the name under which they will
;; be listed.
(while (setq file (pop files))
(setq uname (file-truename file))
(unless (member uname seen)
(push uname seen)
(if (string-match orgdir-re uname)
(setq link-name (substring uname (match-end 0)))
(setq link-name (file-name-nondirectory uname)))
(push (cons file link-name) rtn)))
(nreverse rtn)))
;;;###autoload ;;;###autoload
(defun org-mobile-push () (defun org-mobile-push ()
"Push the current state of Org affairs to the WebDAV directory. "Push the current state of Org affairs to the WebDAV directory.
@ -122,6 +181,7 @@ This will create the index file, copy all agenda files there, and also
create all custom agenda views, for upload to the mobile phone." create all custom agenda views, for upload to the mobile phone."
(interactive) (interactive)
(org-mobile-check-setup) (org-mobile-check-setup)
(org-mobile-prepare-file-lists)
(run-hooks 'org-mobile-pre-push-hook) (run-hooks 'org-mobile-pre-push-hook)
(org-mobile-create-sumo-agenda) (org-mobile-create-sumo-agenda)
(org-save-all-org-buffers) ; to save any IDs created by this process (org-save-all-org-buffers) ; to save any IDs created by this process
@ -222,8 +282,8 @@ agenda view showing the flagged items."
(save-excursion (save-excursion
(setq buf (find-file file)) (setq buf (find-file file))
(insert "\n") (insert "\n")
(save-buffer) (save-buffer))
(kill-buffer buf))))) (kill-buffer buf))))
(defun org-mobile-write-checksums () (defun org-mobile-write-checksums ()
"Create checksums for all files in `org-mobile-directory'. "Create checksums for all files in `org-mobile-directory'.
@ -231,12 +291,19 @@ The table of checksums is written to the file mobile-checksums."
(let ((cmd (cond ((executable-find "shasum")) (let ((cmd (cond ((executable-find "shasum"))
((executable-find "sha1sum")) ((executable-find "sha1sum"))
((executable-find "md5sum")) ((executable-find "md5sum"))
((executable-find "md5"))))) ((executable-find "md5"))))
(files org-mobile-checksum-files))
(if (not cmd) (if (not cmd)
(message "Checksums could not be generated: no executable") (message "Checksums could not be generated: no executable")
(with-temp-buffer (with-temp-buffer
(cd org-mobile-directory) (cd org-mobile-directory)
(if (equal 0 (shell-command (concat cmd " *.org > checksums.dat"))) (if (file-exists-p "agendas.org")
(push "agendas.org" files))
(if (file-exists-p "mobileorg.org")
(push "mobileorg.org" files))
(setq cmd (concat cmd " " (mapconcat 'shell-quote-argument files " ")
" > checksums.dat"))
(if (equal 0 (shell-command cmd))
(message "Checksums written") (message "Checksums written")
(message "Checksums could not be generated")))))) (message "Checksums could not be generated"))))))