64 Commits
2.4.2 ... 2.8.0

Author SHA1 Message Date
Junegunn Choi
2daae46a43 Fix indentation option to work with hard tabs (#19) 2013-10-31 12:32:07 +09:00
Junegunn Choi
2b119f9bb6 Fix issue #19 (hard tab indentation) 2013-10-31 11:08:02 +09:00
Junegunn Choi
15bcbc9499 Update readme 2013-10-29 23:24:14 +09:00
Junegunn Choi
54e6b5d866 Update screenshot 2013-10-29 22:17:23 +09:00
Junegunn Choi
1f28ce346e Update README 2013-10-27 03:14:40 +09:00
Junegunn Choi
2832a76cea Implement filter option (#16, #17)
This commit implements filter option which can be used to filter lines within
the range based on the given pattern. The value of filter option should be
either `g/pattern/` or `v/pattern/`. The former aligns lines that match the
pattern, the latter aligns lines that do not match the pattern.
2013-10-27 03:10:04 +09:00
Junegunn Choi
1a232ac19b Revert "Make user confirm regular expression on live interactive mode"
This reverts commit a76cfdb8ae.
2013-10-25 02:17:52 +09:00
Junegunn Choi
a76cfdb8ae Make user confirm regular expression on live interactive mode 2013-10-25 02:11:43 +09:00
Junegunn Choi
c3a7842b0d Remove a redundant Expect block 2013-10-22 11:24:46 +09:00
Junegunn Choi
3cc564bd68 Do not attach margin_left string before phantom token 2013-10-19 19:49:11 +09:00
Junegunn Choi
6e2264672a Implement live interactive mode (#15)
This commit adds LiveEasyAlign command. (The name was chosen not to introduce
ambiguity when typing in only the prefix of the command: e.g. `:EasyA*|`)
In live interactive mode, the selected text is aligned on-the-fly as the user
type in. In order to finalize the alignment, the user has to type in the
same delimiter key again. (Or CTRL-X on regular expressions)
2013-10-19 19:21:23 +09:00
Junegunn Choi
bec3e94383 Log g:easy_align_last_command 2013-10-18 18:05:52 +09:00
Junegunn Choi
7f0fccba0b Update README 2013-10-15 23:08:16 +09:00
Junegunn Choi
aa62ca4603 Update documentation 2013-10-15 23:07:14 +09:00
Junegunn Choi
831cecdaf2 Implement g:easy_align_bypass_fold switch (#14) with a small fix 2013-10-15 23:00:43 +09:00
Junegunn Choi
37fa908d04 Remove s:max function
Sadly function calls are rather slow in Vimscript.
Test shows that this commit reduces the response time by 10%.
2013-10-13 12:16:58 +09:00
Junegunn Choi
256e5b83ab Remove recursion not to fail in case of many delimiters (> maxfuncdepth) 2013-10-13 03:31:05 +09:00
Junegunn Choi
cb7306341c Use function() instead of a forwarding function 2013-10-13 02:10:33 +09:00
Junegunn Choi
7b82a1e496 Fix: right margin sometimes not attached in partial alignment 2013-10-13 02:09:06 +09:00
Junegunn Choi
ad2df21039 Add alignment rule for LaTeX tables (#13) 2013-10-10 22:15:23 +09:00
Junegunn Choi
4c2808d13c Relocate operator section 2013-10-10 16:04:48 +09:00
Junegunn Choi
124654ec46 Update test doc 2013-10-10 12:58:27 +09:00
Junegunn Choi
ab4b72addf Update README 2013-10-10 12:55:00 +09:00
Junegunn Choi
cdc648f5a4 EasyAlign command as Vim operator 2013-10-10 12:51:43 +09:00
Junegunn Choi
438b5312ee Thoroughly tested 2013-10-10 00:33:32 +09:00
Junegunn Choi
e24f8479a5 Fix invalid test case 2013-10-10 00:19:54 +09:00
Junegunn Choi
9d626dd765 Add test cases for ignore_unmatched behavior 2013-10-10 00:18:52 +09:00
Junegunn Choi
7490aa61d7 Merge pull request #12 from junegunn/vader
Testing with Vader.vim
2013-10-09 08:06:51 -07:00
Junegunn Choi
aa42666f10 Remove recording-based test for interactive mode 2013-10-10 00:03:21 +09:00
Junegunn Choi
9951cad2d0 Rename README 2013-10-09 22:18:38 +09:00
Junegunn Choi
cb5041ba67 Merge branch 'master' into vader 2013-10-09 22:18:20 +09:00
Junegunn Choi
7019edb08c More test cases on Vader 2013-10-09 22:11:03 +09:00
Junegunn Choi
247f69bf3f Migrate more test cases to Vader 2013-10-09 20:39:17 +09:00
Junegunn Choi
133588b181 Testing with Vader.vim 2013-10-09 20:16:58 +09:00
Junegunn Choi
fb8cf1d54a Update doc 2013-10-08 10:59:17 +09:00
Junegunn Choi
013fb54dd1 Update documentation 2013-10-07 21:13:17 +09:00
Junegunn Choi
2bf1b2164d Allow shorthand option notation when using delimiter key
e.g. :EasyAlign=l2r2dlmlr**
2013-10-07 21:09:37 +09:00
Junegunn Choi
bab23a1917 Update documentation 2013-10-05 15:55:22 +09:00
Junegunn Choi
fa26fd7b42 Remove option value after every cycle 2013-10-05 15:27:50 +09:00
Junegunn Choi
a4a1e27395 Apply ignore_unmatched option on R/C mode if explicitly set
By default, unmatched trailing token from each line is also aligned in
right and center alignment modes unlike in left alignment mode. If
ignore_unmatched option is explicitly set to 1 by user, they will be ignored
even in right/center modes.
2013-10-05 12:23:44 +09:00
Junegunn Choi
98bd9fe6f0 Shorthand notation for ignore_groups/ignore_unmatched
e.g. ig['String']iu0
2013-10-04 02:29:24 +09:00
Junegunn Choi
f944f5bf29 Set g:easy_align_last_command 2013-10-04 02:07:35 +09:00
Junegunn Choi
484b4ba5ec Update doc 2013-10-04 01:50:43 +09:00
Junegunn Choi
9d3afa6206 Merge option values in dictionary and shortcut expression 2013-10-04 01:36:55 +09:00
Junegunn Choi
4c6a8c174d Implement shortcut expression for options 2013-10-03 21:59:51 +09:00
Junegunn Choi
3304f4e95a Make <Down> set both left and right margin to zero
(Undocumented) <Up> will clear *UP* left_margin, right_margin, and stick_to_left
2013-10-03 16:06:23 +09:00
Junegunn Choi
e4f86274e3 Update install instructions 2013-09-22 23:04:20 +09:00
Junegunn Choi
2d575bcc25 Underscore between parens 2013-09-22 22:56:27 +09:00
Junegunn Choi
8a783c2125 Fix a failure in test due to change in interactive mode 2013-09-22 22:21:23 +09:00
Junegunn Choi
5230a2402f Disallow 0 as the first character of N-th 2013-09-22 21:58:31 +09:00
Junegunn Choi
94a750e03e Remove unnecessary prev output wipe 2013-09-22 21:48:14 +09:00
Junegunn Choi
afc95b5ed7 Forgiving interactive mode: Do not terminate on invalid input 2013-09-22 21:17:02 +09:00
Junegunn Choi
1d2c58c06a Field index -> N-th parameter 2013-09-22 03:52:36 +09:00
Junegunn Choi
4cdc450126 Update DEMO.md 2013-09-21 23:53:47 +09:00
Junegunn Choi
7e1be152dc Add DEMO.md 2013-09-21 15:46:40 +09:00
Junegunn Choi
c61a11d150 Update doc
- Field number -> Field index
2013-09-21 13:08:55 +09:00
Junegunn Choi
2797baca6c Disallow non-printable character input 2013-09-21 12:04:56 +09:00
Junegunn Choi
663264ed39 Fix center-alignment
= = eee   = eee = f
= = gg  &&= gg
= = fff

= = eee   = eee = f
= = gg  &&= gg
= = f f
2013-09-21 03:31:34 +09:00
Junegunn Choi
df75520f72 Colored, replayable output 2013-09-21 03:11:20 +09:00
Junegunn Choi
a2d52611ee Fix invalid type conversion 2013-09-20 23:19:32 +09:00
Junegunn Choi
fce0a103ff Use try-finally for reverting the setup 2013-09-19 17:27:26 +09:00
Junegunn Choi
1752bf567b Improve message output
- Error message highlighting
- Wipe previous message if needed
- No line wrap on narrow terminal
2013-09-19 17:10:00 +09:00
Junegunn Choi
003194a47f Update example command sequences 2013-09-18 16:18:03 +09:00
Junegunn Choi
c1c6f32e8c Update example command sequence 2013-09-18 15:50:19 +09:00
19 changed files with 2930 additions and 1883 deletions

91
DEMO.md Normal file
View File

@@ -0,0 +1,91 @@
# vim: set buftype=nofile colorcolumn= scrolloff=0 noshowcmd:
vim-easy-align
==============
Where's Lennon?
---------------
Paul McCartney 1942
George Harrison 1943
Ringo Starr 1940
Pete Best 1941
Formatting table
----------------
```
| Option| Type | Default | Description |
|--|--|--|--|
| threads | Fixnum | 1 | number of threads in the thread pool |
|queues |Fixnum | 1 | number of concurrent queues |
|queue_size | Fixnum | 1000 | size of each queue |
| interval | Numeric | 0 | dispatcher interval for processing |
|batch | Boolean | false | enables batch processing mode |
|batch_size | Fixnum | nil | maximum number of items in batch|
|logger | Logger | nil | logger instance for debug logs |
```
Operators with = sign
---------------------
```ruby
a =
a = 1
bbbb = 2
ccccccc = 3
ccccccccccccccc
ddd = 4
eeee === eee = eee = eee=f
fff = ggg += gg &&= gg
g != hhhhhhhh == 888
i := 5
i %= 5
i *= 5
j =~ 5
j >= 5
aa => 123
aa <<= 123
aa >>= 123
bbb => 123
c => 1233123
d => 123
dddddd &&= 123
dddddd ||= 123
dddddd /= 123
gg <=> ee
```
Formatting YAML (or JSON)
-------------------------
```yaml
mysql:
# JDBC driver for MySQL database:
driver: com.mysql.jdbc.Driver
# JDBC URL for the connection (jdbc:mysql://HOSTNAME/DATABASE)
url: jdbc:mysql://localhost/test
database: test
"user:pass":r00t:pa55
```
Using blockwise-visual mode or negative N-th parameter
------------------------------------------------------
```ruby
options = { :caching => nil,
:versions => 3,
"cache=blocks" => false }.merge(options)
```
Commas
------
aaa, bb,c
d,eeeeeee
fffff, gggggggggg,
h, , ii
j,,k

View File

@@ -166,8 +166,8 @@ my_object
```
Using blockwise-visual mode or negative field index
---------------------------------------------------
Using blockwise-visual mode or negative N-th parameter
------------------------------------------------------
You can try either:
- select text around `=>` in blockwise-visual mode (`CTRL-V`) and `<Enter>=`

322
README.md
View File

@@ -6,9 +6,9 @@ A simple, easy-to-use Vim alignment plugin.
Demo
----
![Screencast](https://raw.github.com/junegunn/vim-easy-align/gif/vim-easy-align.gif)
![Screencast](https://raw.github.com/junegunn/i/master/vim-easy-align.gif)
(Too fast? Slower GIF is [here](https://raw.github.com/junegunn/vim-easy-align/gif/vim-easy-align-slow.gif))
(Too fast? Slower GIF is [here](https://raw.github.com/junegunn/i/master/vim-easy-align.gif))
Features
--------
@@ -37,15 +37,17 @@ and extract in ~/.vim or
[plugin](https://github.com/Shougo/neobundle.vim)
[manager](https://github.com/MarcWeber/vim-addon-manager).
### With Vundle
Add the following line to your .vimrc,
```vim
Bundle 'junegunn/vim-easy-align'
```
then execute `:BundleInstall` command.
- [Pathogen](https://github.com/tpope/vim-pathogen)
- `git clone https://github.com/junegunn/vim-easy-align.git ~/.vim/bundle/vim-easy-align`
- [Vundle](https://github.com/gmarik/vundle)
1. Add `Bundle 'junegunn/vim-easy-align'` to .vimrc
2. Run `:BundleInstall`
- [NeoBundle](https://github.com/Shougo/neobundle.vim)
1. Add `NeoBundle 'junegunn/vim-easy-align'` to .vimrc
2. Run `:NeoBundleInstall`
- [vim-plug](https://github.com/junegunn/vim-plug)
1. Add `Plug 'junegunn/vim-easy-align'` to .vimrc
2. Run `:PlugInstall`
Usage
-----
@@ -56,14 +58,15 @@ variant `:EasyAlign!`) for visual mode.
| Mode | Command |
| ------------------------- | ------------------------------------------------ |
| Interactive mode | `:EasyAlign[!] [OPTIONS]` |
| Using predefined rules | `:EasyAlign[!] [FIELD#] DELIMITER_KEY [OPTIONS]` |
| Using regular expressions | `:EasyAlign[!] [FIELD#] /REGEXP/ [OPTIONS]` |
| Using predefined rules | `:EasyAlign[!] [N-th] DELIMITER_KEY [OPTIONS]` |
| Using regular expressions | `:EasyAlign[!] [N-th] /REGEXP/ [OPTIONS]` |
| Live interactive mode | `:LiveEasyAlign[!] [...]` |
### Concept of _alignment rule_
An *alignment rule* is a predefined set of options for common alignment tasks,
which is identified by a single character, *DELIMITER KEY*, such as `<space>`,
`=`, `:`, `.`, `|`, and `,`.
`=`, `:`, `.`, `|`, `&`, and `,`.
Think of it as a shortcut. Instead of writing regular expression and setting
several options, you can just type in a single character.
@@ -75,7 +78,7 @@ For convenience, it is advised that you define a mapping for triggering it in
your `.vimrc`.
```vim
vnoremap <silent> <Enter> :EasyAlign<cr>
vnoremap <silent> <Enter> :EasyAlign<Enter>
```
(Of course you can use any key combination as the trigger. e.g. `<Leader>a`)
@@ -83,8 +86,8 @@ vnoremap <silent> <Enter> :EasyAlign<cr>
With the mapping, you can align selected lines of text with only a few keystrokes.
1. `<Enter>` key to start interactive EasyAlign command
1. Optional Enter keys to select alignment mode (left, right, or center)
1. Optional field number (default: 1)
1. Optional: Enter keys to select alignment mode (left, right, or center)
1. Optional: N-th delimiter (default: 1)
- `1` Around the 1st occurrences of delimiters
- `2` Around the 2nd occurrences of delimiters
- ...
@@ -93,7 +96,7 @@ With the mapping, you can align selected lines of text with only a few keystroke
- `-` Around the last occurrences of delimiters (`-1`)
- `-2` Around the second to last occurrences of delimiters
- ...
1. Delimiter key (a single keystroke; `<space>`, `=`, `:`, `.`, `|`, `,`)
1. Delimiter key (a single keystroke; `<space>`, `=`, `:`, `.`, `|`, `&`, `,`)
Alignment rules for the following delimiters have been defined to meet the most needs.
@@ -104,6 +107,7 @@ 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 |
| `&` | LaTeX tables (matches `&` and `\\`) |
| &#124; | Table markdown |
You can override these default rules or define your own rules with
@@ -112,20 +116,21 @@ You can override these default rules or define your own rules with
#### Example command sequences
| 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 alignment around 1st equals signs | `:'<,'>EasyAlign!=` |
| `<Enter><Enter>**=` | Right-left alternating alignment around all equals signs | `:'<,'>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>-2<space>` | Alignment around the 2nd to last whitespaces | `:'<,'>EasyAlign-2\ ` |
| `<Enter>:` | Alignment around 1st colon (`key: value`) | `:'<,'>EasyAlign:` |
| `<Enter><Right>:` | Alignment around 1st colon (`key : value`) | `:'<,'>EasyAlign:s0l1` |
| `<Enter>=` | Alignment around 1st operators with = | `:'<,'>EasyAlign=` |
| `<Enter>2=` | Alignment around 2nd operators with = | `:'<,'>EasyAlign2=` |
| `<Enter>3=` | Alignment around 3rd operators with = | `:'<,'>EasyAlign3=` |
| `<Enter>*=` | Alignment around all operators with = | `:'<,'>EasyAlign*=` |
| `<Enter>**=` | Left-right alternating alignment around all = operators | `:'<,'>EasyAlign**=` |
| `<Enter><Enter>=` | Right alignment around 1st equals signs | `:'<,'>EasyAlign!=` |
| `<Enter><Enter>**=` | Right-left alternating alignment around all = operators | `:'<,'>EasyAlign!**=` |
#### Using regular expressions
@@ -146,39 +151,55 @@ keys listed below. The meaning of each option will be described in
| Key | Option | Values |
| -------- | ------------------ | -------------------------------------------------- |
| `CTRL-F` | `filter` | Input string (`[gv]/.*/?`) |
| `CTRL-I` | `indentation` | shallow, deep, none, keep |
| `CTRL-L` | `left_margin` | Input number or string |
| `CTRL-R` | `right_margin` | Input number or string |
| `CTRL-D` | `delimiter_align` | left, center, right |
| `CTRL-U` | `ignore_unmatched` | 0, 1 |
| `CTRL-G` | `ignore_groups` | [], ['String'], ['Comment'], ['String', 'Comment'] |
| `CTRL-O` | `mode_sequence` | Input string of `/[lrc]+\*{0,2}/` |
| `CTRL-O` | `mode_sequence` | Input string (`/[lrc]+\*{0,2}/`) |
| `<Left>` | `stick_to_left` | `{ 'stick_to_left': 1, 'left_margin': 0 }` |
| `<Right>` | `stick_to_left` | `{ 'stick_to_left': 0, 'left_margin': 1 }` |
| `<Down>` | `*_margin` | `{ 'left_margin': 0, 'right_margin': 0 }` |
---
After a successful alignment, you can repeat the same operation using the
repeatable, non-interactive command recorded in `g:easy_align_last_command`.
### *Intermission*
```vim
:<C-R>=g:easy_align_last_command<Enter><Enter>
```
You can stop reading here. Trust me. All the fancy features described in the
following sections are really powerful but you won't be needing them in most
of the cases.
### Live interactive mode
Go try out vim-easy-align right now, and come back later when you feel like it.
If you're performing a complex alignment where multiple options should be
carefully adjusted, try "live interactive mode" where you can preview the result
of the alignment on-the-fly as you type in.
---
Live interactive mode can be started with `:LiveEasyAlign` command which takes
the same parameters as `:EasyAlign`. I suggest you define a mapping such as
follows in addition to the one for `:EasyAlign` command.
### Non-interactive mode
```vim
vnoremap <silent> <Leader><Enter> :LiveEasyAlign<Enter>
```
Instead of going into the interactive mode, you can type in arguments to
In live interactive mode, you have to type in the same delimiter (or `CTRL-X` on
regular expression) again to finalize the alignment. This allows you to preview
the result of the alignment and freely change the delimiter using backspace key
without leaving the interactive mode.
### Using `EasyAlign` in command line
Instead of going into the interactive mode, you can just type in arguments to
`:EasyAlign` command.
```vim
" Using predefined alignment rules
:EasyAlign[!] [FIELD#] DELIMITER_KEY [OPTIONS]
:EasyAlign[!] [N-th] DELIMITER_KEY [OPTIONS]
" Using arbitrary regular expressions
:EasyAlign[!] [FIELD#] /REGEXP/ [OPTIONS]
:EasyAlign[!] [N-th] /REGEXP/ [OPTIONS]
```
For example, when aligning the following lines around colons and semi-colons,
@@ -193,13 +214,14 @@ try these commands:
- `:EasyAlign */[:;]\+/`
- `:EasyAlign **/[:;]\+/`
Notice that you can't append `\zs` to your regular expression to put delimiters
on the left. It can be done by providing additional options in Vim dictionary
format.
You can also provide a number of alignment options, [which will be discussed in
detail later](https://github.com/junegunn/vim-easy-align#alignment-options),
to EasyAlign command in Vim dictionary format.
- `:EasyAlign * /[:;]\+/ { 'stick_to_left': 1, 'left_margin': 0 }`
Then we get:
Which means that the matched delimiter should be positioned right next to the
preceding token, without margin on the left. So we get:
apple;: banana:: cake
data;; exchange:; format
@@ -212,8 +234,27 @@ You can even omit spaces between the arguments, so concisely (or cryptically):
- `:EasyAlign*/[:;]\+/{'s':1,'l':0}`
The same thing can be done in the interactive mode as well with the following
key combination.
Nice. But let's make it even shorter. Option values can be written in shorthand
notation.
- `:EasyAlign*/[:;]\+/s1l0`
The following table summarizes the shorthand notation.
| Option | Expression |
| ---------------- | ---------- |
| filter | `[gv]/.*/` |
| left_margin | `l[0-9]+` |
| right_margin | `r[0-9]+` |
| stick_to_left | `s[01]` |
| ignore_unmatched | `iu[01]` |
| ignore_groups | `ig\[.*\]` |
| delimiter_align | `d[lrc]` |
| mode_sequence | `m[lrc*]*` |
| indentation | `i[ksdn]` |
For your information, the same thing can be done in the interactive mode as well
with the following key combination.
- `<Enter>`
- `*`
@@ -246,7 +287,27 @@ my_hash = { :a => 1,
```
However, in this case, we don't really need blockwise visual mode
since the same can be easily done using the negative field number: `<Enter>-=`
since the same can be easily done using the negative N-th parameter: `<Enter>-=`
### EasyAlign as Vim operator
You can define an operator function which executes EasyAlign command, so that it
can be used with a Vim movement.
```vim
function! s:easy_align_1st_eq(type, ...)
'[,']EasyAlign=
endfunction
nnoremap <Leader>= :set opfunc=<SID>easy_align_1st_eq<Enter>g@
function! s:easy_align_1st_colon(type, ...)
'[,']EasyAlign:
endfunction
nnoremap <Leader>: :set opfunc=<SID>easy_align_1st_colon<Enter>g@
```
Now without going into visual mode, you can align the lines in the paragraph
by `<Leader>=ip` or `<Leader>:ip`.
Alignment options
-----------------
@@ -255,6 +316,7 @@ Alignment options
| Option | Type | Default | Description |
| ------------------ | ------- | --------------------- | ------------------------------------------------------- |
| `filter` | string | | Line filtering expression: `g/../` or `v/../` |
| `left_margin` | number | 1 | Number of spaces to attach before delimiter |
| `left_margin` | string | `' '` | String to attach before delimiter |
| `right_margin` | number | 1 | Number of spaces to attach after delimiter |
@@ -270,19 +332,44 @@ There are 4 ways to set alignment options (from lowest precedence to highest):
1. Some option values can be set with corresponding global variables
2. Option values can be specified in the definition of each alignment rule
3. Option values can be given as a dictionary argument to `:EasyAlign` command
3. Option values can be given as arguments to `:EasyAlign` command
4. Option values can be set in interactive mode using special shortcut keys
| Option | Shortcut key | Global variable |
| ------------------ | ------------------- | ------------------------------- |
| `left_margin` | `CTRL-L` | |
| `right_margin` | `CTRL-R` | |
| `stick_to_left` | `<Left>`, `<Right>` | |
| `ignore_groups` | `CTRL-G` | `g:easy_align_ignore_groups` |
| `ignore_unmatched` | `CTRL-U` | `g:easy_align_ignore_unmatched` |
| `indentation` | `CTRL-I` | `g:easy_align_indentation` |
| `delimiter_align` | `CTRL-D` | `g:easy_align_delimiter_align` |
| `mode_sequence` | `CTRL-O` | |
| Option name | Shortcut key | Abbreviated | Global variable |
| ------------------ | ------------------- | ----------- | ------------------------------- |
| `filter` | `CTRL-F` | `[gv]/.*/` | |
| `left_margin` | `CTRL-L` | `l[0-9]+` | |
| `right_margin` | `CTRL-R` | `r[0-9]+` | |
| `stick_to_left` | `<Left>`, `<Right>` | `s[01]` | |
| `ignore_groups` | `CTRL-G` | `ig\[.*\]` | `g:easy_align_ignore_groups` |
| `ignore_unmatched` | `CTRL-U` | `iu[01]` | `g:easy_align_ignore_unmatched` |
| `indentation` | `CTRL-I` | `i[ksdn]` | `g:easy_align_indentation` |
| `delimiter_align` | `CTRL-D` | `d[lrc]` | `g:easy_align_delimiter_align` |
| `mode_sequence` | `CTRL-O` | `m[lrc*]*` | |
### Filtering lines
With `filter` option, you can align lines that only match or do not match a
given pattern. There are several ways to set the pattern.
1. Press `CTRL-F` in interactive mode and input `g/pat/` or `v/pat/`
2. In command-line, it can be written in dictionary format: `{'filter': 'g/pat/'}`
3. Or in shorthand notation: `g/pat/` or `v/pat/`
(You don't need to escape '/'s in the regular expression)
#### Examples
```vim
" Start interactive mode with filter option set to g/hello/
EasyAlign g/hello/
" Start live interactive mode with filter option set to v/goodbye/
LiveEasyAlign v/goodbye/
" Align the lines with 'hi' around the first colons
EasyAlign:g/hi/
```
### Ignoring delimiters in comments or strings
@@ -331,7 +418,7 @@ You can change the default rule by using one of these 4 methods.
2. Define global `g:easy_align_ignore_groups` list
3. Define a custom rule in `g:easy_align_delimiters` with `ignore_groups` option
4. Provide `ignore_groups` option to `:EasyAlign` command.
e.g. `:EasyAlign:{'ig':[]}`
e.g. `:EasyAlign:ig[]`
For example if you set `ignore_groups` option to be an empty list, you get
@@ -350,10 +437,18 @@ Satisfied? :satisfied:
### Ignoring unmatched lines
Lines without any matching delimiter are ignored as well (except in
right-align mode).
`ignore_unmatched` option determines how EasyAlign command processes lines that
do not have N-th delimiter.
For example, when aligning the following code block around the colons,
1. In left-alignment mode, they are ignored
2. In right or center-alignment mode, they are *not* ignored, and the last
tokens from those lines are aligned as well as if there is an invisible
trailing delimiter at the end of each line
3. If `ignore_unmatched` is 1, they are ignored regardless of the alignment mode
4. If `ignore_unmatched` is 0, they are *not* ignored regardless of the mode
Let's take an example.
When we align the following code block around the (1st) colons,
```ruby
{
@@ -377,13 +472,13 @@ this is usually what we want.
}
```
However, this default behavior is also configurable by using one of these 4
methods.
However, we can override this default behavior by setting `ignore_unmatched`
option to zero using one of the following methods.
1. Press `CTRL-U` in interactive mode to toggle `ignore_unmatched` option
2. Set the global `g:easy_align_ignore_unmatched` variable to 0
3. Define a custom alignment rule with `ignore_unmatched` option set to 0
4. Provide `ignore_unmatched` option to `:EasyAlign` command. e.g. `:EasyAlign:{'iu':0}`
4. Provide `ignore_unmatched` option to `:EasyAlign` command. e.g. `:EasyAlign:iu0`
Then we get,
@@ -417,7 +512,7 @@ banana += apple
cake ||= banana
```
However, with `:EasyAlign={'da':l}`, delimiters are left-aligned.
However, with `:EasyAlign=dl`, delimiters are left-aligned.
```ruby
apple = 1
@@ -425,7 +520,7 @@ banana += apple
cake ||= banana
```
And on `:EasyAlign={'da':c}`, center-aligned.
And on `:EasyAlign=dc`, center-aligned.
```ruby
apple = 1
@@ -457,7 +552,7 @@ then again we have `indentation` option. See the following example.
eggplant = 5
# Use the _s_hallowest indentation among the lines
# :EasyAlign={'idt':s}
# :EasyAlign=is
apple = 1
banana = 2
cake = 3
@@ -465,7 +560,7 @@ then again we have `indentation` option. See the following example.
eggplant = 5
# Use the _d_eepest indentation among the lines
# :EasyAlign={'idt':d}
# :EasyAlign=id
apple = 1
banana = 2
cake = 3
@@ -473,7 +568,7 @@ then again we have `indentation` option. See the following example.
eggplant = 5
# Indentation: _n_one
# :EasyAlign={'idt':n}
# :EasyAlign=in
apple = 1
banana = 2
cake = 3
@@ -485,29 +580,9 @@ Notice that `idt` is fuzzy-matched to `indentation`.
In interactive mode, you can change the option value with `CTRL-I` key.
### Left/right/center mode switch in interactive mode
In interactive mode, you can choose the alignment mode you want by pressing
enter keys. The non-bang command, `:EasyAlign` starts in left-alignment mode
and changes to right and center mode as you press enter keys, while the bang
version first starts in right-alignment mode.
- `:EasyAlign`
- Left, Right, Center
- `:EasyAlign!`
- Right, Left, Center
If you do not prefer this default mode transition, you can define your own
settings as follows.
```vim
let g:easy_align_interactive_modes = ['l', 'r']
let g:easy_align_bang_interactive_modes = ['c', 'r']
```
### Alignments over multiple occurrences of delimiters
As stated above, "field number" is used to target specific occurrences of
As stated above, "N-th" parameter is used to target specific occurrences of
the delimiter when it appears multiple times in each line.
To recap:
@@ -543,24 +618,27 @@ in interactive mode with the special key `CTRL-O`)
" Right, left, center alignment over the 1st to 3rd occurrences of delimiters
:EasyAlign = { 'm': 'rlc' }
" Using shorthand notation
:EasyAlign = mrlc
" Right, left, center alignment over the 2nd to 4th occurrences of delimiters
:EasyAlign 2={ 'm': 'rlc' }
:EasyAlign 2=mrlc
" (*) Repeating alignments (default: l, r, or c)
" Right, left, center, center, center, center, ...
:EasyAlign *={ 'm': 'rlc' }
:EasyAlign *=mrlc
" (**) Alternating alignments (default: lr or rl)
" Right, left, center, right, left, center, ...
:EasyAlign **={ 'm': 'rlc' }
:EasyAlign **=mrlc
" Right, left, center, center, center, ... repeating alignment
" over the 3rd to the last occurrences of delimiters
:EasyAlign 3={ 'm': 'rlc*' }
:EasyAlign 3=mrlc*
" Right, left, center, right, left, center, ... alternating alignment
" over the 3rd to the last occurrences of delimiters
:EasyAlign 3={ 'm': 'rlc**' }
:EasyAlign 3=mrlc**
```
### Extending alignment rules
@@ -568,6 +646,9 @@ in interactive mode with the special key `CTRL-O`)
Although the default rules should cover the most of the use cases,
you can extend the rules by setting a dictionary named `g:easy_align_delimiters`.
You may refer to the definitions of the default alignment rules
[here](https://github.com/junegunn/vim-easy-align/blob/2.6.1/autoload/easy_align.vim#L29).
#### Example
```vim
@@ -595,6 +676,42 @@ let g:easy_align_delimiters = {
\ }
```
Other options
-------------
### Disabling &foldmethod during alignment
[It is reported](https://github.com/junegunn/vim-easy-align/issues/14) that
`&foldmethod` value of `expr` or `syntax` can significantly slow down the
alignment when editing a large, complex file with many folds. To alleviate this
issue, EasyAlign provides an option to temporarily set `&foldmethod` to `manual`
during the alignment task. In order to enable this feature, set
`g:easy_align_bypass_fold` switch to 1.
```vim
let g:easy_align_bypass_fold = 1
```
### Left/right/center mode switch in interactive mode
In interactive mode, you can choose the alignment mode you want by pressing
enter keys. The non-bang command, `:EasyAlign` starts in left-alignment mode
and changes to right and center mode as you press enter keys, while the bang
version first starts in right-alignment mode.
- `:EasyAlign`
- Left, Right, Center
- `:EasyAlign!`
- Right, Left, Center
If you do not prefer this default mode transition, you can define your own
settings as follows.
```vim
let g:easy_align_interactive_modes = ['l', 'r']
let g:easy_align_bang_interactive_modes = ['c', 'r']
```
Advanced examples and use cases
-------------------------------
@@ -667,6 +784,11 @@ var jdbc = {
`g:AlignSkip` function reference which should point to a custom function that
looks up the syntax group of a character on a certain position)
### Thoroughly tested
Virtually every aspect of vim-easy-align is being tested with a comprehensive
set of test cases using [Vader.vim](https://github.com/junegunn/vader.vim).
### "Okay. So should I switch?"
Maybe, but I can't really say. I have no ambition to make vim-easy-align

File diff suppressed because it is too large Load Diff

View File

@@ -16,11 +16,11 @@ EasyAlign *:EasyAlign* *:EasyAlign!*
vim-easy-align defines `:EasyAlign` command in the visual mode.
(:EasyAlign! is the right-align version.)
| Mode | Command |
| ------------------------- | ---------------------------------------------- |
| Interactive mode | :EasyAlign[!] [OPTIONS] |
| Using predefined rules | :EasyAlign[!] [FIELD#] DELIMITER_KEY [OPTIONS] |
| Using regular expressions | :EasyAlign[!] [FIELD#] /REGEXP/ [OPTIONS] |
| Mode | Command |
| ------------------------- | -------------------------------------------- |
| Interactive mode | :EasyAlign[!] [OPTIONS] |
| Using predefined rules | :EasyAlign[!] [N-th] DELIMITER_KEY [OPTIONS] |
| Using regular expressions | :EasyAlign[!] [N-th] /REGEXP/ [OPTIONS] |
Interactive mode
@@ -30,13 +30,13 @@ The command will go into the interactive mode when no argument is given.
For convenience, it is advised that you define a mapping for triggering it in
your `.vimrc`.
vnoremap <silent> <Enter> :EasyAlign<cr>
vnoremap <silent> <Enter> :EasyAlign<Enter>
With this mapping, you can align selected lines of text with a few keystrokes.
1. <Enter> key to start interactive EasyAlign command
2. Optional Enter keys to select alignment mode (left, right, or center)
3. Optional field number (default: 1)
2. Optional: Enter keys to select alignment mode (left, right, or center)
3. Optional: N-th delimiter (default: 1)
1 Around the 1st occurrences of delimiters
2 Around the 2nd occurrences of delimiters
* Around all occurrences of delimiters
@@ -50,6 +50,7 @@ With this mapping, you can align selected lines of text with a few keystrokes.
: Suitable for formatting JSON or YAML
. Multi-line method chaining
, Multi-line method arguments. CSV.
& LaTeX tables (matches & and \\)
| Table markdown
(You can override these default rules or define your own rules with
@@ -97,19 +98,68 @@ described in the following sections.
| CTRL-O | mode_sequence | Input string of /[lrc]+\*{0,2}/ |
| <Left> | stick_to_left | { 'stick_to_left': 1, 'left_margin': 0 } |
| <Right> | stick_to_left | { 'stick_to_left': 0, 'left_margin': 1 } |
| <Down> | *_margin | { 'left_margin': 0, 'right_margin': 0 } |
*g:easy_align_last_command*
After a successful alignment, you can repeat the same operation using the
repeatable, non-interactive command recorded in `g:easy_align_last_command`.
:<C-R>=g:easy_align_last_command<Enter><Enter>
Non-interactive mode
Live interactive mode *:LiveEasyAlign* *:LiveEasyAlign!*
-------------------------------------------------------------------------
If you're performing a complex alignment where multiple options should be
carefully adjusted, try "live interactive mode" which aligns the text
on-the-fly as you type in.
Live interactive mode can be started with `:LiveEasyAlign` command which
takes the same parameters as `:EasyAlign`. I suggest you define the
following mapping in addition to the one for `:EasyAlign` command.
vnoremap <silent> <Leader><Enter> :LiveEasyAlign<Enter>
In live interactive mode, you have to type in the same delimiter (or
`CTRL-X` on regular expression) again to finalize the alignment. This
allows you to preview the result of the alignment and freely change the
delimiter using backspace key without leaving the interactive mode.
Left/right/center mode switch in interactive mode
-------------------------------------------------------------------------
*g:easy_align_interactive_modes*
*g:easy_align_bang_interactive_modes*
In interactive mode, you can choose the alignment mode you want by pressing
enter keys. The non-bang command, `:EasyAlign` starts in left-alignment mode
and changes to right and center mode as you press enter keys, while the bang
version first starts in right-alignment mode.
- `:EasyAlign`
- Left, Right, Center
- `:EasyAlign!`
- Right, Left, Center
If you do not prefer this default mode transition, you can define your own
settings as follows.
let g:easy_align_interactive_modes = ['l', 'r']
let g:easy_align_bang_interactive_modes = ['c', 'r']
Using EasyAlign in command line
-------------------------------------------------------------------------
Instead of going into the interactive mode, you can type in arguments to
`:EasyAlign` command.
" Using predefined alignment rules
:EasyAlign[!] [FIELD#] DELIMITER_KEY [OPTIONS]
:EasyAlign[!] [N-th] DELIMITER_KEY [OPTIONS]
" Using arbitrary regular expressions
:EasyAlign[!] [FIELD#] /REGEXP/ [OPTIONS]
:EasyAlign[!] [N-th] /REGEXP/ [OPTIONS]
For example, when aligning the following lines around colons and semi-colons,
@@ -118,38 +168,57 @@ For example, when aligning the following lines around colons and semi-colons,
try these commands:
- :EasyAlign /[:;]\+/
- :EasyAlign 2/[:;]\+/
- :EasyAlign */[:;]\+/
- :EasyAlign **/[:;]\+/
:EasyAlign /[:;]\+/
:EasyAlign 2/[:;]\+/
:EasyAlign */[:;]\+/
:EasyAlign **/[:;]\+/
Notice that you can't append '\zs' to your regular expression to put delimiters
on the left. It can be done by providing additional options in Vim dictionary
format.
You can also provide a number of alignment options, which will be discussed in
detail later, to EasyAlign command in Vim dictionary format.
- :EasyAlign * /[:;]\+/ { 'stick_to_left': 1, 'left_margin': 0 }
:EasyAlign * /[:;]\+/ { 'stick_to_left': 1, 'left_margin': 0 }
Then we get:
Which means that the matched delimiter should be positioned right next to the
preceding token, without margin on the left. So we get:
apple;: banana:: cake
data;; exchange:; format
Option names are fuzzy-matched, so you can write as follows:
- :EasyAlign * /[:;]\+/ { 'stl': 1, 'l': '' }
:EasyAlign * /[:;]\+/ { 'stl': 1, 'l': '' }
You can even omit spaces between the arguments, so concisely (or cryptically):
- :EasyAlign*/[:;]\+/{'s':1,'l':''}
:EasyAlign*/[:;]\+/{'s':1,'l':''}
The same thing can be done in the interactive mode as well with the following
key combination.
Nice. But let's make it even shorter. Option values can be written in shorthand
notation.
- <Enter>
- *
- <Left>
- <CTRL-/> (or <CTRL-X> on GVim)
- [:;]\+
:EasyAlign*/[:;]\+/s1l0
The following table summarizes the shorthand notation.
| Option | Expression |
| -------------- | ---------- |
| filter | [gv]/.*/ |
| left_margin | l[0-9]+ |
| right_margin | r[0-9]+ |
| stick_to_left | s[01] |
| ignore_unmatched | iu[01] |
| ignore_groups | ig\[.*\] |
| delimiter_align | d[lrc] |
| mode_sequence | m[lrc*]+ |
| indentation | i[ksdn] |
For your information, the same thing can be done in the interactive mode as well
with the following key combination.
- <Enter>
- *
- <Left>
- <CTRL-/> (or <CTRL-X> on GVim)
- [:;]\+
Partial alignment in blockwise-visual mode
@@ -166,6 +235,7 @@ Available options are as follows.
| Atrribute | Type | Default |
| ---------------- | ---------------- | ----------------------------- |
| filter | string | |
| left_margin | number or string | 1 |
| right_margin | number or string | 1 |
| stick_to_left | boolean | 0 |
@@ -175,26 +245,51 @@ Available options are as follows.
| | | (right, left, center) |
| indentation | string | 'k' |
| | | (keep, shallow, deep, none) |
| mode_sequence | string | (Depends on field number and |
| mode_sequence | string | (Depends on N-th param and |
| | | selected alignment mode) |
There are 4 ways to set alignment options (from lowest precedence to highest):
1. Some option values can be set with corresponding global variables
2. Option values can be specified in the definition of each alignment rule
3. Option values can be given as a dictionary argument to :EasyAlign command
3. Option values can be given as arguments to :EasyAlign command
4. Option values can be set in interactive mode using special shortcut keys
| Option | Shortcut key | Global variable |
| ---------------- | ------------------- | ------------------------------- |
| left_margin | CTRL-L | |
| right_margin | CTRL-R | |
| stick_to_left | <Left>, <Right> | |
| ignore_groups | CTRL-G | `g:easy_align_ignore_groups` |
| ignore_unmatched | CTRL-U | `g:easy_align_ignore_unmatched` |
| indentation | CTRL-I | `g:easy_align_indentation` |
| delimiter_align | CTRL-D | `g:easy_align_delimiter_align` |
| mode_sequence | CTRL-O | |
| Option | Shortcut key | Abbreviated | Global variable |
| ---------------- | --------------- | ----------- | ----------------------------- |
| filter | CTRL-F | [gv]/.*/ | |
| left_margin | CTRL-L | l[0-9]+ | |
| right_margin | CTRL-R | r[0-9]+ | |
| stick_to_left | <Left>, <Right> | s[01] | |
| ignore_groups | CTRL-G | ig\[.*\] | `g:easy_align_ignore_groups` |
| ignore_unmatched | CTRL-U | iu[01] | `g:easy_align_ignore_unmatched` |
| indentation | CTRL-I | i[ksdn] | `g:easy_align_indentation` |
| delimiter_align | CTRL-D | d[lrc] | `g:easy_align_delimiter_align` |
| mode_sequence | CTRL-O | m[lrc*]+ | |
Filtering lines
-------------------------------------------------------------------------
With filter option, you can align lines that only match or do not match a
given pattern. There are several ways to set the pattern.
1. Press CTRL-F in interactive mode and input g/pat/ or v/pat/
2. In command-line, it can be written in dictionary format: {'filter': 'g/pat/'}
3. Or in shorthand notation: g/pat/ or v/pat/
Examples:
" Start interactive mode with filter option set to g/hello/
EasyAlign g/hello/
" Start live interactive mode with filter option set to v/goodbye/
LiveEasyAlign v/goodbye/
" Align the lines with 'hi' around the first colons
EasyAlign : g/hi/
(You don't need to escape '/'s in the regular expression)
Ignoring delimiters in comments or strings *g:easy_align_ignore_groups*
@@ -239,7 +334,7 @@ You can change the default rule by using one of these 4 methods.
2. Define global `g:easy_align_ignore_groups` list
3. Define a custom rule in `g:easy_align_delimiters` with 'ignore_groups' option
4. Provide 'ignore_groups' option to `:EasyAlign` command.
e.g. :EasyAlign:{'is':[]}
e.g. :EasyAlign:ig[]
For example if you set 'ignore_groups' option to be an empty list, you get
@@ -256,10 +351,18 @@ For example if you set 'ignore_groups' option to be an empty list, you get
Ignoring unmatched lines *g:easy_align_ignore_unmatched*
-------------------------------------------------------------------------
Lines without any matching delimiter are ignored as well (except in
right-align mode).
'ignore_unmatched' option determines how EasyAlign command processes lines that
do not have N-th delimiter.
For example, when aligning the following code block around the colons,
1. In left-alignment mode, they are ignored
2. In right or center-alignment mode, they are not ignored, and the last
tokens from those lines are aligned as well as if there is an invisible
trailing delimiter at the end of each line
3. If 'ignore_unmatched' is 1, they are ignored regardless of the alignment mode
4. If 'ignore_unmatched' is 0, they are not ignored regardless of the mode
Let's take an example.
When we align the following code block around the (1st) colons,
{
apple: proc {
@@ -279,14 +382,14 @@ this is usually what we want.
grapefruits: 3
}
However, this default behavior is also configurable by using one of these 4
methods.
However, we can override this default behavior by setting 'ignore_unmatched'
option to zero using one of the following methods.
1. Press CTRL-U in interactive mode to toggle 'ignore_unmatched' option
2. Set the global `g:easy_align_ignore_unmatched` variable to 0
3. Define a custom alignment rule with 'ignore_unmatched' option set to 0
4. Provide 'ignore_unmatched' option to `:EasyAlign` command.
e.g. :EasyAlign:{'iu':0}
e.g. :EasyAlign:iu0
Then we get,
@@ -316,13 +419,13 @@ By default, delimiters are right-aligned as follows.
banana += apple
cake ||= banana
However, with ':EasyAlign={'da':l}', delimiters are left-aligned.
However, with ':EasyAlign=dl', delimiters are left-aligned.
apple = 1
banana += apple
cake ||= banana
And on ':EasyAlign={'da':c}', center-aligned.
And on ':EasyAlign=dc', center-aligned.
apple = 1
banana += apple
@@ -353,7 +456,7 @@ But then again we have 'indentation' option. See the following example.
eggplant = 5
# Use the _s_hallowest indentation among the lines
# :EasyAlign={'idt':s}
# :EasyAlign=is
apple = 1
banana = 2
cake = 3
@@ -361,7 +464,7 @@ But then again we have 'indentation' option. See the following example.
eggplant = 5
# Use the _d_eepest indentation among the lines
# :EasyAlign={'idt':d}
# :EasyAlign=id
apple = 1
banana = 2
cake = 3
@@ -369,7 +472,7 @@ But then again we have 'indentation' option. See the following example.
eggplant = 5
# Indentation: _n_one
# :EasyAlign={'idt':n}
# :EasyAlign=in
apple = 1
banana = 2
cake = 3
@@ -382,32 +485,10 @@ Notice that 'idt' is fuzzy-matched to 'indentation'.
In interactive mode, you can change the option value with `CTRL-I` key.
Left/right/center mode switch in interactive mode
-------------------------------------------------------------------------
*g:easy_align_interactive_modes*
*g:easy_align_bang_interactive_modes*
In interactive mode, you can choose the alignment mode you want by pressing
enter keys. The non-bang command, `:EasyAlign` starts in left-alignment mode
and changes to right and center mode as you press enter keys, while the bang
version first starts in right-alignment mode.
- `:EasyAlign`
- Left, Right, Center
- `:EasyAlign!`
- Right, Left, Center
If you do not prefer this default mode transition, you can define your own
settings as follows.
let g:easy_align_interactive_modes = ['l', 'r']
let g:easy_align_bang_interactive_modes = ['c', 'r']
Alignments over multiple occurrences of delimiters
-------------------------------------------------------------------------
As stated above, "field number" is used to target specific occurrences of
As stated above, "N-th" parameter is used to target specific occurrences of
the delimiter when it appears multiple times in each line.
To recap:
@@ -440,24 +521,27 @@ in interactive mode with the special key CTRL-O)
" Right, left, center alignment over the 1st to 3rd occurrences of delimiters
:EasyAlign = { 'm': 'rlc' }
" Using shorthand notation
:EasyAlign = mrlc
" Right, left, center alignment over the 2nd to 4th occurrences of delimiters
:EasyAlign 2={ 'm': 'rlc' }
:EasyAlign 2=mrlc
" (*) Repeating alignments (default: l, r, or c)
" Right, left, center, center, center, center, ...
:EasyAlign *={ 'm': 'rlc' }
:EasyAlign *=mrlc
" (**) Alternating alignments (default: lr or rl)
" Right, left, center, right, left, center, ...
:EasyAlign **={ 'm': 'rlc' }
:EasyAlign **=mrlc
" Right, left, center, center, center, ... repeating alignment
" over the 3rd to the last occurrences of delimiters
:EasyAlign 3={ 'm': 'rlc*' }
:EasyAlign 3=mrlc*
" Right, left, center, right, left, center, ... alternating alignment
" over the 3rd to the last occurrences of delimiters
:EasyAlign 3={ 'm': 'rlc**' }
:EasyAlign 3=mrlc**
Extending alignment rules *g:easy_align_delimiters*
@@ -486,3 +570,14 @@ you can extend the rules by setting a dictionary named
\ }
Disabling `foldmethod` during alignment *g:easy_align_bypass_fold*
-------------------------------------------------------------------------
It is reported that `foldmethod` value of expr or syntax can significantly
slow down the alignment when editing a large, complex file with many
folds. To alleviate this issue, EasyAlign provides an option to
temporarily set `foldmethod` to manual during the alignment task.
In order to enable this feature, set g:easy_align_bypass_fold to 1.
let g:easy_align_bypass_fold = 1

View File

@@ -26,4 +26,5 @@ if exists("g:loaded_easy_align_plugin")
endif
let g:loaded_easy_align_plugin = 1
command! -nargs=* -range -bang EasyAlign <line1>,<line2>call easy_align#align('<bang>' == '!', <q-args>)
command! -nargs=* -range -bang EasyAlign <line1>,<line2>call easy_align#align('<bang>' == '!', 0, <q-args>)
command! -nargs=* -range -bang LiveEasyAlign <line1>,<line2>call easy_align#align('<bang>' == '!', 1, <q-args>)

13
test/README.md Normal file
View File

@@ -0,0 +1,13 @@
Test cases for vim-easy-align
=============================
### Prerequisite
- [Vader.vim](https://github.com/junegunn/vader.vim)
### Run
```vim
:Vader*
```

File diff suppressed because it is too large Load Diff

View File

@@ -1,273 +0,0 @@
" :source run.vim
" @a
Paul McCartney 1942
George Harrison 1943
Ringo Starr 1940
Pete Best 1941
| Option| Type | Default | Description |
|--|--|--|--|
| threads | Fixnum | 1 | number of threads in the thread pool |
|queues |Fixnum | 1 | number of concurrent queues |
|queue_size | Fixnum | 1000 | size of each queue |
| interval | Numeric | 0 | dispatcher interval for batch processing |
|batch | Boolean | false | enables batch processing mode |
|batch_size | Fixnum | nil | number of maximum items to be assigned at once |
|logger | Logger | nil | logger instance for debug logs |
aaa, bb,c
d,eeeeeee
fffff, gggggggggg,
h, , ii
j,,k
```ruby
a =
a = 1
bbbb .= 2
ccccccc = 3
ccccccccccccccc
ddd = #
eeee === eee = eee = eee=f
fff = ggg += gg &&= gg
g != hhhhhhhh == # 8
i := 5
i %= 5
i *= 5
j =~ 5
j >= 5
aa => 123
aa <<= 123
aa >>= 123
bbb => 123
c => 1233123
d => 123
dddddd &&= 123
dddddd ||= 123
dddddd /= 123
gg <=> ee
options = { :caching => nil,
:versions => 3,
"cache=blocks" => false }.merge(options)
apple = 1 # comment not aligned
banana = 'Gros Michel' # comment 2
# let g:easy_align_delimiters = { '#': { 'pattern': '#\+', 'ignores': ['String'] } }
apple = 1 # comment not aligned
apricot = 'DAD' + 'F#AD'
banana = 'Gros Michel' # comment 2
```
```yaml
mysql:
# JDBC driver for MySQL database:
driver: com.mysql.jdbc.Driver
# JDBC URL for the connection (jdbc:mysql://HOSTNAME/DATABASE)
url: jdbc:mysql://localhost/test
database: test
"user:pass":r00t:pa55
```
```c
/* a */ b = c
aa >= bb
// aaa = bbb = cccc
/* aaaa = */ bbbb === cccc " = dddd = " = eeee
aaaaa /* bbbbb */ == ccccc /* != eeeee = */ === fffff
```
my_object
.method1.chain
.second_method.call
.third.call
.method_4.execute
my_object.
method1.chain.
second_method.call.
third.call.
method_4.execute
| Option| Type | Default | Description |
|--|--|--|--|
| threads | Fixnum | 1 | number of threads in the thread pool |
|queues |Fixnum | 1 | number of concurrent queues |
|queue_size | Fixnum | 1000 | size of each queue |
| interval | Numeric | 0 | dispatcher interval for batch processing |
|batch | Boolean | false | enables batch processing mode |
|batch_size | Fixnum | nil | number of maximum items to be assigned at once |
|logger | Logger | nil | logger instance for debug logs |
```c
const char* str = "Hello";
int64_t count = 1 + 2;
static double pi = 3.14;
static std::map<std::string, float>* scores = pointer;
```
Paul McCartney 1942
George Harrison 1943
Ringo Starr 1940
Pete Best 1941
...-.-----
..--..----
.---...---
----....--
.---.....-
..--......
...-.....-
apple = 1
banana = 2
cake = 3
daisy = 4
eggplant = 5
```c
int a = 1;
long b = 2;
float c = 3;
string d = 4;
// this line should not get aligned
long int e = 5;
std::map f;
std::map g; /* this? */
short h /* how about this? */ = 6;
string i = "asdf";
```
```ruby
a =
a = 1
bbbb .= 2
ccccccc = 3
ccccccccccccccc
# eeeeeeeeeeeeeeee
e # asdf
ddd = #
eeee === eee = eee = eee=f
fff = ggg += gg &&= gg
g != hhhhhhhh == # 8
i := 5
i %= 5
i *= 5
j =~ 5
j >= 5
aa => 123
aa <<= 123
aa >>= 123
bbb => 123
c => 1233123
d => 123
dddddd &&= 123
dddddd ||= 123
dddddd /= 123
gg <=> ee
a = 1
bb = 22
ccc = 333
dddd = "asdf"
```
a a a a a
bbb bbb bbb bbb bbb
ccccc ccccc ccccc ccccc ccccc
d ddd dddd ddd d
aaaaa = 123456778901234567890 =
bbbbbbbbbb = 12345 =
aaaaa = 123456778901234567890 =
cccccccccccccccccc = 123 =
aaaaa = 123456778901234567890 =
cccccccccccccccccc = 12345678 =
aaaaa = 12345 =
bbbbbbbbbb = 123456778901234567890 =
aaaaa = 12345
bbbbbbbbbb = 123456778901234567890
123456 789
1234567890 1
1234 56
123456 7890
aaaaa = 123456778901234567890 =
cccccccccccccccccc = 12345678 =
```
aaaaa = 123456778901234567890 =
cccccccccccccccccc =12345678 =
aaaa = 123456778901234567890 =
cccccccccccccccccc = 12345678 =
aaaaaaaaaaaaa = 123456778901234567890 =
cc = 12345678 =
aaaaaaaaaaa= 123
a = 123
aaaaaaaaaaaa= 123
a = 123
aaaaaaaaaaaa = 123
aaaaaaaaaaa = 123
aaaaaaaaaa = 123
aaa = 123
aa = 123
a = 123
aaaa = 123456778901234567890 =
cccccccccccccc = 12345678 =
aaaa = 123456778901234567890 =
bbbbbb = 4
cccccccccccccccccc = 12345678 =
aaaa = 123456778901234567890 =
cccccccccccccccccc = 12345678 =
aaaaa = 123456778901234567890 =
cc = 12345678 =
=aaaaa = 123456778901234567890 =
= cccccccccccccccccc = 12345678 =
```
a,,bbb
aa,,bb
aaa,,b
aaaa,,
aaa,b,
aa,bb,
a,bbb,
1 22222 33 444 555 6666 7 888
11 222 3333 4 55 6666 77 888
111 22 333 444 55555 6666 7 88888
1111 2 33 444 555 66 777 8

View File

@@ -1 +0,0 @@
4Gvipjyvip

165
test/commandline.vader Normal file
View File

@@ -0,0 +1,165 @@
Execute (Clean up test environment):
Save g:easy_align_ignore_groups, g:easy_align_ignore_unmatched
Save g:easy_align_indentation, g:easy_align_delimiter_align
Save g:easy_align_interactive_modes, g:easy_align_bang_interactive_modes
Save g:easy_align_delimiters
let g:easy_align_delimiters = {}
silent! unlet g:easy_align_ignore_groups
silent! unlet g:easy_align_ignore_unmatched
silent! unlet g:easy_align_indentation
silent! unlet g:easy_align_delimiter_align
Given (fruits):
apple;:;;banana::cake
data;;exchange:;::format
Execute (regular expression):
%EasyAlign/[:;]\+/
AssertEqual ':EasyAlign /[:;]\+/', g:easy_align_last_command
Expect:
apple ;:;; banana::cake
data ;; exchange:;::format
Execute (options dictionary):
%EasyAlign/[:;]\+/{ 'left_margin': '<', 'right_margin': 3 }
Expect:
apple<;:;; banana::cake
data < ;; exchange:;::format
Execute (fuzzy matching):
%EasyAlign/[:;]\+/{ 'l':'<', 'r': '>'}
Expect:
apple<;:;;>banana::cake
data < ;;>exchange:;::format
Execute (shorthand notation of margin):
%EasyAlign/[:;]\+/l0r0
Expect:
apple;:;;banana::cake
data ;;exchange:;::format
Execute (delimiter align):
%EasyAlign*/[:;]\+/l0r0dc
Expect:
apple;:;;banana :: cake
data ;; exchange:;::format
Execute (shorthand notation of mode_sequence and margin):
%EasyAlign/[:;]\+/mrc*l2r2
Expect:
apple ;:;; banana :: cake
data ;; exchange :;:: format
Execute (deep indentation):
%EasyAlign/[:;]\+/mrc*l2r2
%EasyAlign*/[:;]\+/idmrl*
Expect:
apple ;:;; banana :: cake
data ;; exchange :;:: format
Execute (stick_to_left):
%EasyAlign*/[:;]\+/stl1l0dlrm3
Expect:
apple;:;; banana:: cake
data;; exchange:;:: format
Execute (different regular expression):
%EasyAlign*/../{'lm':'<','rm':'>'}
Expect:
ap><pl><e;><:;><;b><an><an><a:><:c><ak>e
da><ta><;;><ex><ch><an><ge><:;><::><fo><rm><at
Execute (merge different option notations):
%EasyAlign*/../iu0 { 'l': '<', 'r': '>' }
Expect:
ap><pl><e;><:;><;b><an><an><a:><:c><ak>e
da><ta><;;><ex><ch><an><ge><:;><::><fo> <rm><at
Given javascript (json):
var jdbc = {
// JDBC driver for MySQL database:
driver: "com.mysql.jdbc.Driver",
/* JDBC URL for the connection (jdbc:mysql://HOSTNAME/DATABASE) */
url: 'jdbc:mysql://localhost/test',
database: "test",
"user:pass":"r00t:pa55"
};
Execute (default syntax-aware alignment):
%EasyAlign*:
Expect javascript:
var jdbc = {
// JDBC driver for MySQL database:
driver: "com.mysql.jdbc.Driver",
/* JDBC URL for the connection (jdbc:mysql://HOSTNAME/DATABASE) */
url: 'jdbc:mysql://localhost/test',
database: "test",
"user:pass": "r00t:pa55"
};
Execute (do not ignore unmatched):
%EasyAlign*:iu0
Expect javascript:
var jdbc = {
// JDBC driver for MySQL database:
driver: "com.mysql.jdbc.Driver",
/* JDBC URL for the connection (jdbc:mysql://HOSTNAME/DATABASE) */
url: 'jdbc:mysql://localhost/test',
database: "test",
"user:pass": "r00t:pa55"
};
Execute (do not ignore any group):
%EasyAlign*:ig[]iu0
Expect javascript:
var jdbc = {
// JDBC driver for MySQL database:
driver: "com.mysql.jdbc.Driver",
/* JDBC URL for the connection (jdbc: mysql: //HOSTNAME/DATABASE) */
url: 'jdbc: mysql: //localhost/test',
database: "test",
"user: pass": "r00t: pa55"
};
Execute (ignore only strings):
%EasyAlign*:ig['String']
Expect javascript:
var jdbc = {
// JDBC driver for MySQL database:
driver: "com.mysql.jdbc.Driver",
/* JDBC URL for the connection (jdbc: mysql: //HOSTNAME/DATABASE) */
url: 'jdbc:mysql://localhost/test',
database: "test",
"user:pass": "r00t:pa55"
};
Execute (ignore only comments):
%EasyAlign*:ig['Comment']
Expect javascript:
var jdbc = {
// JDBC driver for MySQL database:
driver: "com.mysql.jdbc.Driver",
/* JDBC URL for the connection (jdbc:mysql://HOSTNAME/DATABASE) */
url: 'jdbc: mysql: //localhost/test',
database: "test",
"user: pass": "r00t: pa55"
};
Execute:
Restore

42
test/fixed.vader Normal file
View File

@@ -0,0 +1,42 @@
Given (Table):
|a|b|c|d|
| -|-|>-|-|
|aaa|bbb|ccc|ddd|
Do (Partial alignment around 1st |):
\<C-V>ljj\<Enter>|
Expect (Right margin should be correctly attached):
| a|b|c|d|
| -|-|>-|-|
| aaa|bbb|ccc|ddd|
Given (empty buffer):
Execute (Aligning lines with many delimiters should not fail):
call visualmode(1)
call setline(1, repeat('|', &maxfuncdepth + 1))
%EasyAlign*|
AssertEqual (&maxfuncdepth + 1) * 3 - 2, len(getline(1))
Given:
a | b | c
aa | bb | cc
Execute:
%EasyAlign*|iu0{'l':'<', 'r': '>'}
Expect:
a <|>b <|>c
aa<|>bb<|>cc
Given (Trailing delimiter):
a | b | c |
aa | bb | cc |
Execute:
%EasyAlign*|iu0{'l':'<', 'r': '>'}
Expect:
a <|>b <|>c <|
aa<|>bb<|>cc<|

20
test/fixme.vader Normal file
View File

@@ -0,0 +1,20 @@
# It is currently possible that EasyAlign command incorrectly judges
# that it was executed in block-wise visual mode
Given:
a|b|c
Do (FIXME invalid judgement - block-wise visual mode):
\<C-V>\<Esc>
:%EasyAlign|\<CR>
Expect:
a | b | c
Do (TODO Workaround: reset visualmode() on error):
\<C-V>\<Esc>
:%EasyAlign|\<CR>
:%EasyAlign|\<CR>
Expect:
a | b | c

1506
test/interactive.vader Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,96 +0,0 @@
" :source run.vim
" @a
apple;:banana :: cake
data;;exchange :; format
apple ;: banana :: cake
data ;; exchange :; format
apple ;: banana :: cake
data ;; exchange :; format
apple ;:____banana::cake
data ;;____exchange:;format
apple ; : banana : : cake
data ; ; exchange : ; format
ap pl e; :b an an a: :c ak e
da ta ;; ex ch an ge :; fo rm at
ap ple;:banana::cake
da ta;;exchange:;format
apple???;:~~~banana???::~~~ cake
data???;;~~~ exchange???:;~~~format
apple;: banana::cake
data;; exchange:;format
apple<<<;:>>>banana::cake
data <<<;;>>>exchange:;format
apple ;: banana::cake
data ;; exchange:;format
apple;:banana :: cake
data;;exchange :; format
apple ;: banana :: cake
data ;; exchange :; format
apple ;: banana :: cake
data ;; exchange :; format
apple ;: banana :: cake
data ;; exchange :; format
apple ;: banana :: cake
data ;; exchange :; format
apple ;: banana::cake
data ;; exchange:;format
apple ; :banana::cake
data ; ; exchange: ; format
apple ; :banana::cake
data ; ;exchange:;format
apple ; :banana::cake
data ; ;exchange:;format
apple;:banana::cake
data;;exchange:;format
apple;: banana: : cake
data;;exchange: ;format
apple;:banana: :cake
data;;exchange:;format
apple;:banana: :cake
data;;exchange:;format
apple;: banana: : cake
data;;exchange: ;format
apple;:banana:: cake
data;;exchange: ;format
apple;: banana: : cake
data;;exchange: ;format
apple;: banana::cake
data;;exchange: ;format
```ruby
apple = 1 # comment not aligned
apricot = 'DAD' + 'F#AD'
banana = 'Gros Michel' # comment 2
```
a()p()p()l()e();():()b()a()n()a()n()a():():()c()a()k()e(
d()a()t()a();();()e()x()c()h()a()n()g()e():();()f()o()r()m()a()t(

View File

@@ -1,12 +0,0 @@
" :source run.vim
" @a
apple;:banana::cake
data;;exchange:;format
```ruby
apple = 1 # comment not aligned
apricot = 'DAD' + 'F#AD'
banana = 'Gros Michel' # comment 2
```

View File

@@ -1 +0,0 @@
4Gvipjyvip:EasyAlign:

View File

@@ -1,51 +0,0 @@
e!
function! GFM()
let syntaxes = {
\ 'ruby': 'syntax/ruby.vim',
\ 'yaml': 'syntax/yaml.vim',
\ 'vim': 'syntax/vim.vim',
\ 'sh': 'syntax/sh.vim',
\ 'python': 'syntax/python.vim',
\ 'java': 'syntax/java.vim',
\ 'c': 'syntax/c.vim'
\ }
for [lang, syn] in items(syntaxes)
unlet b:current_syntax
silent! exec printf("syntax include @%s %s", lang, syn)
exec printf("syntax region %sSnip matchgroup=Snip start='```%s' end='```' contains=@%s",
\ lang, lang, lang)
endfor
let b:current_syntax='mkd'
syntax sync fromstart
endfunction
silent! unlet g:easy_align_delimiters
silent! unlet g:easy_align_ignore_unmatched
silent! unlet g:easy_align_ignores
vnoremap <silent> <Enter> :EasyAlign<cr>
noremap <silent> <C-k> <nop>
noremap <silent> <C-j> <nop>
noremap <silent> <C-h> <nop>
noremap <silent> <C-l> <nop>
vnoremap <silent> <C-k> <nop>
vnoremap <silent> <C-j> <nop>
vnoremap <silent> <C-h> <nop>
vnoremap <silent> <C-l> <nop>
set nolazyredraw
set buftype=nofile
set colorcolumn=
silent! ScrollPositionHide
call GFM()
normal gg
let @b=system('cat '. expand('%:p:r') . '.script')
let @a='@b:vert diffsplit ' . expand('%:p:r') . '.expected
'

161
test/tex.vader Normal file
View File

@@ -0,0 +1,161 @@
# http://en.wikibooks.org/wiki/LaTeX/Tables
Execute:
Save g:easy_align_delimiters, g:easy_align_bypass_fold
let g:easy_align_delimiters = {}
silent! unlet g:easy_align_bypass_fold
Given tex (table with escaped &):
\begin{tabular}{ l c r }
1&2&3\\
44&55&66\\
777&8\&8&999\\
\end{tabular}
# FIXME vip doesn't work if folded
Do (Align around all &s and \\s):
VG\<Enter>*&
Expect tex:
\begin{tabular}{ l c r }
1 & 2 & 3 \\
44 & 55 & 66 \\
777 & 8\&8 & 999 \\
\end{tabular}
Do (right-align with explicit ignore_unmatched):
VG\<Enter>\<Enter>\<C-U>\<C-U>*&
Expect tex:
\begin{tabular}{ l c r }
1 & 2 & 3 \\
44 & 55 & 66 \\
777 & 8\&8 & 999 \\
\end{tabular}
Do (center-align with explicit ignore_unmatched):
VG\<Enter>\<Enter>\<Enter>\<C-U>\<C-U>*&
Expect tex:
\begin{tabular}{ l c r }
1 & 2 & 3 \\
44 & 55 & 66 \\
777 & 8\&8 & 999 \\
\end{tabular}
Given tex (simple table with \hline):
\begin{tabular}{ l c r }
1&2&3\\ \hline
44&55&66\\ \hline
777&8\&&999\\ \hline
\end{tabular}
Do:
VG\<Enter>*&
Expect tex:
\begin{tabular}{ l c r }
1 & 2 & 3 \\ \hline
44 & 55 & 66 \\ \hline
777 & 8\& & 999 \\ \hline
\end{tabular}
Given tex (table with lines w/o &s):
\begin{tabular}{|r|l|}
\hline
7C0 & hexadecimal \\
3700&octal \\ \cline{2-2}
1111100000 & binary \\
\hline \hline
1984 & decimal \\
\hline
\end{tabular}
Do (left-align*):
VG\<Enter>*&
Expect tex:
\begin{tabular}{|r|l|}
\hline
7C0 & hexadecimal \\
3700 & octal \\ \cline{2-2}
1111100000 & binary \\
\hline \hline
1984 & decimal \\
\hline
\end{tabular}
Do(left-align* and right-align around 2nd):
VG\<Enter>*&
gv\<Enter>\<Enter>2&
Expect tex:
\begin{tabular}{|r|l|}
\hline
7C0 & hexadecimal \\
3700 & octal \\ \cline{2-2}
1111100000 & binary \\
\hline \hline
1984 & decimal \\
\hline
\end{tabular}
Given tex:
\begin{tabular}{}
32&1.14\e1&&5.65\e2&&&&1.16\e1&&1.28\e1&\\
64&1.03\e1&0.1&4.98\e2&0.2&&&9.21\e2&0.3&1.02\e1&0.3\\
128&9.86\e2&0.1&4.69\e2&0.1&&&8.46\e2&0.1&9.45\e2&0.1\\
256&9.65\e2&0.0&4.59\e2&0.0&&&8.15\e2&0.1&9.11\e2&0.1\\
% 512&9.55\e2&0.0&4.56\e2&0.0&&&8.01\e2&0.0&8.96\e2&0.0\\
1024&9.49\e2&0.0&4.53\e2&0.0&&&7.94\e2&0.0&8.89\e2&0.0\\
2048&9.47\e2&0.0&4.52\e2&0.0&&&7.91\e2&0.0&8.85\e2&0.0\\
4096&9.46\e2&0.0&4.51\e2&0.0%&&&7.90\e2&0.0&8.83\e2&0.0\\
8192&9.45\e2&0.0&4.51\e2&0.0&&&&&&\\
\end{tabular}
Execute (Alignment around &s, foldmethod should not change):
setlocal foldmethod=syntax
%EasyAlign*&
AssertEqual 'syntax', &l:foldmethod
setlocal foldmethod=manual
%EasyAlign*&
AssertEqual 'manual', &l:foldmethod
Expect tex:
\begin{tabular}{}
32 & 1.14\e1 & & 5.65\e2 & & & & 1.16\e1 & & 1.28\e1 & \\
64 & 1.03\e1 & 0.1 & 4.98\e2 & 0.2 & & & 9.21\e2 & 0.3 & 1.02\e1 & 0.3 \\
128 & 9.86\e2 & 0.1 & 4.69\e2 & 0.1 & & & 8.46\e2 & 0.1 & 9.45\e2 & 0.1 \\
256 & 9.65\e2 & 0.0 & 4.59\e2 & 0.0 & & & 8.15\e2 & 0.1 & 9.11\e2 & 0.1 \\
% 512&9.55\e2&0.0&4.56\e2&0.0&&&8.01\e2&0.0&8.96\e2&0.0\\
1024 & 9.49\e2 & 0.0 & 4.53\e2 & 0.0 & & & 7.94\e2 & 0.0 & 8.89\e2 & 0.0 \\
2048 & 9.47\e2 & 0.0 & 4.52\e2 & 0.0 & & & 7.91\e2 & 0.0 & 8.85\e2 & 0.0 \\
4096 & 9.46\e2 & 0.0 & 4.51\e2 & 0.0%&&&7.90\e2&0.0&8.83\e2&0.0\\
8192 & 9.45\e2 & 0.0 & 4.51\e2 & 0.0 & & & & & & \\
\end{tabular}
Execute (g:easy_align_bypass_fold set, foldmethod should not change):
let g:easy_align_bypass_fold = 1
setlocal foldmethod=syntax
%EasyAlign*&
AssertEqual 'syntax', &l:foldmethod
setlocal foldmethod=manual
%EasyAlign*&
AssertEqual 'manual', &l:foldmethod
Expect tex:
\begin{tabular}{}
32 & 1.14\e1 & & 5.65\e2 & & & & 1.16\e1 & & 1.28\e1 & \\
64 & 1.03\e1 & 0.1 & 4.98\e2 & 0.2 & & & 9.21\e2 & 0.3 & 1.02\e1 & 0.3 \\
128 & 9.86\e2 & 0.1 & 4.69\e2 & 0.1 & & & 8.46\e2 & 0.1 & 9.45\e2 & 0.1 \\
256 & 9.65\e2 & 0.0 & 4.59\e2 & 0.0 & & & 8.15\e2 & 0.1 & 9.11\e2 & 0.1 \\
% 512&9.55\e2&0.0&4.56\e2&0.0&&&8.01\e2&0.0&8.96\e2&0.0\\
1024 & 9.49\e2 & 0.0 & 4.53\e2 & 0.0 & & & 7.94\e2 & 0.0 & 8.89\e2 & 0.0 \\
2048 & 9.47\e2 & 0.0 & 4.52\e2 & 0.0 & & & 7.91\e2 & 0.0 & 8.85\e2 & 0.0 \\
4096 & 9.46\e2 & 0.0 & 4.51\e2 & 0.0%&&&7.90\e2&0.0&8.83\e2&0.0\\
8192 & 9.45\e2 & 0.0 & 4.51\e2 & 0.0 & & & & & & \\
\end{tabular}
Execute:
Restore