(Re)generate: (find-saving-links-intro)
Source code:  (find-efunction 'find-saving-links-intro)
More intros:  (find-eev-quick-intro)
              (find-here-links-intro)
              (find-refining-intro)
              (find-eev-intro)
This buffer is _temporary_ and _editable_.
It is meant as both a tutorial and a sandbox.



Note: this intro is being rewritten!
I wrote it originally for this workshop:
  http://anggtwu.net/2021-workshop.html
  http://anggtwu.net/2021-eev-exercises.html
and I also recorded six videos for workshop.
Very few people came, and I didn't like the videos.
In dec/2022 I subtitled the videos and then I realized that
_with subtitles_ the videos are very good.



***UPDATE*** (jan/2024):
Please start by this:
  (find-kl-here-intro)



1. Saving interesting links

Start by this video: Title: Material on `M-3 M-e' Info: (find-1stclassvideo-links "2021workshop3") Play: (find-2021workshop3video "0:00") (find-2021workshop3video "4:56" "The demo") LSubs: (find-1stclassvideolsubs "2021workshop3") (find-1stclassvideolsubs "2021workshop3" "The demo" "4:56") it shows a demo of how I "create elisp hyperlinks to everything interesting that I find". The cheat sheet that I show in the video contains this: (eek "M-j") (find-eek "M-j") (find-eev-quick-intro "2. Evaluating Lisp") (find-eev-quick-intro "2. Evaluating Lisp" "M-0 M-e") (find-eev-quick-intro "4.2. `find-ekey-links' and friends") (eek "M-h M-k M-e") (eek "M-h M-k M-e ;; ee-eval-sexp-eol") (find-eek "M-h M-k M-e ;; ee-eval-sexp-eol") (find-eek "M-h M-k M-e ;; ee-eval-sexp-eol" "(find-efunction ')") (find-efunction 'ee-eval-sexp-eol) (find-efunction 'ee-eval-sexp-eol "3:") (eek "2*<up> M-3 M-e") (find-efunction 'ee-eval-last-sexp) (find-efunction 'ee-eval-last-sexp-3) (find-efunction 'ee-eval-last-sexp-3 "find-wset") (find-efunction 'find-wset) (find-emacs-keys-intro "6. Windows") (find-emacs-keys-intro "6. Windows" "L|R") (find-eev-intro) (find-eev-intro "M-5 M-0 M-j") (find-eev-intro "(find-multiwindow-intro)") (find-multiwindow-intro) (find-wset "13o_2o2o23oo33ooo" '(find-ebuffer "B")) (find-wset "13o_2o2o23oo33ooo+" '(find-ebuffer "B")) (find-2a nil '(find-efunction 'ee-eval-sexp-eol)) (find-2b nil '(find-efunction 'ee-eval-sexp-eol)) That video doesn't have any exercises - it is just a demo that uses some techniques that are only explained in the section 6 below. Title: Material on `M-3 M-e', or: What does it mean to "save links to everything that is interesting?" Comment: In this video I show an example of how I "save links to everything that I find" by "alternating between task and notes" very quickly. It is just a demonstration without exercises, and in it I use some techniques for using a single window that are only taught in the video "2021workshop2" - the last video of the series. See: (find-here-links-intro "1. Alternating between") Info: (find-1stclassvideo-links "2021workshop3") LSubs: (find-1stclassvideolsubs "2021workshop3")

2. Copy from left to right

