-
-
Save tpope/287147 to your computer and use it in GitHub Desktop.
inoremap <silent> <Bar> <Bar><Esc>:call <SID>align()<CR>a | |
function! s:align() | |
let p = '^\s*|\s.*\s|\s*$' | |
if exists(':Tabularize') && getline('.') =~# '^\s*|' && (getline(line('.')-1) =~# p || getline(line('.')+1) =~# p) | |
let column = strlen(substitute(getline('.')[0:col('.')],'[^|]','','g')) | |
let position = strlen(matchstr(getline('.')[0:col('.')],'.*|\s*\zs.*')) | |
Tabularize/|/l1 | |
normal! 0 | |
call search(repeat('[^|]*|',column).'\s\{-\}'.repeat('.',position),'ce',line('.')) | |
endif | |
endfunction |
l
means left align; 1
means one space of padding.
Would you recommend putting this in a ftplugin so as to not slow down non-cucumber-related file editing?
If you do, make sure you add <buffer>
to the map. In practice, I haven't had any issues with it being global.
Ah cool, thank you!
FYI: I just added this to my after/ftplugin/cucumber.vim
and it works like a charm. Very nice.
Thanks! Added this to my vimrc and it works perfectly.
I copied this into my .vimrc. And I have installed Tabular.vim successfully.
But it doesn't work. I input ab | cd | ef and nothing happened. What's wrong?!
@jznhljg, that doesn't look like a valid Cucumber table to me.
@tpope, I just want to edit some plain text, can I use this function to automatically adjust the padding space?
Sure, if you relax the regex a bit. As it stands now, it's hell bent on avoiding false positives.
I was looking for some solution for dealing with Cuke tables in gVIM similar or close to the one TextMate bundle for Cucumber has.
But this is so much better, thanks a lot Tim, as usual :)
For those interested, I made a modified version of this that does the same for equals (=) signs. You can find it in the list of forks to the right, or here: https://gist.github.com/1258015
Credits still go to Tim for the awesome original, I just made a few small changes.
For those who are interested I made a little plugin that you can use easily with pathogen, it is available here: https://github.com/quentindecock/vim-cucumber-align-pipes
Feedback are welcome,
Enjoy,
For those interested, I made a little plugin that extends this concept to creating full fledged tables as you type :). It is available here - https://github.com/dhruvasagar/vim-table-mode. You can put let g:table_mode_border=0
in your vimrc to get the same behavior as this plugin.
Also you can change the separator itself by let g:table_mode_separator='='
or whatever you need to achieve the same effect for other type of characters. Please refer to the :h table-mode.txt
for more information. Feedback is welcome :).
Thanks.
This is really useful!
Thx a lot!
Thanks tpope for this and all your other amazing work. I ended up here after asking this question: http://vi.stackexchange.com/questions/6908/how-can-i-replace-a-word-in-a-column-without-changing-the-width
this function really awesome! thanks
Can I make this to work only on specific file formats such as AsciiDoc? Is it okay to add the code to ftplugin/asciidoc.vim? Thanks!
Sure, make it a <buffer>
map and unmap it in b:undo_ftplugin
.
I have recreated it in lua for anyone that is interested.
local cmd = vim.cmd
local fn = vim.fn
function _G.alignMdTable()
local pattern = '^%s*|%s.*%s|%s*$'
local lineNumber = fn.line('.')
local currentColumn = fn.col('.')
local previousLine = fn.getline(lineNumber - 1)
local currentLine = fn.getline('.')
local nextLine = fn.getline(lineNumber + 1)
if fn.exists(':Tabularize') and currentLine:match('^%s*|') and (previousLine:match(pattern) or nextLine:match(pattern)) then
local column = #currentLine:sub(1, currentColumn):gsub('[^|]', '')
local position = #fn.matchstr(currentLine:sub(1, currentColumn), ".*|\\s*\\zs.*")
cmd('Tabularize/|/l1') -- `l` means left aligned and `1` means one space of cell padding
cmd('normal! 0')
fn.search(('[^|]*|'):rep(column) .. ('\\s\\{-\\}'):rep(position), 'ce', lineNumber)
end
end
local cmd = vim.cmd local fn = vim.fn function _G.alignMdTable() local pattern = '^%s*|%s.%s|%s$' local lineNumber = fn.line('.') local currentColumn = fn.col('.') local previousLine = fn.getline(lineNumber - 1) local currentLine = fn.getline('.') local nextLine = fn.getline(lineNumber + 1) if fn.exists(':Tabularize') and currentLine:match('^%s*|') and (previousLine:match(pattern) or nextLine:match(pattern)) then local column = #currentLine:sub(1, currentColumn):gsub('[^|]', '') local position = #fn.matchstr(currentLine:sub(1, currentColumn), ".|\s\zs.") cmd('Tabularize/|/l1') --
l
means left aligned and1
means one space of cell padding cmd('normal! 0') fn.search(('[^|]|'):rep(column) .. ('\s\{-\}'):rep(position), 'ce', lineNumber) end end
Thank you sir!
Recently moved all my config to lua, u know just playing around and getting to know it .. and this amazing piece of code was one of the missing parts on my new setup. Seems to work just fine.
@namjul hey thank you so much, worked like a charm.
@namjul it works perfectly. Thanks a lot.
I'm wondering, what does the "l1" option on the match of the Tabularize?