Mercurial > emacs
changeset 90488:4094c5298ae1
Merge from emacs--devo--0
Patches applied:
* emacs--devo--0 (patch 314-319)
- Update from CVS
- Merge from gnus--rel--5.10
* gnus--rel--5.10 (patch 107)
- Update from CVS
Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-78
author | Miles Bader <miles@gnu.org> |
---|---|
date | Tue, 20 Jun 2006 07:35:06 +0000 |
parents | ef80dfaa8269 (current diff) d4401f19d62b (diff) |
children | 78a820ef12db |
files | etc/ChangeLog etc/TODO lisp/ChangeLog lisp/bindings.el lisp/cus-edit.el lisp/ediff-diff.el lisp/ediff-mult.el lisp/ediff-vers.el lisp/ediff-wind.el lisp/ediff.el lisp/emulation/viper-cmd.el lisp/emulation/viper-util.el lisp/emulation/viper.el lisp/files.el lisp/gnus/ChangeLog lisp/gnus/message.el lisp/international/characters.el lisp/mouse.el lisp/textmodes/org.el lisp/textmodes/tex-mode.el lispref/ChangeLog lispref/processes.texi man/ChangeLog man/ediff.texi man/faq.texi man/info.texi man/message.texi src/ChangeLog src/syntax.c src/window.c |
diffstat | 32 files changed, 1370 insertions(+), 748 deletions(-) [+] |
line wrap: on
line diff
--- a/etc/ChangeLog Tue Jun 20 01:17:33 2006 +0000 +++ b/etc/ChangeLog Tue Jun 20 07:35:06 2006 +0000 @@ -1,3 +1,9 @@ +2006-06-19 Carsten Dominik <dominik@science.uva.nl> + + * orgcard.tex (section{Clocking Time}): Add new clocking + commands. + (section{Structure Editing}): Add global archiving command. + 2006-06-14 Thien-Thi Nguyen <ttn@gnu.org> * yow.lines: Delete existing data; add a new entry.
--- a/etc/TODO Tue Jun 20 01:17:33 2006 +0000 +++ b/etc/TODO Tue Jun 20 07:35:06 2006 +0000 @@ -305,6 +305,8 @@ ** Check what hooks would help Emacspeak -- see the defadvising in W3. +** Add definitions for symbol properties, for documentation purposes. + ** Add horizontal scroll bars. ** Provide an optional feature which computes a scroll bar slider's
--- a/etc/orgcard.tex Tue Jun 20 01:17:33 2006 +0000 +++ b/etc/orgcard.tex Tue Jun 20 07:35:06 2006 +0000 @@ -1,5 +1,5 @@ % Reference Card for Org Mode -\def\orgversionnumber{4.37} +\def\orgversionnumber{4.38} \def\year{2006} % %**start of header @@ -288,10 +288,8 @@ \section{Motion} -\key{next heading}{C-c C-n} -\key{previous heading}{C-c C-p} -\key{next heading, same level}{C-c C-f} -\key{previous heading, same level}{C-c C-b} +\key{next/previous heading}{C-c C-n/p} +\key{next/previous heading, same level}{C-c C-f/b} \key{backward to higher level heading}{C-c C-u} \key{jump to another place in document}{C-c C-j} \key{previous/next plain list item}{S-UP/DOWN$^3$} @@ -306,13 +304,14 @@ \key{promote current subtree up one level}{M-S-LEFT} \key{demote current subtree down one level}{M-S-RIGHT} -\key{move subtree/list item up}{M-S-UP} -\key{move subtree/list item down}{M-S-DOWN} +\key{move subtree/list item up/down}{M-S-UP/DOWN} \key{kill subtree}{C-c C-x C-w} \key{copy subtree}{C-c C-x M-w} \key{yank subtree}{C-c C-x C-y} +\key{narrow buffer to current subtree}{C-x n s} \key{archive subtree}{C-c \$} +\key{archive all fully done children}{C-u C-c \$} To set archive location for current file, add a line like$^2$: \vskip -1mm \beginexample% @@ -329,18 +328,13 @@ %\key{agenda for the week}{C-c a$^1$} %\key{agenda for date at cursor}{C-c C-o} -\section{Tags} +\section{Dynamic Blocks} -\key{set tags for current heading}{C-c C-c} -\key{realign tags in all headings}{C-u C-c C-c} -\key{create sparse tree with matching tags}{C-c \\} -\key{globally (agenda) match tags at cursor}{C-c C-o} +\key{update dynamic block at point}{C-c C-x C-u} +\metax{update all dynamic blocks}{C-u C-c C-x C-u} \section{Tables} -%Org-mode has its own built-in intuitive table editor with unique -%capabilities. - {\bf Creating a table} %\metax{insert a new Org-mode table}{M-x org-table-create} @@ -466,6 +460,39 @@ %\key{\kbd{vm://myself@some.where.org/folder\#id}}{\rm VM remote} +\section{Remember-mode Integration} + +See the manual for how to make remember.el use Org-mode links and +files. The note-finishing command \kbd{C-c C-c} will first prompt for +an org file. In the file, find a location with: + +\key{rotate subtree visibility}{TAB} +\key{next heading}{DOWN} +\key{previous heading}{UP} + +Insert the note with one of the following: + +\key{as sublevel of heading at cursor}{RET} +\key{right here (cursor not on heading)}{RET} +\key{before current heading}{LEFT} +\key{after current heading}{RIGHT} +\key{shortcut to end of buffer (cursor at buf-start)}{RET} +\key{Abort}{q} + +\section{Completion} + +In-buffer completion completes TODO keywords at headline start, TeX +macros after ``{\tt \\}'', option keywords after ``{\tt \#-}'', TAGS +after ``{\tt :}'', and dictionary words elsewhere. + +\key{Complete word at point}{M-TAB} + + +\newcolumn +\title{Org-Mode Reference Card (2/2)} + +\centerline{(for version \orgversionnumber)} + \section{TODO Items} \key{rotate the state of the current item}{C-c C-t} @@ -480,6 +507,13 @@ \key{\kbd{\#+SEQ_TODO: TODO TRY BLUFF DONE}}{\rm todo workflow} \key{\kbd{\#+TYP_TODO: Phil home work DONE}}{\rm todo types} +\section{Tags} + +\key{set tags for current heading}{C-c C-c} +\key{realign tags in all headings}{C-u C-c C-c} +\key{create sparse tree with matching tags}{C-c \\} +\key{globally (agenda) match tags at cursor}{C-c C-o} + \section{Timestamps} \key{prompt for date and insert timestamp}{C-c .} @@ -502,18 +536,15 @@ %\key{... forward/backward one month}{M-S-LEFT/RIGT} -\newcolumn -\title{Org-Mode Reference Card (2/2)} - -\centerline{(for version \orgversionnumber)} - \section{Clocking Time} \key{start clock on current item}{C-c C-x C-i} \key{stop clock on current item}{C-c C-x C-o} \key{cancel current clock}{C-c C-x C-x} + \key{display total subtree times}{C-c C-x C-d} \key{remove displayed times}{C-c C-c} +\key{insert/update table with clock report}{C-c C-x C-r} \section{Agenda Views} @@ -577,7 +608,6 @@ \key{Stop the clock (clock-out)}{O} \key{Cancel current clock}{X} -\newcolumn {\bf Calendar commands} @@ -593,6 +623,13 @@ \key{quit agenda, remove agenda buffer}{q} \key{exit agenda, remove all agenda buffers}{x} +\section{Calendar and Diary Integration} + +To include entries from the Emacs diary in your Org-mode agenda: +\beginexample% +(setq org-agenda-include-diary t) +\endexample + \section{Exporting and Publishing} Exporting creates files with extensions {\it .txt\/} and {\it .html\/} @@ -629,18 +666,19 @@ \key{language code for html}{\#+LANGUAGE:} \key{free text description of file}{\#+TEXT:} \key{... which can carry over multiple lines}{\#+TEXT:} -\key{settings for the export process - see below}{\#+OPTIONS:} +%\key{settings for the export process - see below}{\#+OPTIONS:} +\key{settings for the export process}{\#+OPTIONS:} -\key{set number of headline levels for export}{H:2} -\key{turn on/off section numbers}{num:t} -\key{turn on/off table of contents}{toc:t} -\key{turn on/off linebreak preservation}{\\n:nil} -\key{turn on/off quoted html tags}{@:t} -\key{turn on/off fixed width sections}{::t} -\key{turn on/off tables}{|:t} -\key{turn on/off \TeX\ syntax for sub/super-scripts}{\^{}:t} -\key{turn on/off emphasised text}{*:nil} -\key{turn on/off \TeX\ macros}{TeX:t} +%\key{set number of headline levels for export}{H:2} +%\key{turn on/off section numbers}{num:t} +%\key{turn on/off table of contents}{toc:t} +%\key{turn on/off linebreak preservation}{\\n:nil} +%\key{turn on/off quoted html tags}{@:t} +%\key{turn on/off fixed width sections}{::t} +%\key{turn on/off tables}{|:t} +%\key{turn on/off \TeX\ syntax for sub/super-scripts}{\^{}:t} +%\key{turn on/off emphasised text}{*:nil} +%\key{turn on/off \TeX\ macros}{TeX:t} {\bf Comments: Text not being exported} @@ -651,53 +689,20 @@ \key{toggle COMMENT keyword on entry}{C-c ;} -\section{Completion} -In-buffer completion completes TODO keywords at headline start, TeX -macros after ``{\tt \\}'', option keywords after ``{\tt \#-}'', TAGS -after ``{\tt :}'', and dictionary words elsewhere. - -\key{Complete word at point}{M-TAB} - -\section{Calendar and Diary Integration} - -To include entries from the Emacs diary in your Org-mode agenda: -\beginexample% -(setq org-agenda-include-diary t) -\endexample - -\section{Remember-mode Integration} - -See the manual for how to make remember.el use Org-mode links and -files. The note-finishing command \kbd{C-c C-c} will first prompt for -an org file. In the file, find a location with: +%\section{CUA and pc-select compatibility}% -\key{rotate subtree visibility}{TAB} -\key{next heading}{DOWN} -\key{previous heading}{UP} - -Insert the note with one of the following: - -\key{as sublevel of heading at cursor}{RET} -\key{right here (cursor not on heading)}{RET} -\key{before current heading}{LEFT} -\key{after current heading}{RIGHT} -\key{shortcut to end of buffer (cursor at buf-start)}{RET} -\key{Abort}{q} - -\section{CUA and pc-select compatibility} - -Configure the variable {\tt org-CUA-compatibility} to make Org-mode -avoid the \kbd{S-<cursor>} bindings used by these modes. When set, -Org-mode will change the following keybindings (also in the agenda -buffer, but not during date selection). See note mark four$^3$ -throughout the reference card. -%\vskip-mm -\beginexample -S-UP $\to$ M-p S-DOWN $\to$ M-n -S-LEFT $\to$ M-- S-RIGHT $\to$ M-+ -S-RET $\to$ C-S-RET -\endexample +%Configure the variable {\tt org-CUA-compatibility} to make Org-mode +%avoid the \kbd{S-<cursor>} bindings used by these modes. When set, +%Org-mode will change the following keybindings (also in the agenda +%buffer, but not during date selection). See note mark four$^3$ +%throughout the reference card. +%%\vskip-mm +%\beginexample +%S-UP $\to$ M-p S-DOWN $\to$ M-n +%S-LEFT $\to$ M-- S-RIGHT $\to$ M-+ +%S-RET $\to$ C-S-RET +%\endexample \section{Notes} $^1$ This is only a suggestion for a binding of this command. Choose
--- a/lisp/ChangeLog Tue Jun 20 01:17:33 2006 +0000 +++ b/lisp/ChangeLog Tue Jun 20 07:35:06 2006 +0000 @@ -1,3 +1,98 @@ +2006-06-20 Kenichi Handa <handa@m17n.org> + + * international/characters.el (word-combining-categories): Add + entries for 2-byte Han characters. + +2006-06-19 Richard Stallman <rms@gnu.org> + + * bindings.el (mode-line-format): Save some mode line space. + + * files.el (find-file-noselect): Improve the question wording. + (basic-save-buffer-2): Mask UMASK against 666. + + * mouse.el (mouse-drag-vertical-line-rightward-window): New function. + (mouse-drag-vertical-line): Call it. + + * cus-edit.el (customize-option, customize-option-other-window): + Error if SYMBOL is nil. + +2006-06-19 Carsten Dominik <dominik@science.uva.nl> + + * textmodes/org.el: Require noutline, also on XEmacs. + (org-end-of-subtree): Return point. + (org-dblock-start-re, org-dblock-end-re): New constants. + (org-create-dblock, org-prepare-dblock, org-map-dblocks) + (org-dblock-update, org-update-dblock, org-beginning-of-dblock) + (org-update-all-dblocks, org-find-dblock): New functions. + (org-collect-clock-time-entries): New function. + (org-html-handle-time-stamps): Never export CLOCK timeranges. + (org-fixup-indentation): Modified to deadl correctly with lines + starting with TAB. Only one argument DIFF now. + (org-demote, org-promote): Call `org-fixup-indentation' with just + one argument, DIFF. + (org-mode): Don't mark buffer as modified when aligning tables. + (org-clock-sum): Don't makr buffer modified when adding time sum + properties. + (org-export-as-html): Added support for a link validation + function. + (org-archive-all-done): New function. + (org-archive-subtree): New prefix argument. When set, archive all + done subtrees in this buffer. + (org-remove-clock-overlays) + (org-remove-occur-highlights): Use + `org-inhibit-highlight-removal'. + (org-inhibit-highlight-removal): New variable, for dynamic + scoping. + (org-put-clock-overlay): Don't swallow last headline character + when displaying overlay. + (org-store-link): Link to `image-mode' with just the file name. + + +2006-06-18 Michael Kifer <kifer@cs.stonybrook.edu> + + * viper-cmd.el (viper-special-read-and-insert-char): use + read-key-sequence. + (viper-after-change-undo-hook): enhancements. + (viper-after-change-undo-hook): new hook. + (viper-undo): use viper-after-change-undo-hook. + (viper-add-newline-at-eob-if-necessary): widen before making changes. + (viper-next-line-at-bol): If point is on a widget or a button, simulate + clicking on that widget/button. + + * viper.el (viper-mode): allow for a separate cursor color in Emacs + state. + + * ediff-diff (ediff-test-patch-utility): catch errors. + (ediff-actual-diff-options, ediff-actual-diff3-options): new variables. + (ediff-set-actual-diff-options): new function. + (ediff-reset-diff-options, ediff-toggle-ignore-case): + use ediff-set-actual-diff-options. + (ediff-extract-diffs): catch errors. + (ediff-whitespace): add nonbreakable space. + (ediff-same-file-contents): catch errors. + + * ediff-mult.el (ediff-collect-custom-diffs): save + coding-system-for-read. + + * ediff-vers.el (ediff-keep-tmp-versions): new var. + (ediff-vc-internal, ediff-vc-merge-internal): use + ediff-delete-version-file. + (ediff-delete-version-file): new function. + + * ediff-wind.el (ediff-control-frame-parameters): set frame fringes. + + * ediff.el (ediff-directories, ediff-directory-revisions, + ediff-merge-directories, ediff-merge-directories-with-ancestor, + ediff-directories-internal, ediff-merge-directory-revisions, + ediff-merge-directory-revisions-with-ancestor, + ediff-directories3): use read-directory-name. + +2006-06-18 Ralf Angeli <angeli@caeruleus.net> + + * textmodes/tex-mode.el (tex-font-lock-match-suscript): Remove + superfluous part of regexp for brace matching which is handled by + `scan-lists' call. + 2006-06-16 Richard Stallman <rms@gnu.org> * obsolete/options.el (list-options): Put "obsolete" msg in buffer.
--- a/lisp/bindings.el Tue Jun 20 01:17:33 2006 +0000 +++ b/lisp/bindings.el Tue Jun 20 07:35:06 2006 +0000 @@ -299,8 +299,7 @@ 'mode-line-buffer-identification (propertize " " 'help-echo help-echo) 'mode-line-position - '(vc-mode vc-mode) - (propertize " " 'help-echo help-echo) + `(vc-mode ("" vc-mode ,(propertize " " 'help-echo help-echo))) 'mode-line-modes `(which-func-mode ("" which-func-format ,dashes)) `(global-mode-string (,dashes global-mode-string))
--- a/lisp/cus-edit.el Tue Jun 20 01:17:33 2006 +0000 +++ b/lisp/cus-edit.el Tue Jun 20 07:35:06 2006 +0000 @@ -1055,6 +1055,8 @@ (defun customize-option (symbol) "Customize SYMBOL, which must be a user option variable." (interactive (custom-variable-prompt)) + (unless symbol + (error "No variable specified")) (let ((basevar (indirect-variable symbol))) (custom-buffer-create (list (list basevar 'custom-variable)) (format "*Customize Option: %s*" @@ -1070,6 +1072,8 @@ "Customize SYMBOL, which must be a user option variable. Show the buffer in another window, but don't select it." (interactive (custom-variable-prompt)) + (unless symbol + (error "No variable specified")) (let ((basevar (indirect-variable symbol))) (custom-buffer-create-other-window (list (list basevar 'custom-variable))
--- a/lisp/ediff-diff.el Tue Jun 20 01:17:33 2006 +0000 +++ b/lisp/ediff-diff.el Tue Jun 20 07:35:06 2006 +0000 @@ -65,10 +65,11 @@ ;; The following functions needed for setting diff/diff3 options ;; test if diff supports the --binary option (defsubst ediff-test-utility (diff-util option &optional files) - (condition-case () + (condition-case nil (eq 0 (apply 'call-process (append (list diff-util nil nil nil option) files))) - (file-error nil))) + (error (format "Cannot execute program %S." diff-util))) + ) (defun ediff-diff-mandatory-option (diff-util) (let ((file (if (boundp 'null-device) null-device "/dev/null"))) @@ -77,13 +78,17 @@ ((and (string= diff-util ediff-diff-program) (ediff-test-utility ediff-diff-program "--binary" (list file file))) - "--binary") + "--binary ") ((and (string= diff-util ediff-diff3-program) (ediff-test-utility ediff-diff3-program "--binary" (list file file file))) - "--binary") + "--binary ") (t "")))) + +;; must be before ediff-reset-diff-options to avoid compiler errors +(fset 'ediff-set-actual-diff-options '(lambda () nil)) + ;; make sure that mandatory options are added even if the user changes ;; ediff-diff-options or ediff-diff3-options in the customization widget (defun ediff-reset-diff-options (symb val) @@ -91,12 +96,9 @@ (if (eq symb 'ediff-diff-options) ediff-diff-program ediff-diff3-program)) - (mandatory-option (ediff-diff-mandatory-option diff-program)) - (spacer (if (string-equal mandatory-option "") "" " "))) - (set symb - (if (string-match mandatory-option val) - val - (concat mandatory-option spacer val))) + (mandatory-option (ediff-diff-mandatory-option diff-program))) + (set symb (concat mandatory-option val)) + (ediff-set-actual-diff-options) )) @@ -155,7 +157,7 @@ :group 'ediff-diff) ;; the actual options used in comparison -(ediff-defvar-local ediff-actual-diff-options "" "") +(ediff-defvar-local ediff-actual-diff-options ediff-diff-options "") (defcustom ediff-custom-diff-program ediff-diff-program "*Program to use for generating custom diff output for saving it in a file. @@ -178,7 +180,7 @@ :group 'ediff-diff) ;; the actual options used in comparison -(ediff-defvar-local ediff-actual-diff3-options "" "") +(ediff-defvar-local ediff-actual-diff3-options ediff-diff3-options "") (defcustom ediff-diff3-ok-lines-regexp "^\\([1-3]:\\|====\\| \\|.*Warning *:\\|.*No newline\\|.*missing newline\\|^\C-m$\\)" @@ -1272,7 +1274,9 @@ ;; Similarly for Windows-* ;; In DOS, must synchronize because DOS doesn't have ;; asynchronous processes. - (apply 'call-process program nil buffer nil args) + (condition-case nil + (apply 'call-process program nil buffer nil args) + (error (format "Cannot execute program %S." program))) ;; On other systems, do it asynchronously. (setq proc (get-buffer-process buffer)) (if proc (kill-process proc)) @@ -1328,7 +1332,8 @@ Used for splitting difference regions into individual words.") (make-variable-buffer-local 'ediff-forward-word-function) -(defvar ediff-whitespace " \n\t\f" +;; \240 is unicode symbol for nonbreakable whitespace +(defvar ediff-whitespace " \n\t\f\r\240" "*Characters constituting white space. These characters are ignored when differing regions are split into words.") (make-variable-buffer-local 'ediff-whitespace) @@ -1442,11 +1447,13 @@ "Return t if files F1 and F2 have identical contents." (if (and (not (file-directory-p f1)) (not (file-directory-p f2))) - (let ((res - (apply 'call-process ediff-cmp-program nil nil nil - (append ediff-cmp-options (list f1 f2))))) - (and (numberp res) (eq res 0)))) - ) + (condition-case nil + (let ((res + (apply 'call-process ediff-cmp-program nil nil nil + (append ediff-cmp-options (list f1 f2))))) + (and (numberp res) (eq res 0))) + (error (format "Cannot execute program %S." ediff-cmp-program))) + )) (defun ediff-same-contents (d1 d2 &optional filter-re) @@ -1521,21 +1528,30 @@ (setq file-list-list (cdr file-list-list))) (reverse result))) + +(defun ediff-set-actual-diff-options () + (if ediff-ignore-case + (setq ediff-actual-diff-options + (concat ediff-diff-options " " ediff-ignore-case-option) + ediff-actual-diff3-options + (concat ediff-diff3-options " " ediff-ignore-case-option3)) + (setq ediff-actual-diff-options ediff-diff-options + ediff-actual-diff3-options ediff-diff3-options) + ) + (setq-default ediff-actual-diff-options ediff-actual-diff-options + ediff-actual-diff3-options ediff-actual-diff3-options) + ) + + ;; Ignore case handling - some ideas from drew.adams@@oracle.com (defun ediff-toggle-ignore-case () (interactive) (ediff-barf-if-not-control-buffer) (setq ediff-ignore-case (not ediff-ignore-case)) - (cond (ediff-ignore-case - (setq ediff-actual-diff-options - (concat ediff-diff-options " " ediff-ignore-case-option) - ediff-actual-diff3-options - (concat ediff-diff3-options " " ediff-ignore-case-option3)) - (message "Ignoring regions that differ only in case")) - (t - (setq ediff-actual-diff-options ediff-diff-options - ediff-actual-diff3-options ediff-diff3-options) - (message "Ignoring case differences turned OFF"))) + (ediff-set-actual-diff-options) + (if ediff-ignore-case + (message "Ignoring regions that differ only in case") + (message "Ignoring case differences turned OFF")) (cond (ediff-merge-job (message "Ignoring letter case is too dangerous in merge jobs")) ((and ediff-diff3-job (string= ediff-ignore-case-option3 ""))
--- a/lisp/ediff-mult.el Tue Jun 20 01:17:33 2006 +0000 +++ b/lisp/ediff-mult.el Tue Jun 20 07:35:06 2006 +0000 @@ -1656,22 +1656,26 @@ multifile patches. For `ediff-directory-revisions', we insist that all marked sessions must be active." (interactive) - (or (ediff-buffer-live-p ediff-meta-diff-buffer) - (setq ediff-meta-diff-buffer - (get-buffer-create - (ediff-unique-buffer-name "*Ediff Multifile Diffs" "*")))) - (ediff-with-current-buffer ediff-meta-diff-buffer - (setq buffer-read-only nil) - (erase-buffer)) - (if (> (ediff-operate-on-marked-sessions 'ediff-append-custom-diff) 0) - ;; did something - (progn - (display-buffer ediff-meta-diff-buffer 'not-this-window) - (ediff-with-current-buffer ediff-meta-diff-buffer - (set-buffer-modified-p nil) - (setq buffer-read-only t))) - (beep) - (message "No marked sessions found"))) + (let ((coding-system-for-read ediff-coding-system-for-read)) + (or (ediff-buffer-live-p ediff-meta-diff-buffer) + (setq ediff-meta-diff-buffer + (get-buffer-create + (ediff-unique-buffer-name "*Ediff Multifile Diffs" "*")))) + (ediff-with-current-buffer ediff-meta-diff-buffer + (setq buffer-read-only nil) + (erase-buffer)) + (if (> (ediff-operate-on-marked-sessions 'ediff-append-custom-diff) 0) + ;; did something + (progn + (display-buffer ediff-meta-diff-buffer 'not-this-window) + (ediff-with-current-buffer ediff-meta-diff-buffer + (set-buffer-modified-p nil) + (setq buffer-read-only t)) + (if (fboundp 'diff-mode) + (with-current-buffer ediff-meta-diff-buffer + (diff-mode)))) + (beep) + (message "No marked sessions found")))) (defun ediff-meta-show-patch () "Show the multi-file patch associated with this group session."
--- a/lisp/ediff-vers.el Tue Jun 20 01:17:33 2006 +0000 +++ b/lisp/ediff-vers.el Tue Jun 20 07:35:06 2006 +0000 @@ -52,6 +52,13 @@ ))) ;; end pacifier +(defcustom ediff-keep-tmp-versions nil + "*If t, do not delete temporary previous versions for the files on which +comparison or merge operations are being performed." + :type 'boolean + :group 'ediff-vers + ) + ;; VC.el support (defun ediff-vc-latest-version (file) @@ -87,8 +94,8 @@ file2 (buffer-file-name))) (setq startup-hooks (cons `(lambda () - (delete-file ,file1) - (or ,(string= rev2 "") (delete-file ,file2))) + (ediff-delete-version-file ,file1) + (or ,(string= rev2 "") (ediff-delete-version-file ,file2))) startup-hooks))) (ediff-buffers rev1buf rev2buf @@ -199,12 +206,12 @@ (setq startup-hooks (cons `(lambda () - (delete-file ,(buffer-file-name buf1)) + (ediff-delete-version-file ,(buffer-file-name buf1)) (or ,(string= rev2 "") - (delete-file ,(buffer-file-name buf2))) + (ediff-delete-version-file ,(buffer-file-name buf2))) (or ,(string= ancestor-rev "") ,(not ancestor-rev) - (delete-file ,(buffer-file-name ancestor-buf))) + (ediff-delete-version-file ,(buffer-file-name ancestor-buf))) ) startup-hooks))) (if ancestor-rev @@ -305,8 +312,13 @@ (find-file-noselect (cvs-fileinfo->full-name fileinfo))) nil ; startup-hooks 'ediff-revisions))) - (if (stringp tmp-file) (delete-file tmp-file)) - (if (stringp ancestor-file) (delete-file ancestor-file)))) + (if (stringp tmp-file) (ediff-delete-version-file tmp-file)) + (if (stringp ancestor-file) (ediff-delete-version-file ancestor-file)))) + + +;; delete version file on exit unless ediff-keep-tmp-versions is true +(defun ediff-delete-version-file (file) + (or ediff-keep-tmp-versions (delete-file file))) (provide 'ediff-vers)
--- a/lisp/ediff-wind.el Tue Jun 20 01:17:33 2006 +0000 +++ b/lisp/ediff-wind.el Tue Jun 20 07:35:06 2006 +0000 @@ -158,6 +158,8 @@ '(scrollbar-height . 0) ; XEmacs only '(menu-bar-lines . 0) ; Emacs only '(tool-bar-lines . 0) ; Emacs 21+ only + '(left-fringe . 0) + '(right-fringe . 0) ;; don't lower but auto-raise '(auto-lower . nil) '(auto-raise . t)
--- a/lisp/ediff.el Tue Jun 20 01:17:33 2006 +0000 +++ b/lisp/ediff.el Tue Jun 20 07:35:06 2006 +0000 @@ -500,12 +500,13 @@ (let ((dir-A (ediff-get-default-directory-name)) (default-regexp (eval ediff-default-filtering-regexp)) f) - (list (setq f (ediff-read-file-name "Directory A to compare:" dir-A nil)) - (ediff-read-file-name "Directory B to compare:" - (if ediff-use-last-dir - ediff-last-dir-B - (ediff-strip-last-dir f)) - nil) + (list (setq f (read-directory-name + "Directory A to compare:" dir-A nil 'must-match)) + (read-directory-name "Directory B to compare:" + (if ediff-use-last-dir + ediff-last-dir-B + (ediff-strip-last-dir f)) + nil 'must-match) (read-string (if (stringp default-regexp) (format "Filter through regular expression (default %s): " @@ -532,8 +533,8 @@ (let ((dir-A (ediff-get-default-directory-name)) (default-regexp (eval ediff-default-filtering-regexp)) ) - (list (ediff-read-file-name - "Directory to compare with revision:" dir-A nil) + (list (read-directory-name + "Directory to compare with revision:" dir-A nil 'must-match) (read-string (if (stringp default-regexp) (format "Filter through regular expression (default %s): " @@ -561,17 +562,17 @@ (let ((dir-A (ediff-get-default-directory-name)) (default-regexp (eval ediff-default-filtering-regexp)) f) - (list (setq f (ediff-read-file-name "Directory A to compare:" dir-A nil)) - (setq f (ediff-read-file-name "Directory B to compare:" - (if ediff-use-last-dir - ediff-last-dir-B - (ediff-strip-last-dir f)) - nil)) - (ediff-read-file-name "Directory C to compare:" - (if ediff-use-last-dir - ediff-last-dir-C - (ediff-strip-last-dir f)) - nil) + (list (setq f (read-directory-name "Directory A to compare:" dir-A nil)) + (setq f (read-directory-name "Directory B to compare:" + (if ediff-use-last-dir + ediff-last-dir-B + (ediff-strip-last-dir f)) + nil 'must-match)) + (read-directory-name "Directory C to compare:" + (if ediff-use-last-dir + ediff-last-dir-C + (ediff-strip-last-dir f)) + nil 'must-match) (read-string (if (stringp default-regexp) (format "Filter through regular expression (default %s): " @@ -597,12 +598,13 @@ (let ((dir-A (ediff-get-default-directory-name)) (default-regexp (eval ediff-default-filtering-regexp)) f) - (list (setq f (ediff-read-file-name "Directory A to merge:" dir-A nil)) - (ediff-read-file-name "Directory B to merge:" - (if ediff-use-last-dir - ediff-last-dir-B - (ediff-strip-last-dir f)) - nil) + (list (setq f (read-directory-name "Directory A to merge:" + dir-A nil 'must-match)) + (read-directory-name "Directory B to merge:" + (if ediff-use-last-dir + ediff-last-dir-B + (ediff-strip-last-dir f)) + nil 'must-match) (read-string (if (stringp default-regexp) (format "Filter through regular expression (default %s): " @@ -633,17 +635,17 @@ (let ((dir-A (ediff-get-default-directory-name)) (default-regexp (eval ediff-default-filtering-regexp)) f) - (list (setq f (ediff-read-file-name "Directory A to merge:" dir-A nil)) - (setq f (ediff-read-file-name "Directory B to merge:" + (list (setq f (read-directory-name "Directory A to merge:" dir-A nil)) + (setq f (read-directory-name "Directory B to merge:" (if ediff-use-last-dir ediff-last-dir-B (ediff-strip-last-dir f)) - nil)) - (ediff-read-file-name "Ancestor directory:" + nil 'must-match)) + (read-directory-name "Ancestor directory:" (if ediff-use-last-dir ediff-last-dir-C (ediff-strip-last-dir f)) - nil) + nil 'must-match) (read-string (if (stringp default-regexp) (format "Filter through regular expression (default %s): " @@ -669,8 +671,8 @@ (let ((dir-A (ediff-get-default-directory-name)) (default-regexp (eval ediff-default-filtering-regexp)) ) - (list (ediff-read-file-name - "Directory to merge with revisions:" dir-A nil) + (list (read-directory-name + "Directory to merge with revisions:" dir-A nil 'must-match) (read-string (if (stringp default-regexp) (format "Filter through regular expression (default %s): " @@ -699,8 +701,9 @@ (let ((dir-A (ediff-get-default-directory-name)) (default-regexp (eval ediff-default-filtering-regexp)) ) - (list (ediff-read-file-name - "Directory to merge with revisions and ancestors:" dir-A nil) + (list (read-directory-name + "Directory to merge with revisions and ancestors:" + dir-A nil 'must-match) (read-string (if (stringp default-regexp) (format "Filter through regular expression (default %s): " @@ -733,11 +736,6 @@ (defun ediff-directories-internal (dir1 dir2 dir3 regexp action jobname &optional startup-hooks merge-autostore-dir) - ;; ediff-read-file-name is set to attach a previously entered file name if - ;; the currently entered file is a directory. This code takes care of that. - (setq dir1 (if (file-directory-p dir1) dir1 (file-name-directory dir1)) - dir2 (if (file-directory-p dir2) dir2 (file-name-directory dir2))) - (if (stringp dir3) (setq dir3 (if (file-directory-p dir3) dir3 (file-name-directory dir3)))) @@ -763,7 +761,7 @@ (ediff-merge-metajob jobname) (not merge-autostore-dir)) (setq merge-autostore-dir - (read-file-name "Save merged files in directory: " + (read-directory-name "Save merged files in directory: " (if ediff-use-last-dir ediff-last-merge-autostore-dir (ediff-strip-last-dir dir1)) @@ -823,7 +821,7 @@ (ediff-merge-metajob jobname) (not merge-autostore-dir)) (setq merge-autostore-dir - (read-file-name "Save merged files in directory: " + (read-directory-name "Save merged files in directory: " (if ediff-use-last-dir ediff-last-merge-autostore-dir (ediff-strip-last-dir dir1))
--- a/lisp/emulation/viper-cmd.el Tue Jun 20 01:17:33 2006 +0000 +++ b/lisp/emulation/viper-cmd.el Tue Jun 20 07:35:06 2006 +0000 @@ -887,12 +887,15 @@ (setq ch (aref (read-key-sequence nil) 0))) (insert ch)) (t - (setq ch (read-char-exclusive)) + ;;(setq ch (read-char-exclusive)) + (setq ch (aref (read-key-sequence nil) 0)) ;; replace ^M with the newline (if (eq ch ?\C-m) (setq ch ?\n)) ;; Make sure ^V and ^Q work as quotation chars (if (memq ch '(?\C-v ?\C-q)) - (setq ch (read-char-exclusive))) + ;;(setq ch (read-char-exclusive)) + (setq ch (aref (read-key-sequence nil) 0)) + ) (insert ch)) ) (setq last-command-event @@ -1730,20 +1733,34 @@ ;; undoing +;; hook used inside undo +(defvar viper-undo-functions nil) + +;; Runs viper-before-change-functions inside before-change-functions +(defun viper-undo-sentinel (beg end length) + (run-hook-with-args 'viper-undo-functions beg end length)) + +(add-hook 'after-change-functions 'viper-undo-sentinel) + +;; Hook used in viper-undo +(defun viper-after-change-undo-hook (beg end len) + (setq undo-beg-posn beg + undo-end-posn (or end beg)) + ;; some other hooks may be changing various text properties in + ;; the buffer in response to 'undo'; so remove this hook to avoid + ;; its repeated invocation + (remove-hook 'viper-undo-functions 'viper-after-change-undo-hook 'local)) + (defun viper-undo () "Undo previous change." (interactive) (message "undo!") (let ((modified (buffer-modified-p)) (before-undo-pt (point-marker)) - (after-change-functions after-change-functions) undo-beg-posn undo-end-posn) - ;; no need to remove this hook, since this var has scope inside a let. - (add-hook 'after-change-functions - '(lambda (beg end len) - (setq undo-beg-posn beg - undo-end-posn (or end beg)))) + ;; the viper-after-change-undo-hook removes itself after the 1st invocation + (add-hook 'viper-undo-functions 'viper-after-change-undo-hook nil 'local) (undo-start) (undo-more 2) @@ -1765,7 +1782,8 @@ (goto-char undo-beg-posn))) (push-mark before-undo-pt t)) (if (and (eolp) (not (bolp))) (backward-char 1)) - (if (not modified) (set-buffer-modified-p t))) + ;;(if (not modified) (set-buffer-modified-p t)) + ) (setq this-command 'viper-undo)) ;; Continue undoing previous changes. @@ -1813,7 +1831,7 @@ (setq viper-undo-needs-adjustment t))))) - +;;; Viper's destructive Command ring utilities (defun viper-display-current-destructive-command () (let ((text (nth 4 viper-d-com)) @@ -1927,12 +1945,15 @@ (end-of-line) ;; make sure all lines end with newline, unless in the minibuffer or ;; when requested otherwise (require-final-newline is nil) - (if (and (eobp) - (not (bolp)) - require-final-newline - (not (viper-is-in-minibuffer)) - (not buffer-read-only)) - (insert "\n")))) + (save-restriction + (widen) + (if (and (eobp) + (not (bolp)) + require-final-newline + (not (viper-is-in-minibuffer)) + (not buffer-read-only)) + (insert "\n"))) + )) (defun viper-yank-defun () (mark-defun) @@ -3045,19 +3066,34 @@ (setq this-command 'next-line) (if com (viper-execute-com 'viper-next-line val com)))) + (defun viper-next-line-at-bol (arg) - "Next line at beginning of line." + "Next line at beginning of line. +If point is on a widget or a button, simulate clicking on that widget/button." (interactive "P") - (viper-leave-region-active) - (save-excursion - (end-of-line) - (if (eobp) (error "Last line in buffer"))) - (let ((val (viper-p-val arg)) - (com (viper-getCom arg))) - (if com (viper-move-marker-locally 'viper-com-point (point))) - (forward-line val) - (back-to-indentation) - (if com (viper-execute-com 'viper-next-line-at-bol val com)))) + (let* ((field (get-char-property (point) 'field)) + (button (get-char-property (point) 'button)) + (doc (get-char-property (point) 'widget-doc)) + (widget (or field button doc))) + (if (and widget + (if (symbolp widget) + (get widget 'widget-type) + (and (consp widget) + (get (widget-type widget) 'widget-type)))) + (widget-button-press (point)) + (if (button-at (point)) + (push-button) + ;; not a widget or a button + (viper-leave-region-active) + (save-excursion + (end-of-line) + (if (eobp) (error "Last line in buffer"))) + (let ((val (viper-p-val arg)) + (com (viper-getCom arg))) + (if com (viper-move-marker-locally 'viper-com-point (point))) + (forward-line val) + (back-to-indentation) + (if com (viper-execute-com 'viper-next-line-at-bol val com))))))) (defun viper-previous-line (arg)
--- a/lisp/emulation/viper-util.el Tue Jun 20 01:17:33 2006 +0000 +++ b/lisp/emulation/viper-util.el Tue Jun 20 07:35:06 2006 +0000 @@ -139,8 +139,8 @@ (defsubst viper-get-cursor-color () (viper-cond-compile-for-xemacs-or-emacs - ;; xemacs - (color-instance-name (frame-property (selected-frame) 'cursor-color)) + (color-instance-name + (frame-property (selected-frame) 'cursor-color)) ; xemacs (cdr (assoc 'cursor-color (frame-parameters))) ; emacs ))
--- a/lisp/emulation/viper.el Tue Jun 20 01:17:33 2006 +0000 +++ b/lisp/emulation/viper.el Tue Jun 20 07:35:06 2006 +0000 @@ -534,6 +534,10 @@ (defun viper-mode () "Turn on Viper emulation of Vi in Emacs. See Info node `(viper)Viper'." (interactive) + (if (null viper-vi-state-cursor-color) + (modify-frame-parameters + (selected-frame) + (list (cons 'viper-vi-state-cursor-color (viper-get-cursor-color))))) (if (not noninteractive) (progn ;; if the user requested viper-mode explicitly @@ -545,8 +549,6 @@ (if viper-first-time ; Important check. Prevents mix-up of startup (progn ; and expert-level msgs when viper-mode recurses (setq viper-first-time nil) - (setq viper-vi-state-cursor-color - (viper-get-cursor-color)) (if (not viper-inhibit-startup-message) (save-window-excursion (setq viper-inhibit-startup-message t)
--- a/lisp/files.el Tue Jun 20 01:17:33 2006 +0000 +++ b/lisp/files.el Tue Jun 20 07:35:06 2006 +0000 @@ -1514,23 +1514,53 @@ ;; hexl-mode. (not (eq major-mode 'hexl-mode))) (if (buffer-modified-p) - (if (y-or-n-p (if rawfile - "Save file and revisit literally? " - "Save file and revisit non-literally? ")) + (if (y-or-n-p + (format + (if rawfile + "The file %s is already visited normally, +and you have edited the buffer. Now you have asked to visit it literally, +meaning no coding system handling, format conversion, or local variables. +Emacs can only visit a file in one way at a time. + +Do you want to save the file, and visit it literally instead? " + "The file %s is already visited literally, +meaning no coding system handling, format conversion, or local variables. +You have edited the buffer. Now you have asked to visit the file normally, +but Emacs can only visit a file in one way at a time. + +Do you want to save the file, and visit it normally instead? ") + (file-name-nondirectory filename))) (progn (save-buffer) (find-file-noselect-1 buf filename nowarn rawfile truename number)) - (if (y-or-n-p (if rawfile - "Discard your edits and revisit file literally? " - "Discard your edits and revisit file non-literally? ")) + (if (y-or-n-p + (format + (if rawfile + "\ +Do you want to discard your changes, and visit the file literally now? " + "\ +Do you want to discard your changes, and visit the file normally now? "))) (find-file-noselect-1 buf filename nowarn rawfile truename number) (error (if rawfile "File already visited non-literally" "File already visited literally")))) - (if (y-or-n-p (if rawfile - "Revisit file literally? " - "Revisit file non-literally? ")) + (if (y-or-n-p + (format + (if rawfile + "The file %s is already visited normally. +You have asked to visit it literally, +meaning no coding system decoding, format conversion, or local variables. +But Emacs can only visit a file in one way at a time. + +Do you want to revisit the file literally now? " + "The file %s is already visited literally, +meaning no coding system decoding, format conversion, or local variables. +You have asked to visit it normally, +but Emacs can only visit a file in one way at a time. + +Do you want to revisit the file normally now? ") + (file-name-nondirectory filename))) (find-file-noselect-1 buf filename nowarn rawfile truename number) (error (if rawfile "File already visited non-literally" @@ -3631,7 +3661,8 @@ ;; Since we have created an entirely new file, ;; make sure it gets the right permission bits set. (setq setmodes (or setmodes - (cons (or (file-modes buffer-file-name) umask) + (cons (or (file-modes buffer-file-name) + (logand ?\666 umask)) buffer-file-name))) ;; We succeeded in writing the temp file, ;; so rename it.
--- a/lisp/gnus/ChangeLog Tue Jun 20 01:17:33 2006 +0000 +++ b/lisp/gnus/ChangeLog Tue Jun 20 07:35:06 2006 +0000 @@ -1,3 +1,7 @@ +2006-06-19 Katsumi Yamaoka <yamaoka@jpl.org> + + * message.el (message-syntax-checks): Doc fix. + 2006-06-16 Katsumi Yamaoka <yamaoka@jpl.org> * message.el (message-syntax-checks): Doc fix.
--- a/lisp/gnus/message.el Tue Jun 20 01:17:33 2006 +0000 +++ b/lisp/gnus/message.el Tue Jun 20 07:35:06 2006 +0000 @@ -194,7 +194,7 @@ `empty', `existing-newsgroups', `from', `illegible-text', `invisible-text', `long-header-lines', `long-lines', `message-id', `multiple-headers', `new-text', `newsgroups', `quoting-style', -`repeated-newsgroups', `reply-to', `sendsys', `shoot', +`repeated-newsgroups', `reply-to', `sender', `sendsys', `shoot', `shorten-followup-to', `signature', `size', `subject', `subject-cmsg' and `valid-newsgroups'." :group 'message-news
--- a/lisp/international/characters.el Tue Jun 20 01:17:33 2006 +0000 +++ b/lisp/international/characters.el Tue Jun 20 07:35:06 2006 +0000 @@ -1078,7 +1078,10 @@ char-script-table) (setq word-combining-categories - '((?l . ?l))) + '((?l . ?l) + (?C . ?C) + (?C . ?H) + (?C . ?K))) (setq word-separating-categories ; (2-byte character sets) '((?A . ?K) ; Alpha numeric - Katakana
--- a/lisp/mouse.el Tue Jun 20 01:17:33 2006 +0000 +++ b/lisp/mouse.el Tue Jun 20 07:35:06 2006 +0000 @@ -529,6 +529,24 @@ (mouse-drag-mode-line-1 start-event nil)))) +(defun mouse-drag-vertical-line-rightward-window (window) + "Return a window that is immediately to the right of WINDOW, or nil." + (let ((bottom (nth 3 (window-inside-edges window))) + (left (nth 0 (window-inside-edges window))) + best best-right + (try (previous-window window))) + (while (not (eq try window)) + (let ((try-top (nth 1 (window-inside-edges try))) + (try-bottom (nth 3 (window-inside-edges try))) + (try-right (nth 2 (window-inside-edges try)))) + (if (and (< try-top bottom) + (>= try-bottom bottom) + (< try-right left) + (or (null best-right) (> try-right best-right))) + (setq best-right try-right best try))) + (setq try (previous-window try))) + best)) + (defun mouse-drag-vertical-line (start-event) "Change the width of a window by dragging on the vertical line." (interactive "e") @@ -594,7 +612,8 @@ ;; adjust the window on the left. (if (eq which-side 'right) (selected-window) - (previous-window)))) + (mouse-drag-vertical-line-rightward-window + (selected-window))))) (setq x (- (car (cdr mouse)) (if (eq which-side 'right) 0 2)) edges (window-edges window)
--- a/lisp/textmodes/org.el Tue Jun 20 01:17:33 2006 +0000 +++ b/lisp/textmodes/org.el Tue Jun 20 07:35:06 2006 +0000 @@ -5,7 +5,7 @@ ;; Author: Carsten Dominik <dominik at science dot uva dot nl> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://www.astro.uva.nl/~dominik/Tools/org/ -;; Version: 4.36b +;; Version: 4.38 ;; ;; This file is part of GNU Emacs. ;; @@ -90,6 +90,14 @@ ;; ;; Recent changes ;; -------------- +;; Version 4.38 +;; - noutline.el is now required (important for XEmacs users only). +;; - Dynamic blocks. +;; - Archiving of all level 1 trees without open TODO items. +;; - Clock reports can be inserted into the file in a special section. +;; - FAQ removed from the manual, now only on the web. +;; - Bug fixes. +;; ;; Version 4.37 ;; - Clock-feature for measuring time spent on specific items. ;; - Improved emphasizing allows configuration and stacking. @@ -170,13 +178,18 @@ (eval-when-compile (require 'cl) (require 'calendar)) -(require 'outline) +;; For XEmacs, noutline is not yet provided by outline.el, so arrange for +;; the file noutline.el being loaded. +(if (featurep 'xemacs) (condition-case nil (require 'noutline))) +;; We require noutline, which might be provided in outline.el +(require 'outline) (require 'noutline) +;; Other stuff we need. (require 'time-date) (require 'easymenu) ;;; Customization variables -(defvar org-version "4.36b" +(defvar org-version "4.38" "The version number of the file org.el.") (defun org-version () (interactive) @@ -2202,7 +2215,7 @@ `org-emphasis-alist') will be allowed as pre/post, aiding inside-out matching. Use customize to modify this, or restart emacs after changing it." - :group 'org-fixme + :group 'org-font-lock :set 'org-set-emph-re :type '(list (sexp :tag "Allowed chars in pre ") @@ -2216,19 +2229,23 @@ '(("*" bold "<b>" "</b>") ("/" italic "<i>" "</i>") ("_" underline "<u>" "</u>") - ("=" shadow "<code>" "</code>")) + ("=" shadow "<code>" "</code>") + ("+" (:strike-through t) "<del>" "</del>") +) "Special syntax for emphasised text. Text starting and ending with a special character will be emphasized, for example *bold*, _underlined_ and /italic/. This variable sets the marker characters, the face to bbe used by font-lock for highlighting in Org-mode emacs buffers, and the HTML tags to be used for this. Use customize to modify this, or restart emacs after changing it." - :group 'org-fixme + :group 'org-font-lock :set 'org-set-emph-re :type '(repeat (list (string :tag "Marker character") - (face :tag "Font-lock-face") + (choice + (face :tag "Font-lock-face") + (plist :tag "Face property list")) (string :tag "HTML start tag") (string :tag "HTML end tag")))) @@ -2708,6 +2725,7 @@ (defvar gnus-group-name) ; from gnus (defvar gnus-article-current) ; from gnus (defvar w3m-current-url) ; from w3m +(defvar w3m-current-title) ; from w3m (defvar mh-progs) ; from MH-E (defvar mh-current-folder) ; from MH-E (defvar mh-show-folder-buffer) ; from MH-E @@ -2823,8 +2841,10 @@ (insert " -*- mode: org -*-\n\n")) (unless org-inhibit-startup - (if org-startup-align-all-tables - (org-table-map-tables 'org-table-align)) + (when org-startup-align-all-tables + (let ((bmp (buffer-modified-p))) + (org-table-map-tables 'org-table-align) + (set-buffer-modified-p bmp))) (if org-startup-with-deadline-check (call-interactively 'org-check-deadlines) (cond @@ -3722,9 +3742,7 @@ (replace-match up-head nil t) ;; Fixup tag positioning (and org-auto-align-tags (org-set-tags nil t)) - (if org-adapt-indentation - (org-fixup-indentation (if (> diff 1) "^ " "^ ") "" - (if (> diff 1) "^ ? ?\\S-" "^ ?\\S-"))))) + (if org-adapt-indentation (org-fixup-indentation (- diff))))) (defun org-demote () "Demote the current heading lower down the tree. @@ -3737,8 +3755,7 @@ (replace-match down-head nil t) ;; Fixup tag positioning (and org-auto-align-tags (org-set-tags nil t)) - (if org-adapt-indentation - (org-fixup-indentation "^ " (if (> diff 1) " " " ") "^\\S-")))) + (if org-adapt-indentation (org-fixup-indentation diff)))) (defun org-map-tree (fun) "Call FUN for every heading underneath the current one." @@ -3767,20 +3784,23 @@ (not (eobp))) (funcall fun))))) -;; FIXME: this does not work well with Tabulators. This has to be re-written entirely. -(defun org-fixup-indentation (from to prohibit) - "Change the indentation in the current entry by re-replacing FROM with TO. -However, if the regexp PROHIBIT matches at all, don't do anything. -This is being used to change indentation along with the length of the -heading marker. But if there are any lines which are not indented, nothing -is changed at all." +(defun org-fixup-indentation (diff) + "Change the indentation in the current entry by DIFF +However, if any line in the current entry has no indentation, or if it +would end up with no indentation after the change, nothing at all is done." (save-excursion (let ((end (save-excursion (outline-next-heading) - (point-marker)))) + (point-marker))) + (prohibit (if (> diff 0) + "^\\S-" + (concat "^ \\{0," (int-to-string (- diff)) "\\}\\S-"))) + col) (unless (save-excursion (re-search-forward prohibit end t)) - (while (re-search-forward from end t) - (replace-match to) - (beginning-of-line 2))) + (while (re-search-forward "^[ \t]+" end t) + (goto-char (match-end 0)) + (setq col (current-column)) + (if (< diff 0) (replace-match "")) + (indent-to (+ diff col)))) (move-marker end nil)))) ;;; Vertical tree motion, cutting and pasting of subtrees @@ -3984,6 +4004,14 @@ (throw 'exit nil))) t)))) +(defun org-narrow-to-subtree () + "Narrow buffer to the current subtree." + (interactive) + (save-excursion + (narrow-to-region + (progn (org-back-to-heading) (point)) + (progn (org-end-of-subtree t) (point))))) + ;;; Plain list items (defun org-at-item-p () @@ -4292,103 +4320,259 @@ ;;; Archiving -(defun org-archive-subtree () +(defun org-archive-subtree (&optional find-done) "Move the current subtree to the archive. The archive can be a certain top-level heading in the current file, or in a different file. The tree will be moved to that location, the subtree -heading be marked DONE, and the current time will be added." - (interactive) - ;; Save all relevant TODO keyword-relatex variables - (let ((tr-org-todo-line-regexp org-todo-line-regexp) ; keep despite compiler - (tr-org-todo-keywords org-todo-keywords) - (tr-org-todo-interpretation org-todo-interpretation) - (tr-org-done-string org-done-string) - (tr-org-todo-regexp org-todo-regexp) - (tr-org-todo-line-regexp org-todo-line-regexp) - (this-buffer (current-buffer)) - file heading buffer level newfile-p) - (if (string-match "\\(.*\\)::\\(.*\\)" org-archive-location) +heading be marked DONE, and the current time will be added. + +When called with prefix argument FIND-DONE, find whole trees without any +open TODO items and archive them (after getting confirmation from the user). +If the cursor is not at a headline when this comand is called, try all level +1 trees. If the cursor is on a headline, only try the direct children of +this heading. " + (interactive "P") + (if find-done + (org-archive-all-done) + ;; Save all relevant TODO keyword-relatex variables + + (let ((tr-org-todo-line-regexp org-todo-line-regexp) ; keep despite compiler + (tr-org-todo-keywords org-todo-keywords) + (tr-org-todo-interpretation org-todo-interpretation) + (tr-org-done-string org-done-string) + (tr-org-todo-regexp org-todo-regexp) + (tr-org-todo-line-regexp org-todo-line-regexp) + (this-buffer (current-buffer)) + file heading buffer level newfile-p) + (if (string-match "\\(.*\\)::\\(.*\\)" org-archive-location) + (progn + (setq file (format (match-string 1 org-archive-location) + (file-name-nondirectory buffer-file-name)) + heading (match-string 2 org-archive-location))) + (error "Invalid `org-archive-location'")) + (if (> (length file) 0) + (setq newfile-p (not (file-exists-p file)) + buffer (find-file-noselect file)) + (setq buffer (current-buffer))) + (unless buffer + (error "Cannot access file \"%s\"" file)) + (if (and (> (length heading) 0) + (string-match "^\\*+" heading)) + (setq level (match-end 0)) + (setq heading nil level 0)) + (save-excursion + ;; We first only copy, in case something goes wrong + ;; we need to protect this-command, to avoid kill-region sets it, + ;; which would lead to duplication of subtrees + (let (this-command) (org-copy-subtree)) + (set-buffer buffer) + ;; Enforce org-mode for the archive buffer + (if (not (eq major-mode 'org-mode)) + ;; Force the mode for future visits. + (let ((org-insert-mode-line-in-empty-file t)) + (call-interactively 'org-mode))) + (when newfile-p + (goto-char (point-max)) + (insert (format "\nArchived entries from file %s\n\n" + (buffer-file-name this-buffer)))) + ;; Force the TODO keywords of the original buffer + (let ((org-todo-line-regexp tr-org-todo-line-regexp) + (org-todo-keywords tr-org-todo-keywords) + (org-todo-interpretation tr-org-todo-interpretation) + (org-done-string tr-org-done-string) + (org-todo-regexp tr-org-todo-regexp) + (org-todo-line-regexp tr-org-todo-line-regexp)) + (goto-char (point-min)) + (if heading + (progn + (if (re-search-forward + (concat "\\(^\\|\r\\)" + (regexp-quote heading) "[ \t]*\\($\\|\r\\)") + nil t) + (goto-char (match-end 0)) + ;; Heading not found, just insert it at the end + (goto-char (point-max)) + (or (bolp) (insert "\n")) + (insert "\n" heading "\n") + (end-of-line 0)) + ;; Make the subtree visible + (show-subtree) + (org-end-of-subtree t) + (skip-chars-backward " \t\r\n]") + (and (looking-at "[ \t\r\n]*") + (replace-match "\n\n"))) + ;; No specific heading, just go to end of file. + (goto-char (point-max)) (insert "\n")) + ;; Paste + (org-paste-subtree (1+ level)) + ;; Mark the entry as done, i.e. set to last work in org-todo-keywords + (if org-archive-mark-done + (org-todo (length org-todo-keywords))) + ;; Move cursor to right after the TODO keyword + (when org-archive-stamp-time + (beginning-of-line 1) + (looking-at org-todo-line-regexp) + (goto-char (or (match-end 2) (match-beginning 3))) + (insert "(" (format-time-string (cdr org-time-stamp-formats) + (org-current-time)) + ")")) + ;; Save the buffer, if it is not the same buffer. + (if (not (eq this-buffer buffer)) (save-buffer)))) + ;; Here we are back in the original buffer. Everything seems to have + ;; worked. So now cut the tree and finish up. + (let (this-command) (org-cut-subtree)) + (if (and (not (eobp)) (looking-at "[ \t]*$")) (kill-line)) + (message "Subtree archived %s" + (if (eq this-buffer buffer) + (concat "under heading: " heading) + (concat "in file: " (abbreviate-file-name file))))))) + +(defun org-archive-all-done () + "Archive sublevels of the current tree without open TODO items. +If the cursor is not on a headline, try all level 1 trees. If +it is on a headline, try all direct children." + (let ((re (concat "^\\*+ +" org-not-done-regexp)) re1 + (begm (make-marker)) + (endm (make-marker)) + beg end (cntarch 0)) + (if (org-on-heading-p) (progn - (setq file (format (match-string 1 org-archive-location) - (file-name-nondirectory buffer-file-name)) - heading (match-string 2 org-archive-location))) - (error "Invalid `org-archive-location'")) - (if (> (length file) 0) - (setq newfile-p (not (file-exists-p file)) - buffer (find-file-noselect file)) - (setq buffer (current-buffer))) - (unless buffer - (error "Cannot access file \"%s\"" file)) - (if (and (> (length heading) 0) - (string-match "^\\*+" heading)) - (setq level (match-end 0)) - (setq heading nil level 0)) + (setq re1 (concat "^" (regexp-quote + (make-string + (1+ (- (match-end 0) (match-beginning 0))) + ?*)) + " ")) + (move-marker begm (point)) + (move-marker endm (org-end-of-subtree))) + (setq re1 "^* ") + (move-marker begm (point-min)) + (move-marker endm (point-max))) (save-excursion - ;; We first only copy, in case something goes wrong - ;; we need to protect this-command, to avoid kill-region sets it, - ;; which would lead to duplication of subtrees - (let (this-command) (org-copy-subtree)) - (set-buffer buffer) - ;; Enforce org-mode for the archive buffer - (if (not (eq major-mode 'org-mode)) - ;; Force the mode for future visits. - (let ((org-insert-mode-line-in-empty-file t)) - (call-interactively 'org-mode))) - (when newfile-p - (goto-char (point-max)) - (insert (format "\nArchived entries from file %s\n\n" - (buffer-file-name this-buffer)))) - ;; Force the TODO keywords of the original buffer - (let ((org-todo-line-regexp tr-org-todo-line-regexp) - (org-todo-keywords tr-org-todo-keywords) - (org-todo-interpretation tr-org-todo-interpretation) - (org-done-string tr-org-done-string) - (org-todo-regexp tr-org-todo-regexp) - (org-todo-line-regexp tr-org-todo-line-regexp)) - (goto-char (point-min)) - (if heading - (progn - (if (re-search-forward - (concat "\\(^\\|\r\\)" - (regexp-quote heading) "[ \t]*\\($\\|\r\\)") - nil t) - (goto-char (match-end 0)) - ;; Heading not found, just insert it at the end - (goto-char (point-max)) - (or (bolp) (insert "\n")) - (insert "\n" heading "\n") - (end-of-line 0)) - ;; Make the subtree visible - (show-subtree) - (org-end-of-subtree t) - (skip-chars-backward " \t\r\n]") - (and (looking-at "[ \t\r\n]*") - (replace-match "\n\n"))) - ;; No specific heading, just go to end of file. - (goto-char (point-max)) (insert "\n")) - ;; Paste - (org-paste-subtree (1+ level)) - ;; Mark the entry as done, i.e. set to last work in org-todo-keywords - (if org-archive-mark-done - (org-todo (length org-todo-keywords))) - ;; Move cursor to right after the TODO keyword - (when org-archive-stamp-time - (beginning-of-line 1) - (looking-at org-todo-line-regexp) - (goto-char (or (match-end 2) (match-beginning 3))) - (insert "(" (format-time-string (cdr org-time-stamp-formats) - (org-current-time)) - ")")) - ;; Save the buffer, if it is not the same buffer. - (if (not (eq this-buffer buffer)) (save-buffer)))) - ;; Here we are back in the original buffer. Everything seems to have - ;; worked. So now cut the tree and finish up. - (let (this-command) (org-cut-subtree)) - (if (and (not (eobp)) (looking-at "[ \t]*$")) (kill-line)) - (message "Subtree archived %s" - (if (eq this-buffer buffer) - (concat "under heading: " heading) - (concat "in file: " (abbreviate-file-name file)))))) + (goto-char begm) + (while (re-search-forward re1 endm t) + beg (match-beginning 0) + end (save-excursion (org-end-of-subtree t) (point))) + (goto-char beg) + (if (re-search-forward re end t) + (goto-char end) + (goto-char beg) + (if (y-or-n-p "Archive this subtree (no open TODO items)? ") + (progn + (org-archive-subtree) + (setq cntarch (1+ cntarch))) + (goto-char end)))) + (message "%d trees archived" cntarch))) + +;;; Dynamic blocks + +(defun org-find-dblock (name) + "Find the first dynamic block with name NAME in the buffer. +If not found, stay at current position and return nil." + (let (pos) + (save-excursion + (goto-char (point-min)) + (setq pos (and (re-search-forward (concat "^#\\+BEGIN:[ \t]+" name "\\>") + nil t) + (match-beginning 0)))) + (if pos (goto-char pos)) + pos)) + +(defconst org-dblock-start-re + "^#\\+BEGIN:[ \t]+\\(\\S-+\\)[ \t]+\\(.*\\)" + "Matches the startline of a dynamic block, with parameters.") + +(defconst org-dblock-end-re "^#\\+END\\([: \t\r\n]\\|$\\)" + "Matches the end of a dyhamic block.") + +(defun org-create-dblock (plist) + "Create a dynamic block section, with parameters taken from PLIST. +PLIST must containe a :name entry which is used as name of the block." + (unless (bolp) (newline)) + (let ((name (plist-get plist :name))) + (insert "#+BEGIN: " name) + (while plist + (if (eq (car plist) :name) + (setq plist (cddr plist)) + (insert " " (prin1-to-string (pop plist))))) + (insert "\n\n#+END:\n") + (beginning-of-line -2))) + +(defun org-prepare-dblock () + "Prepare dynamic block for refresh. +This empties the block, puts the cursor at the insert position and returns +the property list including an extra property :name with the block name." + (unless (looking-at org-dblock-start-re) + (error "Not at a dynamic block")) + (let* ((beg (match-beginning 0)) + (begdel (1+ (match-end 0))) + (name (match-string 1)) + (params (append (list :name name) + (read (concat "(" (match-string 2) ")"))))) + (unless (re-search-forward org-dblock-end-re nil t) + (error "Dynamic block not terminated")) + (delete-region begdel (match-beginning 0)) + (goto-char begdel) + (open-line 1) + params)) + +(defun org-map-dblocks (&optional command) + "Apply COMMAND to all dynamic blocks in the current buffer. +If COMMAND is not given, use `org-update-dblock'." + (let ((cmd (or command 'org-update-dblock)) + pos) + (save-excursion + (goto-char (point-min)) + (while (re-search-forward org-dblock-start-re nil t) + (goto-char (setq pos (match-beginning 0))) + (condition-case nil + (funcall cmd) + (error (message "Error during update of dynamic block"))) + (goto-char pos) + (unless (re-search-forward org-dblock-end-re nil t) + (error "Dynamic block not terminated")))))) + +(defun org-dblock-update (&optional arg) + "User command for updating dynamic blocks. +Update the dynamic block at point. With prefix ARG, update all dynamic +blocks in the buffer." + (interactive "P") + (if arg + (org-update-all-dblocks) + (or (looking-at org-dblock-start-re) + (org-beginning-of-dblock)) + (org-update-dblock))) + +(defun org-update-dblock () + "Update the dynamic block at point +This means to empty the block, parse for parameters and then call +the correct writing function." + (let* ((pos (point)) + (params (org-prepare-dblock)) + (name (plist-get params :name)) + (cmd (intern (concat "org-dblock-write:" name)))) + (funcall cmd params) + (goto-char pos))) + +(defun org-beginning-of-dblock () + "Find the beginning of the dynamic block at point. +Error if there is no scuh block at point." + (let ((pos (point)) + beg end) + (end-of-line 1) + (if (and (re-search-backward org-dblock-start-re nil t) + (setq beg (match-beginning 0)) + (re-search-forward org-dblock-end-re nil t) + (> (match-end 0) pos)) + (goto-char beg) + (goto-char pos) + (error "Not in a dynamic block")))) + +(defun org-update-all-dblocks () + "Update all dynamic blocks in the buffer. +This function can be used in a hook." + (when (eq major-mode 'org-mode) + (org-map-dblocks 'org-update-dblock))) + ;;; Completion @@ -4783,16 +4967,18 @@ (org-overlay-put ov 'face 'secondary-selection) (push ov org-occur-highlights))) +(defvar org-inhibit-highlight-removal nil) (defun org-remove-occur-highlights (&optional beg end noremove) "Remove the occur highlights from the buffer. BEG and END are ignored. If NOREMOVE is nil, remove this function from the `before-change-functions' in the current buffer." (interactive) - (mapc 'org-delete-overlay org-occur-highlights) - (setq org-occur-highlights nil) - (unless noremove - (remove-hook 'before-change-functions - 'org-remove-occur-highlights 'local))) + (unless org-inhibit-highlight-removal + (mapc 'org-delete-overlay org-occur-highlights) + (setq org-occur-highlights nil) + (unless noremove + (remove-hook 'before-change-functions + 'org-remove-occur-highlights 'local)))) ;;; Priorities @@ -5449,8 +5635,8 @@ "Sum the times for each subtree. Puts the resulting times in minutes as a text property on each headline." (interactive) - (remove-text-properties (point-min) (point-max) '(:org-clock-minutes t)) - (let* ((re (concat "^\\(\\*+\\)[ \t]\\|^[ \t]*" + (let* ((bmp (buffer-modified-p)) + (re (concat "^\\(\\*+\\)[ \t]\\|^[ \t]*" org-clock-string ".*=>[ \t]*\\([0-9]+\\):\\([0-9]+\\)[ \t]*$")) (lmax 30) @@ -5458,6 +5644,7 @@ (t1 0) (level 0) (lastlevel 0) time) + (remove-text-properties (point-min) (point-max) '(:org-clock-minutes t)) (save-excursion (goto-char (point-max)) (while (re-search-backward re nil t) @@ -5475,7 +5662,8 @@ (aset ltimes l 0)) (goto-char (match-beginning 0)) (put-text-property (point) (point-at-eol) :org-clock-minutes time)))) - (setq org-clock-file-total-minutes (aref ltimes 0))))) + (setq org-clock-file-total-minutes (aref ltimes 0))) + (set-buffer-modified-p bmp))) (defun org-clock-display (&optional total-only) "Show subtree times in the entire buffer. @@ -5510,11 +5698,11 @@ (off 0) ov tx) (move-to-column c) - (if (eolp) (setq off 1)) (unless (eolp) (skip-chars-backward "^ \t")) (skip-chars-backward " \t") - (setq ov (org-make-overlay (- (point) off) (point-at-eol)) - tx (concat (make-string (+ off (max 0 (- c (current-column)))) ?.) + (setq ov (org-make-overlay (1- (point)) (point-at-eol)) + tx (concat (buffer-substring (1- (point)) (point)) + (make-string (+ off (max 0 (- c (current-column)))) ?.) (org-add-props (format "%s %2d:%02d%s" (make-string l ?*) h m (make-string (- 10 l) ?\ )) @@ -5528,11 +5716,12 @@ BEG and END are ignored. If NOREMOVE is nil, remove this function from the `before-change-functions' in the current buffer." (interactive) - (mapc 'org-delete-overlay org-clock-overlays) - (setq org-clock-overlays nil) - (unless noremove - (remove-hook 'before-change-functions - 'org-remove-clock-overlays 'local))) + (unless org-inhibit-highlight-removal + (mapc 'org-delete-overlay org-clock-overlays) + (setq org-clock-overlays nil) + (unless noremove + (remove-hook 'before-change-functions + 'org-remove-clock-overlays 'local)))) (defun org-clock-out-if-current () "Clock out if the current entry contains the running clock. @@ -5557,6 +5746,113 @@ (when (y-or-n-p "Save changed buffer?") (save-buffer)))) +(defun org-clock-report () + "Create a table containing a report about clocked time. +If the buffer contains lines +#+BEGIN: clocktable :maxlevel 3 :emphasize nil + +#+END: clocktable +then the table will be inserted between these lines, replacing whatever +is was there before. If these lines are not in the buffer, the table +is inserted at point, surrounded by the special lines. +The BEGIN line can contain parameters. Allowed are: +:maxlevel The maximum level to be included in the table. Default is 3. +:emphasize t/nil, if levell 1 and level 2 should be bold/italic in the table." + (interactive) + (org-remove-clock-overlays) + (unless (org-find-dblock "clocktable") + (org-create-dblock (list :name "clocktable" + :maxlevel 2 :emphasize nil))) + (org-update-dblock)) + +(defun org-dblock-write:clocktable (params) + "Write the standard clocktable." + (let ((hlchars '((1 . "*") (2 . ?/))) + (emph nil) + (pos (point)) ipos + (ins (make-marker)) + time h m p level hlc hdl maxlevel) + (setq maxlevel (or (plist-get params :maxlevel) 3) + emph (plist-get params :emphasize)) + (move-marker ins (point)) + (setq ipos (point)) + (insert-before-markers "Clock summary at [" + (substring + (format-time-string (cdr org-time-stamp-formats)) + 1 -1) + "]\n|L|Headline|Time|\n") + (org-clock-sum) + (setq h (/ org-clock-file-total-minutes 60) + m (- org-clock-file-total-minutes (* 60 h))) + (insert-before-markers "|-\n|0|" "*Total file time*| " + (format "*%d:%02d*" h m) + "|\n") + (goto-char (point-min)) + (while (setq p (next-single-property-change (point) :org-clock-minutes)) + (goto-char p) + (when (setq time (get-text-property p :org-clock-minutes)) + (beginning-of-line 1) + (when (and (looking-at "\\(\\*+\\)[ \t]+\\(.*?\\)\\([ \t]+:[0-9a-zA-Z_@:]+:\\)?[ \t]*$") + (setq level (- (match-end 1) (match-beginning 1))) + (<= level maxlevel)) + (setq hlc (if emph (or (cdr (assoc level hlchars)) "") "") + hdl (match-string 2) + h (/ time 60) + m (- time (* 60 h))) + (save-excursion + (goto-char ins) + (if (= level 1) (insert-before-markers "|-\n")) + (insert-before-markers + "| " (int-to-string level) "|" hlc hdl hlc " |" + (make-string (1- level) ?|) + hlc + (format "%d:%02d" h m) + hlc + " |\n"))))) + (goto-char ins) + (backward-delete-char 1) + (goto-char ipos) + (skip-chars-forward "^|") + (org-table-align))) + +(defun org-collect-clock-time-entries () + "Return an internal list with clocking information. +This list has one entry for each CLOCK interval. +FIXME: describe the elements." + (interactive) + (let ((re (concat "^[ \t]*" org-clock-string + " *\\[\\(.*?\\)\\]--\\[\\(.*?\\)\\]")) + rtn beg end next cont level title total closedp leafp + clockpos titlepos h m donep) + (save-excursion + (org-clock-sum) + (goto-char (point-min)) + (while (re-search-forward re nil t) + (setq clockpos (match-beginning 0) + beg (match-string 1) end (match-string 2) + cont (match-end 0)) + (setq beg (apply 'encode-time (org-parse-time-string beg)) + end (apply 'encode-time (org-parse-time-string end))) + (org-back-to-heading t) + (setq donep (org-entry-is-done-p)) + (setq titlepos (point) + total (or (get-text-property (1+ (point)) :org-clock-minutes) 0) + h (/ total 60) m (- total (* 60 h)) + total (cons h m)) + (looking-at "\\(\\*+\\) +\\(.*\\)") + (setq level (- (match-end 1) (match-beginning 1)) + title (org-match-string-no-properties 2)) + (save-excursion (outline-next-heading) (setq next (point))) + (setq closedp (re-search-forward org-closed-time-regexp next t)) + (goto-char next) + (setq leafp (and (looking-at "^\\*+ ") + (<= (- (match-end 0) (point)) level))) + (push (list beg end clockpos closedp donep + total title titlepos level leafp) + rtn) + (goto-char cont))) + (nreverse rtn))) + ;;; Agenda, and Diary Integration ;;; Define the mode @@ -9186,8 +9482,8 @@ (setq cpltxt (url-view-url t) link (org-make-link cpltxt))) ((eq major-mode 'w3m-mode) - (setq cpltxt w3m-current-url - link (org-make-link cpltxt))) + (setq cpltxt (or w3m-current-title w3m-current-url) + link (org-make-link w3m-current-url))) ((setq search (run-hook-with-args-until-success 'org-create-file-search-functions)) @@ -9195,6 +9491,11 @@ "::" search)) (setq cpltxt (or description link))) + ((eq major-mode 'image-mode) + (setq cpltxt (concat "file:" + (abbreviate-file-name buffer-file-name)) + link (org-make-link cpltxt))) + ((eq major-mode 'org-mode) ;; Just link to current headline (setq cpltxt (concat "file:" @@ -9414,7 +9715,9 @@ completed in the minibuffer (i.e. normally ~/path/to/file). With two \\[universal-argument] prefixes, enforce an absolute path even if the file -is in the current directory or below." +is in the current directory or below. +With three \\[universal-argument] prefixes, negate the meaning of +`org-keep-stored-link-after-insertion'." (interactive "P") (let (link desc entry remove file (pos (point))) (cond @@ -9430,7 +9733,7 @@ (setq link (read-string "Link: " (org-link-unescape (org-match-string-no-properties 1))))) - (complete-file + ((equal complete-file '(4)) ;; Completing read for file names. (setq file (read-file-name "File: ")) (let ((pwd (file-name-as-directory (expand-file-name "."))) @@ -9455,7 +9758,8 @@ org-insert-link-history (or (car (car org-stored-links))))) (setq entry (assoc link org-stored-links)) - (if (not org-keep-stored-link-after-insertion) + (if (funcall (if (equal complete-file '(64)) 'not 'identity) + (not org-keep-stored-link-after-insertion)) (setq org-stored-links (delq (assoc link org-stored-links) org-stored-links))) (setq link (if entry (nth 1 entry) link) @@ -12199,7 +12503,8 @@ \[X] publish... (project will be prompted for) \[A] publish all projects") (cmds - '((?v . org-export-visible) + '((?t . org-insert-export-options-template) + (?v . org-export-visible) (?a . org-export-as-ascii) (?h . org-export-as-html) (?b . org-export-as-html-and-open) @@ -12566,7 +12871,7 @@ (match-string 1) "[[" (match-string 2) ":" (match-string 3) "]]") t t)) ;; Find multiline emphasis and put them into single line - (when (assq :emph-multiline parameters) + (when (memq :emph-multiline parameters) (goto-char (point-min)) (while (re-search-forward org-emph-re nil t) (subst-char-in-region (match-beginning 0) (match-end 0) ?\n ?\ t) @@ -12858,13 +13163,18 @@ (interactive (list (progn (message "Export visible: [a]SCII [h]tml [b]rowse HTML [x]OXO [ ]keep buffer") - (char-to-string (read-char-exclusive))) + (read-char-exclusive)) current-prefix-arg)) - (if (not (member type '("a" "\C-a" "b" "\C-b" "h" "x" " "))) + (if (not (member type '(?a ?\C-a ?b ?\C-b ?h ?x ?\ ))) (error "Invalid export key")) - ;; FIXME: do this more explicit? - (let* ((binding (key-binding (concat "\C-c\C-x" type))) - (keepp (equal type " ")) + (let* ((binding (cdr (assoc type + '((?a . org-export-as-ascii) + (?\C-a . org-export-as-ascii) + (?b . org-export-as-html-and-open) + (?\C-b . org-export-as-html-and-open) + (?h . org-export-as-html) + (?x . org-export-as-xoxo))))) + (keepp (equal type ?\ )) (file buffer-file-name) (buffer (get-buffer-create "*Org Export Visible*")) s e) @@ -13049,6 +13359,8 @@ (org-infile-export-plist))) (style (plist-get opt-plist :style)) + (link-validate (plist-get opt-plist :link-validation-function)) + valid (odd org-odd-levels-only) (region-p (org-region-active-p)) (region @@ -13068,6 +13380,7 @@ (file-name-sans-extension (file-name-nondirectory buffer-file-name)) ".html")) + (current-dir (file-name-directory buffer-file-name)) (buffer (find-file-noselect filename)) (levels-open (make-vector org-level-max nil)) (date (format-time-string "%Y/%m/%d" (current-time))) @@ -13314,6 +13627,10 @@ (if (string-match "::\\(.*\\)" filename) (setq search (match-string 1 filename) filename (replace-match "" t nil filename))) + (setq valid + (if (functionp link-validate) + (funcall link-validate filename current-dir) + t)) (setq file-is-image-p (string-match (org-image-file-name-regexp) filename)) (setq thefile (if abs-p (expand-file-name filename) filename)) @@ -13339,7 +13656,8 @@ (and org-export-html-inline-images (not descp)))) (concat "<img src=\"" thefile "\"/>") - (concat "<a href=\"" thefile "\">" desc "</a>"))))) + (concat "<a href=\"" thefile "\">" desc "</a>"))) + (if (not valid) (setq rpl desc)))) ((member type '("bbdb" "vm" "wl" "mhe" "rmail" "gnus" "shell" "info" "elisp")) (setq rpl (concat "<i><" type ":" (save-match-data (org-link-unescape path)) @@ -13650,27 +13968,31 @@ (defun org-html-handle-time-stamps (s) "Format time stamps in string S, or remove them." - (let (r b) - (while (string-match org-maybe-keyword-time-regexp s) - (or b (setq b (substring s 0 (match-beginning 0)))) - (if (not org-export-with-timestamps) - (setq r (concat r (substring s 0 (match-beginning 0))) - s (substring s (match-end 0))) - (setq r (concat - r (substring s 0 (match-beginning 0)) - (if (match-end 1) - (format "@<span class=\"timestamp-kwd\">%s @</span>" - (match-string 1 s))) - (format " @<span class=\"timestamp\">%s@</span>" - (substring (match-string 3 s) 1 -1))) - s (substring s (match-end 0))))) - ;; Line break of line started and ended with time stamp stuff - (if (not r) - s - (setq r (concat r s)) - (unless (string-match "\\S-" (concat b s)) - (setq r (concat r "@<br/>"))) - r))) + (catch 'exit + (let (r b) + (while (string-match org-maybe-keyword-time-regexp s) + ;; FIXME: is it good to never export CLOCK, or do we need control? + (if (and (match-end 1) (equal (match-string 1 s) org-clock-string)) + (throw 'exit "")) + (or b (setq b (substring s 0 (match-beginning 0)))) + (if (not org-export-with-timestamps) + (setq r (concat r (substring s 0 (match-beginning 0))) + s (substring s (match-end 0))) + (setq r (concat + r (substring s 0 (match-beginning 0)) + (if (match-end 1) + (format "@<span class=\"timestamp-kwd\">%s @</span>" + (match-string 1 s))) + (format " @<span class=\"timestamp\">%s@</span>" + (substring (match-string 3 s) 1 -1))) + s (substring s (match-end 0))))) + ;; Line break if line started and ended with time stamp stuff + (if (not r) + s + (setq r (concat r s)) + (unless (string-match "\\S-" (concat b s)) + (setq r (concat r "@<br/>"))) + r)))) (defun org-html-protect (s) ;; convert & to &, < to < and > to > @@ -14212,6 +14534,7 @@ ;; All the other keys (define-key org-mode-map "\C-c\C-a" 'show-all) ; in case allout messed up. +(define-key org-mode-map "\C-xns" 'org-narrow-to-subtree) (define-key org-mode-map "\C-c$" 'org-archive-subtree) (define-key org-mode-map "\C-c\C-j" 'org-goto) (define-key org-mode-map "\C-c\C-t" 'org-todo) @@ -14255,24 +14578,7 @@ (define-key org-mode-map "\C-c~" 'org-table-create-with-table.el) (define-key org-mode-map "\C-c\C-q" 'org-table-wrap-region) (define-key org-mode-map "\C-c\C-e" 'org-export) -;(define-key org-mode-map "\C-c\C-xa" 'org-export-as-ascii) -;(define-key org-mode-map "\C-c\C-x\C-a" 'org-export-as-ascii) -;(define-key org-mode-map "\C-c\C-xv" 'org-export-visible) -;(define-key org-mode-map "\C-c\C-x\C-v" 'org-export-visible) -;; OPML support is only an option for the future -;(define-key org-mode-map "\C-c\C-xo" 'org-export-as-opml) -;(define-key org-mode-map "\C-c\C-x\C-o" 'org-export-as-opml) -;(define-key org-mode-map "\C-c\C-xi" 'org-export-icalendar-this-file) -;(define-key org-mode-map "\C-c\C-x\C-i" 'org-export-icalendar-all-agenda-files) -;(define-key org-mode-map "\C-c\C-xc" 'org-export-icalendar-combine-agenda-files) -;(define-key org-mode-map "\C-c\C-x\C-c" 'org-export-icalendar-combine-agenda-files) -;(define-key org-mode-map "\C-c\C-xt" 'org-insert-export-options-template) (define-key org-mode-map "\C-c:" 'org-toggle-fixed-width-section) -;(define-key org-mode-map "\C-c\C-xh" 'org-export-as-html) -;(define-key org-mode-map "\C-c\C-xx" 'org-export-as-xoxo) -;(define-key org-mode-map "\C-c\C-x\C-x" 'org-export-as-xoxo) -;(define-key org-mode-map "\C-c\C-xb" 'org-export-as-html-and-open) -;(define-key org-mode-map "\C-c\C-x\C-b" 'org-export-as-html-and-open) (define-key org-mode-map "\C-c\C-x\C-k" 'org-cut-special) (define-key org-mode-map "\C-c\C-x\C-w" 'org-cut-special) @@ -14283,15 +14589,9 @@ (define-key org-mode-map "\C-c\C-x\C-o" 'org-clock-out) (define-key org-mode-map "\C-c\C-x\C-x" 'org-clock-cancel) (define-key org-mode-map "\C-c\C-x\C-d" 'org-clock-display) - -;(define-key org-mode-map "\C-c\C-ef" 'org-publish-current-file) -;(define-key org-mode-map "\C-c\C-ep" 'org-publish-current-project) -;(define-key org-mode-map "\C-c\C-ec" 'org-publish) -;(define-key org-mode-map "\C-c\C-ea" 'org-publish-all) -;(define-key org-mode-map "\C-c\C-e\C-f" 'org-publish-current-file) -;(define-key org-mode-map "\C-c\C-e\C-p" 'org-publish-current-project) -;(define-key org-mode-map "\C-c\C-e\C-c" 'org-publish) -;(define-key org-mode-map "\C-c\C-e\C-a" 'org-publish-all) +(define-key org-mode-map "\C-c\C-x\C-r" 'org-clock-report) + +(define-key org-mode-map "\C-c\C-x\C-u" 'org-dblock-update) (when (featurep 'xemacs) (define-key org-mode-map 'button3 'popup-mode-menu)) @@ -14785,6 +15085,7 @@ ["Clock out" org-clock-out t] ["Clock cancel" org-clock-cancel t] ["Display times" org-clock-display t] + ["Create clock table" org-clock-report t] "--" ["Record DONE time" (progn (setq org-log-done (not org-log-done)) @@ -15284,7 +15585,8 @@ (forward-char -1) (if (memq (preceding-char) '(?\n ?\^M)) ;; leave blank line before heading - (forward-char -1)))))) + (forward-char -1))))) + (point)) (defun org-show-subtree () "Show everything after this heading at deeper levels." @@ -15334,8 +15636,12 @@ (org-invisible-p))) (org-show-hierarchy-above))) + +;;; Experimental code + + ;;; Finish up - + (provide 'org) (run-hooks 'org-load-hook)
--- a/lisp/textmodes/tex-mode.el Tue Jun 20 01:17:33 2006 +0000 +++ b/lisp/textmodes/tex-mode.el Tue Jun 20 07:35:06 2006 +0000 @@ -597,7 +597,7 @@ (defun tex-font-lock-match-suscript (limit) "Match subscript and superscript patterns up to LIMIT." (when (re-search-forward "[_^] *\\([^\n\\{}]\\|\ -\\\\\\([a-zA-Z@]+\\|[^ \t\n]\\)\\|{[^\\{]*}\\|\\({\\)\\)" limit t) +\\\\\\([a-zA-Z@]+\\|[^ \t\n]\\)\\|\\({\\)\\)" limit t) (when (match-end 3) (let ((beg (match-beginning 3)) (end (save-restriction
--- a/lispref/ChangeLog Tue Jun 20 01:17:33 2006 +0000 +++ b/lispref/ChangeLog Tue Jun 20 07:35:06 2006 +0000 @@ -1,3 +1,7 @@ +2006-06-19 Richard Stallman <rms@gnu.org> + + * processes.texi (Bindat Spec): Clarify previous change. + 2006-06-16 Richard Stallman <rms@gnu.org> * tips.texi (Coding Conventions): Better explain conventions
--- a/lispref/processes.texi Tue Jun 20 01:17:33 2006 +0000 +++ b/lispref/processes.texi Tue Jun 20 07:35:06 2006 +0000 @@ -2230,13 +2230,12 @@ @var{tag} matches unconditionally if it is @code{t}. @end itemize -@item repeat @var{count} @var{field-spec}@dots{} -Process the set of @var{field-spec}s recursively, in order, and loop -starting from the first one, for @var{count} times overall (looping -@code{@var{count} @minus{} 1} times). -@var{count} may be an integer, or a list of one element naming a -previous field. For correct operation, each @var{field-spec} must -include a name. +@item repeat @var{count} @var{field-specs}@dots{} +Process the @var{field-specs} recursively, in order, then repeat +starting from the first one, processing all the specs @var{count} +times overall. @var{count} may be an integer, or a list of one +element that names a previous field. For correct operation, each spec +in @var{field-specs} must include a name. @end table @node Bindat Functions
--- a/man/ChangeLog Tue Jun 20 01:17:33 2006 +0000 +++ b/man/ChangeLog Tue Jun 20 07:35:06 2006 +0000 @@ -1,3 +1,18 @@ +2006-06-19 Katsumi Yamaoka <yamaoka@jpl.org> + + * message.texi (News Headers): Update message-syntax-checks section. + +2006-06-19 Karl Berry <karl@gnu.org> + + * info.texi (Advanced): mention C-q, especially with ?. + +2006-06-19 Carsten Dominik <dominik@science.uva.nl> + + * org.texi (Publishing links): Document the `:link-validation-function' + property. + (Extensions and Hacking): New chapter, includes some sections of the + "Miscellaneous" chapter. + 2006-06-16 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> * macos.texi (Mac Input): Add description of mac-function-modifier. @@ -11,6 +26,11 @@ * mule.texi (Recognize Coding): Clarify previous change. +2006-06-09 Kenichi Handa <handa@m17n.org> + + * mule.texi (Recognize Coding): Describe the convention of "CODING!" + notation. + 2006-06-07 Kevin Ryde <user42@zip.com.au> * mule.texi (Coding Systems): Footnote xref "MS-DOS and MULE" in main
--- a/man/ediff.texi Tue Jun 20 01:17:33 2006 +0000 +++ b/man/ediff.texi Tue Jun 20 07:35:06 2006 +0000 @@ -1614,6 +1614,9 @@ ignoring letter case or not. It can be set in @file{.emacs} using @code{setq-default}. +When case sensitivity is toggled, all difference +regions are recomputed. + @node Highlighting Difference Regions, Narrowing, Selective Browsing, Customization @section Highlighting Difference Regions @@ -2316,6 +2319,14 @@ Using @code{ediff-cleanup-hook}, one can make Ediff delete the variants unconditionally (e.g., by making @code{ediff-janitor} into one of these hooks). + +@item ediff-keep-tmp-versions +@vindex @code{ediff-keep-tmp-versions} +Default is @code{nil}. If @code{t}, the versions of the files being +compared or merged using operations such as @code{ediff-revision} or +@code{ediff-merge-revisions} are not deleted on exit. The normal action is +to clean up and delete these version files. + @item ediff-grab-mouse @vindex @code{ediff-grab-mouse} Default is @code{t}. Normally, Ediff grabs mouse and puts it in its @@ -2457,6 +2468,7 @@ (jaffe@@chipmunk.cita.utoronto.ca), David Karr (dkarr@@nmo.gtegsc.com), Norbert Kiesel (norbert@@i3.informatik.rwth-aachen.de), +Steffen Kilb (skilb@@gmx.net), Leigh L Klotz (klotz@@adoc.xerox.com), Fritz Knabe (Fritz.Knabe@@ecrc.de), Heinz Knutzen (hk@@informatik.uni-kiel.d400.de),
--- a/man/faq.texi Tue Jun 20 01:17:33 2006 +0000 +++ b/man/faq.texi Tue Jun 20 07:35:06 2006 +0000 @@ -3659,7 +3659,7 @@ For information on Emacs for Windows 95 and NT, read the FAQ produced by @email{voelker@@cs.washington.edu, Geoff Voelker} and currently maintained -by @email{ramprasad_i82@@yahoo.com, Ramprasad B}, available at +by @email{ramprasad@@gnu.org, Ramprasad B}, available at @uref{http://www.gnu.org/software/emacs/windows/ntemacs.html}
--- a/man/info.texi Tue Jun 20 01:17:33 2006 +0000 +++ b/man/info.texi Tue Jun 20 07:35:06 2006 +0000 @@ -918,6 +918,15 @@ specific to it, which are documented in several chapters of @ref{Top,, GNU Info, info-stnd, GNU Info}.) +@kindex C-q @r{(Info mode)} + One advanced command useful with most of the others described here +is @kbd{C-q}, which ``quotes'' the next character so that it is +entered literally (@pxref{Inserting Text,,,emacs,The GNU Emacs +Manual}). For example, pressing @kbd{?} ordinarily brings up a list +of completion possibilities. If you want to (for example) search for +an actual @samp{?} character, the simplest way is to insert it using +@kbd{C-q ?}. This works the same in Emacs and stand-alone Info. + @menu * Search Text:: How to search Info documents. * Search Index:: How to search the indices for specific subjects.
--- a/man/message.texi Tue Jun 20 01:17:33 2006 +0000 +++ b/man/message.texi Tue Jun 20 07:35:06 2006 +0000 @@ -1681,56 +1681,73 @@ Valid checks are: @table @code -@item subject-cmsg -Check the subject for commands. -@item sender -@cindex Sender -Insert a new @code{Sender} header if the @code{From} header looks odd. -@item multiple-headers -Check for the existence of multiple equal headers. -@item sendsys -@cindex sendsys -Check for the existence of version and sendsys commands. -@item message-id -Check whether the @code{Message-ID} looks ok. -@item from -Check whether the @code{From} header seems nice. -@item long-lines -@cindex long lines -Check for too long lines. -@item control-chars -Check for invalid characters. -@item size -Check for excessive size. -@item new-text -Check whether there is any new text in the messages. -@item signature -Check the length of the signature. @item approved @cindex approved Check whether the article has an @code{Approved} header, which is something only moderators should include. +@item continuation-headers +Check whether there are continuation header lines that don't begin with +whitespace. +@item control-chars +Check for invalid characters. @item empty Check whether the article is empty. -@item invisible-text -Check whether there is any invisible text in the buffer. -@item empty-headers -Check whether any of the headers are empty. @item existing-newsgroups Check whether the newsgroups mentioned in the @code{Newsgroups} and @code{Followup-To} headers exist. -@item valid-newsgroups -Check whether the @code{Newsgroups} and @code{Followup-to} headers -are valid syntactically. +@item from +Check whether the @code{From} header seems nice. +@item illegible-text +Check whether there is any non-printable character in the body. +@item invisible-text +Check whether there is any invisible text in the buffer. +@item long-header-lines +Check for too long header lines. +@item long-lines +@cindex long lines +Check for too long lines in the body. +@item message-id +Check whether the @code{Message-ID} looks syntactically ok. +@item multiple-headers +Check for the existence of multiple equal headers. +@item new-text +Check whether there is any new text in the messages. +@item newsgroups +Check whether the @code{Newsgroups} header exists and is not empty. +@item quoting-style +Check whether text follows last quoted portion. @item repeated-newsgroups Check whether the @code{Newsgroups} and @code{Followup-to} headers contains repeated group names. +@item reply-to +Check whether the @code{Reply-To} header looks ok. +@item sender +@cindex Sender +Insert a new @code{Sender} header if the @code{From} header looks odd. +@item sendsys +@cindex sendsys +Check for the existence of version and sendsys commands. +@item shoot +Check whether the domain part of the @code{Message-ID} header looks ok. @item shorten-followup-to Check whether to add a @code{Followup-to} header to shorten the number of groups to post to. +@item signature +Check the length of the signature. +@item size +Check for excessive size. +@item subject +Check whether the @code{Subject} header exists and is not empty. +@item subject-cmsg +Check the subject for commands. +@item valid-newsgroups +Check whether the @code{Newsgroups} and @code{Followup-to} headers +are valid syntactically. @end table -All these conditions are checked by default. +All these conditions are checked by default, except for @code{sender} +for which the check is disabled by default if +@code{message-insert-canlock} is non-@code{nil} (@pxref{Canceling News}). @item message-ignored-news-headers @vindex message-ignored-news-headers
--- a/man/org.texi Tue Jun 20 01:17:33 2006 +0000 +++ b/man/org.texi Tue Jun 20 07:35:06 2006 +0000 @@ -3,7 +3,7 @@ @setfilename ../info/org @settitle Org Mode Manual -@set VERSION 4.37 +@set VERSION 4.38 @set DATE June 2006 @dircategory Emacs @@ -86,6 +86,8 @@ * Exporting:: Sharing and publishing of notes * Publishing:: Create a web site of linked Org-mode files * Miscellaneous:: All the rest which did not fit elsewhere +* Extensions and Hacking:: +* History and Acknowledgments:: * Index:: The fast road to specific information * Key Index:: Key bindings and where they are described @@ -162,7 +164,7 @@ Progress Logging -* Closing items:: When was this entry makred DONE? +* Closing items:: When was this entry marked DONE? * Clocking work time:: When exactly did you work on this item? Tags @@ -231,17 +233,19 @@ * The very busy C-c C-c key:: When in doubt, press C-c C-c * Clean view:: Getting rid of leading stars in the outline * TTY keys:: Using Org-mode on a tty -* FAQ:: Frequently asked questions * Interaction:: Other Emacs packages * Bugs:: Things which do not work perfectly -* Acknowledgments:: These people provided feedback and more Interaction with other packages -* Extensions:: Third-party extensions for Org-mode * Cooperation:: Packages Org-mode cooperates with * Conflicts:: Packages that lead to conflicts +Extensions and Hacking + +* Extensions:: +* Dynamic blocks:: + @end detailmenu @end menu @@ -296,9 +300,10 @@ The Org-mode table editor can be integrated into any major mode by activating the minor Orgtbl-mode. +@cindex FAQ There is a website for Org-mode which provides links to the newest -version of Org-mode, as well as additional information, screen shots -and example files. This page is located at +version of Org-mode, as well as additional information, frequently asked +questions (FAQ), links to tutorials etc. This page is located at @uref{http://www.astro.uva.nl/~dominik/Tools/org/}. @page @@ -341,6 +346,10 @@ (require 'org-install) @end lisp +If you use Org-mode with XEmacs, you also need to install the file +@file{noutline.el} from the @file{xemacs} subdirectory of the Org-mode +distribution. + @cindex org-mode, turning on With this setup, all files with extension @samp{.org} will be put into Org-mode. As an alternative, make the first line of a file look like @@ -621,9 +630,16 @@ special top-level heading, or even to a different file. @table @kbd @kindex C-c $ -@item @kbd{C-c $} +@item C-c $ Archive the subtree starting at the cursor position to the location given by @code{org-archive-location}. +@kindex C-u C-c $ +@item C-u C-c $ +When @kbd{C-c $} is called with @kbd{C-u} prefix argument, check for +(sub)trees without any open TODO items and offer to archive them. When +the cursor is on a headline when this command is called, inly check the +direct children of this headline. When the cursor is @emph{not} on a +headline, check all level 1 trees. @end table @cindex archive locations @@ -1674,7 +1690,11 @@ Insert a link. This prompts for a link to be inserted into the buffer. You can just type a link, using text for an internal link, or one of the link type prefixes mentioned in the examples above. Through completion, -all links stored during the current session can be accessed. The link +all links stored during the current session can be +accessed@footnote{After insertion of a stored link, the link will be +removed from the list of stored links. To keep it in the list later +use, use a triple @kbd{C-u} prefix to @kbd{C-c C-l}, or configure the +option @code{org-keep-stored-link-after-insertion}.}. The link will be inserted into the buffer, along with a descriptive text. Note that you don't have to use this command to insert a link. Links in Org-mode are plain text, and you can type or paste them straight into @@ -2227,10 +2247,9 @@ @item Time range with CLOCK keyword @cindex CLOCK keyword When using the clock to time the work that is being done on specific -items, time ranges preceeded by the CLOCK keyword are inserted +items, time ranges preceded by the CLOCK keyword are inserted automatically into the file. The time stamps are enclosed in square brackets instead of angular brackets. @xref{Clocking work time}. -@c FIXME: Reference needed @end table @node Creating timestamps, Progress logging, Time stamps, Timestamps @@ -2376,7 +2395,7 @@ stop working on an aspect of a project. @menu -* Closing items:: When was this entry makred DONE? +* Closing items:: When was this entry marked DONE? * Clocking work time:: When exactly did you work on this item? @end menu @@ -2405,8 +2424,8 @@ Org-mode allows you to clock the time you spent on specific tasks in a project. When you start working on an item, you can start the clock. -When you stop working on that tast, or when you makr the task done, the -clock is stoppend and the corresponding time interval is recorded. It +When you stop working on that task, or when you mark the task done, the +clock is stopped and the corresponding time interval is recorded. It also computes the total time spent on each subtree of a project. @table @kbd @@ -2435,6 +2454,22 @@ recorded under that heading, including the time of any subheadings. You can use visibility cycling to study the tree, but the overlays disappear automatically when the buffer is changed. +@kindex C-c C-x C-r +@item C-c C-x C-r +Insert a dynamic block containing a clock report as an org-mode table +into the current file. +@example +#+BEGIN: clocktable :maxlevel 2 :emphasize nil + +#+END: clocktable +@end example +@noindent +If such a block already exists, its content is replaced by the new +table. The @samp{BEGIN} line can specify options: +@example +:maxlevels @r{Maximum level depth to which times are listed in the table.} +:emphasize @r{When @code{t}, emphasize level one and level two items} +@end example @end table The @kbd{l} key may be used in the timeline (@pxref{Timeline}) and in @@ -3765,6 +3800,24 @@ org-publish to upload the related files, these links will work too. @ref{Complex example} for an example of this usage. +Sometime an Org-mode file to be published may contain links that are +only valid in your production environment, but not in the publishing +location. In this case, use the property + +@multitable @columnfractions 0.4 0.6 +@item @code{:link-validation-function} +@tab Function to validate links +@end multitable + +@noindent +to define a function for checking link validity. This function must +accept two arguments, the file name and a directory relative to which +the file name is interpreted in the production environment. If this +function returns @code{nil}, then the HTML generator will only insert a +description into the HTML file, but no link. One option for this +function is @code{org-publish-validate-link} which checks if the given +file is part of any project in @code{org-publish-project-alist}. + @node Project page index, , Publishing links, Configuration @subsection Project page index @@ -3891,7 +3944,7 @@ functions normally only publish changed files. You can override this and force publishing of all files by giving a prefix argument. -@node Miscellaneous, Index, Publishing, Top +@node Miscellaneous, Extensions and Hacking, Publishing, Top @chapter Miscellaneous @menu @@ -3901,10 +3954,8 @@ * The very busy C-c C-c key:: When in doubt, press C-c C-c * Clean view:: Getting rid of leading stars in the outline * TTY keys:: Using Org-mode on a tty -* FAQ:: Frequently asked questions * Interaction:: Other Emacs packages * Bugs:: Things which do not work perfectly -* Acknowledgments:: These people provided feedback and more @end menu @node Completion, Customization, Miscellaneous, Miscellaneous @@ -4043,14 +4094,13 @@ mentioned scattered throughout this manual. One specific function of this key is to add @emph{tags} to a headline (@pxref{Tags}). In many other circumstances it means something like @emph{Hey Org-mode, look -here and update according to what you see here}. Here is a summary of what -this means in different contexts. +here and update according to what you see here}. Here is a summary of +what this means in different contexts. @itemize @minus -@c @item -@c If the cursor is in a headline, prompt for tags and insert them -@c into the current line, aligned to `org-tags-column'. When called -@c with prefix arg, realign all tags in the current buffer. +@item +If there are highlichts in the buffer from the creation of a sparse +tree, or from clock display, remove these highlights. @item If the cursor is in one of the special @code{#+KEYWORD} lines, this triggers scanning the buffer for these lines and updating the @@ -4180,7 +4230,7 @@ RET} in that file. The reverse operation is @kbd{M-x org-convert-to-oddeven-levels}. -@node TTY keys, FAQ, Clean view, Miscellaneous +@node TTY keys, Interaction, Clean view, Miscellaneous @section Using org-mode on a tty @cindex tty keybindings @@ -4217,251 +4267,19 @@ @item @kbd{S-@key{down}} @tab @kbd{C-c C-x @key{down}} @tab @end multitable -@node FAQ, Interaction, TTY keys, Miscellaneous -@section Frequently asked questions -@cindex FAQ - -@enumerate -@cindex @code{keymapp nil} error -@item @b{When I try to use Org-mode, I always get -@code{(wrong-type-argument keymapp nil)}}.@* -@cindex allout.el, conflict with -This is a conflict with an outdated version of the @file{allout.el}. -See @ref{Conflicts}. - -@item @b{Org-mode seems to be a useful default mode for the various -@file{README} files I have scattered through my directories. How do I -turn it on for all @file{README} files?} - -@lisp -(add-to-list 'auto-mode-alist '("README$" . org-mode)) -@end lisp - -@item @b{I would like to use editing features of org-mode in other -modes, is this possible?}@* -@c -Not really. For tables there is @code{orgtbl-mode} which implements the -table editor as a minor mode. For other features you need to switch to -Org-mode temporarily, or prepare text in a different buffer. - -@item @b{Can I get the visibility-cycling features in outline-mode and -outline-minor-mode?}@* -@c -Yes, these functions are written in a way that they are independent of -the outline setup. The following setup provides standard Org-mode -functionality in outline-mode on @key{TAB} and @kbd{S-@key{TAB}}. For -outline-minor-mode, we use @kbd{C-@key{TAB}} instead of @key{TAB}, -because @key{TAB} usually has mode-specific tasks. -@lisp -(add-hook 'outline-minor-mode-hook - (lambda () - (define-key outline-minor-mode-map [(control tab)] 'org-cycle) - (define-key outline-minor-mode-map [(shift tab)] 'org-global-cycle))) -(add-hook 'outline-mode-hook - (lambda () - (define-key outline-mode-map [(tab)] 'org-cycle) - (define-key outline-mode-map [(shift tab)] 'org-global-cycle))) -@end lisp - -Or check out @file{outline-magic.el}, which does this and also provides -promotion and demotion functionality. @file{outline-magic.el} is -available at @url{http://www.astro.uva.nl/~dominik/Tools/OutlineMagic}. - -@item @b{Some of my links stopped working after I upgraded to a version -4.20 or later. Why is this, and how can I fix it?}@* -@c -These must be links in plain text, containing white space, such as -@samp{bbdb:Richard Stallman}. You need to protect these links by -putting double brackets around them, like @samp{[[bbdb:Richard -Stallman]]}. - -@item @b{I see that Org-mode now creates links using the double bracket -convention that hides the link part and the brackets, only showing the -description part. How can I convert my old links to this new format?}@* -@c -Execute once in each Org-mode file: @kbd{M-x org-upgrade-old-links}. -This replaces angular brackets with the new link format. - -@item @b{I don't care if you find the new bracket links great, I am -attached to the old style using angular brackets and no hiding of the -link text. Please give them back to me, don't tell me it is not -possible!}@* -@c -Would I let you down like that? If you must, you can do this - -@lisp -(setq org-link-style 'plain - org-link-format "<%s>") -@end lisp - -@item @b{When I am executing shell/elisp links I always get a -confirmation prompt and need to type @kbd{yes @key{RET}}, that's 4 key -presses! Can I get rid of this?}@* -@c -@cindex shell links, confirmation -@cindex dangerous commands -The confirmation is there to protect you from unwantingly execute -potentially dangerous commands. For example, imagine a link -@samp{[[shell:rm -rf ~/*][Google Search]]}. In an Org-mode buffer, this -command would look like @samp{Google Search}, but really it would remove -your home directory. If you wish, you can make it easier to respond to -the query by setting @code{org-confirm-shell-link-function} and/or -@code{org-confirm-elisp-link-function} to @code{y-or-n-p}. Then a -single @kbd{y} keypress will be enough to confirm those links. It is -also possible to turn off this check entirely, but I do not recommend to -do this. Be warned. - -@item @b{All these stars are driving me mad, I just find the Emacs -outlines unreadable. Can't you just put white space and a single star as a -starter for headlines?}@* -@c -See @ref{Clean view}. - -@item @b{I would like to have two windows on the same Org-mode -file, but with different outline visibility. Is that possible?}@* -@c -@cindex @code{make-indirect-buffer} -@cindex indirect buffers -In GNU Emacs, you may use @emph{indirect buffers} which do exactly this. -See the documentation on the command @code{make-indirect-buffer}. In -XEmacs, this is currently not possible because of the different outline -implementation. - -@item @b{When I export my TODO list, every TODO item becomes a -separate section. How do I enforce these items to be exported as an -itemized list?}@* -@c -If you plan to use ASCII or HTML export, make sure things you want to -be exported as item lists are level 4 at least, even if that does mean -there is a level jump. For example: - -@example -* Todays top priorities -**** TODO write a letter to xyz -**** TODO Finish the paper -**** Pick up kids at the school -@end example - -Alternatively, if you need a specific value for the heading/item -transition in a particular file, use the @samp{+OPTIONS} line to -configure the @samp{H} switch. - -@example -+OPTIONS: H:2; ... -@end example - -@item @b{I would like to export only a subtree of my file to HTML. -How?}@* -@c -@cindex exporting a subtree -If you want to export a subtree, mark the subtree as region and then -export. Marking can be done with @kbd{C-c @@ C-x C-x}, for example. - -@item @b{Org-mode takes over the S-cursor keys. I also want to use -CUA-mode, is there a way to fix this conflict?}@* -Yes, see @ref{Conflicts}. - -@item @b{One of my table columns has started to fill up with -@samp{#ERROR}. What is going on?}@* -@c -Org-mode tried to compute the column from other fields using a -formula stored in the @samp{#+TBLFM:} line just below the table, and -the evaluation of the formula fails. Fix the fields used in the -formula, or fix the formula, or remove it! - -@item @b{When I am in the last column of a table and just above a -horizontal line in the table, pressing TAB creates a new table line -@i{before} the horizontal line. How can I quickly move to the line -@i{below} the horizontal line instead?}@* -@c -Press @key{down} (to get on the separator line) and then @key{TAB}. -Or configure the variable @code{org-table-tab-jumps-over-hlines}. - -@item @b{How can I change the indentation of an entire table without -fixing every line by hand?}@* -@c -@cindex indentation, of tables -The indentation of a table is set by the first line. So just fix the -indentation of the first line and realign with @key{TAB}. - -@item @b{Is it possible to include entries from org-mode files into my -emacs diary?}@* -@c -Since the org-mode agenda is much more powerful and can contain the -diary (@pxref{Calendar/Diary integration}), you should think twice -before deciding to do this. Integrating Org-mode information into the -diary is, however, possible. You need to turn on @emph{fancy diary -display} by setting in @file{.emacs}: - -@lisp -(add-hook 'diary-display-hook 'fancy-diary-display) -@end lisp - -Then include the following line into your @file{~/diary} file, in -order to get the entries from all files listed in the variable -@code{org-agenda-files}: - -@example -&%%(org-diary) -@end example -@noindent -You may also select specific files with - -@example -&%%(org-diary) ~/path/to/some/org-file.org -&%%(org-diary) ~/path/to/another/org-file.org -@end example - -If you now launch the calendar and press @kbd{d} to display a diary, the -headlines of entries containing a timestamp, date range, schedule, or -deadline referring to the selected date will be listed. Just like -Org-mode's agenda view, the diary for @emph{today} contains additional -entries for overdue deadlines and scheduled items. See also the -documentation of the @command{org-diary} function. Under XEmacs, it is -not possible to jump back from the diary to the org, this works only in -the agenda buffer. - -@end enumerate - - -@node Interaction, Bugs, FAQ, Miscellaneous +@node Interaction, Bugs, TTY keys, Miscellaneous @section Interaction with other packages @cindex packages, interaction with other Org-mode lives in the world of GNU Emacs and interacts in various ways with other code out there. @menu -* Extensions:: Third-party extensions for Org-mode * Cooperation:: Packages Org-mode cooperates with * Conflicts:: Packages that lead to conflicts @end menu -@node Extensions, Cooperation, Interaction, Interaction -@subsection Third-party extensions for Org-mode - -The following extensions for Org-mode have been written by other people: - -@table @asis -@cindex @file{org-mouse.el} -@item @file{org-mouse.el} by Piotr Zielinski -This package implements extended mouse functionality for Org-mode. It -allows you to cycle visibility and to edit the document structure with -the mouse. Best of all, it provides a context-sensitive menu on -@key{mouse-3} that changes depending on the context of a mouse-click. -@file{org-mouse.el} is freely available at @url{http://www.cl.cam.ac.uk/~pz215/files/org-mouse.el}. -@cindex @file{org-publish.el} -@item @file{org-publish.el} by David O'Toole -This package provides facilities for publishing related sets of Org-mode -files together with linked files like images as a webpages. It is -highly configurable and can be used for other publishing purposes as -well. As of Org-mode version 4.30, @file{org-publish.el} is part of -the Org-mode distribution. It is not yet part of Emacs, however, due to -a pending copyright assignment. In the mean time, @file{org-publish.el} -can be downloaded from David's site: -@url{http://dto.freeshell.org/e/org-publish.el}. -@end table - -@node Cooperation, Conflicts, Extensions, Interaction + +@node Cooperation, Conflicts, Interaction, Interaction @subsection Packages that Org-mode cooperates with @table @asis @@ -4538,7 +4356,7 @@ @end table -@node Bugs, Acknowledgments, Interaction, Miscellaneous +@node Bugs, , Interaction, Miscellaneous @section Bugs @cindex bugs @@ -4564,10 +4382,6 @@ (for example because the application does not exist or refuses to open the file), it does so silently. No error message is displayed. @item -Plain list items should be able to hold a TODO item. Unfortunately this -has so many technical problems that I will only consider this change for -the next major release (5.0). -@item The remote-editing commands in the agenda buffer cannot be undone with @code{undo} called from within the agenda buffer. But you can go to the corresponding buffer (using @key{TAB} or @key{RET} and execute @@ -4577,22 +4391,140 @@ If a formula uses @emph{calculated} fields further down the row, multiple recalculation may be needed to get all fields consistent. @item -Several words in a row may @b{*be made bold*}, but this does not work if -the string is distributed over two lines. +A single letter cannot be made bold, for example @samp{*a*}. @item The exporters work well, but could be made more efficient. @end itemize -@node Acknowledgments, , Bugs, Miscellaneous -@section Acknowledgments + +@node Extensions and Hacking, History and Acknowledgments, Miscellaneous, Top +@appendix Extensions, Hooks and Hacking + +This appendix lists extensions for Org-mode written by other authors. +It also covers some aspects where users can easily extend the +functionality of Org-mode. + +@menu +* Extensions:: +* Dynamic blocks:: +@end menu + +@node Extensions, Dynamic blocks, Extensions and Hacking, Extensions and Hacking +@section Third-party extensions for Org-mode + +The following extensions for Org-mode have been written by other people: + +@table @asis +@cindex @file{org-mouse.el} +@item @file{org-mouse.el} by Piotr Zielinski +This package implements extended mouse functionality for Org-mode. It +allows you to cycle visibility and to edit the document structure with +the mouse. Best of all, it provides a context-sensitive menu on +@key{mouse-3} that changes depending on the context of a mouse-click. +@file{org-mouse.el} is freely available at @url{http://www.cl.cam.ac.uk/~pz215/files/org-mouse.el}. +@cindex @file{org-publish.el} +@item @file{org-publish.el} by David O'Toole +This package provides facilities for publishing related sets of Org-mode +files together with linked files like images as a webpages. It is +highly configurable and can be used for other publishing purposes as +well. As of Org-mode version 4.30, @file{org-publish.el} is part of the +Org-mode distribution. It is not yet part of Emacs, however, a delay +caused by the preparations for the 22.1 release. In the mean time, +@file{org-publish.el} can be downloaded from David's site: +@url{http://dto.freeshell.org/e/org-publish.el}. +@cindex @file{org-blog.el} +@item @file{org-blog.el} by David O'Toole +A blogging plug-in for @file{org-publish.el}. +@cindex @file{org-blogging.el} +@item @file{org-blogging.el} by Bastien Guerry +Publish Org-mode files as +blogs. @url{http://www.cognition.ens.fr/~guerry/org-blogging.html}. +@end table + +@node Dynamic blocks, , Extensions, Extensions and Hacking +@section Dynamic blocks + +Org-mode documents can contain @emph{dynamic blocks}. These are +specially marked regions that are updates by some user-written +function. A good example for such a block is the clock table inserted +by the command @kbd{C-c C-x C-r} (@pxref{Clocking work time}). + +Dynamic block are enclosed by a BEGIN-END structure that assigns a name +to the block and can also specify parameters for the function producing +the content of the block. + +@example +#+BEGIN: myblock :parameter1 value1 :parameter2 value2 ..... + +#+END: +@end example + +Dynamic blocks are updated with the following commands + +@table @kbd +@kindex C-c C-x C-u +@item C-c C-x C-u +Update dynamic block at point. +@kindex C-u C-c C-x C-u +@item C-u C-c C-x C-u +Update all dynamic blocks in the current file. +@end table + +Updating a dynamic block means to remove all the text between BEGIN and +END, parse the BEGIN line for parameters and then call the specific +writer function for this block to insert the new content. For a block +with name @code{myblock}, the writer function is +@code{org-dblock-write:myblock} with as only parameter a property list +with the parameters given in the begin line. Here is a trivial example +of a block that keeps track of when the block update function was last +run: + +@example +#+BEGIN: block-update-time :format "on %m/%d/%Y at %H:%M" + +#+END: +@end example + +@noindent +The corresponding block writer function could look like this: + +@lisp +(defun org-dblock-write:date-and-time (params) + (let ((fmt (or (plist-get params :format) "%d. %m. %Y"))) + (insert "Last block update at: " + (format-time-string fmt (current-time))))) +@end lisp + +If you want to make sure that all dynamic blocks are always up-to-date, +you could add the function @code{org-update-all-dblocks} to a hook, for +example @code{before-save-hook}. @code{org-update-all-dblocks} is +written in a way that is does nothing in buffers that are not in Org-mode. + + +@node History and Acknowledgments, Index, Extensions and Hacking, Top +@appendix History and Acknowledgments @cindex acknowledgments +@cindex history @cindex thanks -Org-mode was created by @value{AUTHOR}, who still maintains it at the -Org-mode homepage @uref{http://www.astro.uva.nl/~dominik/Tools/org/}. -The following people (in alphabetic order) have helped the development -along with ideas, suggestions and patches. Many thanks to all of you, -Org-mode would not be what it is without your input. +Org-mode was conceived in 2003 out of frustration over the user +interface of the emacs outline-mode. The first driver was simply to +make working with an outline tree possible without having to remember +more than 10 commands just for hiding and unhiding parts of the outline +tree, and to allow to restructure a tree easily. Visibility cycling and +structure editing were originally implemented in the package +@file{outline-magic.el}, but quickly moved to the more general +@file{org.el}. TODO entries and table support were added relatively +quickly, and pointed to the two main drivers of Org-mode: Creating a +new plain text mode with intuitive editing features, and to +incorporate project planning functionality directly into a notes file. + +Since the first release, hundreds of emails either directly to me or +later on @code{emacs-orgmode@@gnu.org} have been a constant source of +bug reports, feedback and new ideas. While I cannot mention everyone, I +try to keep here a list of the people who had significant +influence in shaping one or more aspects of Org-mode. Many thanks to +all of you. If I have forgotten someone, please accept my apologies. @itemize @bullet @item @@ -4607,8 +4539,9 @@ @i{Pavel Chalmoviansky} influenced the agenda treatment of items with specified time. @item -@i{Gregory Chenov} patched support for lisp forms into table -calculations and improved XEmacs compatibility. +@i{Gregory Chernov} patched support for lisp forms into table +calculations and improved XEmacs compatibility, in particular by porting +@file{nouline.el} to XEmacs. @item @i{Sacha Chua} suggested to copy some linking code from Planner. @item @@ -4619,6 +4552,8 @@ @item @i{Nic Ferrier} contributed mailcap and XOXO support. @item +@i{Bastien Guerry} provoded extensive feedback. +@item @i{Kai Grossjohann} pointed out key-binding conflicts caused by Org-mode. @item @@ -4655,6 +4590,10 @@ @item Linking to VM/BBDB/GNUS was inspired by @i{Tom Shannon}'s @file{organizer-mode.el}. +@c FIXME: +@c @item +@c @i{Daniel Sinder} came up with the idea if internal archiving my locking +@c subtrees. @item @i{David O'Toole} wrote @file{org-publish.el} and drafted the manual chapter about publishing. @@ -4684,9 +4623,10 @@ @i{Piotr Zielinski} wrote @file{org-mouse.el} and showed how to follow links with mouse-1. @end itemize - -@node Index, Key Index, Miscellaneous, Top -@chapter Index + + +@node Index, Key Index, History and Acknowledgments, Top +@unnumbered Index @printindex cp
--- a/src/ChangeLog Tue Jun 20 01:17:33 2006 +0000 +++ b/src/ChangeLog Tue Jun 20 07:35:06 2006 +0000 @@ -1,3 +1,13 @@ +2006-06-19 Richard Stallman <rms@gnu.org> + + * window.c (size_window): New arg FIRST_ONLY. All callers changed. + (adjust_window_trailing_edge): Specially compute FIRST_PARALLEL + for the case of a top-level window and the following minibuffer. + Don't exit because of no `next' when there is a parent. + Use the FIRST_ONLY feature when resizing following windows. + + * syntax.c (init_syntax_once): Give most control chars' syntax Spunct. + 2006-06-17 Kim F. Storm <storm@cua.dk> * dispnew.c (update_frame): Check for input pending on entry.
--- a/src/syntax.c Tue Jun 20 01:17:33 2006 +0000 +++ b/src/syntax.c Tue Jun 20 07:35:06 2006 +0000 @@ -3346,6 +3346,20 @@ Vstandard_syntax_table = Fmake_char_table (Qsyntax_table, temp); + /* Control characters should not be whitespace. */ + temp = XVECTOR (Vsyntax_code_object)->contents[(int) Spunct]; + for (i = 0; i <= ' ' - 1; i++) + SET_RAW_SYNTAX_ENTRY (Vstandard_syntax_table, i, temp); + SET_RAW_SYNTAX_ENTRY (Vstandard_syntax_table, 0177, temp); + + /* Except that a few really are whitespace. */ + temp = XVECTOR (Vsyntax_code_object)->contents[(int) Swhitespace]; + SET_RAW_SYNTAX_ENTRY (Vstandard_syntax_table, ' ', temp); + SET_RAW_SYNTAX_ENTRY (Vstandard_syntax_table, '\t', temp); + SET_RAW_SYNTAX_ENTRY (Vstandard_syntax_table, '\n', temp); + SET_RAW_SYNTAX_ENTRY (Vstandard_syntax_table, 015, temp); + SET_RAW_SYNTAX_ENTRY (Vstandard_syntax_table, 014, temp); + temp = XVECTOR (Vsyntax_code_object)->contents[(int) Sword]; for (i = 'a'; i <= 'z'; i++) SET_RAW_SYNTAX_ENTRY (Vstandard_syntax_table, i, temp);
--- a/src/window.c Tue Jun 20 01:17:33 2006 +0000 +++ b/src/window.c Tue Jun 20 07:35:06 2006 +0000 @@ -63,7 +63,7 @@ static void window_scroll_line_based P_ ((Lisp_Object, int, int, int)); static int window_min_size_1 P_ ((struct window *, int)); static int window_min_size P_ ((struct window *, int, int, int *)); -static void size_window P_ ((Lisp_Object, int, int, int)); +static void size_window P_ ((Lisp_Object, int, int, int, int, int)); static int freeze_window_start P_ ((struct window *, void *)); static int window_fixed_size_p P_ ((struct window *, int, int)); static void enlarge_window P_ ((Lisp_Object, int, int)); @@ -2826,17 +2826,23 @@ /* Set WINDOW's height or width to SIZE. WIDTH_P non-zero means set WINDOW's width. Resize WINDOW's children, if any, so that they - keep their proportionate size relative to WINDOW. Propagate - WINDOW's top or left edge position to children. Delete windows - that become too small unless NODELETE_P is non-zero. + keep their proportionate size relative to WINDOW. + + If FIRST_ONLY is 1, change only the first of WINDOW's children when + they are in series. If LAST_ONLY is 1, change only the last of + WINDOW's children when they are in series. + + Propagate WINDOW's top or left edge position to children. Delete + windows that become too small unless NODELETE_P is non-zero. If NODELETE_P is 2, that means we do delete windows that are too small, even if they were too small before! */ static void -size_window (window, size, width_p, nodelete_p) +size_window (window, size, width_p, nodelete_p, first_only, last_only) Lisp_Object window; int size, width_p, nodelete_p; + int first_only, last_only; { struct window *w = XWINDOW (window); struct window *c; @@ -2911,6 +2917,7 @@ if (!NILP (*sideward)) { + /* We have a chain of parallel siblings whose size should all change. */ for (child = *sideward; !NILP (child); child = c->next) { c = XWINDOW (child); @@ -2918,8 +2925,44 @@ c->left_col = w->left_col; else c->top_line = w->top_line; - size_window (child, size, width_p, nodelete_p); + size_window (child, size, width_p, nodelete_p, + first_only, last_only); + } + } + else if (!NILP (*forward) && last_only) + { + /* Change the last in a series of siblings. */ + Lisp_Object last_child; + int child_size; + + for (child = *forward; !NILP (child); child = c->next) + { + c = XWINDOW (child); + last_child = child; } + + child_size = XINT (width_p ? c->total_cols : c->total_lines); + size_window (last_child, + size - old_size + child_size, + width_p, nodelete_p, first_only, last_only); + } + else if (!NILP (*forward) && first_only) + { + /* Change the first in a series of siblings. */ + int child_size; + + child = *forward; + c = XWINDOW (child); + + if (width_p) + c->left_col = w->left_col; + else + c->top_line = w->top_line; + + child_size = XINT (width_p ? c->total_cols : c->total_lines); + size_window (child, + size - old_size + child_size, + width_p, nodelete_p, first_only, last_only); } else if (!NILP (*forward)) { @@ -2928,7 +2971,7 @@ int last_pos, first_pos, nchildren, total; int *new_sizes = NULL; - /* Determine the fixed-size portion of the this window, and the + /* Determine the fixed-size portion of this window, and the number of child windows. */ fixed_size = nchildren = nfixed = total = 0; for (child = *forward; !NILP (child); child = c->next, ++nchildren) @@ -2991,7 +3034,7 @@ /* Set new height. Note that size_window also propagates edge positions to children, so it's not a no-op if we didn't change the child's size. */ - size_window (child, new_size, width_p, 1); + size_window (child, new_size, width_p, 1, first_only, last_only); /* Remember the bottom/right edge position of this child; it will be used to set the top/left edge of the next child. */ @@ -3010,7 +3053,7 @@ int child_size; c = XWINDOW (child); child_size = width_p ? XINT (c->total_cols) : XINT (c->total_lines); - size_window (child, child_size, width_p, 2); + size_window (child, child_size, width_p, 2, first_only, last_only); } } } @@ -3026,7 +3069,7 @@ int height; int nodelete; { - size_window (window, height, 0, nodelete); + size_window (window, height, 0, nodelete, 0, 0); } @@ -3041,7 +3084,7 @@ int width; int nodelete; { - size_window (window, width, 1, nodelete); + size_window (window, width, 1, nodelete, 0, 0); } /* Change window heights in windows rooted in WINDOW by N lines. */ @@ -4281,8 +4324,8 @@ if (NILP (window)) { - /* This can happen if WINDOW on the previous iteration was - at top level of the tree and we did not exit. */ + /* This happens if WINDOW on the previous iteration was + at top level of the window tree. */ Fset_window_configuration (old_config); error ("Specified window edge is fixed"); } @@ -4296,6 +4339,14 @@ { if (! NILP (parent) && !NILP (XWINDOW (parent)->vchild)) first_parallel = XWINDOW (parent)->vchild; + else if (NILP (parent) && !NILP (p->next)) + { + /* Handle the vertical chain of main window and minibuffer + which has no parent. */ + first_parallel = window; + while (! NILP (XWINDOW (first_parallel)->prev)) + first_parallel = XWINDOW (first_parallel)->prev; + } } else { @@ -4304,8 +4355,10 @@ } /* If this level's succession is in the desired dimension, - and this window is the last one, its trailing edge is fixed. */ - if (NILP (XWINDOW (window)->next) && NILP (first_parallel)) + and this window is the last one, and there is no higher level, + its trailing edge is fixed. */ + if (NILP (XWINDOW (window)->next) && NILP (first_parallel) + && NILP (parent)) { Fset_window_configuration (old_config); error ("Specified window edge is fixed"); @@ -4347,7 +4400,7 @@ XSETINT (CURBEG (p->next), XINT (CURBEG (p->next)) + delta); size_window (p->next, XINT (CURSIZE (p->next)) - delta, - horiz_flag, 0); + horiz_flag, 0, 1, 0); break; } } @@ -4359,7 +4412,7 @@ child = XWINDOW (child)->next) if (! EQ (child, window)) size_window (child, XINT (CURSIZE (child)) + delta, - horiz_flag, 0); + horiz_flag, 0, 0, 1); window = parent; }