phpvimsyntaxphp-beautifier

Modify PHP_Beautifier in Vim to not strip empty lines


Just finished incorporating PHP_Beautifier into Vim and the fact that it removes whitespace irks me. Apparently it's a bug since 2007. There is a hack to fix this problem, but it leads to other problems. Instead I decided to use a round about method.

First Convert multiple blank lines to a single blank line via the command as suggested here

:g/^\_$\n\_^$/d

Next Convert all blank lines to something unique like so (make sure it does not get changed during beautification)

:%s/^[\ \t]*\n/$x = 'It puts the lotion on the skin';\r/ge

Next Call PHP_Beautifier like so

:% ! php_beautifier --filters "ArrayNested() IndentStyles(style=k&r) NewLines(before=if:switch:foreach:else:T_CLASS,after=T_COMMENT:function)"<CR>

Finally Change all unique lines back to empty lines like so

:%s/$x='It puts the lotion on the skin';//ge

All four work when I tested them independently. I also have the third step mapped to my F8 key like so

map <F8> :% ! php_beautifier --filters "ArrayNested() IndentStyles(style=k&r) NewLines(before=if:switch:foreach:else:T_CLASS,after=T_COMMENT:function)"<CR>

But when I try to string the commands together via the pipe symbol, like so (I padded the pipes with whitespace to better show the different commands)

map <F8> :g/^\_$\n\_^$/d    |    %s/^[\ \t]*\n/$x = 'It puts the lotion on the skin';\r/ge      |      % ! php_beautifier --filters "ArrayNested() IndentStyles(style=k&r) NewLines(before=if:switch:foreach:else:T_CLASS,after=T_COMMENT:function)"     |     %s/$x = 'It puts the lotion on the skin';//ge<CR>

I get the following error

Error detected while processing /home/xxx/.vimrc:
line  105:
E749: empty buffer

E482: Can't create file /tmp/vZ6LPjd/0
Press ENTER or type command to continue

How do I bind these multiple commands to a key, in this case F8.


Thanks to ib's answer, I finally got this to work. If anyone is having this same problem, just copy this script into your .vimrc file

func! ParsePHP()
    :exe 'g/^\_$\n\_^$/d' 
    :%s/^[\ \t]*\n/$x = 'It puts the lotion on the skin';\r/ge
    :exe '%!php_beautifier --filters "ArrayNested() IndentStyles(style=k&r)"'
    :%s/$x = 'It puts the lotion on the skin';//ge 
endfunc

map <F8> :call ParsePHP()<CR>

Solution

  • For some Ex commands, including :global and :!, a bar symbol (|) is interpreted as a part of a command's argument (see :help :bar for the full list). To chain two commands, the first of which allows a bar symbol in its arguments, use the :execute command.

    :exe 'g/^\_$\n\_^$/d' |
    \   %s/^[\ \t]*\n/$x = 'It puts the lotion on the skin';\r/ge |
    \   exe '%!php_beautifier --filters "ArrayNested() IndentStyles(style=k&r) NewLines(before=if:switch:foreach:else:T_CLASS,after=T_COMMENT:function)"' |
    \   %s/$x = 'It puts the lotion on the skin';//ge