Come posso eseguire il debug del mio file vimrc?


80

Ho un problema in Vim e penso che potrebbe essere nel mio vimrcfile (o mi è stato detto che potrebbe essere il mio vimrcfile).

Come posso verificare questo? Se è il mio vimrcfile, come faccio a sapere esattamente dove si trova il problema?

Risposte:


79

La prima cosa che vuoi fare è avviare Vim con le impostazioni predefinite:

vim -u NONE -U NONE -N

Le -u NONEimpedisce Vim da caricare il tuo vimrc, -U NONEimpedisce Vim di caricare il vostro gvimrc, e -Ndice a Vim di usare no-compatibili modalità (questo non è richiesto, ma la maggior parte degli utenti di Vim non sono abituati al modo "compatibile"). Si noti che NONEè necessario essere in maiuscolo.

In Windows è possibile aggiungere questi flag creando un nuovo collegamento 1 .

  • Se il problema persiste, allora sai che non è qualcosa nel tuo vimrc.

  • Se il problema scompare, ora è causato da qualcosa nel tuo file vimrc.

Non è il mio vimrc!

Evviva! Vai e fai la tua domanda. Ricorda che hai provato ad avviare Vim senza un file vimrc!

Quindi è il mio vimrc, e adesso?

Se non lo hai già fatto, probabilmente vorrai prima salvare una copia di backup del tuo file vimrc.

Controlla i plugin

La prossima cosa che probabilmente vorresti fare è disabilitare prima tutti i plugin; i plugin possono cambiare abbastanza in Vim. Se questo risolve il problema, prova a scoprire quale plug-in riattivandoli uno a uno. Dopo aver scoperto quale plugin causa esattamente il problema, puoi provare a risolverlo leggendo la documentazione di questo plugin e / o ponendo una domanda contrassegnata con plugin-<name>.

Se si tratta di non un plugin, e non si ha alcuna idea di che cosa sta causando il problema, allora si tratta di un procedimento per tentativi ed errori. Commenta una o più righe nel tuo vimrc, avvia Vim, controlla se si verifica il problema e ripeti questa procedura fino a quando il problema non si interrompe. Il modo più veloce per farlo è:

  1. Commenta (o rimuovi) circa metà del tuo file vimrc.
  2. Riavvia Vim o apri un nuovo Vim (ricaricare Vimrc non è abbastanza buono, poiché le impostazioni non sono disattivate).
  3. Il problema ora è andato? Rimetti a posto la parte che hai rimosso (mantenere Vim aperto e usare Annulla è utile qui) e ripeti il ​​passaggio 1 sulla parte che hai aggiunto di nuovo.
  4. Il problema persiste? Vai al passaggio 1.

Alla fine dovresti avere una singola opzione o una combinazione di alcune opzioni che causano il tuo problema. Puoi scoprire di più su qualsiasi opzione in Vim usando:

:help 'option_name'

Le virgolette sono importanti qui, di solito funziona senza di esse, ma a volte finisci sulla pagina sbagliata se le ometti.

Se sei ancora confuso dopo aver letto la pagina di aiuto, sai dove porre una domanda ;-)

Debug di un singolo plugin

Se vuoi isolare un singolo plugin, magari per fare una domanda al riguardo, vuoi caricare il meno possibile ma comunque caricare il plugin; puoi farlo facilmente con la funzione dei pacchetti di Vim. Ciò richiede Vim 8 o una versione abbastanza recente di Neovim.

  1. Crea una nuova directory vuota; useremo il ~/pluginpercorso in questo esempio. Ora metti il ​​plugin nella pack/plugins/start/$namedirectory normale . Per esempio:

    git clone https://github.com/fatih/vim-go.git ~/plugin/pack/plugins/start/vim-go
    
  2. Creare un test-vimrcfile con i seguenti contenuti; questo assicurerà che Vim caricherà i plugin dalla ~/plugindirectory e non dalla ~/.vim directory:

    set nocompatible
    set packpath=~/plugin,/usr/share/vim/vimfiles,/usr/share/vim/vim80,/usr/share/vim/vimfiles/after,~/plugin/after
    packloadall!
    
    syntax on
    filetype plugin indent on
    
  3. Inizia Vim con:

    vim -U NONE -u ~/test-vimrc
    

    Ora hai un vimrc minimo con questo singolo plugin.


Le note

1 Ad esempio: a 64 bit di Windows, la scorciatoia sarebbe simile a questa: "C:\Program Files (x86)\Vim\vim74\vim.exe" -u NONE -U NONE -N. Per crearlo, fai clic con il pulsante destro del mouse in Esplora file nel punto in cui desideri il collegamento, quindi seleziona Nuovo -> Collegamento e incolla il testo del collegamento. Potrebbe essere necessario modificare il percorso di Vim se Vim è installato in un'altra posizione.


7
Questa tecnica si chiama Localizzazione guasti ricerca binaria .
Tommaso,

