emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: aditya siram <aditya.siram@gmail.com>
To: Eric Schulte <schulte.eric@gmail.com>
Cc: emacs-orgmode@gnu.org
Subject: Re: Jumping from source block to Org block ...
Date: Sat, 14 Sep 2013 11:56:39 -0500	[thread overview]
Message-ID: <CAJrReyjWP5zNQzYThr1KPiA8nq__4Ev3qzYGNiwFk0c2fzpPmQ@mail.gmail.com> (raw)
In-Reply-To: <CAJrReyh5dchL8cpmbBswnG1V4T=2UAMeWAJ6t-CmJd1KkXvueA@mail.gmail.com>


[-- Attachment #1.1: Type: text/plain, Size: 2687 bytes --]

I've included new versions of both patches with most of the changes you
suggested. I guess you'll apply the longer one when you've been notified by
the FSF?

Is this a one-time deal that covers future patches or do I have to do this
with every patch that's over 15 lines long?

Thanks!
-deech


On Sat, Sep 14, 2013 at 10:53 AM, aditya siram <aditya.siram@gmail.com>wrote:

> Thanks for your feedback and your work on org-babel!
>
> Oops, the maintain-point was a hold-over and isn't actually used in the
> code. I'll remove it.
>
> I will incorporate your suggestions.
>
> However, regarding the cascading if statements, how would I use `cond`
> when the predicates are `and`ed and when I need different behavior in the
> else cases?
>
>
> On Sat, Sep 14, 2013 at 10:44 AM, Eric Schulte <schulte.eric@gmail.com>wrote:
>
>> aditya siram <aditya.siram@gmail.com> writes:
>>
>> > Attached is a patch that fixes a bug with jumping from source block
>> back to
>> > the Org file. The problem is that the current detangling behavior does
>> not
>> > take the :padlline flag into account. This stopped.
>> >
>> > Hopefully this is helpful to others ...
>> > -deech
>> >
>>
>> Hi deech,
>>
>> Please see the Org-mode contribution instructions at [1].  A patch of
>> this length would require that you fill out the FSF copyright assignment
>> paperwork before the patch could be applied.
>>
>> As for the content of the patch, my only question is why do you add an
>> optional maintain-point argument to `org-babel-tangle-jump-to-org'?  Is
>> there ever a case when you would not want to maintain the point?
>>
>> Of much less importance I have a couple of stylistic notes about the
>> code which are largely unrelated to its functionality and are included
>> to make future changes easier to read and because I'm a cranky old lisp
>> programmer.
>>
>> - you should indent the code s.t. no lines are longer than 79 characters
>> - comments which float after code (e.g., ";; end of first delimiter")
>>   should only use 1 ; character
>> - the series of if statements (if should-be-padded... if
>>   possibly-padded... if actually-padded...) would be more legible if
>>   written as a single `cond' form.
>>
>> Thanks for this change.  It appears to pass all tests, so after the
>> above have been addressed I'd be very happy to apply it.
>>
>> Thanks for contributing, this is much appreciated!
>>
>> If you have the time and inclination to include a test which fails
>> without this patch applied that would be icing on the cake.
>>
>> Best,
>>
>> Footnotes:
>> [1]  http://orgmode.org/worg/org-contribute.html
>>
>> --
>> Eric Schulte
>> https://cs.unm.edu/~eschulte
>> PGP: 0x614CA05D
>>
>
>

[-- Attachment #1.2: Type: text/html, Size: 3859 bytes --]

[-- Attachment #2: src_block_jump_fix.patch.txt --]
[-- Type: text/plain, Size: 5977 bytes --]

From 791a41a9cb97ae9a237b74c839a1fc2c0f4970db Mon Sep 17 00:00:00 2001
From: Aditya Siram <aditya siram at gmail dot com>
Date: Sat, 14 Sep 2013 11:47:17 -0500
Subject: [PATCH 2/2] Detangling and jumping back now correctly compensate for
 padded chunks

---
 lisp/ob-tangle.el | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 97 insertions(+), 5 deletions(-)

diff --git a/lisp/ob-tangle.el b/lisp/ob-tangle.el
index 8141943..42fa31c 100644
--- a/lisp/ob-tangle.el
+++ b/lisp/ob-tangle.el
@@ -506,8 +506,8 @@ which enable the original code blocks to be found."
   "Jump from a tangled code file to the related Org-mode file."
   (interactive)
   (let ((mid (point))
-	start body-start end done
-        target-buffer target-char link path block-name body)
+	start body-start end done depadded-body
+        target-buffer offset target-char link path block-name body)
     (save-window-excursion
       (save-excursion
 	(while (and (re-search-backward org-bracket-link-analytic-regexp nil t)
@@ -526,7 +526,7 @@ which enable the original code blocks to be found."
 			      (setq end (point-at-bol))))))))
 	(unless (and start (< start mid) (< mid end))
 	  (error "Not in tangled code"))
-        (setq body (org-babel-trim (buffer-substring start end))))
+        (setq body (buffer-substring start end)))
       (when (string-match "::" path)
         (setq path (substring path 0 (match-beginning 0))))
       (find-file path) (setq target-buffer (current-buffer))
