Category Archives: geek

On this page:

Emacs tweaks: Export Org checkboxes using UTF-8 symbols

UPDATE 2014-03-28: Newer versions of org have the org-html-checkbox-type variable, which you can set to unicode. Use M-x customize-variable org-html-checkbox-type to see if you have it.

This snippet turns - [X] into ☑ and - [ ] into ☐.

(defun sacha/org-html-checkbox (checkbox)
  "Format CHECKBOX into HTML."
  (case checkbox (on "<span class=\"check\">&#x2611;</span>") ; checkbox (checked)
        (off "<span class=\"checkbox\">&#x2610;</span>")
        (trans "<code>[-]</code>")
        (t "")))
(defadvice org-html-checkbox (around sacha activate)
  (setq ad-return-value (sacha/org-html-checkbox (ad-get-arg 0))))

To find this code, I searched ox-html.el for [. Eventually I found org-html-checkbox, which is directly called by org-html-format-list-item instead of being a function variable that you can change. So that meant I needed to override the behaviour of org-html-checkbox through defadvice. You can see above how I wrap advice around org-html-checkbox and replace the return value with my own function. For more about advice, read the Emacs Lisp Intro manual.

To find the hex codes for the UTF-8 characters, I searched Google for UTF-8 checkbox and found BALLOT BOX WITH CHECK. I used the hex code so that I didn’t have to worry about encoding issues. I tested it by updating one of my weekly reviews. Tada!

Inspired by Grant from Wisdom and Wonder.

Emacs Basics: Using the mouse

This entry is part 1 of 3 in the series Emacs Basics

You can download the MP3 from archive.org.

Transcript:

I’m Sacha Chua and this is an Emacs Basics episode on using the mouse. The best way to use Emacs is to master the keyboard shortcuts, but when you’re starting out, don’t worry about them yet. You might find yourself using the mouse a whole lot more than you used to, but over time, you will learn more and more keyboard shortcuts as you get used to Emacs. So let’s say that you’re just starting out. What are some of the things that you can do right away to get the hang of using Emacs?

The Emacs tutorial is a great place to start. You can get to that by clicking on the Emacs tutorial link on the splash screen. If you’ve done the tutorial before, it will offer to let you resume at that point. If you don’t have the splash screen handy, you can also get to the tutorial from Help > Emacs tutorial. Go through this and you’ll learn a lot of the common keyboard shortcuts that will come in handy.

The toolbar and the menu will also give you quick access to a lot of common commands. If you’d like to create a new file or open an existing file, you can click on the New file icon located in the top left. You can specify the file, and if the file doesn’t exist yet, it will create it. To save the file, click on the Save icon. If you’d like to close a file, just click on the X mark. You can open the file again using the toolbar icon.

To copy and paste, use your mouse to select a region of text, then copy or cut it. Then you can paste it wherever you want. You could also search for text. Click on that search button and start typing what you’re looking for. It will highlight the search results. Press Ctrl+s to search for the next instance. Press Enter to stop searching.

The menus also offer a lot of other commands. For example, you can insert a file. You can save the current buffer with another file name. You can split your windows so you can see more than one file at the same time. If you’d like to close a window and go back to having one file across your entire screen, you just have to use File > Remove other windows. To switch between the files you have open, use the Buffers menu. Explore the menus for other options.

One of the interesting things in Emacs is that you can copy or cut multiple things and then paste them without having to keep copying or cutting each time. For example, if I copy this, then Paste will paste that. But you could also access the things that you copied or cut previously. Just click on Edit > Paste from kill menu, then select the item you want to paste.

There are lots of other tools that are available in Emacs. The availability of these tools may depend on what else you’ve installed. Again, for more information, check out the Emacs tutorial or read the Emacs manual.

Have fun!

 

Emacs, Evernote (through enscript.exe), and Org links

I’ve given myself permission to spend an hour or two tickling my brain with various technical ideas and prototypes every day. This means Emacs geekery is going to turn up on my blog more often. =) Here’s a recent hack that I put together to make my weekly reviews a little easier.