2
Dopo aver scoperto il tuo bug, sarebbe un ottimo momento per iniziare a mantenere il tuo .vimrc sotto il controllo della versione :) Sarà quasi sempre una delle ultime modifiche che hai apportato ad esso che ha reso le cose strane.
escrafford,

1
Non hai bisogno -U NONEse hai -u NONE.
Antony,

@MartinTournoij Ho suggerito una modifica per facilitare la comprensione di un lettore per la prima volta. Spero vi piaccia. Grazie!
jpaugh,

1
Grazie @jpaugh; Penso che l'ordine abbia più senso.
Martin Tournoij,

31

Esiste un -Dparametro Vim appositamente per il debug che passerà alla modalità di debug dopo aver eseguito il primo comando da uno script.

Ad esempio per eseguire Vim in modalità debug senza plug-in, eseguire come:

vim --noplugin -D

Digitare n/ nextper analizzare la riga successiva e continuare a premere Enter.

E conto qper tornare vimall'interfaccia.

Se stai usando una versione della GUI, inserisci un guicomando in vimrc per avviare il debug subito dopo quel comando.

Premere Ctrl+ dper l'elenco dei comandi disponibili

Leggi di più:


1
Questo è stato molto utile per trovare un semplice errore nel file .vimrc che stava causando un messaggio di errore. Vale la pena provare questo prima perché è veloce da fare.
RichVel,

1
@kenorb questo comando è fantastico, salvami dall'andare a un altro editor.
TheLazyChap,

11

Come già accennato, prima cerca vim -u NONE -U NONE -Ndi assicurarti che la tua vaniglia vim funzioni bene.

Quindi avviare vim normalmente e controllare

:messages

dall'interno di vim dopo il problema, che mostrerà tutti gli avvisi e gli errori.

Infine avvia vim con il seguente comando

vim -V9logfile.log

che creerà un file di registro chiamato logfile.log, -V9è il livello di registrazione e tenta di riprodurre il problema.


11

Un altro consiglio: per quanto possa sembrare un uomo delle caverne, mi piace aggiungere: echom "messaggio" al mio .vimrc per vedere cosa viene eseguito e cosa no.

Per esempio

if executable('ag')
  :echom "AG FOUND"

  ...
endif

Questo mi aiuta a vedere rapidamente se il blocco if è in esecuzione, ecc. Il messaggio verrà stampato sulla console al prossimo avvio di vim.


6
E se si utilizza echomun altro comando interessante è :messagesquello di ottenere l'eco del registro completo dei messaggi. A volte può essere utile guardarli dopo l'avvio.
statox

Questo è quasi ciò di cui avevo bisogno, voglio vedere qual è il valore di cpoptions in un punto del mio vimrc, come faccio a echo l'output di ": set cpoptions?" ?
Mike Lippert,

10

Una cosa che ho trovato aiuta è mantenere una raccolta di variabili che commutano parti del tuo in .vimrcmodo da poter disabilitare o abilitare parti di esso senza dover commentare cose. Ha anche il piacevole effetto collaterale di costringerti a pensare all'organizzazione del tuo .vimrc.

" feature toggles in vimrc
let g:vimrc_feat_pathogen               = 1
let g:vimrc_feat_core_minimal           = 1
let g:vimrc_feat_matchit                = 1
let g:vimrc_feat_options                = 1
let g:vimrc_feat_colors_and_highlight   = 1
let g:vimrc_feat_key_rebinding_arpeggio = 1
let g:vimrc_feat_key_rebinding          = 1
let g:vimrc_feat_autocommand_group      = 1
let g:vimrc_feat_custom_definitions     = 1
let g:vimrc_feat_load_opam              = 1

Ecco un esempio di una sezione protetta da un if:

if g:vimrc_feat_core_minimal
    set nocompatible
    filetype plugin indent on
    syntax on
endif

1

Il mio tempo di caricamento di vimrc è stato molto lento, circa 400 ms, e l'ho ridotto a 20 ms solo rimuovendo questa riga:

silent !mkdir ~/.config/nvim/backups > /dev/null 2>&1

Assicurati di non avere chiamate a comandi esterni come quello.


1
Benvenuti nel sito! Questo è un bocconcino utile, ma è un po 'più specifico della domanda molto generale. Potrebbe essere meglio aggiunto come risposta ad esempio a questa domanda o, se stai solo cercando di condividere conoscenze, potresti forse chiedere e rispondere alla tua domanda?
Ricco

0

Ecco una semplice procedura per iniziare.

  1. commentare i contenuti dell'intero file .vimrc
  2. ricaricare il tuo .vimrc eseguendo :source %o:so $MYVIMRC
  3. decommenta una parte discreta del file (generalmente a partire dall'alto)
  4. Ripetere i passaggi 2 e 3 fino a trovare l'errore.
  5. correggi l'errore.

1
Questa risposta potrebbe essere molto migliore se la capitalizzi e la punteggi correttamente.

Consiglio vivamente di farlo con una ricerca binaria.
D. Ben Knoble,
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.