This video: Title: Copy from left to right Info: (find-1stclassvideo-links "2021workshop5") Play: (find-2021workshop5video "0:00") LSubs: (find-1stclassvideolsubs "2021workshop5") (find-1stclassvideolsubs "2021workshop5" "2. Names of buffers") (find-1stclassvideolsubs "2021workshop5" "3. Frames") (find-1stclassvideolsubs "2021workshop5" "4. Notation for copy and paste") (find-1stclassvideolsubs "2021workshop5" "5. M-21j") (find-1stclassvideolsubs "2021workshop5" "6. M-K*") (find-1stclassvideolsubs "2021workshop5" "Exercise 1") (find-1stclassvideolsubs "2021workshop5" "Exercise 2") [Was: 3.1. Two basic exercises] In the diagrams below the names of the buffers are abbreviated: [EX] - (find-eev-exercises-intro) [J] - (find-eejumps) [N] - notes, i.e., (find-fline "~/TODO") [EK] - (find-emacs-keys-intro) ________ _______ ______________ ________ | | | | | | | | | | [EX] | M-j | [J] | M-21j | [J] | [N] | C-x 1 M-K* | [EX] | | | ----> | | -----> | M-w ::> C-y | ----------> | | |________| |_______| |_______|______| |________| ________ _______ ______________ ________ | | | | | | | | | | [EX] | M-2j | [EK] | M-21j | [EK] | [N] | C-x 1 M-K* | [EX] | | | ----> | | -----> | M-w ::> C-y | ----------> | | |________| |_______| |_______|______| |________| `M-21j' is `M-2 M-1 M-j' written in an abbreviated form - mnemonic: "hold the meta key, type 21j, lift meta" - and `M-K*' means "type M-K as many times as needed". Watch this video and try to reproduce what happens in it: (find-2021workshop5video "0:00")

2.1. Reading diagrams aloud

I will use 2D diagrams to represent sequences of actions. In beginning of this tutorial these diagrams will have lots of details, but they will become progressively more and more streamlined; in the last exercises of this intro we will work with diagrams in which only the details that are very hard to infer are written down explicitly.

2.2. Key sequences

I will suppose that you are familiar with the first few sequences of keys below, and that you are trying to become familiar with the other ones. The pronounciations at the right are the ones that we will use in the text of this intro and in its videos. Pronounciations C-w cut M-w copy, or copy into the kill ring C-y paste, or copy from the kill ring, or yank C-x 0 delete window C-x 1 one window M-k kill buffer M-K bury buffer M-j meta-jay, or list of jumps M-1j jump to notes M-2j jump to emacs keys M-5j jump to main tutorial M-21j show notes at the right M-31j jump to notes at the right M-h3 find here links beginner M-h1 go back (to the previous window configuration) M-hh find here links M-hk find key links M-hf find function links M-he find extra links M-h2 duplicate M-hy refine, or yank into pos-spec M-h- shrink M-hw copy line M-1hw copy last tag Exercise: all the key sequences above are mentioned here: (find-emacs-keys-intro) check that their pronounciations above make sense. Find the link to the documentation of each key sequence, follow it, and read the explanation. A few of the explanations have exercises that show in practice how those key sequences work - do these exercises.

2.3. Windows and buffer names

We will use two ways to explain what our abbreviations for buffer names, like [EX], [EH], and [N], mean: pronounciations and sexps. For example: [EX] exercises (find-saving-links-intro) [HL] here-links (find-here-links) [N] notes (find-fline "~/TODO") A diagram like this _________________ ____________ | | | | | | | [HL] | | | | [EX] | | | [EX] | | |________| ---> | | | | | | | | | [N] | | | | | | | | |________|________| |____________| We mean that we started in a window configuration with three windows, with [EX] at the left half, [HR] at the upper right, and [N] at the lower right, and then we switched to a window configuration with a single window displaying [EX].

2.4. Adding keys

Look at this diagram: _________________ ____________ | | | | | | [EX] | [HL] | | [EX] | | M-w | M-h2 | | | | | M-hy | | | | | M-w | M-h1 | | | |___::___| ---> | | | | \/ | | | | | | | | | | [N] | | | | | C-y | | | |________|________| |____________| We added key sequences to the diagram of the previous section, and we did that in a way that lets us deduce from the diagram in which buffer each key sequence was typed, and in which order. For me these diagrams become easy to understand and to remember if I translate mentally each key sequence to its pronounciation - like this: In the buffer with exercises, copy a string to the kill ring; (1) In the buffer with here-links, duplicate, refine, copy; (2) go to the buffer with notes, and paste; (3) go back to the previous window configuration. This is somewhat similar to reading a score sheet. In the steps (1), (2), and (3) some information hard to put in words was omitted from the pronounciation. In (1) we copy to the kill ring exactly the string that will be used in the refining step; in (2) we copy to the kill ring two links, one "original" and one that it is refined version; in the step (3) we copy these two links to the right place in our notes, but the pronounciation doesn't say where.

3. Invisible text