I skim a lot of blog posts on my phone using the Feedly app. (See: How to read blogs efficiently with a feed reader.) I save the posts I want to follow up on or include in my weekly round-up. I have an If This Then That recipe that monitors my saved items and stashes them in Evernote with the roundup tag. If I come across other interesting pages while browsing on my computer, I use the Evernote Web Clipper to save those pages with the roundup tag as well.

In the past, I selected a range of notes to export from Evernote, saved them to a file, and used my sacha/evernote-extract-links-for-review function to extract the titles and URLs. I opened each of the pages with C-c C-o (org-open-at-point) to refresh my memory and follow up. I deleted lines that were no longer relevant. Since IFTTT had changed to rewriting the URLs instead of leaving the source URLs alone, I copied the original URLs and replaced the links that were in Org.

This is Emacs, though, and even that can be smoothened with a little scripting. Now I can use the code below to expand URLs and to open all the URLs in the region.

Link-related convenience functions

I picked this up from http://www.emacswiki.org/emacs/AlexSchroederConfigOrientalibombus .

(defun kensanata/resolve-redirect (url)
  "Resolve shortened URL by launching `curl --head' and parsing the result."
  (let* ((curl (shell-command-to-string
                (format "curl --silent --head %s" url)))
         (location (when (and (string-match "\\`HTTP/1\.1 301" curl)
                              (string-match "^Location: \\(.*\\)" curl))
                     (match-string 1 curl))))
    (or location url)))

(defun sacha/resolve-urls-in-region (beg end)
  "Expand URLs between BEG and END."
  (interactive "r")
  (save-excursion
    (save-restriction
      (narrow-to-region beg end)
      (goto-char (point-min))
      (while (re-search-forward org-bracket-link-regexp nil t)
        (replace-match (save-match-data (kensanata/resolve-redirect
                                         (match-string 1))) t t nil 1))
      (goto-char (point-min))
      (while (re-search-forward org-link-re-with-space nil t)
        (replace-match (save-match-data (kensanata/resolve-redirect
                                         (match-string 0))) t t nil)))))

(defun sacha/open-urls-in-region (beg end)
  "Open URLs between BEG and END."
  (interactive "r")
  (save-excursion
    (save-restriction
      (narrow-to-region beg end)
      (goto-char (point-min))
      (while (re-search-forward org-plain-link-re nil t)
        (org-open-at-point)))))

Evernote-related extract

Evernote on Windows doesn’t have the same kind of scripting capabilities that Evernote on the Mac has, but it turns out you can still do a fair bit of scripting with the enscript tool.

(defun sacha/evernote-export-and-extract (start-date end-date)
  "Extract notes created on or after START-DATE and before END-DATE."
  (let ((filename "c:/sacha/tmp/Evernote.enex"))
    (call-process 
     "c:/Program Files (x86)/Evernote/Evernote/enscript.exe"
     nil t t
     "exportNotes"
     "/q" (concat
           " tag:roundup"
           " created:" (replace-regexp-in-string "-" "" start-date)
           " -created:" (replace-regexp-in-string "-" "" end-date))
     "/f" filename)
    (sacha/evernote-extract-links-for-review filename)))

(defun sacha/evernote-extract-links-for-review (filename)
  "Extract note names and URLs from FILENAME.
     The file should be an ENEX export."
  (interactive (list (read-file-name "File: ")
                     (org-read-date)
                     (org-read-date)))
  (let (list)
    (with-temp-buffer
      (insert-file-contents filename)
      (goto-char (point-min))
      (while (re-search-forward "<title>\\(.+?\\)</title>\\(.*?\n\\)*?.*?href=\"\\(.*?\\)\"" nil t)
        (setq list
              (cons
               (cons
                (match-string-no-properties 1)
                (match-string-no-properties 3)) list))))
    (setq list
          (mapconcat (lambda (x)
                       (concat "- [["
                               (kensanata/resolve-redirect (cdr x))
                               "][" (car x) "]]: ")) list "\n"))
          (if (called-interactively-p 'any)
              (insert list)
            list)))

Let’s see how this new workflow goes. =) If you’re curious, you can check out the rest of my weekly-review-related code in my Emacs configuration.

