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

rjr*_*ray 13 vim perl

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

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

Mis*_*rEd 12

在尝试@hobbs回答后,我注意到当通过perltidy游标返回到字节1 过滤整个缓冲区时,我不得不记下原始行号,这样我就可以在:Tidy完成后返回.

所以在@hobbs'和@ Ignacio的答案的基础上,我将以下内容添加到我的.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>
Run Code Online (Sandbox Code Playgroud)

(关闭"为SO语法突出显示添加到注释(不是必需的,但有效的vim语法))

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

[Vim版本:7.2]

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


Ign*_*ams 9

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

:%!command
Run Code Online (Sandbox Code Playgroud)

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

:nmap <C-F6> :%!command<CR>
Run Code Online (Sandbox Code Playgroud)

为了增加乐趣:

:au Filetype perl nmap <C-F6> :%!command<CR>
Run Code Online (Sandbox Code Playgroud)

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


hob*_*bbs 9

我整洁的命令:

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

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