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:

PHP súbor je správne naformátovaný pri uložení vo vime

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:

Použitie vim filtra nahradí obsah aktuálneho bufferu chybovým výstupom

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 #