Browse Source

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

Carsten Dominik 16 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
 
+*** 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:

+ 2 - 0
doc/ChangeLog

@@ -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>
 

+ 6 - 1
doc/org.texi

@@ -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
 
 

+ 7 - 0
lisp/ChangeLog

@@ -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.
 

+ 74 - 2
lisp/org.el

@@ -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)