function! puppet#align#IndentLevel(lnum) return indent(a:lnum) / &shiftwidth endfunction function! puppet#align#LinesInBlock(lnum) let lines = [] let indent_level = puppet#align#IndentLevel(a:lnum) let marker = a:lnum - 1 while marker >= 1 let line_text = getline(marker) let line_indent = puppet#align#IndentLevel(marker) if line_text =~? '\v\S' if line_indent < indent_level break elseif line_indent == indent_level call add(lines, marker) endif endif let marker -= 1 endwhile let marker = a:lnum while marker <= line('$') let line_text = getline(marker) let line_indent = puppet#align#IndentLevel(marker) if line_text =~? '\v\S' if line_indent < indent_level break elseif line_indent == indent_level call add(lines, marker) endif endif let marker += 1 endwhile return lines endfunction function! puppet#align#AlignHashrockets() let lines_in_block = puppet#align#LinesInBlock(line('.')) let max_left_len = 0 let indent_str = printf('%' . indent(line('.')) . 's', '') for line_num in lines_in_block let data = matchlist(getline(line_num), '^\s*\(.*\S\)\s*=>\s*\(.*\)$') if !empty(data) let max_left_len = max([max_left_len, strlen(data[1])]) endif endfor for line_num in lines_in_block let data = matchlist(getline(line_num), '^\s*\(.*\S\)\s*=>\s*\(.*\)$') if !empty(data) let new_line = printf('%s%-' . max_left_len . 's => %s', indent_str, data[1], data[2]) call setline(line_num, new_line) endif endfor endfunction