org.el 801 KB
Newer Older
1
;;; org.el --- Outline-based notes management and organizer
2
;; Carstens outline-mode for keeping track of everything.
3
;; Copyright (C) 2004-2012  Free Software Foundation, Inc.
4
;;
John Wiegley's avatar
John Wiegley committed
5
;; Author: Carsten Dominik <carsten at orgmode dot org>
Bastien Guerry's avatar
Bastien Guerry committed
6
;; Maintainer: Bastien Guerry <bzg at gnu dot org>
7
;; Keywords: outlines, hypermedia, calendar, wp
John Wiegley's avatar
John Wiegley committed
8
;; Homepage: http://orgmode.org
9
;; Version: 7.8.11
10
;;
Richard M. Stallman's avatar
Richard M. Stallman committed
11
;; This file is part of GNU Emacs.
12
;;
13
;; GNU Emacs is free software: you can redistribute it and/or modify
Richard M. Stallman's avatar
Richard M. Stallman committed
14
;; it under the terms of the GNU General Public License as published by
15 16
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
Richard M. Stallman's avatar
Richard M. Stallman committed
17

Richard M. Stallman's avatar
Richard M. Stallman committed
18 19 20 21
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.
Richard M. Stallman's avatar
Richard M. Stallman committed
22 23

;; You should have received a copy of the GNU General Public License
24
;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
Richard M. Stallman's avatar
Richard M. Stallman committed
25 26 27 28 29 30 31
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;; Commentary:
;;
;; Org-mode is a mode for keeping notes, maintaining ToDo lists, and doing
;; project planning with a fast and effective plain-text system.
;;
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
;; Org-mode develops organizational tasks around NOTES files that contain
;; information about projects as plain text.  Org-mode is implemented on
;; top of outline-mode, which makes it possible to keep the content of
;; large files well structured.  Visibility cycling and structure editing
;; help to work with the tree.  Tables are easily created with a built-in
;; table editor.  Org-mode supports ToDo items, deadlines, time stamps,
;; and scheduling.  It dynamically compiles entries into an agenda that
;; utilizes and smoothly integrates much of the Emacs calendar and diary.
;; Plain text URL-like links connect to websites, emails, Usenet
;; messages, BBDB entries, and any files related to the projects.  For
;; printing and sharing of notes, an Org-mode file can be exported as a
;; structured ASCII file, as HTML, or (todo and agenda items only) as an
;; iCalendar file.  It can also serve as a publishing tool for a set of
;; linked webpages.
;;
47 48 49
;; Installation and Activation
;; ---------------------------
;; See the corresponding sections in the manual at
Richard M. Stallman's avatar
Richard M. Stallman committed
50
;;
John Wiegley's avatar
John Wiegley committed
51
;;   http://orgmode.org/org.html#Installation
Richard M. Stallman's avatar
Richard M. Stallman committed
52 53 54
;;
;; Documentation
;; -------------
55 56 57
;; The documentation of Org-mode can be found in the TeXInfo file.  The
;; distribution also contains a PDF version of it.  At the homepage of
;; Org-mode, you can read the same text online as HTML.  There is also an
58 59
;; excellent reference card made by Philip Rooke.  This card can be found
;; in the etc/ directory of Emacs 22.
Richard M. Stallman's avatar
Richard M. Stallman committed
60
;;
61
;; A list of recent changes can be found at
62
;; http://orgmode.org/Changes.html
63
;;
Richard M. Stallman's avatar
Richard M. Stallman committed
64 65
;;; Code:

66 67 68 69 70
(defvar org-inhibit-highlight-removal nil) ; dynamically scoped param
(defvar org-table-formula-constants-local nil
  "Local version of `org-table-formula-constants'.")