This video Title: Invisible text Info: (find-1stclassvideo-links "2021workshop4") Play: (find-2021workshop4video "0:00") (find-2021workshop4video "4:46" "The demo - fix this") LSubs: (find-1stclassvideolsubs "2021workshop4") (find-1stclassvideolsubs "2021workshop4" "The demo" "4:46 - fix this") explains how to create links to sections of intros. This is easy and incredibly useful, but it has a trick... Run this sexp: (eek "3*<up> C-a C-SPC C-e") and then use `M-w' to copy the region to the kill ring and `M-hy' to yank it into this sexp: (insert "\n") Instead of getting the first sexp below you will get the second one: (insert "\n" "2.3. Invisible text") (insert "\n" "2.3. Invisible text\n-------------------") That's because the title line contains some invisible text, and the `M-hy' clears all the properties of the text that it inserts, including the invisibility property. Invisible text is explained here: (find-elnode "Invisible Text") When you type `C-e' on the title of a section of an "intro" the `C-e' takes you to the right of the line _after_ the invisible text. If you type `<left> <right>' there this moves the point to a position before the invisible text. So, if you want to copy the title of a section of an intro to use in a refinement, use C-a C-SPC C-e <left> <right> M-w instead of: C-a C-SPC C-e M-w Exercise: create a pair of elisp hyperlinks, the first one pointing to this intro and the second pointing to this section, and copy the pair to your notes. You'll have to watch the video to understand some tricky points and you will have to follow the diagram below. ________ _______ _______________ ________ | | | | | | | | | | [EX] | M-hh | [EH] | M-21j | [EH] | [N] | C-x 1 M-K* | [EX] | | M-w | ----> | | -----> | M-h2 ::> C-y | ----------> | | | | | | | M-hy | | | | |________| |_______| |________|______| |________| [Video links:] (find-2021workshop4video "0:00") Title: Invisible text, or: How to create links to sections of intros Comment: This video is about one exercise - one that is rasonably simple and incredibly useful. Info: (find-1stclassvideo-links "2021workshop4") LSubs: (find-1stclassvideolsubs "2021workshop4")

4. `find-extra-file-links'

This video Title: `find-extra-file-links' Info: (find-1stclassvideo-links "2021workshop6") Play: (find-2021workshop6video "0:00") (find-2021workshop6video "4:56" "The demo - fix this") LSubs: (find-1stclassvideolsubs "2021workshop6") (find-1stclassvideolsubs "2021workshop6" "The demo" "4:66 - fix this") (...) Here you will need to understand `code-c-d' and `find-extra-file-links'. See: (find-eev-quick-intro "9. Shorter hyperlinks") (find-eev-quick-intro "9.1. `code-c-d'") (find-audiovideo-intro "4.1. `find-extra-file-links'") The diagram will be this one: ________ _______ _______ ______________ ________ | | | | | | | | | | | | [EX] | | [D] | M-he | [EH] | M-21j | [EH] | [N] | C-x 1 M-K* | [EX] | | | --> | | ----> | | -----> | M-w ::> C-y | ----------> | | |________| |_______| |_______| |_______|______| |________| Where [D] is a dired buffer. Watch this video and try to reproduce what happens in it: (find-2021workshop6video "0:00") Do this twice. In the first time you should create elisp hyperlinks pointing to this directory and this file, (find-efile "play/") (find-efile "play/" "life.el") and in the second time you should create elisp hyperlinks to a directory and a file that you find interesting. Title: `find-extra-file-links' (`M-h M-e') Comment: This video explains an easy way to create both "links" and "short links" to (text) files, directories, PDF files, and videos. Info: (find-1stclassvideo-links "2021workshop6") LSubs: (find-1stclassvideolsubs "2021workshop6")

5. The base cases 1 and 2

