Po migrácii mojich dotfiles na Mac M3 som narazil na blokujúci problém v mojom neovim nastavení. Zakaždým, keď som uložil PHP súbor, na jeho začiatok sa pridalo veľa nezmyselných dát. Ak si pamätáte, moje nastavenie používa prettier na formátovanie všetkého, väčšinou cez coc-prettier, ale keďže @prettier/plugin-php je len plugin a nie súčasť hlavnej vetvy, používam vim-prettier špeciálne len pre .php súbory. Nastavenie dobre slúži mojim potrebám, po zavedení vyžadovalo len minimálne doladenie.

Späť k nezmyslom, vyzerali presne takto:

]4;1;rgb:cc/24/1d␇␛]4;2;rgb:98/97/1a␇␛]4;3;rgb:d7/99/21␇␛]4;4;rgb:45/85/88␇␛]4;5;rgb:b1/62/86␇␛]4;6;rgb:68/9d/6a␇␛]11;rgb:28/28/28␇␛]10;rgb:eb/db/b2␇␛]4;0;rgb:28/28/28␇␛]4;7;rgb:a8/99/84␇␛]4;8;rgb:92/83/74␇␛]4;9;rgb:fb/59/34␇␛]4;10;rgb:b8/bb/26␇␛]4;11;rgb:fa/bd/2f␇␛]4;12;rgb:83/a5/98␇␛]4;13;rgb:d3/86/9b␇␛]4;14;rgb:8e/c0/7c␇␛]4;15;rgb:eb/db/b2␇␛]4;236;rgb:32/30/2f␇␛]4;234;rgb:1d/20/21␇␛]4;235;rgb:28/28/28␇␛]4;237;rgb:3c/38/36␇␛]4;239;rgb:50/49/45␇␛]4;241;rgb:66/5c/54␇␛]4;243;rgb:7c/6f/64␇␛]4;244;rgb:92/83/74␇␛]4;245;rgb:92/83/74␇␛]4;228;rgb:f2/e5/bc␇␛]4;230;rgb:f9/f5/d7␇␛]4;229;rgb:fb/f1/c7␇␛]4;223;rgb:eb/db/b2␇␛]4;250;rgb:d5/c4/a1␇␛]4;248;rgb:bd/ae/93␇␛]4;246;rgb:a8/99/84␇␛]4;167;rgb:fb/49/34␇␛]4;142;rgb:b8/bb/26␇␛]4;214;rgb:fa/bd/2f␇␛]4;109;rgb:83/a5/98␇␛]4;175;rgb:d3/86/9b␇␛]4;108;rgb:8e/c0/7c␇␛]4;208;rgb:fe/80/19␇␛]4;88;rgb:9d/00/06␇␛]4;100;rgb:79/74/0e␇␛]4;136;rgb:b5/76/14␇␛]4;24;rgb:07/66/78␇␛]4;96;rgb:8f/3f/71␇␛]4;66;rgb:42/7b/58␇␛]4;130;rgb:af/3a/03␇<?php

// rest of the file ...

Tu je doslovný výstup z ChatGPT, ktorý vysvetľuje, čo tieto sekvencie znamenajú, keďže takéto informácie neviem poskytnúť z pamäti, ani vytvoriť relevantný vyhľadávací dopyt:

  • ]4;N;rgb:RR/GG/BB ␇ nastaví farbu pre položku palety N na zadanú RGB farbu
  • ]10;rgb:RR/GG/BB ␇ nastaví farbu popredia (textu)
  • ]11;rgb:RR/GG/BB ␇ nastaví farbu pozadia

A príklady vyššie uvedeného:

  • ]4;1;rgb:cc/24/1d ␇ nastaví farbu 1 na RGB(204, 36, 29)
  • ]10;rgb:eb/db/b2 ␇ nastaví farbu textu na RGB(235, 219, 178)
  • ]11;rgb:28/28/28 ␇ nastaví farbu pozadia na RGB(40, 40, 40)

