Going to the Top and Bottom of iBuffer

I use iBuffer a lot. That’s probably because I get a little OCD about stray buffers eating up memory for no reason. With my new 16 GB laptop, buffers eating up memory isn’t much of a problem but it’s too late for me to reform my ways.

I especially like to clean up after I upgrade my packages. That process always leaves a Compile-Log buffer at the top of the iBuffer list and a Packages buffer at the bottom. Of course, when I navigate to the head or tail of the buffer I end up in the wrong place—not at the head or tail of the list.

If that seems a little familiar it’s probably because Magnar Sveen had similar problem with dired and solved it with a bit of Elisp. So I shamelessly ripped off Sveen’s code and made a few trivial changes so it does the same thing for iBuffer that Sveen’s did for dired. If you’re having the same problem, the code is below. It’s almost embarrassing to post it because it’s such a rip off but Emacsers who don’t have the wherewithal to figure out which key map to use or who don’t know Elisp may find it useful.

;; Stolen from Magnar's code to do the same thing for dired
;; http://whattheemacsd.com/setup-dired.el-02.html
(defun ibuffer-back-to-top ()
  (interactive)
  (beginning-of-buffer)
  (next-line 3))

(defun ibuffer-jump-to-bottom ()
  (interactive)
  (end-of-buffer)
  (next-line -2))