Title: The base cases 1 and 2 Comment: This is a more advanced video that explains a basic workflow for refining hyperlinks. Info: (find-1stclassvideo-links "2021workshop1") LSubs: (find-1stclassvideolsubs "2021workshop1") All the methods to create and save elisp hyperlinks that we will see can be regarded as variants of the base cases 1, 2, and 3. The base cases 1, 2, and 3 all follow this pattern: _______________ _____________________ ________________ | | | | | | | | | | ::> elinks | | | | | | | buffer | | | | target | M-h3 | target |____::____| M-h1 | target | | buffer | ---> | buffer | \/ | ---> | buffer | | | | | notes | | | | | | | buffer | | | |_______________| |__________|__________| |________________| They only use two key sequences that change the window configuration - M-h3 - find here links beginner M-h1 - go back (to the previous window configuration) and they differ in the steps for editing the link in the elinks buffer before copying it to the notes buffer. In the base case 1: we do no editing, we just copy one link to the notes buffer, In the base case 2: we duplicate and refine, and we copy two links to the notes buffer, In the base case 3: we duplicate, refine, and shrink, and we copy two links to the notes buffer. The base cases 2 and 3 require us to copy to the kill ring a string that will be used for the refining. The operation "copy a string from the target buffer to the kill ring" consists of: In the base case 1: nothing In the base case 2: copy (with M-w) In the base case 3: copy last tag (with M-1hw) Let's see each one of the three base cases in detail and do one exercise for each one.

5.1. The base case 1

The base case 1 is just this: _____________ _____________________ _____________ | | | | | | | | [T] | | [T] ::> [EH] | | [T] | | | | | M-hw | | | | | M-h3 | |____::____| M-h1 | | | | ---> | | \/ | ---> | | | | | | [N] | | | | | | | C-y | | | |_____________| |__________|__________| |_____________| In this case the arrow "::>" means just "switch to the buffer with elisp hyperlinks". In the [EH] buffer we copy the line with the hyperlink that points to the target to the kill ring with `M-hw' ("copy this line"), and then we switch to the notes buffer and we paste the hyperlink with `C-y' ("yank"). If we treat the steps `M-h3', `M-hw' ("copy this line"), `C-y' ("yank"), and `M-h1' as "obvious" we can omit them from the diagram, and we get this: _____________ _____________________ _____________ | | | | | | | | [T] | | [T] ::> [EH] | | [T] | | | | | | | | | | | |____::____| | | | | ---> | | \/ | ---> | | | | | | [N] | | | | | | | | | | |_____________| |__________|__________| |_____________| One of my reasons for preferring this diagram with less information is that now the step that means "copy the hyperlink to the kill ring" does not say how to do that - and we can use either `M-hw' or a more standard way to copy a line to the kill ring, like `C-SPC <down> M-w'. Exercise 2.1a: Treat this intro as the target buffer. Use the method above to generate a link to this target and to copy it to your notes. Let me introduce another abbreviation that I will use. In the exercises 2.1b, 2.2b, and 2.2c below we will use a target buffer that is different from the buffer with the exercises, and instead of representing what happens in the exercise with five window configurations, as ________ _______ ____________ _______ ________ | | | | | | | | | | | | [EX] | -> | [T] | -> | [T]::>[EH] | -> | [T] | -> | [EX] | | | | | | |__::__| | | | | | | | | | | \/ | | | | | | | | | | | [N] | | | | | |________| |_______| |_____|______| |_______| |________| I will omit the second and the fourth window configurations and draw something equivalent to this: ________ ____________ ________ | | | | | | | | [EX] | --------------> | [T]::>[EH] | --------------> | [EX] | | | | |__::__| | | | | | | \/ | | | | | | | [N] | | | |________| |_____|______| |________| or, even worse, I will simply expect that people will be able to take the diagram of the previous exercise, i.e., of the exercises 2.1a, 2.2a, and 2.3a, that are like this, _______ ____________ _______ | | | | | | | | [T] | -> | [T]::>[EH] | -> | [T] | | | | |__::__| | | | | | | \/ | | | | | | | [N] | | | |_______| |_____|______| |_______| and convert it mentally to a diagram with "[EX]" in the extremities. So: Exercise 2.1b: Follow this link: (find-enode "Setting Mark") it will open an info page. Treat that info page as the "target" and use the method above to create a link to that target and to copy it to your notes. After that come back to this intro using `M-K*' - i.e., "bury buffer" as many times as needed - or using any other method. Note that this exercise starts and ends with a window configuraton in which only the buffer "[EX]" is shown, so it uses implicitly the abbreviation that I've just described. [Video links:] (find-2021workshop1video "0:22" "The base case 1 is described here") (find-2021workshop1video "0:52" "The instructions are here")

