我正在尝试编写一个beautify.vim脚本,使得类似C的代码符合我能够轻松阅读的标准。
我的文件只包含所有以%s/...
但是,当我尝试以:source beautify.vim
或:runtime beautify.vim
的方式打开我的文件来运行脚本时,它会运行但是所有替换命令都表明它们的模式未找到(模式通过手动输入进行测试并且应该有效。)
有没有办法让vim在当前缓冲区的上下文中运行命令?
beautify.vim:
" add spaces before open braces
sil! :%s/\%>1c\s\@<!{/ {/g
" beautify for
sil! :%s/for *( *\([^;]*\) *; *\([^;]*\) *; *\([^;]*\) *)/for (\1; \2; \3)/
" add spaces after commas
sil! :%s/,\s\@!/, /g
在我的测试中,第一个:s命令应匹配(手动应用时匹配)。
答案 0 :(得分:3)
我刚刚写了一个类似的美化脚本,但我实现了它,我认为这是一种更灵活的方式;另外,我试图提出一种避免在字符串中替换东西的机制。
" {{{ regex silly beautifier (avoids strings, works with ranges)
function! Foo_SillyRegexBeautifier(start, end)
let i = a:start
while i <= a:end
let line = getline(i)
" ignore preprocessor directives
if match(line, '^\s*#') == 0
let i += 1
continue
endif
" ignore content of strings, splitting at double quotes characters not
" preceded by escape characters
let chunks = split(line, '\(\([^\\]\|^\)\\\(\\\\\)*\)\@<!"', 1)
let c = 0
for c in range(0, len(chunks), 2)
let chunk = chunks[c]
" add whitespace in couples
let chunk = substitute(chunk, '[?({\[,]', '\0 ', 'g')
let chunk = substitute(chunk, '[?)}\]]', ' \0', 'g')
" continue like this by calling substitute() on chunk and
" reassigning it
" ...
let chunks[c] = chunk
endfor
let line = join(chunks, '"')
" remove spaces at the end of the line
let line = substitute(line, '\s\+$', '', '')
call setline(i, line)
let i += 1
endw
endfunction
" }}}
然后我定义了一个映射,它在正常模式下影响整个文件,并且只在可视模式下影响选定的行。如果您有一些不想触摸的文件的精心格式化部分,这是很好的。
nnoremap ,bf :call Foo_SillyRegexBeautifier(0, line('$'))<CR>
vnoremap ,bf :call Foo_SillyRegexBeautifier(line("'<"), line("'>"))<CR>