mirror of
https://github.com/junegunn/vim-easy-align.git
synced 2025-11-11 19:33:50 -05:00
Merge pull request #3 from junegunn/alternating
Left-right alternating alignment (**)
This commit is contained in:
43
README.md
43
README.md
@@ -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) |
|
||||
| | | 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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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*
|
||||
|
||||
Reference in New Issue
Block a user