5.2. The base case 2

The base case 2 is similar to the base case 1 but here we duplicate and refine the hyperlink. Its diagram is: _____________ _____________________ _____________ | | | | | | | | [T] | | [T] ::> [EH] | | [T] | | | | | M-h2 | | | | | | | M-hy | | | | | | |____::____| | | | | ---> | | \/ | ---> | | | | | | [N] | | | | | | | | | | |_____________| |__________|__________| |_____________| Here many obvious (?!?!) steps were omitted. Here's how to read it aloud including the omitted steps: find here links beginner In the target buffer: copy a string to the kill ring In the elisp hyperlinks buffer: find the hyperlink to the target duplicate refine copy the original and the refined links to the kill ring In the notes buffer: paste go back to the previous window configuration Exercise 2.2a: Treat this intro as the target buffer and the "(?!?!)" as the string that will be used in the refinement. Use the method above to generate two links - one to this intro and one to the first occurrence of "(?!?!)" in it - and copy these two links to your notes. Exercise 2.2b: Follow this link: (find-enode "Setting Mark" "C-x C-x") it will open an info page and search for the first occurence of "C-x C-x" in it. Treat that info page as the "target" and use the method above to create: 1. a link to that target 2. a refinement of that link that points to the "C-x C-x" then copy this pair of links to your notes. After that come back to this intro using `M-K*' - i.e., "bury buffer" as many times as needed - or using any other method. Note that here the initial and the final window configurations are just "[EX]", so we are using implicitly the abbreviation that omits some window configurations that was explained before the exercise 2.1b. [Video links:] (find-2021workshop1video "1:24" "The base case 2") (find-2021workshop1video "1:39" "What I need to do is slightly") (find-2021workshop1video "1:55" "This is not yet the link that I want")

5.3. The base case 3

(Is this explained in the videos?) In the base case 2 we edited the hyperlink by doing duplicate and refine; in the base case 3 we will will edit it by doing duplicate, refine, _and shrink_. Very few other sections of this intro depend on this one - so you may skip this. The base case 3 will only make sense to people who understand: anchors, short hyperlinks to anchors, using `M-1hw' to copy the preceding tag to the kill ring, and using `M--' to shrink a hyperlink to make it point to an anchor. You can learn these extra prerequisites here: (find-eev-quick-intro "8. Anchors") (find-eev-quick-intro "8.1. Introduction: `to'") (find-eev-quick-intro "8.5. Hyperlinks to anchors in other files") (find-eev-quick-intro "9. Shorter hyperlinks") (find-eev-quick-intro "9.1. `code-c-d'") (find-eev-quick-intro "9.2. Extra arguments to `code-c-d'") (find-eev-quick-intro "9.2. Extra arguments to `code-c-d'" ":anchor") (find-eev-quick-intro "9.2. Extra arguments to `code-c-d'" ":anchor" "3)") (find-anchors-intro "2. Shrinking") (find-anchors-intro "3. The preceding tag") Also, the base case 3 will only _look useful_ to people who can imagine using anchors in their own files. The main techniques for creating anchors are described in the two first links below, and the other three links point to an experimental feature of eev that I use to move the first half of an index/section pair to the index section of a file with few keystrokes. (find-eev-quick-intro "8.3. Creating index/section anchor pairs") (find-eev-quick-intro "8.4. Creating e-script blocks") (find-refining-intro "5. Pointing to anchors") (find-refining-intro "5. Pointing to anchors" "but I don't touch-type") (find-eev "eev-hydras.el") The diagram for the base case 3 is this one. Note - ta-da! - that we are introducing another abbreviation: we are omitting the window settings in the extremities. _____________________ | | | | [T] ::> [EH] | | M-1hw | M-h2 | | | M-hy | ---> | | M-h- | ---> | |____::____| | | \/ | | | [N] | | | | |__________|__________| One way to pronounce that diagram is: go to the target buffer find here links beginner in the target buffer: copy last tag in the elisp hyperlinks buffer: duplicate refine shrink copy the original and the refined links to the kill ring In the notes buffer: paste go back to the original window configuration Exercise 2.3a: Omitted. Try to understand why! =) Exercise 2.3b: This hyperlink (find-eev "eev-videolinks.el" "ee-1stclassvideos-field") points to an anchor in one of the source files of eev. Use it to go to that anchor, and pretend that you arrived there by accident, found that anchor interesting, and decided that you had to put a link to it in your notes. Use the method above to create 1. a link to that file 2. a link to that anchor in that file and then copy the two links to your notes.

6. Using a 2-window setting

Title: Creating a link to a file using a 2-window setting Comment: A more advanced exercise that prepares people to generate hyperlinks, refine them, and copy them to the notes using a single window, using the second window just as a kind of a cheat sheet - like in the most basic video, "2021workshop3", Info: (find-1stclassvideo-links "2021workshop2") LSubs: (find-1stclassvideolsubs "2021workshop2") "Taking executable notes" consists mainly on: a. recording commands sent to shell-like programs, b. saving elisp hyperlinks to everything interesting that we find. "(Generating and) saving links" is the harder half. This intro is about how to do that fluently. This intro was split from: (find-eev-exercises-intro) Pre-requisites: (find-here-links-intro) (find-refining-intro) See also: (find-kla-intro) [Delete everything below this point?] [Video links:] (find-2021workshop1video "0:22" "The base case 1 is described here") (find-2021workshop1video "0:52" "The instructions are here") [Video links:] (find-2021workshop1video "1:24" "The base case 2") (find-2021workshop1video "1:39" "What I need to do is slightly") (find-2021workshop1video "1:55" "This is not yet the link that I want")

3.3. Copy from `find-ekey-links'

