Jednou z funkcií vimu je schopnosť filtrovať obsah súboru cez príkaz a vrátiť výstup späť do bufferu. Dá sa to využiť napríklad na opravu odsadenia v súbore alebo všeobecne na formátovanie dokumentu.
Súčasťou oficiálnej dokumentácie pre prettier/plugin-php je aj tento vimscript:
" Prettier for PHP
function PrettierPhpCursor()
let save_pos = getpos(".")
%! prettier --parser=php
call setpos('.', save_pos)
endfunction
" define custom command
command PrettierPhp call PrettierPhpCursor()
" format on save
autocmd BufwritePre *.php PrettierPhp
Používa príkaz prettier dostupný v PATH, nainštalovateľný napríklad cez:
npm install -g prettier @prettier/plugin-php
Skript funguje podľa popisu — PHP súbor sa naformátuje pri uložení, v závislosti od nastavení prettiera môže vyzerať podobne ako toto:

Nadbytočné medzery sa odstránia, chýbajúce sa doplnia a úvodzovky sa zjednotia, okrem iných formátovacích úloh. Pekné.
Problém #
Táto rozprávková situácia sa ale skomplikuje, ak PHP kód obsahuje syntaktickú chybu alebo podobný problém:

Nielen že vás vyruší správa shell returned 2, ale aj výzva Type ENTER
or type command to continue, ktorá nahradí obsah aktuálneho bufferu
chybovým hlásením.
Dá sa to vrátiť stlačením u, ale potom je kurzor na začiatku súboru.
Vrátiť kurzor tam, kde bol, stojí ešte viac zbytočných stlačení kláves.
Riešenie #
Malou úpravou spomínaného vimscriptu sa mi podarilo dosiahnuť príjemnejšie riešenie:
" Prettier for PHP
function PrettierPhpCursor()
let save_pos = getpos(".")
%! prettier --parser=php
" undo automatically on error
if v:shell_error | silent undo | endif
call setpos('.', save_pos)
endfunction
" define custom command
command PrettierPhp call PrettierPhpCursor()
" format on save silently
autocmd BufwritePre *.php silent PrettierPhp
Príkaz prettier má tiež množstvo nastaviteľných možností, buď cez súbor
.prettierrc, alebo priamo vo vimscripte, napríklad:
%! prettier --parser=php --brace-style=1tbs
Viac detailov nájdete v sekcii Configuration dokumentácie alebo cez:
npx prettier --parser=php --help
Zdá sa, že upravený vimscript teraz funguje bez väčších rušivých momentov. Príjemné používanie!
Odkazy #
- https://github.com/prettier/plugin-php
- https://askubuntu.com/a/719000/350681
- https://vimhelp.org/cmdline.txt.html#%3A%25
- https://vimhelp.org/various.txt.html#%3A%21
- https://stackoverflow.com/a/6074494/1972509
- https://stackoverflow.com/a/62976064/1972509
- https://stackoverflow.com/questions/26051680/display-stdout-in-vim-when-external-command-fails
- https://vi.stackexchange.com/questions/5795/shell-returned-2-when-i-try-to-indent
- https://vi.stackexchange.com/questions/7116/how-can-i-filter-a-buffer-to-an-external-command-on-save-without-causing-any-sid/7118
- https://stackoverflow.com/questions/11703174/abort-write-in-bufwritepre-of-vim-script