Browse Source

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

Carsten Dominik 17 years ago
parent
commit
089ac08747
5 changed files with 108 additions and 3 deletions
  1. 19 0
      ORGWEBPAGE/Changes.org
  2. 2 0
      doc/ChangeLog
  3. 6 1
      doc/org.texi
  4. 7 0
      lisp/ChangeLog
  5. 74 2
      lisp/org.el

+ 19 - 0
ORGWEBPAGE/Changes.org

@@ -32,6 +32,25 @@
 
 
 ** Details
 ** 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
 *** New interpretation of prefix arguments when exiting remember
     The prefix argument to the `C-c C-c' command that finishes a
     The prefix argument to the `C-c C-c' command that finishes a
     remember process is not interpetred differently:
     remember process is not interpetred differently:

+ 2 - 0
doc/ChangeLog

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

+ 6 - 1
doc/org.texi

@@ -6925,7 +6925,12 @@ example:
 @item C-c '
 @item C-c '
 Edit the source code example at point in its native mode.  This works by
 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
 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
 @end table
 
 
 
 

+ 7 - 0
lisp/ChangeLog

@@ -1,5 +1,12 @@
 2008-09-05  Carsten Dominik  <dominik@science.uva.nl>
 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
 	* org-remember.el (org-remember-templates): Add nil instead of
 	empty strings to fix the length of remember templates.
 	empty strings to fix the length of remember templates.
 
 

+ 74 - 2
lisp/org.el

@@ -669,6 +669,16 @@ See also the QUOTE keyword."
   :group 'org-edit-structure
   :group 'org-edit-structure
   :type 'boolean)
   :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
 (defcustom org-goto-auto-isearch t
   "Non-nil means, typing characters in org-goto starts incremental search."
   "Non-nil means, typing characters in org-goto starts incremental search."
   :group 'org-edit-structure
   :group 'org-edit-structure
@@ -3502,8 +3512,8 @@ will be prompted for."
 	  (throw 'exit t))))))
 	  (throw 'exit t))))))
 
 
 (defun org-activate-code (limit)
 (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)
 	(remove-text-properties (match-beginning 0) (match-end 0)
 				'(display t invisible t intangible t))
 				'(display t invisible t intangible t))
 	t)))
 	t)))
@@ -5433,6 +5443,60 @@ exit by killing the buffer with \\[org-edit-src-exit]."
       (message "%s" msg)
       (message "%s" msg)
       t)))
       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 ()
 (defun org-edit-src-find-region-and-lang ()
   "Find the region and language for a local edit.
   "Find the region and language for a local edit.
 Return a list with beginning and end of the region, a string representing
 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
     (when font-lock-mode
       (font-lock-unfontify-region (point-min) (point-max)))
       (font-lock-unfontify-region (point-min) (point-max)))
     (put-text-property (point-min) (point-max) 'font-lock-fontified t))
     (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))
   (kill-buffer (current-buffer))
   (and (org-mode-p) (org-restart-font-lock)))
   (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>]+\\)"))
       (looking-at "\\(?:#\\+\\(?:setupfile\\|include\\):?[ \t]+\"?\\|[ \t]*<include\\>.*?file=\"\\)\\([^\"\n>]+\\)"))
     (find-file (org-trim (match-string 1))))
     (find-file (org-trim (match-string 1))))
    ((org-edit-src-code))
    ((org-edit-src-code))
+   ((org-edit-fixed-width-region))
    (t (call-interactively 'ffap))))
    (t (call-interactively 'ffap))))
 
 
 (defun org-ctrl-c-ctrl-c (&optional arg)
 (defun org-ctrl-c-ctrl-c (&optional arg)