lining up function parameter lists with vim

2019-02-12 03:47发布

When defining or calling functions with enough arguments to span multiple lines, I want vim to line them up. For example,

def myfunction(arg1, arg2, arg, ...
               argsN-1, argN)

The idea is for argsN-1 to have its 'a' lined up with args1.

Does anyone have a way to have this happen automatically in vim? I've seen the align plugin for lining equal signs (in assignment statements) and such, but I'm not sure if it can be made to solve this problem?

4条回答
我只想做你的唯一
2楼-- · 2019-02-12 04:11

you might get some good mileage out of using a language-specific external tool as a Vim filter. for example, if you can write a Perltidy config file to generate the formatting you want (it looks like you would want the -lp -vtc=2 flags), you can then pipe your existing Vim buffer through it with

:!/path/to/tidy -config /path/to/configfile

if you're going to be running this sort of command frequently, you can define an command by putting something like the following in your .vimrc:

command -range=% Tidy <line1>,<line2>!/path/to/tidy -config /path/to/configfile
查看更多
再贱就再见
3楼-- · 2019-02-12 04:22

I believe you have to issue the command:

:set cino=(0

This is when using cindent of course.

edit: I missed "set"

查看更多
Juvenile、少年°
4楼-- · 2019-02-12 04:26

The previous poster had it, but forgot the set

:set cino=(0<Enter>

From :help cinoptions-values

The 'cinoptions' option sets how Vim performs indentation.  In the list below,
"N" represents a number of your choice (the number can be negative).  When
there is an 's' after the number, Vim multiplies the number by 'shiftwidth':
"1s" is 'shiftwidth', "2s" is two times 'shiftwidth', etc.  You can use a
decimal point, too: "-0.5s" is minus half a 'shiftwidth'.  The examples below
assume a 'shiftwidth' of 4.

...

    (N    When in unclosed parentheses, indent N characters from the line
          with the unclosed parentheses.  Add a 'shiftwidth' for every
          unclosed parentheses.  When N is 0 or the unclosed parentheses
          is the first non-white character in its line, line up with the
          next non-white character after the unclosed parentheses.
          (default 'shiftwidth' * 2).

            cino=                     cino=(0 >
              if (c1 && (c2 ||          if (c1 && (c2 ||
                          c3))                     c3))
                  foo;                      foo;
              if (c1 &&                 if (c1 &&
                      (c2 || c3))           (c2 || c3))
                 {                         {
查看更多
登录 后发表回答