-
-
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 |
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.
this function really awesome! thanks