I numeri grandi fanno girare lentamente Vim?


18

Sembra una domanda davvero stupida, ma ho un file Python che contiene un numero lungo un migliaio di cifre e quel file sembra funzionare molto lentamente, non sono sicuro che ci sia un qualche tipo di elaborazione in corso che io non ne sono consapevole.

Premo la linea je c'è una pausa definita di ~ 1 secondo che è molto dolorosa!

Ho solo questo sul file Python, non succede su altri.

Dopo aver eliminato il numero, il file funziona di nuovo normalmente ...

Ecco il numero:

number=("""7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450""")

In realtà non è nemmeno un numero, è una stringa.


2
Confermato qui; non succede se il file è .txt. Suppongo che alcune sintassi evidenzino il modello regexp che va storto.
Rmano,

Poiché si tratta di evidenziare la sintassi, la semplice soluzione sarebbe quella di impostare synmaxcolun numero limitato (come la larghezza del terminale).
Slade,

Risposte:


23

Posso riprodurlo con syntax/python.vimquello fornito con Vim 7.4.663.

Utilizzando :syntime, questo sembra essere causato dal seguente gruppo / modello di sintassi:

TOTAL      COUNT  MATCH   SLOWEST     AVERAGE   NAME               PATTERN
73.870736   20     0       3.940215    3.693537  pythonNumber       \%(^\|\W\)\@<=\d*\.\d\+\%([eE][+-]\=\d\+\)\=[jJ]\=\>

Dovresti segnalare questo problema al suo manutentore (il suo nome e indirizzo e-mail sono nell'intestazione dello script).

Per inciso, in origine non riuscivo a riprodurre questo, perché utilizzo uno script di sintassi alternativo da qui . Passare a quello (se si adatta alle tue esigenze), sarebbe anche una soluzione alternativa fattibile.


Modifica: esaminando ulteriormente la probabile causa, questo sembra essere dovuto alle prestazioni patologiche del nuovo motore regexp basato su NFA. Con :set regexpengine=1, non vedo quell'enorme rallentamento. Quindi una possibile soluzione / correzione sarebbe passare al vecchio motore per quella corrispondenza di sintassi; questo può essere fatto anteponendo \%#=1al modello (cp. :help NFA).


grazie @Ingo, non ho mai segnalato nulla prima, ma sono felice di farlo. Ho il file di sintassi /usr/share/vim/vim74/syntax, lo sviluppatore è in alto Neil Schemenauer <nas@python.ca>. Posso chiederti; è per questo che hai modificato originariamente i file di sintassi? Grazie
baxx il

Sì, è giusto; l'ultima versione è del 16 luglio 2014, quindi è probabile che venga ancora mantenuta e riceverai una risposta dall'autore. Puoi indicarlo a questo, la tua domanda, in quanto contiene già un bell'esempio riproducibile.
Ingo Karkat,

Ho appena trovato la mia sintassi alternativa di Python da qualche parte; Sto modificando solo raramente i file Python, quindi finora non ci ho pensato molto.
Ingo Karkat,

grazie @Ingo, ho modificato i file di sintassi e non è più così lento. Temo che i motori regex siano un po 'oltre la mia comprensione, invierò un'email allo sviluppatore, sono felice di eseguire qualsiasi test.
baxx,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.