如何运行改变当前缓冲区的vim脚本?

时间:2011-02-27 22:32:44

标签: vim

我正在尝试编写一个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命令应匹配(手动应用时匹配)。

1 个答案:

答案 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>