Implement using artist-mode to edit fixed-width sections.

This commit is contained in:
Carsten Dominik 2008-09-05 13:37:33 +02:00
parent d5ceac5848
commit 089ac08747
5 changed files with 108 additions and 3 deletions

View File

@ -32,6 +32,25 @@
** Details
*** Editing fixed-width regions with picture or artist mode
The command @<code>C-c '@</code> (that is =C-c= followed by a
single quote) can now also be used to switch to a special
editing mode for fixed-width sections. The default mode is
=artist-mode= which allows you to create ASCII drawings.
It works like this: Enter the editing mode with
@<code>C-c '@</code>. An indirect buffer will be created and
narrowed to the fixed-width region. Edit the drawing, and
press @<code>C-c '@</code> again to exit.
Lines in a fixed-width region should be preceded by a colon
followed by at least one space. These will be removed during
editing, and then added back when you exit the editing mode.
Using the command in an empty line will create a new
fixed-width region.
*** New interpretation of prefix arguments when exiting remember
The prefix argument to the `C-c C-c' command that finishes a
remember process is not interpetred differently:

View File

@ -2,6 +2,8 @@
* org.texi (Creating timestamps): Fix documentation of the "C-c ."
command.
(Literal examples): Document using artist-mode for ASCII
drawings.
2008-06-13 Carsten Dominik <dominik@science.uva.nl>

View File

@ -6925,7 +6925,12 @@ example:
@item C-c '
Edit the source code example at point in its native mode. This works by
switching to an indirect buffer, narrowing the buffer and switching to the
other mode. You need to exit by pressing @kbd{C-c '} again.
other mode. You need to exit by pressing @kbd{C-c '} again. Fixed-width
regions (where each line starts with a colon followed by a space) will be
edited using @code{artist-mode}@footnote{You may select a different-mode with
the variable @code{org-edit-fixed-width-region-mode}.} to allow creating
ASCII drawings easily. Using this command in an empty line will create a new
fixed-width region.
@end table

View File

@ -1,5 +1,12 @@
2008-09-05 Carsten Dominik <dominik@science.uva.nl>
* org.el (org-edit-fixed-width-region): New function.
(org-edit-fixed-width-region): Also try
`org-edit-fixed-width-region'.
(org-edit-fixed-width-region-mode): New option.
(org-activate-code): Only interprete lines starting with colon
plus a space as example lines.
* org-remember.el (org-remember-templates): Add nil instead of
empty strings to fix the length of remember templates.

View File

@ -669,6 +669,16 @@ See also the QUOTE keyword."
:group 'org-edit-structure
:type 'boolean)
(defcustom org-edit-fixed-width-region-mode 'artist-mode
"The mode that should be used to edit fixed-width regions.
These are the regions where each line starts with a colon."
:group 'org-edit-structure
:type '(choice
(const artist-mode)
(const picture-mode)
(const fundamental-mode)
(function :tag "Other (specify)")))
(defcustom org-goto-auto-isearch t
"Non-nil means, typing characters in org-goto starts incremental search."
:group 'org-edit-structure
@ -3502,8 +3512,8 @@ will be prompted for."
(throw 'exit t))))))
(defun org-activate-code (limit)
(if (re-search-forward "^[ \t]*\\(:.*\\)" limit t)
(unless (get-text-property (match-beginning 1) 'face)
(if (re-search-forward "^[ \t]*\\(: .*\n?\\)" limit t)
(progn
(remove-text-properties (match-beginning 0) (match-end 0)
'(display t invisible t intangible t))
t)))
@ -5433,6 +5443,60 @@ exit by killing the buffer with \\[org-edit-src-exit]."
(message "%s" msg)
t)))
(defun org-edit-fixed-width-region ()
"Edit the fixed-width ascii drawing at point.
This must be a region where each line starts with ca colon followed by
a space character.
An indirect buffer is created, and that buffer is then narrowed to the
example at point and switched to artist-mode. When done,
exit by killing the buffer with \\[org-edit-src-exit]."
(interactive)
(let ((line (org-current-line))
(case-fold-search t)
(msg (substitute-command-keys
"Edit, then exit with C-c ' (C-c and single quote)"))
(org-mode-p (eq major-mode 'org-mode))
beg end lang lang-f)
(beginning-of-line 1)
(if (looking-at "[ \t]*[^:\n \t]")
nil
(if (looking-at "[ \t]*\\(\n\\|\\'\\)]")
(setq beg (point) end (match-end 0))
(save-excursion
(if (re-search-backward "^[ \t]*[^:]" nil 'move)
(setq beg (point-at-bol 2))
(setq beg (point))))
(save-excursion
(if (re-search-forward "^[ \t]*[^:]" nil 'move)
(setq end (match-beginning 0))
(setq end (point))))
(goto-line line)
(if (get-buffer "*Org Edit Picture*")
(kill-buffer "*Org Edit Picture*"))
(switch-to-buffer (make-indirect-buffer (current-buffer)
"*Org Edit Picture*"))
(narrow-to-region beg end)
(remove-text-properties beg end '(display nil invisible nil
intangible nil))
(when (fboundp 'font-lock-unfontify-region)
(font-lock-unfontify-region (point-min) (point-max)))
(cond
((eq org-edit-fixed-width-region-mode 'artist-mode)
(fundamental-mode)
(artist-mode 1))
(t (funcall org-edit-fixed-width-region-mode)))
(set (make-local-variable 'org-edit-src-force-single-line) nil)
(set (make-local-variable 'org-edit-src-from-org-mode) org-mode-p)
(set (make-local-variable 'org-edit-src-picture) t)
(goto-char (point-min))
(while (re-search-forward "^[ \t]*: " nil t)
(replace-match ""))
(goto-line line)
(org-exit-edit-mode)
(org-set-local 'header-line-format msg)
(message "%s" msg)
t))))
(defun org-edit-src-find-region-and-lang ()
"Find the region and language for a local edit.
Return a list with beginning and end of the region, a string representing
@ -5518,6 +5582,13 @@ the language, a switch telling of the content should be in a single line."
(when font-lock-mode
(font-lock-unfontify-region (point-min) (point-max)))
(put-text-property (point-min) (point-max) 'font-lock-fontified t))
(when (org-bound-and-true-p org-edit-src-picture)
(goto-char (point-min))
(while (re-search-forward "^" nil t)
(replace-match ": "))
(when font-lock-mode
(font-lock-unfontify-region (point-min) (point-max)))
(put-text-property (point-min) (point-max) 'font-lock-fontified t))
(kill-buffer (current-buffer))
(and (org-mode-p) (org-restart-font-lock)))
@ -12971,6 +13042,7 @@ When in an #+include line, visit the include file. Otherwise call
(looking-at "\\(?:#\\+\\(?:setupfile\\|include\\):?[ \t]+\"?\\|[ \t]*<include\\>.*?file=\"\\)\\([^\"\n>]+\\)"))
(find-file (org-trim (match-string 1))))
((org-edit-src-code))
((org-edit-fixed-width-region))
(t (call-interactively 'ffap))))
(defun org-ctrl-c-ctrl-c (&optional arg)