Merge pull request #3 from junegunn/alternating

Left-right alternating alignment (**)
This commit is contained in:
Junegunn Choi
2013-07-15 04:56:26 -07:00
3 changed files with 70 additions and 56 deletions

View File

@@ -7,7 +7,7 @@ Features:
- Optimized for code editing
- Extensible alignment rules
- Aligns text around either _all or n-th_ appearance(s) of the delimiter
- Aligns text around either _all or n-th_ occurrence(s) of the delimiter
- Ignores comment lines
- Ignores lines without a matching delimiter
@@ -46,14 +46,15 @@ With the mapping, you can align selected lines with a few keystrokes.
1. `<Enter>` key to start interactive EasyAlign command
1. Optional Enter keys to toggle right-justification mode
1. Optional field number (default: 1)
- `1` Alignment around 1st delimiters
- `2` Alignment around 2nd delimiters
- `1` Around the 1st occurrences of delimiters
- `2` Around the 2nd occurrences of delimiters
- ...
- `*` Alignment around all delimiters (recursive)
- `-` Alignment around the last delimiters (`-1`)
- `-2` Alignment around the one before the last delimiters
- `*` Around all occurrences of delimiters
- `**` Left-right alternating alignment around all delimiters
- `-` Around the last occurrences of delimiters (`-1`)
- `-2` Around the second to last occurrences of delimiters
- ...
1. Delimiter (`<space>`, `=`, `:`, `.`, `|`, `,`, `}`)
1. Delimiter (`<space>`, `=`, `:`, `.`, `|`, `,`)
Alignment rules for the following delimiters have been defined to meet the most needs.
@@ -64,24 +65,24 @@ Alignment rules for the following delimiters have been defined to meet the most
| `:` | Suitable for formatting JSON or YAML |
| `.` | Multi-line method chaining |
| `,` | Multi-line method arguments |
| `}` | Closing braces (Try using it with a negative field number) |
| &#124; | Table markdown |
### Example command sequences
| With visual map | Description | Equivalent command |
| ----------------- | ------------------------------------------------- | ----------------------- |
| `<Enter>=` | Alignment around 1st equals signs (and the likes) | `:'<,'>EasyAlign=` |
| `<Enter>2=` | Alignment around 2nd equals signs (and the likes) | `:'<,'>EasyAlign2=` |
| `<Enter>3=` | Alignment around 3rd equals signs (and the likes) | `:'<,'>EasyAlign3=` |
| `<Enter>*=` | Alignment around all equals signs (and the likes) | `:'<,'>EasyAlign*=` |
| `<Enter><Enter>=` | Right-justified alignment around 1st equals signs | `:'<,'>EasyAlignRight=` |
| `<Enter><space>` | Alignment around 1st whitespaces | `:'<,'>EasyAlign\ ` |
| `<Enter>2<space>` | Alignment around 2nd whitespaces | `:'<,'>EasyAlign2\ ` |
| `<Enter>-<space>` | Alignment around the last whitespaces | `:'<,'>EasyAlign-\ ` |
| `<Enter>:` | Alignment around 1st colon | `:'<,'>EasyAlign:` |
| `<Enter>-}` | Alignment around the last closing braces | `:'<,'>EasyAlign-}` |
| ... | ... | |
| With visual map | Description | Equivalent command |
| ------------------- | -------------------------------------------------------- | ------------------------- |
| `<Enter><space>` | Alignment around 1st whitespaces | `:'<,'>EasyAlign\ ` |
| `<Enter>2<space>` | Alignment around 2nd whitespaces | `:'<,'>EasyAlign2\ ` |
| `<Enter>-<space>` | Alignment around the last whitespaces | `:'<,'>EasyAlign-\ ` |
| `<Enter>:` | Alignment around 1st colon | `:'<,'>EasyAlign:` |
| `<Enter>=` | Alignment around 1st equals signs (and the likes) | `:'<,'>EasyAlign=` |
| `<Enter>2=` | Alignment around 2nd equals signs (and the likes) | `:'<,'>EasyAlign2=` |
| `<Enter>3=` | Alignment around 3rd equals signs (and the likes) | `:'<,'>EasyAlign3=` |
| `<Enter>*=` | Alignment around all equals signs (and the likes) | `:'<,'>EasyAlign*=` |
| `<Enter>**=` | Left-right alternating alignment around all equals signs | `:'<,'>EasyAlign**=` |
| `<Enter><Enter>=` | Right-justified alignment around 1st equals signs | `:'<,'>EasyAlignRight=` |
| `<Enter><Enter>**=` | Right-left alternating alignment around all equals signs | `:'<,'>EasyAlignRight**=` |
| ... | ... | |
### Partial alignment in blockwise-visual mode

View File