1. use M-5j to go to (find-eev-quick-intro) - a.k.a. "the main tutorial", 2. go to the section 4.2 in that main tutorial, and find where it says "Try the eek links below", 3. run the eek link that says: (eek "M-h M-k C-s ;; isearch-forward") 4. it should open a temporary buffer whose buffer name is "*Elisp hyperlinks*". Find the two lines in that buffer that say: # (Info-goto-emacs-command-node 'isearch-forward) # (find-enode "Command Index" "* isearch-forward:") 5. mark and copy those lines, 6. use `M-21j' or `M-31j' to open your notes buffer in the right window, 7. paste those lines to your notes buffer. In a diagram: __________ __________ ________________ | | | | | | | M-5j | [MT] | M-e | [EH] | M-21j | [EH] | [N] | -----> | sec. 4.2 | ----> | | ---------> | ::> | | | | | or M-31j | | | |__________| |__________| |________|_______|

3.4. A variant

Someone who knows how to use `M-h M-k' (`find-ekey-links') and who doesn't need to split windows can do essentially the same as we did in the previous section with fewer keystrokes. Let's see how. Exercise: 1. Type `M-hk C-s' to open a temporary buffer with elisp hyperlinks on the key `C-s', 2. mark, and copy with `M-w', the lines that say: # (Info-goto-emacs-command-node 'isearch-forward) # (find-enode "Command Index" "* isearch-forward:") 3. use `M-1j' to go to your notes buffer, 4. paste those lines to your notes buffer with `C-y'. In a diagram: ___________ ___________ | | | | M-hk C-s | [EH] | M-1j | [N] | ---------> | mark, M-w | -----> | C-y | | | | | |___________| |___________|

4. A two-window setting (hard)

Exercise: copy the diagram below to your notes, ____________ _____________ ____________ _____________ | | | | | | | | | | | | | [EX] | [T] | M-hh | [EX] | [EH] | M-21j | [EH] | [N] | M-K* | [EH] | [EX] | | | M-w | ----> | | M-h2 | -----> | | C-y | ---> | | | | | | | | M-hy | | | | | | | | | | | | M-w | | | | | | | |______|_____| |______|______| |______|_____| |______|______| then come back here and type `C-x 1 C-x 3' to split the window. In the window at the right, go this directory, (find-efile "") find the subdirectory "play", enter it, find the file "life.el", and inside the file "life.el" find the line that starts with this string, with a space at its end: "(defun life " Then follow the instructions in the diagram above to create a link to the file "life.el". Refine that link to make it point to the first occurrence of the string "(defun life " inside the file "life.el", and copy the original link and the refined one to your notes. [Video links:] (find-2021workshop2video "0:00")