(make-variable-buffer-local 'org-table-formula-constants-local)

71 72
;;;; Require other packages

73
(eval-when-compile
74
  (require 'cl)
75 76 77
  (require 'gnus-sum))

(require 'calendar)
78
(require 'format-spec)
Carsten Dominik's avatar
Carsten Dominik committed
79

80
;; Emacs 22 calendar compatibility:  Make sure the new variables are available
81 82 83 84 85 86 87 88 89
(when (fboundp 'defvaralias)
  (unless (boundp 'calendar-view-holidays-initially-flag)
    (defvaralias 'calendar-view-holidays-initially-flag
      'view-calendar-holidays-initially))
  (unless (boundp 'calendar-view-diary-initially-flag)
    (defvaralias 'calendar-view-diary-initially-flag
      'view-diary-entries-initially))
  (unless (boundp 'diary-fancy-buffer)
    (defvaralias 'diary-fancy-buffer 'fancy-diary-buffer)))
90

91 92
(require 'outline) (require 'noutline)
;; Other stuff we need.
Richard M. Stallman's avatar
Richard M. Stallman committed
93
(require 'time-date)
94
(unless (fboundp 'time-subtract) (defalias 'time-subtract 'subtract-time))
Richard M. Stallman's avatar
Richard M. Stallman committed
95
(require 'easymenu)
96
(require 'overlay)
Richard M. Stallman's avatar
Richard M. Stallman committed
97

98
(require 'org-macs)
99
(require 'org-entities)
100 101
(require 'org-compat)
(require 'org-faces)
102
(require 'org-list)
103
(require 'org-pcomplete)
104
(require 'org-src)
105
(require 'org-footnote)
106

107 108 109
(declare-function org-inlinetask-at-task-p "org-inlinetask" ())
(declare-function org-inlinetask-outline-regexp "org-inlinetask" ())
(declare-function org-inlinetask-toggle-visibility "org-inlinetask" ())
Bastien Guerry's avatar
Bastien Guerry committed
110
(declare-function org-pop-to-buffer-same-window "org-compat" (&optional buffer-or-name norecord label))
111 112 113 114
(declare-function org-at-clock-log-p "org-clock" ())
(declare-function org-clock-timestamps-up "org-clock" ())
(declare-function org-clock-timestamps-down "org-clock" ())

115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
;; babel
(require 'ob)
(require 'ob-table)
(require 'ob-lob)
(require 'ob-ref)
(require 'ob-tangle)
(require 'ob-comint)
(require 'ob-keys)

;; load languages based on value of `org-babel-load-languages'
(defvar org-babel-load-languages)
;;;###autoload
(defun org-babel-do-load-languages (sym value)
  "Load the languages defined in `org-babel-load-languages'."
  (set-default sym value)
  (mapc (lambda (pair)
	  (let ((active (cdr pair)) (lang (symbol-name (car pair))))
	    (if active
		(progn
		  (require (intern (concat "ob-" lang))))
	      (progn
		(funcall 'fmakunbound
			 (intern (concat "org-babel-execute:" lang)))
		(funcall 'fmakunbound
			 (intern (concat "org-babel-expand-body:" lang)))))))
	org-babel-load-languages))

(defcustom org-babel-load-languages '((emacs-lisp . t))
  "Languages which can be evaluated in Org-mode buffers.
This list can be used to load support for any of the languages
below, note that each language will depend on a different set of
system executables and/or Emacs modes.  When a language is
\"loaded\", then code blocks in that language can be evaluated
with `org-babel-execute-src-block' bound by default to C-c
C-c (note the `org-babel-no-eval-on-ctrl-c-ctrl-c' variable can
be set to remove code block evaluation from the C-c C-c
keybinding.  By default only Emacs Lisp (which has no
requirements) is loaded."
  :group 'org-babel
  :set 'org-babel-do-load-languages
155
  :version "24.1"
156 157 158
  :type '(alist :tag "Babel Languages"
		:key-type
		(choice
159
		 (const :tag "Awk" awk)
160 161 162
		 (const :tag "C" C)
		 (const :tag "R" R)
		 (const :tag "Asymptote" asymptote)
Carsten Dominik's avatar
Carsten Dominik committed
163
		 (const :tag "Calc" calc)
164 165 166 167 168
		 (const :tag "Clojure" clojure)
		 (const :tag "CSS" css)
		 (const :tag "Ditaa" ditaa)
		 (const :tag "Dot" dot)
		 (const :tag "Emacs Lisp" emacs-lisp)
Bastien Guerry's avatar
Bastien Guerry committed
169
		 (const :tag "Fortran" fortran)
170 171
		 (const :tag "Gnuplot" gnuplot)
		 (const :tag "Haskell" haskell)
172
		 (const :tag "Java" java)
Carsten Dominik's avatar
Carsten Dominik committed
173
		 (const :tag "Javascript" js)
174
		 (const :tag "Latex" latex)
Carsten Dominik's avatar
Carsten Dominik committed
175
		 (const :tag "Ledger" ledger)
176 177
		 (const :tag "Lilypond" lilypond)
		 (const :tag "Maxima" maxima)
178 179 180 181
		 (const :tag "Matlab" matlab)
		 (const :tag "Mscgen" mscgen)
		 (const :tag "Ocaml" ocaml)
		 (const :tag "Octave" octave)
Carsten Dominik's avatar
Carsten Dominik committed
182
		 (const :tag "Org" org)
183
		 (const :tag "Perl" perl)
Bastien Guerry's avatar
Bastien Guerry committed
184
		 (const :tag "Pico Lisp" picolisp)
Carsten Dominik's avatar
Carsten Dominik committed
185
		 (const :tag "PlantUML" plantuml)
186 187 188
		 (const :tag "Python" python)
		 (const :tag "Ruby" ruby)
		 (const :tag "Sass" sass)
Carsten Dominik's avatar
Carsten Dominik committed
189
		 (const :tag "Scheme" scheme)
190 191
		 (const :tag "Screen" screen)
		 (const :tag "Shell Script" sh)
Bastien Guerry's avatar
Bastien Guerry committed
192
		 (const :tag "Shen" shen)
193 194 195 196
		 (const :tag "Sql" sql)
		 (const :tag "Sqlite" sqlite))
		:value-type (boolean :tag "Activate" :value t)))

197
;;;; Customization variables
198 199 200 201 202 203
(defcustom org-clone-delete-id nil
  "Remove ID property of clones of a subtree.
When non-nil, clones of a subtree don't inherit the ID property.
Otherwise they inherit the ID property with a new unique
identifier."
  :type 'boolean
204
  :version "24.1"
205
  :group 'org-id)
Richard M. Stallman's avatar
Richard M. Stallman committed
206

207 208
;;; Version

209
(defconst org-version "7.8.11"
Richard M. Stallman's avatar
Richard M. Stallman committed
210
  "The version number of the file org.el.")
211

212
;;;###autoload
213 214 215 216
(defun org-version (&optional here)
  "Show the org-mode version in the echo area.
With prefix arg HERE, insert it at point."
  (interactive "P")
217 218
  (let* ((origin default-directory)
	 (version org-version)
219 220
	 (git-version)
	 (dir (concat (file-name-directory (locate-library "org")) "../" )))
221 222 223 224 225 226
    (when (and (file-exists-p (expand-file-name ".git" dir))
	       (executable-find "git"))
      (unwind-protect
	  (progn
	    (cd dir)
	    (when (eql 0 (shell-command "git describe --abbrev=4 HEAD"))
227
	      (with-current-buffer "*Shell Command Output*"
228
		(goto-char (point-min))
229 230 231 232 233 234 235 236
		(setq git-version (buffer-substring (point) (point-at-eol))))
	      (subst-char-in-string ?- ?. git-version t)
	      (when (string-match "\\S-"
				  (shell-command-to-string
				   "git diff-index --name-only HEAD --"))
		(setq git-version (concat git-version ".dirty")))
	      (setq version (concat version " (" git-version ")"))))
	(cd origin)))
237 238
    (setq version (format "Org-mode version %s" version))
    (if here (insert version))
239
    (message version)))
Richard M. Stallman's avatar
Richard M. Stallman committed
240

241
;;; Compatibility constants
242

243 244
;;; The custom variables

Richard M. Stallman's avatar
Richard M. Stallman committed
245
(defgroup org nil
246
  "Outline-based notes management and organizer."
Richard M. Stallman's avatar
Richard M. Stallman committed
247 248 249 250
  :tag "Org"
  :group 'outlines
  :group 'calendar)

251 252 253 254 255
(defcustom org-mode-hook nil
  "Mode hook for Org-mode, run after the mode was turned on."
  :group 'org
  :type 'hook)

256 257 258 259 260
(defcustom org-load-hook nil
  "Hook that is run after org.el has been loaded."
  :group 'org
  :type 'hook)

Bastien Guerry's avatar
Bastien Guerry committed
261 262 263
(defcustom org-log-buffer-setup-hook nil
  "Hook that is run after an Org log buffer is created."
  :group 'org
264
  :version "24.1"
Bastien Guerry's avatar
Bastien Guerry committed
265 266
  :type 'hook)

267 268 269 270 271
(defvar org-modules)  ; defined below
(defvar org-modules-loaded nil
  "Have the modules been loaded already?")

(defun org-load-modules-maybe (&optional force)
272
  "Load all extensions listed in `org-modules'."
273 274 275 276 277 278 279 280 281 282 283 284 285
  (when (or force (not org-modules-loaded))
    (mapc (lambda (ext)
	    (condition-case nil (require ext)
	      (error (message "Problems while trying to load feature `%s'" ext))))
	  org-modules)
    (setq org-modules-loaded t)))

(defun org-set-modules (var value)
  "Set VAR to VALUE and call `org-load-modules-maybe' with the force flag."
  (set var value)
  (when (featurep 'org)
    (org-load-modules-maybe 'force)))

286 287 288 289
(when (org-bound-and-true-p org-modules)
  (let ((a (member 'org-infojs org-modules)))
    (and a (setcar a 'org-jsinfo))))

290
(defcustom org-modules '(org-bbdb org-bibtex org-docview org-gnus org-info org-jsinfo org-irc org-mew org-mhe org-rmail org-vm org-w3m org-wl)
291
  "Modules that should always be loaded together with org.el.
292
If a description starts with <C>, the file is not part of Emacs
293 294 295 296
and loading it will require that you have downloaded and properly installed
the org-mode distribution.

You can also use this system to load external packages (i.e. neither Org
297
core modules, nor modules from the CONTRIB directory).  Just add symbols
298
to the end of the list.  If the package is called org-xyz.el, then you need
299 300 301
to add the symbol `xyz', and the package must have a call to

   (provide 'org-xyz)"
302
  :group 'org
303 304 305 306 307
  :set 'org-set-modules
  :type
  '(set :greedy t
	(const :tag "   bbdb:              Links to BBDB entries" org-bbdb)
	(const :tag "   bibtex:            Links to BibTeX entries" org-bibtex)
308
	(const :tag "   crypt:             Encryption of subtrees" org-crypt)
309 310
	(const :tag "   ctags:             Access to Emacs tags with links" org-ctags)
	(const :tag "   docview:           Links to doc-view buffers" org-docview)
311
	(const :tag "   gnus:              Links to GNUS folders/messages" org-gnus)
312
	(const :tag "   id:                Global IDs for identifying entries" org-id)
313
	(const :tag "   info:              Links to Info nodes" org-info)
314
	(const :tag "   jsinfo:            Set up Sebastian Rose's JavaScript org-info.js" org-jsinfo)
315
	(const :tag "   habit:             Track your consistency with habits" org-habit)
316
	(const :tag "   inlinetask:        Tasks independent of outline hierarchy" org-inlinetask)
317 318 319 320
	(const :tag "   irc:               Links to IRC/ERC chat sessions" org-irc)
	(const :tag "   mac-message:       Links to messages in Apple Mail" org-mac-message)
	(const :tag "   mew                Links to Mew folders/messages" org-mew)
	(const :tag "   mhe:               Links to MHE folders/messages" org-mhe)
321
	(const :tag "   protocol:          Intercept calls from emacsclient" org-protocol)
322
	(const :tag "   rmail:             Links to RMAIL folders/messages" org-rmail)
323
	(const :tag "   special-blocks:    Turn blocks into LaTeX envs and HTML divs" org-special-blocks)
324 325
	(const :tag "   vm:                Links to VM folders/messages" org-vm)
	(const :tag "   wl:                Links to Wanderlust folders/messages" org-wl)
326
	(const :tag "   w3m:               Special cut/paste from w3m to Org-mode." org-w3m)
327
	(const :tag "   mouse:             Additional mouse support" org-mouse)
Carsten Dominik's avatar
Carsten Dominik committed
328
	(const :tag "   TaskJuggler:       Export tasks to a TaskJuggler project" org-taskjuggler)
329 330

	(const :tag "C  annotate-file:     Annotate a file with org syntax" org-annotate-file)
331
	(const :tag "C  bookmark:          Org-mode links to bookmarks" org-bookmark)
332 333 334
	(const :tag "C  checklist:         Extra functions for checklists in repeated tasks" org-checklist)
	(const :tag "C  choose:            Use TODO keywords to mark decisions states" org-choose)
	(const :tag "C  collector:         Collect properties into tables" org-collector)
335
	(const :tag "C  depend:            TODO dependencies for Org-mode\n\t\t\t(PARTIALLY OBSOLETE, see built-in dependency support))" org-depend)
336
	(const :tag "C  drill:             Flashcards and spaced repetition for Org-mode" org-drill)
337
	(const :tag "C  elisp-symbol:      Org-mode links to emacs-lisp symbols" org-elisp-symbol)
338
	(const :tag "C  eshell             Support for links to working directories in eshell" org-eshell)
339
	(const :tag "C  eval:              Include command output as text" org-eval)
340
	(const :tag "C  eval-light:        Evaluate inbuffer-code on demand" org-eval-light)
341
	(const :tag "C  expiry:            Expiry mechanism for Org-mode entries" org-expiry)
342
	(const :tag "C  exp-bibtex:        Export citations using BibTeX" org-exp-bibtex)
343
	(const :tag "C  git-link:          Provide org links to specific file version" org-git-link)
344 345
	(const :tag "C  interactive-query: Interactive modification of tags query\n\t\t\t(PARTIALLY OBSOLETE, see secondary filtering)" org-interactive-query)

346
        (const :tag "C  invoice:           Help manage client invoices in Org-mode" org-invoice)
347

348 349 350
	(const :tag "C  jira:              Add a jira:ticket protocol to Org-mode" org-jira)
	(const :tag "C  learn:             SuperMemo's incremental learning algorithm" org-learn)
	(const :tag "C  mairix:            Hook mairix search into Org-mode for different MUAs" org-mairix)
351
	(const :tag "C  notmuch:           Provide org links to notmuch searches or messages" org-notmuch)
352
	(const :tag "C  mac-iCal           Imports events from iCal.app to the Emacs diary" org-mac-iCal)
353
	(const :tag "C  mac-link-grabber   Grab links and URLs from various Mac applications" org-mac-link-grabber)
354
	(const :tag "C  man:               Support for links to manpages in Org-mode" org-man)
355
	(const :tag "C  mtags:             Support for muse-like tags" org-mtags)
356
	(const :tag "C  panel:             Simple routines for us with bad memory" org-panel)
357
	(const :tag "C  registry:          A registry for Org-mode links" org-registry)
358 359
	(const :tag "C  org2rem:           Convert org appointments into reminders" org2rem)
	(const :tag "C  screen:            Visit screen sessions through Org-mode links" org-screen)
360
	(const :tag "C  secretary:         Team management with org-mode" org-secretary)
361
	(const :tag "C  sqlinsert:         Convert Org-mode tables to SQL insertions" orgtbl-sqlinsert)
362
	(const :tag "C  toc:               Table of contents for Org-mode buffer" org-toc)
363
	(const :tag "C  track:             Keep up with Org-mode development" org-track)
Carsten Dominik's avatar
Carsten Dominik committed
364 365
	(const :tag "C  velocity           Something like Notational Velocity for Org" org-velocity)
	(const :tag "C  wikinodes:         CamelCase wiki-like links" org-wikinodes)
366 367
	(repeat :tag "External packages" :inline t (symbol :tag "Package"))))

368
(defcustom org-support-shift-select nil
369
  "Non-nil means make shift-cursor commands select text when possible.
370

Bastien Guerry's avatar
Bastien Guerry committed
371 372 373 374 375 376
In Emacs 23, when `shift-select-mode' is on, shifted cursor keys
start selecting a region, or enlarge regions started in this way.
In Org-mode, in special contexts, these same keys are used for
other purposes, important enough to compete with shift selection.
Org tries to balance these needs by supporting `shift-select-mode'
outside these special contexts, under control of this variable.
377 378 379 380 381 382 383 384 385 386

The default of this variable is nil, to avoid confusing behavior.  Shifted
cursor keys will then execute Org commands in the following contexts:
- on a headline, changing TODO state (left/right) and priority (up/down)
- on a time stamp, changing the time
- in a plain list item, changing the bullet type
- in a property definition line, switching between allowed values
- in the BEGIN line of a clock table (changing the time block).
Outside these contexts, the commands will throw an error.

Bastien Guerry's avatar
Bastien Guerry committed
387 388 389 390 391
When this variable is t and the cursor is not in a special
context, Org-mode will support shift-selection for making and
enlarging regions.  To make this more effective, the bullet
cycling will no longer happen anywhere in an item line, but only
if the cursor is exactly on the bullet.
392 393

If you set this variable to the symbol `always', then the keys
Bastien Guerry's avatar
Bastien Guerry committed
394 395 396 397 398 399
will not be special in headlines, property lines, and item lines,
to make shift selection work there as well.  If this is what you
want, you can use the following alternative commands: `C-c C-t'
and `C-c ,' to change TODO state and priority, `C-u C-u C-c C-t'
can be used to switch TODO sets, `C-c -' to cycle item bullet
types, and properties can be edited by hand or in column view.
400 401 402 403

However, when the cursor is on a timestamp, shift-cursor commands
will still edit the time stamp - this is just too good to give up.

Bastien Guerry's avatar
Bastien Guerry committed
404 405
XEmacs user should have this variable set to nil, because
`shift-select-mode' is in Emacs 23 or later only."
406 407 408 409 410
  :group 'org
  :type '(choice
	  (const :tag "Never" nil)
	  (const :tag "When outside special context" t)
	  (const :tag "Everywhere except timestamps" always)))
411

Bastien Guerry's avatar
Bastien Guerry committed
412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433
(defcustom org-loop-over-headlines-in-active-region nil
  "Shall some commands act upon headlines in the active region?

When set to `t', some commands will be performed in all headlines
within the active region.

When set to `start-level', some commands will be performed in all
headlines within the active region, provided that these headlines
are of the same level than the first one.

When set to a string, those commands will be performed on the
matching headlines within the active region.  Such string must be
a tags/property/todo match as it is used in the agenda tags view.

The list of commands is: `org-schedule', `org-deadline',
`org-todo', `org-archive-subtree', `org-archive-set-tag' and
`org-archive-to-archive-sibling'.  The archiving commands skip
already archived entries."
  :type '(choice (const :tag "Don't loop" nil)
		 (const :tag "All headlines in active region" t)
		 (const :tag "In active region, headlines at the same level than the first one" 'start-level)
		 (string :tag "Tags/Property/Todo matcher"))
434
  :version "24.1"
Bastien Guerry's avatar
Bastien Guerry committed
435 436 437
  :group 'org-todo
  :group 'org-archive)

Richard M. Stallman's avatar
Richard M. Stallman committed
438 439 440 441 442 443
(defgroup org-startup nil
  "Options concerning startup of Org-mode."
  :tag "Org Startup"
  :group 'org)

(defcustom org-startup-folded t
444
  "Non-nil means entering Org-mode will switch to OVERVIEW.
445 446 447
This can also be configured on a per-file basis by adding one of
the following lines anywhere in the buffer:

448 449 450 451
   #+STARTUP: fold              (or `overview', this is equivalent)
   #+STARTUP: nofold            (or `showall', this is equivalent)
   #+STARTUP: content
   #+STARTUP: showeverything"
Richard M. Stallman's avatar
Richard M. Stallman committed
452
  :group 'org-startup
453
  :type '(choice
454 455
	  (const :tag "nofold: show all" nil)
	  (const :tag "fold: overview" t)
456 457
	  (const :tag "content: all headlines" content)
	  (const :tag "show everything, even drawers" showeverything)))
Richard M. Stallman's avatar
Richard M. Stallman committed
458 459

(defcustom org-startup-truncated t
460
  "Non-nil means entering Org-mode will set `truncate-lines'.
Richard M. Stallman's avatar
Richard M. Stallman committed
461 462 463 464 465
This is useful since some lines containing links can be very long and
uninteresting.  Also tables look terrible when wrapped."
  :group 'org-startup
  :type 'boolean)

466
(defcustom org-startup-indented nil
467
  "Non-nil means turn on `org-indent-mode' on startup.
468 469 470 471 472 473 474 475 476 477
This can also be configured on a per-file basis by adding one of
the following lines anywhere in the buffer:

   #+STARTUP: indent
   #+STARTUP: noindent"
  :group 'org-structure
  :type '(choice
	  (const :tag "Not" nil)
	  (const :tag "Globally (slow on startup in large files)" t)))

478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502
(defcustom org-use-sub-superscripts t
  "Non-nil means interpret \"_\" and \"^\" for export.
When this option is turned on, you can use TeX-like syntax for sub- and
superscripts.  Several characters after \"_\" or \"^\" will be
considered as a single item - so grouping with {} is normally not
needed.  For example, the following things will be parsed as single
sub- or superscripts.

 10^24   or   10^tau     several digits will be considered 1 item.
 10^-12  or   10^-tau    a leading sign with digits or a word
 x^2-y^3                 will be read as x^2 - y^3, because items are
			 terminated by almost any nonword/nondigit char.
 x_{i^2} or   x^(2-i)    braces or parenthesis do grouping.

Still, ambiguity is possible - so when in doubt use {} to enclose the
sub/superscript.  If you set this variable to the symbol `{}',
the braces are *required* in order to trigger interpretations as
sub/superscript.  This can be helpful in documents that need \"_\"
frequently in plain text.

Not all export backends support this, but HTML does.

This option can also be set with the +OPTIONS line, e.g. \"^:nil\"."
  :group 'org-startup
  :group 'org-export-translation
503
  :version "24.1"
504 505 506 507 508 509 510 511 512
  :type '(choice
	  (const :tag "Always interpret" t)
	  (const :tag "Only with braces" {})
	  (const :tag "Never interpret" nil)))

(if (fboundp 'defvaralias)
    (defvaralias 'org-export-with-sub-superscripts 'org-use-sub-superscripts))


513 514 515 516 517 518 519
(defcustom org-startup-with-beamer-mode nil
  "Non-nil means turn on `org-beamer-mode' on startup.
This can also be configured on a per-file basis by adding one of
the following lines anywhere in the buffer:

   #+STARTUP: beamer"
  :group 'org-startup
520
  :version "24.1"
521 522
  :type 'boolean)

523
(defcustom org-startup-align-all-tables nil
524
  "Non-nil means align all tables when visiting a file.
525
This is useful when the column width in tables is forced with <N> cookies
526 527 528 529 530
in table fields.  Such tables will look correct only after the first re-align.
This can also be configured on a per-file basis by adding one of
the following lines anywhere in the buffer:
   #+STARTUP: align
   #+STARTUP: noalign"
531 532 533
  :group 'org-startup
  :type 'boolean)

Carsten Dominik's avatar
Carsten Dominik committed
534 535 536 537 538 539 540
(defcustom org-startup-with-inline-images nil
  "Non-nil means show inline images when loading a new Org file.
This can also be configured on a per-file basis by adding one of
the following lines anywhere in the buffer:
   #+STARTUP: inlineimages
   #+STARTUP: noinlineimages"
  :group 'org-startup
541
  :version "24.1"
Carsten Dominik's avatar
Carsten Dominik committed
542 543
  :type 'boolean)

544
(defcustom org-insert-mode-line-in-empty-file nil
Richard M. Stallman's avatar
Richard M. Stallman committed
545
  "Non-nil means insert the first line setting Org-mode in empty files.
546
When the function `org-mode' is called interactively in an empty file, this
Richard M. Stallman's avatar
Richard M. Stallman committed
547 548
normally means that the file name does not automatically trigger Org-mode.
To ensure that the file will always be in Org-mode in the future, a
549 550
line enforcing Org-mode will be inserted into the buffer, if this option
has been set."
Richard M. Stallman's avatar
Richard M. Stallman committed
551 552 553
  :group 'org-startup
  :type 'boolean)

554 555 556
(defcustom org-replace-disputed-keys nil
  "Non-nil means use alternative key bindings for some keys.
Org-mode uses S-<cursor> keys for changing timestamps and priorities.
557 558
These keys are also used by other packages like shift-selection-mode'
\(built into Emacs 23), `CUA-mode' or `windmove.el'.
559 560 561
If you want to use Org-mode together with one of these other modes,
or more generally if you would like to move some Org-mode commands to
other keys, set this variable and configure the keys with the variable
562
`org-disputed-keys'.
Richard M. Stallman's avatar
Richard M. Stallman committed
563

564 565 566
This option is only relevant at load-time of Org-mode, and must be set
*before* org.el is loaded.  Changing it requires a restart of Emacs to
become effective."
567 568
  :group 'org-startup
  :type 'boolean)
Richard M. Stallman's avatar
Richard M. Stallman committed
569

570
(defcustom org-use-extra-keys nil
571 572 573 574
  "Non-nil means use extra key sequence definitions for certain commands.
This happens automatically if you run XEmacs or if `window-system'
is nil.  This variable lets you do the same manually.  You must
set it before loading org.
575 576 577 578 579 580 581 582

Example: on Carbon Emacs 22 running graphically, with an external
keyboard on a Powerbook, the default way of setting M-left might
not work for either Alt or ESC.  Setting this variable will make
it work for ESC."
  :group 'org-startup
  :type 'boolean)

583 584 585 586 587 588 589 590 591 592
(if (fboundp 'defvaralias)
    (defvaralias 'org-CUA-compatible 'org-replace-disputed-keys))

(defcustom org-disputed-keys
  '(([(shift up)]		. [(meta p)])
    ([(shift down)]		. [(meta n)])
    ([(shift left)]		. [(meta -)])
    ([(shift right)]		. [(meta +)])
    ([(control shift right)] 	. [(meta shift +)])
    ([(control shift left)]	. [(meta shift -)]))
593
  "Keys for which Org-mode and other modes compete.
594 595 596 597 598 599 600 601
This is an alist, cars are the default keys, second element specifies
the alternative to use when `org-replace-disputed-keys' is t.

Keys can be specified in any syntax supported by `define-key'.
The value of this option takes effect only at Org-mode's startup,
therefore you'll have to restart Emacs to apply it after changing."
  :group 'org-startup
  :type 'alist)
602 603

(defun org-key (key)
604
  "Select key according to `org-replace-disputed-keys' and `org-disputed-keys'.
605 606 607 608 609 610 611 612 613 614 615
Or return the original if not disputed.
Also apply the translations defined in `org-xemacs-key-equivalents'."
  (when org-replace-disputed-keys
    (let* ((nkey (key-description key))
	   (x (org-find-if (lambda (x)
			     (equal (key-description (car x)) nkey))
			   org-disputed-keys)))
      (setq key (if x (cdr x) key))))
  (when (featurep 'xemacs)
    (setq key (or (cdr (assoc key org-xemacs-key-equivalents)) key)))
  key)
616 617 618 619 620 621 622 623 624 625 626

(defun org-find-if (predicate seq)
  (catch 'exit
    (while seq
      (if (funcall predicate (car seq))
	  (throw 'exit (car seq))
	(pop seq)))))

(defun org-defkey (keymap key def)
  "Define a key, possibly translated, as returned by `org-key'."
  (define-key keymap (org-key key) def))
627

628
(defcustom org-ellipsis nil
629 630
  "The ellipsis to use in the Org-mode outline.
When nil, just use the standard three dots.  When a string, use that instead,
631
When a face, use the standard 3 dots, but with the specified face.
632
The change affects only Org-mode (which will then use its own display table).
633 634 635 636
Changing this requires executing `M-x org-mode' in a buffer to become
effective."
  :group 'org-startup
  :type '(choice (const :tag "Default" nil)
637
		 (face :tag "Face" :value org-warning)
638 639 640 641 642 643 644 645 646
		 (string :tag "String" :value "...#")))

(defvar org-display-table nil
  "The display table for org-mode, in case `org-ellipsis' is non-nil.")

(defgroup org-keywords nil
  "Keywords in Org-mode."
  :tag "Org Keywords"
  :group 'org)
Richard M. Stallman's avatar
Richard M. Stallman committed
647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665

(defcustom org-deadline-string "DEADLINE:"
  "String to mark deadline entries.
A deadline is this string, followed by a time stamp.  Should be a word,
terminated by a colon.  You can insert a schedule keyword and
a timestamp with \\[org-deadline].
Changes become only effective after restarting Emacs."
  :group 'org-keywords
  :type 'string)

(defcustom org-scheduled-string "SCHEDULED:"
  "String to mark scheduled TODO entries.
A schedule is this string, followed by a time stamp.  Should be a word,
terminated by a colon.  You can insert a schedule keyword and
a timestamp with \\[org-schedule].
Changes become only effective after restarting Emacs."
  :group 'org-keywords
  :type 'string)

Carsten Dominik's avatar
Carsten Dominik committed
666
(defcustom org-closed-string "CLOSED:"
667
  "String used as the prefix for timestamps logging closing a TODO entry."
Carsten Dominik's avatar
Carsten Dominik committed
668 669 670
  :group 'org-keywords
  :type 'string)

671 672 673 674 675
(defcustom org-clock-string "CLOCK:"
  "String used as prefix for timestamps clocking work hours on an item."
  :group 'org-keywords
  :type 'string)

Richard M. Stallman's avatar
Richard M. Stallman committed
676 677 678 679 680 681 682 683
(defcustom org-comment-string "COMMENT"
  "Entries starting with this keyword will never be exported.
An entry can be toggled between COMMENT and normal with
\\[org-toggle-comment].
Changes become only effective after restarting Emacs."
  :group 'org-keywords
  :type 'string)

684 685 686 687 688
(defcustom org-quote-string "QUOTE"
  "Entries starting with this keyword will be exported in fixed-width font.
Quoting applies only to the text in the entry following the headline, and does
not extend beyond the next headline, even if that is lower level.
An entry can be toggled between QUOTE and normal with
689
\\[org-toggle-fixed-width-section]."
690 691 692
  :group 'org-keywords
  :type 'string)

693
(defconst org-repeat-re
694
  "<[0-9]\\{4\\}-[0-9][0-9]-[0-9][0-9] [^>\n]*?\\([.+]?\\+[0-9]+[dwmy]\\(/[0-9]+[dwmy]\\)?\\)"
695 696 697
  "Regular expression for specifying repeated events.
After a match, group 1 contains the repeat expression.")

698 699 700 701
(defgroup org-structure nil
  "Options concerning the general structure of Org-mode files."
  :tag "Org Structure"
  :group 'org)
702

703 704 705 706 707
(defgroup org-reveal-location nil
  "Options about how to make context of a location visible."
  :tag "Org Reveal Location"
  :group 'org-structure)

708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726
(defconst org-context-choice
  '(choice
    (const :tag "Always" t)
    (const :tag "Never" nil)
    (repeat :greedy t :tag "Individual contexts"
	    (cons
	     (choice :tag "Context"
		     (const agenda)
		     (const org-goto)
		     (const occur-tree)
		     (const tags-tree)
		     (const link-search)
		     (const mark-goto)
		     (const bookmark-jump)
		     (const isearch)
		     (const default))
	     (boolean))))
  "Contexts for the reveal options.")

727
(defcustom org-show-hierarchy-above '((default . t))
728
  "Non-nil means show full hierarchy when revealing a location.
729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744
Org-mode often shows locations in an org-mode file which might have
been invisible before.  When this is set, the hierarchy of headings
above the exposed location is shown.
Turning this off for example for sparse trees makes them very compact.
Instead of t, this can also be an alist specifying this option for different
contexts.  Valid contexts are
  agenda         when exposing an entry from the agenda
  org-goto       when using the command `org-goto' on key C-c C-j
  occur-tree     when using the command `org-occur' on key C-c /
  tags-tree      when constructing a sparse tree based on tags matches
  link-search    when exposing search matches associated with a link
  mark-goto      when exposing the jump goal of a mark
  bookmark-jump  when exposing a bookmark location
  isearch        when exiting from an incremental search
  default        default for all contexts not set explicitly"
  :group 'org-reveal-location
745
  :type org-context-choice)
746

747
(defcustom org-show-following-heading '((default . nil))
748
  "Non-nil means show following heading when revealing a location.
749 750 751 752 753 754 755 756 757
Org-mode often shows locations in an org-mode file which might have
been invisible before.  When this is set, the heading following the
match is shown.
Turning this off for example for sparse trees makes them very compact,
but makes it harder to edit the location of the match.  In such a case,
use the command \\[org-reveal] to show more context.
Instead of t, this can also be an alist specifying this option for different
contexts.  See `org-show-hierarchy-above' for valid contexts."
  :group 'org-reveal-location
758
  :type org-context-choice)
759 760

(defcustom org-show-siblings '((default . nil) (isearch t))
761
  "Non-nil means show all sibling heading when revealing a location.
762 763 764 765 766 767 768 769 770 771 772 773
Org-mode often shows locations in an org-mode file which might have
been invisible before.  When this is set, the sibling of the current entry
heading are all made visible.  If `org-show-hierarchy-above' is t,
the same happens on each level of the hierarchy above the current entry.

By default this is on for the isearch context, off for all other contexts.
Turning this off for example for sparse trees makes them very compact,
but makes it harder to edit the location of the match.  In such a case,
use the command \\[org-reveal] to show more context.
Instead of t, this can also be an alist specifying this option for different
contexts.  See `org-show-hierarchy-above' for valid contexts."
  :group 'org-reveal-location
774 775 776
  :type org-context-choice)

(defcustom org-show-entry-below '((default . nil))
777
  "Non-nil means show the entry below a headline when revealing a location.
778 779 780 781 782 783 784 785 786
Org-mode often shows locations in an org-mode file which might have
been invisible before.  When this is set, the text below the headline that is
exposed is also shown.

By default this is off for all contexts.
Instead of t, this can also be an alist specifying this option for different
contexts.  See `org-show-hierarchy-above' for valid contexts."
  :group 'org-reveal-location
  :type org-context-choice)
787

788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806
(defcustom org-indirect-buffer-display 'other-window
  "How should indirect tree buffers be displayed?
This applies to indirect buffers created with the commands
\\[org-tree-to-indirect-buffer] and \\[org-agenda-tree-to-indirect-buffer].
Valid values are:
current-window   Display in the current window
other-window     Just display in another window.
dedicated-frame  Create one new frame, and re-use it each time.
new-frame        Make a new frame each time.  Note that in this case
                 previously-made indirect buffers are kept, and you need to
                 kill these buffers yourself."
  :group 'org-structure
  :group 'org-agenda-windows
  :type '(choice
	  (const :tag "In current window" current-window)
	  (const :tag "In current frame, other window" other-window)
	  (const :tag "Each time a new frame" new-frame)
	  (const :tag "One dedicated frame" dedicated-frame)))

807
(defcustom org-use-speed-commands nil
808
  "Non-nil means activate single letter commands at beginning of a headline.
809 810
This may also be a function to test for appropriate locations where speed
commands should be active."
811
  :group 'org-structure
812 813 814 815
  :type '(choice
	  (const :tag "Never" nil)
	  (const :tag "At beginning of headline stars" t)
	  (function)))
816 817 818 819 820 821 822 823 824

(defcustom org-speed-commands-user nil
    "Alist of additional speed commands.
This list will be checked before `org-speed-commands-default'
when the variable `org-use-speed-commands' is non-nil
and when the cursor is at the beginning of a headline.
The car if each entry is a string with a single letter, which must
be assigned to `self-insert-command' in the global map.
The cdr is either a command to be called interactively, a function
825 826 827
to be called, or a form to be evaluated.
An entry that is just a list with a single string will be interpreted
as a descriptive headline that will be added when listing the speed
828
commands in the Help buffer using the `?' speed command."
829
    :group 'org-structure
830 831 832 833 834 835 836 837
    :type '(repeat :value ("k" . ignore)
	    (choice :value ("k" . ignore)
	     (list :tag "Descriptive Headline" (string :tag "Headline"))
	     (cons :tag "Letter and Command"
	      (string :tag "Command letter")
	      (choice
	       (function)
	       (sexp))))))
838

839 840 841 842
(defgroup org-cycle nil
  "Options concerning visibility cycling in Org-mode."
  :tag "Org Cycle"
  :group 'org-structure)
843

844
(defcustom org-cycle-skip-children-state-if-no-children t
845
  "Non-nil means skip CHILDREN state in entries that don't have any."
846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863
  :group 'org-cycle
  :type 'boolean)

(defcustom org-cycle-max-level nil
  "Maximum level which should still be subject to visibility cycling.
Levels higher than this will, for cycling, be treated as text, not a headline.
When `org-odd-levels-only' is set, a value of N in this variable actually
means 2N-1 stars as the limiting headline.
When nil, cycle all levels.
Note that the limiting level of cycling is also influenced by
`org-inlinetask-min-level'.  When `org-cycle-max-level' is not set but
`org-inlinetask-min-level' is, cycling will be limited to levels one less
than its value."
  :group 'org-cycle
  :type '(choice
	  (const :tag "No limit" nil)
	  (integer :tag "Maximum level")))

Bastien Guerry's avatar
Bastien Guerry committed
864
(defcustom org-drawers '("PROPERTIES" "CLOCK" "LOGBOOK" "RESULTS")
865 866 867 868 869
  "Names of drawers.  Drawers are not opened by cycling on the headline above.
Drawers only open with a TAB on the drawer line itself.  A drawer looks like
this:
   :DRAWERNAME:
   .....
870 871
   :END:
The drawer \"PROPERTIES\" is special for capturing properties through
John Wiegley's avatar
John Wiegley committed
872 873 874 875 876
the property API.

Drawers can be defined on the per-file basis with a line like:

#+DRAWERS: HIDDEN STATE PROPERTIES"
877
  :group 'org-structure
878
  :group 'org-cycle
879 880
  :type '(repeat (string :tag "Drawer Name")))

881
(defcustom org-hide-block-startup nil
882
  "Non-nil means entering Org-mode will fold all blocks.
883 884 885 886 887 888 889 890
This can also be set in on a per-file basis with

#+STARTUP: hideblocks
#+STARTUP: showblocks"
  :group 'org-startup
  :group 'org-cycle
  :type 'boolean)

891
(defcustom org-cycle-global-at-bob nil
892 893
  "Cycle globally if cursor is at beginning of buffer and not at a headline.
This makes it possible to do global cycling without having to use S-TAB or
894 895
\\[universal-argument] TAB.  For this special case to work, the first line \
of the buffer
896
must not be a headline - it may be empty or some other text.  When used in
897 898 899 900 901 902 903
this way, `org-cycle-hook' is disables temporarily, to make sure the
cursor stays at the beginning of the buffer.
When this option is nil, don't do anything special at the beginning
of the buffer."
  :group 'org-cycle
  :type 'boolean)

904
(defcustom org-cycle-level-after-item/entry-creation t
905
  "Non-nil means cycle entry level or item indentation in new empty entries.
906 907 908

When the cursor is at the end of an empty headline, i.e with only stars
and maybe a TODO keyword, TAB will then switch the entry to become a child,
909
and then all possible ancestor states, before returning to the original state.
910 911 912 913 914 915 916 917 918
This makes data entry extremely fast:  M-RET to create a new headline,
on TAB to make it a child, two or more tabs to make it a (grand-)uncle.

When the cursor is at the end of an empty plain list item, one TAB will
make it a subitem, two or more tabs will back up to make this an item
higher up in the item hierarchy."
  :group 'org-cycle
  :type 'boolean)

919 920
(defcustom org-cycle-emulate-tab t
  "Where should `org-cycle' emulate TAB.
921 922
nil         Never
white       Only in completely white lines
923
whitestart  Only at the beginning of lines, before the first non-white char
924
t           Everywhere except in headlines
925
exc-hl-bol  Everywhere except at the start of a headline
926 927
If TAB is used in a place where it does not emulate TAB, the current subtree
visibility is cycled."
928 929 930
  :group 'org-cycle
  :type '(choice (const :tag "Never" nil)
		 (const :tag "Only in completely white lines" white)
931
		 (const :tag "Before first char in a line" whitestart)
932
		 (const :tag "Everywhere except in headlines" t)
933
		 (const :tag "Everywhere except at bol in headlines" exc-hl-bol)
934
		 ))
935

936 937 938 939 940 941
(defcustom org-cycle-separator-lines 2
  "Number of empty lines needed to keep an empty line between collapsed trees.
If you leave an empty line between the end of a subtree and the following
headline, this empty line is hidden when the subtree is folded.
Org-mode will leave (exactly) one empty line visible if the number of
empty lines is equal or larger to the number given in this variable.
942
So the default 2 means at least 2 empty lines after the end of a subtree
943 944 945
are needed to produce free space between a collapsed subtree and the
following headline.

946 947 948
If the number is negative, and the number of empty lines is at least -N,
all empty lines are shown.

949 950 951
Special case: when 0, never leave empty lines in collapsed view."
  :group 'org-cycle
  :type 'integer)
952
(put 'org-cycle-separator-lines 'safe-local-variable 'integerp)
953

954 955 956 957 958 959 960 961 962 963
(defcustom org-pre-cycle-hook nil
  "Hook that is run before visibility cycling is happening.
The function(s) in this hook must accept a single argument which indicates
the new state that will be set right after running this hook.  The
argument is a symbol.  Before a global state change, it can have the values
`overview', `content', or `all'.  Before a local state change, it can have
the values `folded', `children', or `subtree'."
  :group 'org-cycle
  :type 'hook)

Carsten Dominik's avatar
Carsten Dominik committed
964
(defcustom org-cycle-hook '(org-cycle-hide-archived-subtrees
965
			    org-cycle-hide-drawers
966
			    org-cycle-show-empty-lines
Carsten Dominik's avatar
Carsten Dominik committed
967
			    org-optimize-window-after-visibility-change)
968 969 970 971 972 973 974 975
  "Hook that is run after `org-cycle' has changed the buffer visibility.
The function(s) in this hook must accept a single argument which indicates
the new state that was set by the most recent `org-cycle' command.  The
argument is a symbol.  After a global state change, it can have the values
`overview', `content', or `all'.  After a local state change, it can have
the values `folded', `children', or `subtree'."
  :group 'org-cycle
  :type 'hook)
976

977 978 979 980
(defgroup org-edit-structure nil
  "Options concerning structure editing in Org-mode."
  :tag "Org Edit Structure"
  :group 'org-structure)
981

982
(defcustom org-odd-levels-only nil
983
  "Non-nil means skip even levels and only use odd levels for the outline.
984 985 986 987 988 989 990 991 992 993 994
This has the effect that two stars are being added/taken away in
promotion/demotion commands.  It also influences how levels are
handled by the exporters.
Changing it requires restart of `font-lock-mode' to become effective
for fontification also in regions already fontified.
You may also set this on a per-file basis by adding one of the following
lines to the buffer:

   #+STARTUP: odd
   #+STARTUP: oddeven"
  :group 'org-edit-structure
995
  :group 'org-appearance
996 997 998
  :type 'boolean)

(defcustom org-adapt-indentation t
999
  "Non-nil means adapt indentation to outline node level.
1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018

When this variable is set, Org assumes that you write outlines by
indenting text in each node to align with the headline (after the stars).
The following issues are influenced by this variable:

- When this is set and the *entire* text in an entry is indented, the
  indentation is increased by one space in a demotion command, and
  decreased by one in a promotion command.  If any line in the entry
  body starts with text at column 0, indentation is not changed at all.

- Property drawers and planning information is inserted indented when
  this variable s set.  When nil, they will not be indented.

- TAB indents a line relative to context.  The lines below a headline
  will be indented when this variable is set.

Note that this is all about true indentation, by adding and removing
space characters.  See also `org-indent.el' which does level-dependent
indentation in a virtual way, i.e. at display time in Emacs."
1019 1020 1021
  :group 'org-edit-structure
  :type 'boolean)

Carsten Dominik's avatar
Carsten Dominik committed
1022
(defcustom org-special-ctrl-a/e nil
1023
  "Non-nil means `C-a' and `C-e' behave specially in headlines and items.
1024

1025
When t, `C-a' will bring back the cursor to the beginning of the
1026
headline text, i.e. after the stars and after a possible TODO keyword.
1027
In an item, this will be the position after the bullet.
1028
When the cursor is already at that position, another `C-a' will bring
Carsten Dominik's avatar
Carsten Dominik committed
1029
it to the beginning of the line.
1030

Carsten Dominik's avatar
Carsten Dominik committed
1031 1032
`C-e' will jump to the end of the headline, ignoring the presence of tags
in the headline.  A second `C-e' will then jump to the true end of the
1033 1034 1035
line, after any tags.  This also means that, when this variable is
non-nil, `C-e' also will never jump beyond the end of the heading of a
folded section, i.e. not after the ellipses.
1036

1037
When set to the symbol `reversed', the first `C-a' or `C-e' works normally,
1038 1039 1040 1041 1042
going to the true line boundary first.  Only a directly following, identical
keypress will bring the cursor to the special positions.

This may also be a cons cell where the behavior for `C-a' and `C-e' is
set separately."
1043
  :group 'org-edit-structure
1044 1045
  :type '(choice
	  (const :tag "off" nil)
1046 1047
	  (const :tag "on: after stars/bullet and before tags first" t)
	  (const :tag "reversed: true line boundary first" reversed)
1048 1049 1050
	  (cons :tag "Set C-a and C-e separately"
		(choice :tag "Special C-a"
			(const :tag "off" nil)
1051 1052
			(const :tag "on: after  stars/bullet first" t)
			(const :tag "reversed: before stars/bullet first" reversed))
1053 1054
		(choice :tag "Special C-e"
			(const :tag "off" nil)
1055 1056
			(const :tag "on: before tags first" t)
			(const :tag "reversed: after tags first" reversed)))))
Carsten Dominik's avatar
Carsten Dominik committed
1057 1058 1059
(if (fboundp 'defvaralias)
    (defvaralias 'org-special-ctrl-a 'org-special-ctrl-a/e))

1060 1061 1062 1063
(defcustom org-special-ctrl-k nil
  "Non-nil means `C-k' will behave specially in headlines.
When nil, `C-k' will call the default `kill-line' command.
When t, the following will happen while the cursor is in the headline:
1064

1065 1066 1067 1068
- When the cursor is at the beginning of a headline, kill the entire
  line and possible the folded subtree below the line.
- When in the middle of the headline text, kill the headline up to the tags.
- When after the headline text, kill the tags."
1069 1070
  :group 'org-edit-structure
  :type 'boolean)
Richard M. Stallman's avatar
Richard M. Stallman committed
1071

1072 1073 1074 1075 1076 1077 1078
(defcustom org-ctrl-k-protect-subtree nil
  "Non-nil means, do not delete a hidden subtree with C-k.
When set to the symbol `error', simply throw an error when C-k is
used to kill (part-of) a headline that has hidden text behind it.
Any other non-nil value will result in a query to the user, if it is
OK to kill that hidden subtree.  When nil, kill without remorse."
  :group 'org-edit-structure
1079
  :version "24.1"
1080 1081 1082 1083 1084
  :type '(choice
	  (const :tag "Do not protect hidden subtrees" nil)
	  (const :tag "Protect hidden subtrees with a security query" t)
	  (const :tag "Never kill a hidden subtree with C-k" error)))

Bastien Guerry's avatar
Bastien Guerry committed
1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099
(defcustom org-catch-invisible-edits nil
  "Check if in invisible region before inserting or deleting a character.
Valid values are:

nil              Do not check, so just do invisible edits.
error            Throw an error and do nothing.
show             Make point visible, and do the requested edit.
show-and-error   Make point visible, then throw an error and abort the edit.
smart            Make point visible, and do insertion/deletion if it is