Drafting a baby-steps guide to managing your tasks with Org Mode for Emacs

Org mode for Emacs is powerful and flexible, which can make it intimidating for newcomers. After helping several people with essentially the same problem–an unmanageably large heap of tasks–I thought about what might help people get the hang of the key features of Org Mode slowly.

Here are some general ideas. Start by writing your tasks down. Group them into projects. Once you get the hang of that, schedule your tasks. You might find yourself overestimating what you can do in a day, so reschedule or get rid of tasks as needed.

2014-02-08 A path toward taming your TODO list

2014-02-08 A path toward taming your TODO list

Here’s a visual overview of how you can apply that to Org, starting with simple outlines and moving on to scheduling.

2014-02-16 Org TODO basics

2014-02-16 Org TODO basics

I’ve started to put together an outline/draft for A Baby Steps Guide to Managing Your Tasks with Org Mode, which you can find at sach.ac/baby-steps-org-todo. Comments and questions welcome!

New free/pay what you want resource: Sketchnotes 2013; also, Emacs Dired rocks

cover

Get your copy of the Sketchnotes 2013 collection

Since people found my collection of sketchnotes from 2012 handy, I’ve put together a categorized collection of sketchnotes from 2013 as well. Enjoy! =)

Behind the scenes

This was how I made the 2012 collection:

  1. Create a Microsoft Powerpoint presentation. Fill it with high-res images. Resize and position all the images. Use AutoHotkey to save myself time and avoid going crazy.
  2. Create a spreadsheet with titles and page numbers. Add captions with liberal use of AutoHotkey.
  3. Create a manual table of contents and link to all the images. Mostly use AutoHotkey, except for the part where if you create a link to a slide number that consists of repeated numbers (ex: 55 or 66), you have to select it a different way, because typing “55″ gets you #51 (and “555″ gets you #52, etc).
  4. Save as PDF.

There was a lot of manual fiddling around involved in making that collection, so I’m experimenting with a different approach that may be useful. For Sketchnotes 2013, I wanted to see if there were ways I could simplify the packaging process while enabling people to do other things with the files.

Here’s what I did:

  1. I used Emacs dired-mode’s C-x C-q (dired-toggle-read-only) to go into editable mode, which allowed me to easily edit all the filenames to include #keywords. I used C-x C-q to save the changes.
  2. Then I used Emacs dired’s % m to select multiple files by regular expressions and R to move the files into a specified directory.
  3. Tada! Neatly organized files. I packaged it up as a ZIP and put it on Gumroad.
  4. Since Dropbox also allows you to share folders, I created a public link to the folder that had my organized sketches. That way, people can download a single directory if they want to, instead of downloading all 250+ MB.

It still might be interesting to make a PDF, especially if I can make one that can be published through something like CreateSpace. More packaging… =)

More notes on managing a large blog archive: 17 things I do to handle 10+ years of blog posts

