Categories
Uncategorized

assignment alignment in vim

I’ve just been reading some articles about programming vim from Damian Conway.

* Scripting the Vim editor, Part 1: Variables, values, and expressions
* Scripting the Vim editor, Part 2: User-defined functions

The latter has a very useful example.

function AlignAssignments()
   " Patterns needed to locate assignment operators. "
   let ASSIGN_OP   = '[-+*/%|&]?=@<!=[=~]@!'
   let ASSIGN_LINE = '^(.{-})s*(' . ASSIGN_OP . ')'

   " Locate block of code to be considered (same indentation, no blanks) "
   let indent_pat = '^' . matchstr(getline('.'), '^s*') . 'S'
   let firstline  = search('^%(' . indent_pat . ')@!', 'bnW') + 1
   let lastline   = search('^%(' . indent_pat . ')@!',  'nW') - 1
   if lastline = 0
           let max_align_col = max([max_align_col, left_width])
           let op_width      = strlen(matchstr(linetext, ASSIGN_OP))
           let max_op_width  = max([max_op_width, op_width + 1])
       endif
   endfor

   " Code needed to reformat lines so as to align operators. "
   let FORMATTER = '=printf("%-*s%*s", max_align_col, submatch(1),
                                       max_op_width,  submatch(2))'

   " Reformat lines with operators aligned in the appropriate column. "
   for linenum in range(firstline, lastline)
       let oldline = getline(linenum)
       let newline = substitute(oldline, ASSIGN_LINE, FORMATTER, "")
       call setline(linenum, newline)
   endfor
endfunction

nmap  ;= :call AlignAssignments()

This allows you to line up assignments so that all the the equals appear in a column. I find this much easier to read.

To use this code, paste it into a file ~/.vim/plugin/AlignAssignments.vim. It’ll get loaded automatically. From then on you use it by going to a group of assignments and hitting ;=. Blam!

There are other alignment plugins available in the vim scripts archive, but this one is relatively small & simple.