@@ -147,7 +147,8 @@ function! s:do_align(just, cl, fl, ll, fc, lc, pattern, nth, ml, mr, stick_to_le
endfor
if a:recursive && a:nth < max_tokens
call s:do_align(a:just, a:cl, a:fl, a:ll, a:fc, a:lc, a:pattern, a:nth + 1, a:ml, a:mr, a:stick_to_left, a:recursive)
let just = a:recursive == 2 ? !a:just : a:just
call s:do_align(just, a:cl, a:fl, a:ll, a:fc, a:lc, a:pattern, a:nth + 1, a:ml, a:mr, a:stick_to_left, a:recursive)
endif
endfunction
@@ -168,32 +169,38 @@ function! easy_align#align(just, ...) range
let c = getchar()
let ch = nr2char(c)
if c == 3 || c == 27
if c == 3 || c == 27 " CTRL-C / ESC
return
elseif c == '<27>kb'
elseif c == '<27>kb' " Backspace
if len(n) > 0
let n = strpart(n, 0, len(n) - 1)
endif
elseif c == 13
elseif c == 13 " Enter key
let just = (just + 1) % len(s:just)
elseif index(['-', '*'], ch) != -1
elseif ch == '-'
if empty(n)
let n = ch
let n = '-'
elseif n == '-'
let n = ''
else
break
endif
elseif c == 48
if n == '-'
let n = '-0'
elseif ch == '*'
if empty(n)
let n = '*'
elseif n == '*'
let n = '**'
elseif n == '**'
let n = ''
else
break
endif
elseif c > 48 && c <= 57
if n != '*'
elseif c >= 48 && c <= 57
if n[0] == '*'
break
else
let n = n . ch
else
break
endif
end
else
break
endif
@@ -214,15 +221,20 @@ function! easy_align#align(just, ...) range
endif
if n == '*'
let n = 1
let nth = 1
let recursive = 1
elseif n == '**'
let nth = 1
let recursive = 2
elseif n == '-'
let n = -1
let nth = -1
elseif empty(n)
let n = 1
let nth = 1
elseif n != '-0' && n != string(str2nr(n))
echon "\rInvalid field number: ". n
return
else
let nth = n
endif
let delimiters = extend(copy(s:easy_align_delimiters_default),
@@ -234,11 +246,11 @@ function! easy_align#align(just, ...) range
\ visualmode() == '' ? min([col("'<"), col("'>")]) : 1,
\ visualmode() == '' ? max([col("'<"), col("'>")]) : 0,
\ get(dict, 'pattern', ch),
\ n,
\ nth,
\ get(dict, 'margin_left', ' '),
\ get(dict, 'margin_right', ' '),
\ get(dict, 'stick_to_left', 0), recursive)
call s:echon(just, (recursive ? '*' : n), ch)
call s:echon(just, n, ch)
else
echon "\rUnknown delimiter: ". ch
endif

View File

@@ -22,35 +22,36 @@ With this mapping, you can align selected lines with a few keystrokes.
1. <Enter> key to start interactive EasyAlign command
2. Optional Enter keys to switch justficiation mode (default: left)
3. Optional field number (default: 1)
1 Alignment around 1st delimiters
2 Alignment around 2nd delimiters
1 Around the 1st occurrences of delimiters
2 Around the 2nd occurrences of delimiters
* Around all occurrences of delimiters
** Left-right alternating alignment around all delimiters
- Around the last occurrences of delimiters (`-1`)
-2 Around the second to last occurrences of delimiters
...
* Alignment around all delimiters (recursive)
- Alignment around the last delimieters
-2 Alignment around the one before the last delimieters
4. Delimiter
<space> General alignment around whitespaces
= Operators containing equals sign (=, ==, !=, +=, &&=, ...)
: Suitable for formatting JSON or YAML
. Multi-line method chaining
, Multi-line method arguments. CSV.
} Closing braces (Try using it with a negative field number)
| Table markdown
During the key sequence, <Enter> key will toggle right-justification mode.
Examples:
<Enter>= Alignment around 1st equals signs (and the likes)
<Enter>2= Alignment around 2nd equals signs (and the likes)
<Enter>3= Alignment around 3rd equals signs (and the likes)
<Enter>*= Alignment around all equals signs (and the likes)
<Enter><Enter>= Right-justified alignment around 1st equals signs
<Enter><space> Alignment around 1st whitespaces
<Enter>2<space> Alignment around 2nd whitespaces
<Enter>-<space> Alignment around the last whitespaces
<Enter>: Alignment around 1st colons
<Enter>-} Alignment around the last closing braces
<Enter><space> Alignment around 1st whitespaces
<Enter>2<space> Alignment around 2nd whitespaces
<Enter>-<space> Alignment around the last whitespaces
<Enter>: Alignment around 1st colon
<Enter>= Alignment around 1st equals signs (and the likes)
<Enter>2= Alignment around 2nd equals signs (and the likes)
<Enter>3= Alignment around 3rd equals signs (and the likes)
<Enter>*= Alignment around all equals signs (and the likes)
<Enter>**= Left-right alternating alignment around all equals signs
<Enter><Enter>= Right-justified alignment around 1st equals signs
<Enter><Enter>**= Right-left alternating alignment around all equals signs
EasyAlignRight *EasyAlignRight*