Expanding and Using Abbreviations in Emacs

A defined abbrev is a word which expands, if you insert it, into some different text.

They are really simple and really helpful if you like this kind of thing. If you grew up hacking on Java, then you surely already use this in IntelliJ IDEA!
Here is a nice post on how to choose and define abbrevs based upon actual usage.

On FORTH and a Friend

FORTH is a programming language with a lot of both interested and interesting users and implementers. Unbeknownst to you, your anti-lock brake controllers and fuel-injectors could be running by FORTH, and even if they aren’t, surely other critical parts of your vehicle are running on it, or diagnosed and maintained with it, or both.

The curious thing about the language is that its manifestation in this reality demonstrated how a single programming language could be both highly perform-ant and highly expressive. This is rare and uncommon. Today, no language achieve this feat. To consider that FORTH achieved it on limited computers, a long time ago, adds further wonder and respect for this delightful language. If you haven’t even taken at least a single look at it, then you should grab your copy of whatever you call hardware systems, along with the latest copy of gforth, to write hello world and play with the stack a little bit. It is interesting how much expressivity and power you can get out of a little computer system using this neat language. The language isn’t the most important thing though; it is the people.

When choosing a Scheme distribution, someone quipped that “When you choose one, you aren’t choosing a interpreter, so much as, you are choosing the a community”. This is true. Since it was tradition to implement your own FORTH interpreter, you could join a lot of different communities. The common traits among all of them were humans who could think for themselves, optimize at every level of the implementation (both software and hardware), and have a lot of fun doing it. One of those people was a best friend of mine named Bruce Langenbach.

Bruce passed away this year. His LinkedIn profile is still up; though I put in a request to retire it. For some bizarre reason, he never mentions FORTH on this resume. At Bear Automotive Service Equipment he used it to run all of the equipment (Bear sells automobile maintenance systems). The cool thing was that FORTH didn’t just run the equipment, it was also the operating system, code-editor, and debugger, all implemented and executed on-device. All of the REPL-joy that people blog about today was there long ago on little computers (which are somewhat dismissively called “micro-controllers” when in reality they are just computers like any others). That was a really, really fun job.

Bruce told me about it all of the time. It was the most fun job that he ever had. Anyone knows that with any job you have ups and downs. It is especially hard though when your first job is your best one. Fortunately he was investing in and exploring non-programming related forms of employment and expression. The neatest stuff was the encaustic painting.

Encaustic painting, using my simple understanding of it, uses layers of hot wax. It is beautiful, and, is a beautiful form of expression. Bruce was working on integrating LEDs and Arduino-systems with the canvas and the art. I loved hearing about it and was really, really looking forward to seeing what he was ready to share.

If he had been able to finish his work, he surely would have done it on FORTH. This implementation in particular says all of the right things, in spirit, intent, and implementation, and surely would have been a great place to start.

Easily check src block correctness in org-mode

Thank you Nicolas Goaziou, for the beginnings of an org-lint. The goal here was to:

  1. Report an error if there is a source block without a language
    specified
  2. Report an error if there is a source block with a language specified
    that is not present in `org-babel-load-languages’

And, it does.

(defun gcr/src-block-check ()
  (interactive)
  (org-element-map (org-element-parse-buffer 'element) 'src-block
    (lambda (src-block)
      (let ((language (org-element-property :language src-block)))
        (cond ((null language)
               (error "Missing language at position %d"
                      (org-element-property :post-affiliated src-block)))
              ((not (assoc-string language org-babel-load-languages))
               (error "Unknown language at position %d"
                      (org-element-property :post-affiliated src-block)))))))
  (message "Source blocks checked in %s." (buffer-name (buffer-base-buffer))))

Addendum: 2015-02-05
Sebastien Vauban just posted his improved version to:
– “Check as well for the language of inline code blocks,”
– “Report the line number instead of the char position.”

  (defun org-src-block-check ()
    (interactive)
    (org-element-map (org-element-parse-buffer)
      '(src-block inline-src-block)
      (lambda (sb)
        (let ((language (org-element-property :language sb)))
          (cond ((null language)
                 (error "Missing language at line %d in %s"
                        (org-current-line
                         (org-element-property :post-affiliated sb))
                        (buffer-name)))
                ((not (assoc-string language org-babel-load-languages))
                 (error "Unknown language `%s' at line %d in `%s'"
                        language
                        (org-current-line
                         (org-element-property :post-affiliated sb))
                        (buffer-name)))))))
    (message "Source blocks checked in %s." (buffer-name (buffer-base-buffer))))

Not seeing this post on the web yet so no link.

Notes on ALEC

Last week I blogged about pushing ALEC out to GitHub. My focus there was 100% philosophical, and I barely said a thing about the details. This post is to share some of the details.

ALEC is my 5th attempt and configuring Emacs for myself. After spending nearly a year practicing Org-Mode, this version feels much better than the last. The biggest note is that the system compiles in 27 seconds instead of 600 seconds!

The old approach was to generate both a lightweight and heavyweight configuration file, but that is gone now. With a 27s tangle time, you can easily comment out the source block noweb-references to build what you want quite easily.

Package management was the major theme. Cask has worked perfectly, and I wanted to see how easy easily that I could deploy this system on Windows. When I set out to do so, Cask did not have Windows support. Now I think it does, but I’m not going to pursue it right now. Package seems to do quite well, despite some nagging behavior that still exists (noted in the system) of not installing packages sometimes.

The packages are packaged up and stored in GitHub. Heresy? Perhaps. It is a best attempt at capturing the entirety of a working system, so that I and even others have an example or proof that it does what it should be doing.

Literate programming here is done with Org-Mode. It is an insanely delightful and hyper productivity enhancing tool. It is so simple that the 99% will dismiss it as a “markup language”, and the 1% will soon find that the painful-gap between exploration, implementation, and reflection can now be totally and completely removed regardless of the implementation artifact that you use to perform these three critical tasks.

ALEC's a Language for Expressing Creativity

ALEC is the new configuration of my Emacs/Organization-Mode system. Just wanted to share some thoughts on the experience. The code says a lot, and the text, too, but I’m more interested in the experience.
For context, this is the next step of TC3F.
If nothing else, just know that the tangle time went down from 10m to 27 seconds :).

Continue reading “ALEC's a Language for Expressing Creativity”

Don't run mode hooks during org exports

binchen has a nice post about how to disable org mode hook execution during exports. It can be a surprise when you run in batch mode and your export breaks because of dependency failures. Oh yea, the major mode hooks run during export even though you personally are not opening a buffer, Emacs is doing so!
Here is his solution:

(defun is-buffer-file-temp ()
  (interactive)
  "If (buffer-file-name) is nil or a temp file or HTML file converted from org file"
  (let ((f (buffer-file-name))
        (rlt t))
    (if f
        (if (and (not (string-match temporary-file-directory f))
                 (not (file-exists-p (replace-regexp-in-string "\.html$" ".org" f))))
          (setq rlt nil)))
    rlt))

Interesting.