Lokalizácia problému #

Musím povedať, že som strávil dosť veľa času lokalizáciou tohto problému, ale bolo to celkom zábavné. Súčasťou môjho prechodu z Arch na Mac bola zmena zsh na fish shell. Momentálne neviem povedať, či to bolo dobré alebo zlé rozhodnutie, ani či bol načasovanie správne, ale to si pravdepodobne zaslúži samostatný článok.

Prvá vec, ktorú som vyskúšal, bolo uistenie sa, že problém skutočne nejako súvisí s prettier, keďže to bol v tom bode len môj neoverený predpoklad. Po zakomentovaní môjho riadku “autosave” v ~/.config/nvim/init.vim:

autocmd BufWritePre *.php PrettierAsync

Na začiatku súboru nezmysly neboli, ale manuálne spustenie :PrettierAsync v neovime ich znovu vyprodukovalo. Ako vidíte, prettier pre PHP sa stal úplne nepoužiteľným. Preto som otestoval, či natívne Prettier formáty robia to isté. Výsledok bol záporný. Oprava formátovania napríklad markdownového .md súboru žiadne nezmysly nevyprodukovala. To mi dalo celkom istotu, že problém leží v plugin-php, takže som to skúsil manuálne:

npx prettier --write file.php

Na moje veľké prekvapenie v takomto súbore žiadne nezmysly neboli. Bol som bez stopy, tak som sa pozrel na akékoľvek otvorené issues v týchto nástrojoch, ale nič neprinieslo žiadne výsledky. Ako som už povedal, je veľmi ťažké vytvoriť relevantný vyhľadávací dopyt pre takýto problém.

Execute! #

Po trochu dlhšom skúmaní som skúsil spustiť vyššie uvedené priamo v neovime cez execute pomocou :!

:!npx prettier --write %

Toto prinieslo prekvapenie, keďže presne tie isté nezmyselné dáta boli vo výsledku (a ešte nie v súbore). Mal som ďalší náznak, ale stále som nevedel, čo presne problém spôsobuje. Stále som si myslel, že plugin-php je vinník v tomto bode, výsledky mojich testov:

  • neovim s mojou konfiguráciou v fish produkoval problém, ale v zsh a bash nie
  • neovim s -u NONE (bez extra konfigurácie) produkoval problém vo všetkých troch shelloch
  • čistý vim v akomkoľvek shelle problém neprodukoval, ďalší náznak

Keďže plugin-php problém neprodukoval cez npx priamo, ani vo vim a len v neovim, presunul som svoju pozornosť tam. Stále som bol bez odpovede, keďže spúšťanie v akomkoľvek shelli a dokonca bez mojej konfigurácie problém produkovalo. Žiadna nedávna aktualizácia neovim, bežal som v0.9.5 celkom dlho, hoci v0.10.0 bol vydaný pred troma dňami, ešte som tam neprejdel, keďže boli oznámené niektoré breaking changes a nebol som si istý, či ma ovplyvnia alebo nie. Lepšie počkať týždeň alebo dva, kým sa vyžehlia najzrejmejšie bugy.

Stopa #

Neviem, ako mi to napadlo, možno z beznádeje, ale skúsil som spustiť nasledujúce:

:!ls

Toto produkovalo rovnaké nezmysly pred skutočným výstupom ls v neovime. Hotovo, problém vôbec neležal v prettier ani plugin-php! Teraz zabávne vyhľadávací výraz vim dumb shell ma priviedol k tomuto stackoverflow odpovedi, ktorá mala skutočné riešenie môjho problému.

Pridaním tohto príkazu do môjho init.nvim:

set shell=/bin/bash

Žiadne nezmysly sa neprodukovali. Verím, že problém je vo formátovaní farieb shellu fish. Neovim pravdepodobne číta predvolený shell a používa ho vo vnútri, bez ohľadu na to, z akého shellu je spúšťaný. Užite si to!

Odkazy #