Minor fix to jumping to org-blocks in literate world

The difference between space and blank, is that space includes newlines.
This commit is contained in:
Howard Abrams 2024-07-16 22:07:56 -07:00
parent 3aaf79eb24
commit 59472d1cda

View file

@ -48,6 +48,9 @@ Since we are using Emacs, the downsides of using a literate approach (even for p
*Note:* What follows is advanced LP usage. I would recommend checking out my [[https://www.howardism.org/Technical/Emacs/literate-programming-tutorial.html][Introduction to LP in Org]] before venturing down this essay. *Note:* What follows is advanced LP usage. I would recommend checking out my [[https://www.howardism.org/Technical/Emacs/literate-programming-tutorial.html][Introduction to LP in Org]] before venturing down this essay.
* Navigating Code Blocks * Navigating Code Blocks
:PROPERTIES:
:ID: 3230b1f4-0d2d-47c7-9f3d-fa53083f8c8d
:END:
Ive been using Oleh Krehels (abo-abo) [[https://github.com/abo-abo/avy][Avy project]] to jump around the screen for years, and I just learned that I can wrap the =avy-jump= function to provide either/or regular expression and action to perform. Ive been using Oleh Krehels (abo-abo) [[https://github.com/abo-abo/avy][Avy project]] to jump around the screen for years, and I just learned that I can wrap the =avy-jump= function to provide either/or regular expression and action to perform.
For instance, the following function can be used to quickly select a source code block, and jump to it: For instance, the following function can be used to quickly select a source code block, and jump to it:
@ -56,14 +59,19 @@ For instance, the following function can be used to quickly select a source code
(defun avy-jump-org-block () (defun avy-jump-org-block ()
"Jump to org block using Avy subsystem." "Jump to org block using Avy subsystem."
(interactive) (interactive)
(avy-jump (rx line-start (zero-or-more space) "#+begin_src") (avy-jump (rx line-start (zero-or-more blank) "#+begin_src")
:action 'goto-char)) :action 'goto-char)
;; Jump _into_ the block:
(next-line))
#+end_src #+end_src
I need to take advantage of this feature more. I need to take advantage of this feature more.
* Evaluating Code * Evaluating Code
Hitting ~C-c C-c~ in a source code block /evaluates/ the code. Simple, sure, but the following enhancements make this more accessible. Hitting ~C-c C-c~ in a source code block /evaluates/ the code. Simple, sure, but the following enhancements make this more accessible.
** Evaluating a Block ** Evaluating a Block
:PROPERTIES:
:ID: 93a9695c-67be-448a-b068-9727cd0aa9b0
:END:
At times I would like to jump to a particular block, evaluate the code, and jump back. This seems like a great job for the [[https://github.com/abo-abo/avy][avy project]]. The =avy-jump= function takes a regular expression of text /in the frame/ (which means you can specify text in other windows), and highlights each match. Normally, selecting a match moves the cursor to that match, the =avy-jump= accepts a function to execute instead: At times I would like to jump to a particular block, evaluate the code, and jump back. This seems like a great job for the [[https://github.com/abo-abo/avy][avy project]]. The =avy-jump= function takes a regular expression of text /in the frame/ (which means you can specify text in other windows), and highlights each match. Normally, selecting a match moves the cursor to that match, the =avy-jump= accepts a function to execute instead:
#+begin_src emacs-lisp #+begin_src emacs-lisp
@ -79,7 +87,7 @@ At times I would like to jump to a particular block, evaluate the code, and jump
e.g. `#+begin_src', and then executes the code without moving e.g. `#+begin_src', and then executes the code without moving
the point." the point."
(interactive) (interactive)
(avy-jump (rx line-start (zero-or-more space) "#+begin_src") (avy-jump (rx line-start (zero-or-more blank) "#+begin_src")
:action 'org-babel-execute-src-block-at-point)) :action 'org-babel-execute-src-block-at-point))
#+end_src #+end_src
@ -87,6 +95,9 @@ In this case, =avy-org-babel-execute-src-block= highlights all /visible blocks/
TODO Screenshot of multiple highlighted blocks. TODO Screenshot of multiple highlighted blocks.
** Evaluating a Section ** Evaluating a Section
:PROPERTIES:
:ID: 188e378c-bed4-463c-98d4-d22be1845bc2
:END:
A trick to =org-babel-tangle=, is that it tangles /what is shown/, that is, it will only tangle code blocks that are visible after narrowing to the current org section. This means, we can call =org-narrow-to-subtree= to temporary hide everything in the org file except the current heading, evaluate all blocks in the “now visible” buffer, and then widen: A trick to =org-babel-tangle=, is that it tangles /what is shown/, that is, it will only tangle code blocks that are visible after narrowing to the current org section. This means, we can call =org-narrow-to-subtree= to temporary hide everything in the org file except the current heading, evaluate all blocks in the “now visible” buffer, and then widen:
#+begin_src emacs-lisp :results silent #+begin_src emacs-lisp :results silent
@ -99,6 +110,9 @@ A trick to =org-babel-tangle=, is that it tangles /what is shown/, that is, it w
(widen))) (widen)))
#+end_src #+end_src
** Editing a Block ** Editing a Block
:PROPERTIES:
:ID: f143bbd6-fb4d-45b8-bcfa-196c7a26ed34
:END:
Why navigate to a block, just to focus on that block in a dedicated buffer, when we can take advantage of the =avy-jump= and edit any visible block? Why navigate to a block, just to focus on that block in a dedicated buffer, when we can take advantage of the =avy-jump= and edit any visible block?
#+begin_src emacs-lisp #+begin_src emacs-lisp
@ -114,7 +128,7 @@ Why navigate to a block, just to focus on that block in a dedicated buffer, when
e.g. `#+begin_src', and then executes the code without moving e.g. `#+begin_src', and then executes the code without moving
the point." the point."
(interactive) (interactive)
(avy-jump (rx line-start (zero-or-more space) "#+begin_src") (avy-jump (rx line-start (zero-or-more blank) "#+begin_src")
:action :action
'org-babel-edit-src-block-at-point)) 'org-babel-edit-src-block-at-point))
#+end_src #+end_src
@ -123,6 +137,9 @@ Why navigate to a block, just to focus on that block in a dedicated buffer, when
One of the issues with literate programming is not being able to use the same interface for moving around code when the source code is in org files. One of the issues with literate programming is not being able to use the same interface for moving around code when the source code is in org files.
** XRef Interface ** XRef Interface
:PROPERTIES:
:ID: 4dc771a4-b974-4b0d-9cc3-a943108c9d3a
:END:
The Emacs interface for jumping to function definitions and variable declarations is called xref (see [[https://www.ackerleytng.com/posts/emacs-xref/][this great article]] for an overview of the interface). I think it would be great to be able, even within the prose of an org file, to jump to the definition of a function that is defined in an org file. The Emacs interface for jumping to function definitions and variable declarations is called xref (see [[https://www.ackerleytng.com/posts/emacs-xref/][this great article]] for an overview of the interface). I think it would be great to be able, even within the prose of an org file, to jump to the definition of a function that is defined in an org file.
- [[*Definitions][Definitions]] :: To jump to the line where a macro, function or variable is defined. - [[*Definitions][Definitions]] :: To jump to the line where a macro, function or variable is defined.
@ -297,7 +314,7 @@ The =ha-literate--block-line-numbers= returns a hash where the keys are files, a
See `ha-literate--process-src-refs'." See `ha-literate--process-src-refs'."
(clrhash ha-literate--process-src-refs) (clrhash ha-literate--process-src-refs)
(ha-literate--ripgrep-matches 'ha-literate--process-src-blocks (ha-literate--ripgrep-matches 'ha-literate--process-src-blocks
(rx line-start (zero-or-more space) (rx line-start (zero-or-more blank)
"#+" (or "begin" "end") "_src"))) "#+" (or "begin" "end") "_src")))
#+end_src #+end_src
@ -668,6 +685,9 @@ So the following tests should pass:
#+end_src #+end_src
* Keybindings * Keybindings
:PROPERTIES:
:ID: 2412ef3b-b5d0-43a3-bd01-764fd92b0c3c
:END:
With a lovely collection of functions, we need to have a way to easily call them. Ive been using the =pretty-hydra= feature of major-mode-hydra: With a lovely collection of functions, we need to have a way to easily call them. Ive been using the =pretty-hydra= feature of major-mode-hydra:
#+begin_src emacs-lisp #+begin_src emacs-lisp