(eval-after-load 'ibuffer
  '(progn
     (define-key ibuffer-mode-map
       (vector 'remap 'end-of-buffer) 'ibuffer-jump-to-bottom)
     (define-key ibuffer-mode-map
       (vector 'remap 'beginning-of-buffer) 'ibuffer-back-to-top)))
Posted in General | Tagged | 2 Comments

Sorting by IP Addresses 2

Yesterday, I told you about my difficulties in trying to sort an Org mode table. I came up with a solution that was, um, less than optimal but at least I got the table sorted. It bugged me that Org mode couldn’t sort by IP address so I wrote a patch to add a “sort by IP address” option to org-table-sort-lines and submitted it.

Nicolas Goaziou pushed me to make a more general patch that would allow a user to specify any sorting method. The idea was to duplicate the ?f ?F functionality of org-sort-list. After some back and forth, the patch was accepted and is now on the master branch. If you’re tracking the Org repository, it’s available now. If you’re getting Org from ELPA or just updating with major releases it should be along shortly.

Org mode still doesn’t have an IP sort option but now I can write my own. First, I need a comparison function:

(defun jcs-ip-lessp (ip1 ip2 &optional op)
  "Compare two IP addresses.
Unless the optional argument OP is provided, this function will return T
if IP1 is less than IP2 or NIL otherwise. The optional argument OP is
intended to be #'> to support reverse sorting."
  (setq cmp (or op #'<))
  (cl-labels ((compare (l1 l2)
                       (if (or (null l1) (null l2))
                           nil
                         (let ((n1 (string-to-number (car l1)))
                               (n2 (string-to-number (car l2))))
                           (cond
                            ((funcall cmp n1 n2) t)
                            ((= n1 n2) (compare (cdr l1) (cdr l2)))
                            (t nil))))))
    (compare (split-string ip1 "\\.") (split-string ip2 "\\."))))

The rest is easy. I just need to call org-table-sort-lines with jcs-ip-lessp and the appropriate key extraction function:

(defun jcs-ip-sort ()
  (interactive)
  (org-table-sort-lines nil ?f #'org-sort-remove-invisible #'jcs-ip-lessp))

(defun jcs-ip-sort-reverse ()
  (interactive)
  (org-table-sort-lines nil ?F #'org-sort-remove-invisible
                        (lambda (ip1 ip2) (jcs-ip-lessp ip1 ip2 #'>))))

I just add this to my init.el and then call jcs-ip-sort or jcs-ip-sort-reverse to sort a table by IP address.

You can also specify the key extraction function interactively and org-table-sort-lines will choose either a string or numeric sort depending on the type of the first extracted key.

Posted in General | Tagged , | 3 Comments

Maintenance

Irreal’s hosting provider is planning some server maintenace from [2014-12-26 Fri] to [2014-12-29 Mon]. Somewhere in that interval, the server that Irreal runs on will be upgraded.

The hosting provider does not expect any outages during this process but warns that if a reboot is necessary the site may be down for a few minutes. If you try to connect and nothing happens, just wait a few minutes.

Posted in Blogging | Tagged | Leave a comment

Sorting by IP Addresses

Recently, I needed to sort an Org mode table by a column having IP addresses. For example, given the table

|            IP | 11/01 | 11/02 | 11/03 |
|---------------+-------+-------+-------|
|    10.1.213.5 |     2 |     1 |     0 |
|  172.25.100.1 |     4 |     1 |     1 |
|   10.234.4.55 |     1 |     1 |     5 |
|  192.168.7.11 |     2 |     1 |     3 |
| 10.25.215.200 |     1 |     3 |     1 |
|    172.35.0.1 |     2 |     5 |     1 |

I want to sort on the IP column to get

|            IP | 11/01 | 11/02 | 11/03 |
|---------------+-------+-------+-------|
|    10.1.213.5 |     2 |     1 |     0 |
| 10.25.215.200 |     1 |     3 |     1 |
|   10.234.4.55 |     1 |     1 |     5 |
|  172.25.100.1 |     4 |     1 |     1 |
|    172.35.0.1 |     2 |     5 |     1 |
|  192.168.7.11 |     2 |     1 |     3 |

That turns out to be surprisingly difficult. There’s no built-in method and I couldn’t find an appropriate sort routine that exposed the comparison function so that I could write my own.

The normal Unix sort can sort IP addresses with

sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4

Not easy or pretty but at least it gets the job done. My first attempt to get this to work was to mark the whole table except for the header line and the following rule line and then pipe it into sort with 【Ctrl+u Meta+|】. Sadly, this didn’t work because of the | that begins each line.

Next, I tried marking the rectangle comprising the data of the table with 【Ctrl+x Space】 and then piping it into sort as before. That didn’t work either.

Finally I remembered that I have cua-selection-mode enabled to mark rectangular regions. I marked the data with that and piped it into sort. Happily, that worked. If you haven’t already enabled cua-selection-mode, you should. It’s really useful.

I wouldn’t think sorting IP addresses would be that unusual but there’s no support for it all in Emacs. Most utilities do no better. Even sort only manages with some trickery. It’s probably just that IP addresses weren’t as ubiquitous as they are now when Emacs and those utilities were written. Or maybe I’m the only one who wants to sort by IP address.

So I solved the problem, sort of, but, really, it’s a terrible solution. After a bit of thought, I ginned up a patch and sent it off to the Org mailing list. Tomorrow, I’ll tell you the rest of the story.

Posted in General | Tagged | 2 Comments

PDF Animations

Edgar Aroutiounian has a nice post about adding animations to PDF files with Emacs, Org, and LaTeX. If you’re an OS X user, he also explains how to load a minimal TeX distribution rather than the huge MacTeX distribution.

The real magic is putting an animated graph into a PDF file. It’s surprisingly easy to do and doesn’t require much more than Emacs, Org, and LaTeX. Definitely worth reading if you think you might want to do this someday.

Posted in General | Tagged | Leave a comment

Emacs Function Frequency

Xah Lee has an interesting post of the frequency of Emacs functions in the Emacs code base. It’s easy to write such a thing off with a shrug but I found the chart fascinating. The first five most frequently used functions are setq, if, defun, let, and and. That’s not too surprising, of course, but I would have expected car and cdr to be in the first five.

As Lee says, it’s an interesting exercise to read down the list and find the first command you don’t already know. In my case that was oref, which is an eieio function. My excuse for not knowing it is that I’ve never used eieio. More to the point, though, is that now I do know it so I’ve learned something new.

Take a look at the list and see how far you get. Like me, you’ll probably know almost all of them but there may be a few that are new and then you’ll have learned something.

UPDATE: Fixed link.

Posted in Programming | Tagged | 4 Comments

Yosemite Autocorrect

This is a note for users of OS X Yosemite. With the new OS, spelling autocorrect is on by default. For me, at least, this was most evident in the mail app (almost all my other writing occurs in Emacs). When writing function names such as getkey-function, autocorrect would helpfully correct that to get key-function. It happens so quickly that half the time I didn’t even notice it.

I finally got fed up enough to try to fix it. The obvious place to look was in mail preferences but all you could do there was to turn off spell checking completely or just do it when you press send. I asked Duck Duck Go about it and found this helpful page. The TL;DR is that you can turn off autocorrect in the keyboard preferences; just uncheck the autocorrect box and you’re done.

Posted in General | Tagged , | Leave a comment

Ooh, I Must Be a Power User

Posted in General | Tagged | 2 Comments

Mastering Emacs, The Book

The estimable Mickey Petersen, proprietor of the Mastering Emacs blog, is working on a book. Mickey says that the book is not an encapsulation of his blog but rather is all new material. His announcement has a general outline of what he’s going to cover so read that if you’re interested.

Mickey’s aiming to release the book in February 2015 so we won’t have to wait long. If you sign up to be notified when it’s ready, Mickey will give you 20% off. You can sign up on the announcement page so head on over.

Posted in General | Tagged | Leave a comment

Dr. Dobbs, RIP

Although many younger developers don’t remember—or maybe weren’t even born—it wasn’t that many years ago that the Web as we know it today didn’t exist and access to what did exist was hard to obtain. In those sad times it was difficult for the struggling n00b to find examples of code to study and learn from. Linux and even the wide availability of BSD derived systems were still in the future.

What we did have, though, was Dr. Dobbs. It was a magazine for programmers that every month offered high quality articles that taught its readers valuable lessons about programming. I certainly learned a load from it. It was generally considered the premier magazine of its type.

Like most other tech magazines, Dr. Dobbs fell on hard times when the Internet became widely available and offered untold riches of high quality code for study. Still, it motored on as a Webzine for several more years. Now, sadly, after 38 years, its owner is sunetting Dr. Dobbs. Advertisers have discovered that ads on such sites aren’t as productive as they are elsewhere so revenues are down sharply.

Those of us who learned so much from the magazine will mourn its passing but, really, its time had come. Nevertheless, I’ll miss it and the comfort of knowing it was there to visit whenever I felt the urge or saw a reference to one of its current articles that seemed particularly interesting. Rest in peace, Doctor.

Posted in Programming | Tagged | Leave a comment