如何编写vim来在缓冲区上运行perltidy?

时间:2010-02-26 23:29:37

标签: perl vim

在我目前的工作中,我们的编码风格标准与我通常遵循的标准不同。幸运的是,我们有perltidy的固定RC文件,我可以申请重新格式化文件,然后再将其提交给我们的审核流程。

我有emacs的代码,我用它来通过缓冲区运行命令并用输出替换缓冲区,我已经适应了这个。但我有时在emacs和vim之间交替,并希望在那里具有相同的功能。我确信这个或类似的东西很简单,已经完成并重复了很多次。但我没有太多运气找到任何似乎做我需要的vim脚本的例子。实质上,这是能够击中一个键组合(如Ctrl-F6,我在emacs中使用的),并且缓冲区由perltidy就地重新格式化。虽然我是一个舒服的vim用户,但我完全无法为vim写这类东西。

6 个答案:

答案 0 :(得分:11)

在尝试@hobbs回答后,我注意到当通过perltidy过滤整个缓冲区时,光标返回到字节1,我必须记下原始行号,以便我可以在{{{{{ 1}}完成。

基于@hobbs'和@ Ignacio的答案,我在:Tidy添加了以下内容:

.vimrc

(关闭"define :Tidy command to run perltidy on visual selection || entire buffer" command -range=% -nargs=* Tidy <line1>,<line2>!perltidy "run :Tidy on entire buffer and return cursor to (approximate) original position" fun DoTidy() let l = line(".") let c = col(".") :Tidy call cursor(l, c) endfun "shortcut for normal mode to run on entire buffer then return to current line" au Filetype perl nmap <F2> :call DoTidy()<CR> "shortcut for visual mode to run on the the current visual selection" au Filetype perl vmap <F2> :Tidy<CR> 添加到评论中以显示SO语法(不是必需的,但是有效的vim语法))

"会将光标返回到原始位置加上或减去最多DoTidy()个字节,其中XX相对于perltidy添加/删除的字节数原始光标位置。但只要你保持整洁,这是相当微不足道的。)。

[Vim版本:7.2]

编辑:更新DoTidy()以纳入@ mikew的评论,以提高可读性和与Vim 7.0的兼容性

答案 1 :(得分:9)

通过外部程序过滤整个缓冲区的命令是:

:%!command

将以下内容放入~/.vimrc以在正常模式下将其绑定到Ctrl-F6:

:nmap <C-F6> :%!command<CR>

增加乐趣:

:au Filetype perl nmap <C-F6> :%!command<CR>

这只会在编辑Perl文件时映射过滤器。

答案 2 :(得分:9)

我的整洁命令:

command -range=% -nargs=* Tidy <line1>,<line2>!
  \perltidy (your default options go here) <args>

如果您使用视觉选择或提供范围,那么它将整理所选范围,否则它将使用整个文件。您可以在我编写(your default options go here)的位置放置一组默认选项(如果有的话),但是您提供给:Tidy的任何参数都将附加到perltidy命令行,覆盖您的默认值。 (如果你使用.perltidyrc你可能没有默认args - 那很好 - 但是你可能希望有一个默认值--profile=vim来设置默认值只适用于你工作的时候vim。无论什么都有效。)

答案 3 :(得分:4)

将hobbs的答案更进一步,您可以将该命令映射到快捷键:

command -range=% -nargs=* Tidy <line1>,<line2>!perltidy -q
noremap <C-F6> :Tidy<CR>

还有一步:只在你处于Perl缓冲区时映射命令(因为你可能不希望在任何其他语言上运行perltidy):

autocmd BufRead,BufNewFile *.pl,*.plx,*.pm command! -range=% -nargs=* Tidy <line1>,<line2>!perltidy -q
autocmd BufRead,BufNewFile *.pl,*.plx,*.pm noremap <C-F6> :Tidy<CR>

现在您可以在没有活动选择的情况下按Ctrl-F6来格式化整个文件,或者使用活动选择来格式化该部分。

答案 4 :(得分:2)

与其创建新的键盘快捷键,不如替换body,html{}命令的含义,该命令已经在人们的手指记忆中缩进了东西?是的,perlcritic不仅可以缩进,而且无论如何使用perlcritic时,您可能不想回到劣等的“ just indent” =命令。因此,让我们覆盖它吧!

=

现在我们可以像以前一样使用filetype plugin indent on autocmd FileType perl setlocal equalprg=perltidy ,但是增加了perlcritic的功能,而不仅仅是缩进行了:

=

最棒的是,您不必学习任何新的快捷方式,但可以继续使用已经使用的快捷方式,而且功能更强大。 :)

答案 5 :(得分:0)

我习惯使用面向行的视觉 Shift + V 选择文本然后按我有{{1}在历史的某个地方,所以我向上箭头点击一次或多次。