I’ve been thinking a lot about how to manage a large archive to encourage discovery and serendipity, and to make it easier to fish out articles so that I can send them to people. I started in 2001-ish and have more than 6,500 posts. There’s not a lot of information on how to manage a large archive. Most blogging-related advice focuses on helping people get started and get going. Few people have a large personal archive yet. I love coming across other bloggers who have been at this for more than ten years, because information architecture is fascinating. Here’s what I do, in case it gives you any ideas.

  1.  I set up Google Chrome quick searches for my blog, categories, and tags. This means I can quickly dig up blog posts if I remember roughly where they are. (Gear > Settings > Search > Manage Search Engines):
    • Blog (b): https://www.google.ca/search?q=site%3Asachachua.com+%s
    • Blog category (bc): http://sachachua.com/blog/category/%s
    • Blog tag (bt): http://sachachua.com/blog/tag/%s
  2. I create pages with additional notes and lists of content. I use either Display Posts Shortcode or WP Views, depending on what I need. See the Emacs page as an example.
  3. I’ve started using Organize Series to set up trails through my content. It’s more convenient than manually defining links, and it allows people to page through the posts in order too. Read my notes to find examples. I’m also working on maps, outlines, and overviews.
  4. I’ve also started packaging resources into PDFs and e-books. It makes sense to organize things in a more convenient form.
  5. I converted all the categories with fewer than ten entries to tags. Categories can get unwieldy when you create them organically, so I use categories for main topics and tags for other keywords that might graduate to become categories someday. I think I used Categories to Tags Converter or Taxonomy Converter for this. Hah! Similar Posts reminded me that I used Term Management Tools. Awesome.
  6. I manually maintain a more detailed categorical index at sach.ac/index. This makes it easier for me to see when many blog posts are piling up in a category, and to organize them more logically.
  7. I set up short URLs for frequently-mentioned posts. The Redirection plugin does a decent job at this. For example, people often ask me about the tools I use to draw, and it’s great to just be able to type in http://sach.ac/sketchtools as an answer.
  8. I post weekly and monthly reviews. The weekly review includes links to that week’s blog posts, and the monthly review includes a categorized list. I’ve also set up daily, weekly, and monthly subscriptions based on the RSS feeds. This is probably overkill (more choices = lower subscriptions), but I want to give people options for how frequently they want updates. The weekly and monthly reviews are also helpful for me in terms of quickly getting a sense of the passage of time.
  9. I use Similar Posts to recommend other things people might be interested in. There are a number of similar plugins, so try different ones to see which one you like the most. I tried nRelate and the one from Zemanta, but I wasn’t happy with the way those looked, so I’m back to plain text.
  10. I show recent comments. People often comment on really old posts, and this is a great way for other people to discover them.
  11. I use post titles in my next/previous navigation, and I labelled them “Older” and “Newer”. I think they’re more interesting than
  12. I customized my theme pages to make it easier to skim through posts or get them in bulk. For example, http://sachachua.com/blog/2014/02 lists all the posts for February. http://sachachua.com/blog/2014/?bulk=1 puts all the posts together so that I can copy and paste it into a Microsoft Word file. http://sachachua.com/blog/2014/?org=1 puts it in a special list form so that I can paste it into Org Mode in Emacs. You can also pass the number of posts to a category page: http://sachachua.com/blog/category/drawing/?posts_per_page=-1 displays all the posts instead of paginating them. These tweaks make it easier for me to copy information, too.
  13. I give people the option to browse oldest posts first. Sometimes people prefer starting from the beginning, so I’ve added a link that switches the current view around.
  14. I have an “On this day” widget. Sometimes I notice interesting things in it. I used to put it at the end of a post, but I moved it to the sidebar to make the main column cleaner.
  15. For fun, I have a link that goes to a random post. I used to display random post titles in the sidebar, which might be an interesting approach to return to.
  16. I back up to many different places. I mirror my site as a development environment. I back up the database and the files to another web server and to my computer, and I duplicate the disk image with Linode too. I should set up incremental backups so that it’s easier to go back in time, just in case.
  17. I rated my posts and archived my favourite ones as a PDF so that I’ll still have them even if I mess up my database. Besides, it was a good excuse to read ten years of posts again.

Hope that gives you some ideas for things to experiment with! I’m working on organizing more blog posts into trails and e-books. I’m also getting better at planning what I want to write about and learn. If you’re curious about any of the techniques I use or you want to bounce around ideas, feel free to e-mail me at [email protected] or set up a chat.

Do you have a large blog? How do you manage it?