@@ -537,12 +537,18 @@ which enable the original code blocks to be found."
         (org-babel-goto-named-src-block block-name))
       ;; position at the beginning of the code block body
       (goto-char (org-babel-where-is-src-block-head))
+      (let* ((pad-adjusted-values
+	      (org-babel-detangle-adjust-for-padlines start mid body))
+	     (depadded-body (car pad-adjusted-values))
+	     (depadded-point (cdr pad-adjusted-values)))
+	(progn
+	  (setq offset depadded-point)
+	  (setq body depadded-body)))
       (forward-line 1)
-      ;; Use org-edit-special to isolate the code.
       (org-edit-special)
       ;; Then move forward the correct number of characters in the
       ;; code buffer.
-      (forward-char (- mid body-start))
+      (forward-char offset)
       ;; And return to the Org-mode buffer with the point in the right
       ;; place.
       (org-edit-src-exit)
@@ -550,6 +556,92 @@ which enable the original code blocks to be found."
     (org-src-switch-to-buffer target-buffer t)
     (prog1 body (goto-char target-char))))
 
+(defun org-babel-detangle-adjust-for-padlines (chunk-start desired-point chunk-body)
+  "Check if :padline was enabled for this chunk and then
+adjust point and body accordingly. Also account for the user
+editing the tangled file and removing the padded lines.
+
+Returns a tuple (body . offset) where body is an adjusted source chunk
+with padded newlines possibly removed and offset is how far into
+that chunk point is. If point was on either of the padlines, point
+is set to the first or last character of the chunk depending on what's
+closer."
+  (save-excursion
+    (let* ((org-block (org-babel-get-src-block-info))
+	   (params (nth 2 org-block))
+	   (org-body (nth 1 org-block))
+	   (should-be-padded (not (string= "no" (cdr (assoc :padline params)))))
+	   (minimal-padded-chunk-length (+ 1 ; end of first delimiter
+					   1 ; newline from first padline
+					   1 ; newline from second padline
+					   1 ; start of second delimiter
+					   ))
+	   (possibly-padded (>= (length chunk-body) minimal-padded-chunk-length))
+	   (char-at (lambda (pos str) (substring str pos (+ pos 1))))
+	   (actually-padded  (and (not (=  (length chunk-body) 0))
+				  (string= "\n" (funcall char-at
+							 1
+							 chunk-body))
+				  (string= "\n" (funcall char-at
+							 (- (length chunk-body)
+							    1 ; start of second delimiter
+							    1 ; newline from second padline
+							    )
+							 chunk-body)))))
+      (if should-be-padded
+	  (if possibly-padded
+	      (if actually-padded
+		  (let* ((start-offset (+ 1 ; end of first delimiter
+					  1 ; newline from first padline
+					  1 ; first character of body
+					  ))
+			 (end-offset (+ 1 ; newline from second padline
+					1 ; eol character after last character of body
+					))
+			 (start-index (- start-offset 1))
+			 (end-index (- (length chunk-body) end-offset))
+			 (depadded-body (substring chunk-body
+						   start-index
+						   end-index))
+			 (distance-from-start (- desired-point chunk-start))
+			 (on-first-padline (= distance-from-start 1))
+			 (on-last-padline (= distance-from-start
+					     (- (length chunk-body) 1)))
+			 (adjusted-distance
+			  (cond (on-first-padline 0)
+				(on-last-padline (length depadded-body))
+				(t (- distance-from-start
+				      (- start-offset
+					 1 ; compensate for the fact that
+					   ; start-offset includes the first
+					   ; character
+					 )))))
+			 (distance-within-org-body (< adjusted-distance
+						      (- (length org-body) 1))))
+		    ;; If this chunk and the org source chunk match
+		    ;; send this chunk back and preserve the desired point
+		    (if (string= org-body depadded-body)
+			`(,depadded-body . ,adjusted-distance)
+		      ;; if the chunks match before the desired point
+		      ;; we can still preserve the point
+		      (if (and distance-within-org-body
+			       (string= (substring org-body
+						   0
+						   adjusted-distance)
+					(substring depadded-body
+						   0
+						   adjusted-distance)))
+			  `(,depadded-body . ,adjusted-distance)
+			;; otherwise we can't preserve the point
+			`(,depadded-body . 0))
+		      `(,depadded-body . 0)))
+		;; The user didn't respect the padlines
+		;; so the whole body goes back unchanged
+		`(,chunk-body . 0))
+	    `(,chunk-body . 0))
+	;; No adjustment needed
+	`(,chunk-body . ,desired-point)))))
+
 (provide 'ob-tangle)
 
 ;; Local variables:
-- 
1.8.1.2


[-- Attachment #3: src_regexp_fix.patch.txt --]
[-- Type: text/plain, Size: 987 bytes --]

From cce0cf9682c01c8ff4d36d0bf06df223b7c7cb6e Mon Sep 17 00:00:00 2001
From: Aditya Siram <aditya siram at gmail dot com>
Date: Fri, 13 Sep 2013 09:57:25 -0500
Subject: [PATCH 1/2] org-babel-src-block-regexp ignores empty body

 org-babel-src-block gobbled up everything until the ending delimiter
 of the next code block. Fixed this by making the body regexp non-greedy.

 lisp/ob-core.el | 2 +
 1 file changed, 1 insertion(+), 1 deletion(-)
---
 lisp/ob-core.el | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lisp/ob-core.el b/lisp/ob-core.el
index d57806b..e8f16a0 100644
--- a/lisp/ob-core.el
+++ b/lisp/ob-core.el
@@ -188,7 +188,7 @@ This string must include a \"%s\" which will be replaced by the results."
    ;; (4) header arguments
    "\\([^\n]*\\)\n"
    ;; (5) body
-   "\\([^\000]*?\n\\)?[ \t]*#\\+end_src")
+   "\\([^\000]*?\n\\)??[ \t]*#\\+end_src")
   "Regexp used to identify code blocks.")
 
 (defvar org-babel-inline-src-block-regexp
-- 
1.8.1.2


  reply	other threads:[~2013-09-14 16:57 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-14  3:04 Jumping from source block to Org block aditya siram
2013-09-14 15:44 ` Eric Schulte
2013-09-14 15:53   ` aditya siram
2013-09-14 16:56     ` aditya siram [this message]
2013-09-15 11:51       ` Eric Schulte
2013-09-15 11:52     ` Eric Schulte

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAJrReyjWP5zNQzYThr1KPiA8nq__4Ev3qzYGNiwFk0c2fzpPmQ@mail.gmail.com \
    --to=aditya.siram@gmail.com \
    --cc=emacs-orgmode@gnu.org \
    --cc=schulte.eric@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).