2011-02-05 2 views
6

Come mostrare temporaneamente un'istantanea di un file, nascondendo i commenti e la riga vuota?Istantanea di una parte di un file in Vim: nascondi i commenti e le righe vuote

Lo scopo sarebbe quello di ottenere una cattura di una funzione C++ (ad esempio), in una pagina densa di formazione.

Un modo per farlo è quello di utilizzare il comando globale per filtrare le righe di commento

:g!/\/\/ 

ma poi l'evidenziazione della sintassi e spostare i controlli scompaiono.

La funzione di piegatura di Vim è un modo per eseguire il lavoro, ma riduce solo diversi commenti consecutivi a una singola riga visivamente invadente.

In ogni caso, pieghevole è ancora utile per nascondere i commenti lunghi C-come, ad esempio con:

:set foldmethod=marker 
:set foldmarker=/*,*/ 

ma non sono riuscito a piegare facilmente sia C (/ ... /) e C++ (// ...) commenti in un singolo comando.

Il trucco ideale sarebbe:

  • nascondere (non solo piega in una sola riga) commenti e le righe vuote,
  • forse indicare le linee nascoste con un personaggio sulla prima colonna ,
  • gestire entrambi i commenti C e C++,
  • preservando l'evidenziazione della sintassi,
  • e, idealmente, la capacità di browse il codice,
  • consente una facile Revert di tornare alla "commentato" vista.

così da trasformare il seguente codice:

/** Let say hello 
* and do not forget anybody 
*/ 
void hello(int arg) 
{ 
    // OMG an hello world! 
    std::cout << "hello" << std::endl; 

} // where is the world? 

nelle seguenti buffer:

void hello(int arg) 
{ 
    std::cout << "hello" << std::endl; 
} 

risposta

4

Tutti i commenti possono essere rimossi dalla sorgente con il seguente comando:
:%s/\/\*\_.\{-}\*\/\n\{,1}\|^\s*\/\/.*\n\|\s*\/\/.*//

Questo può essere annullato con lo u comando, supponendo che non siano presenti altre azioni da annullare.

Poiché le regex possono essere estremamente criptiche, di seguito è riportata una spiegazione di ciascuna parte. L'intera regex è divisa in tre parti separate da un operatore OR (\|).

\/\*\_.\{-}\*\/\n\{,1}
Questo corrisponde ai commenti del blocco del modulo /* ... */.Corrisponde alla stringa '/ *' (\/\*) seguita da zero o più di qualsiasi carattere, inclusa la nuova riga, ma corrispondente il meno possibile (\_.\{-}), seguita da zero o una nuova riga (\n\{,1}). Il motivo per cui corrisponde a zero o una nuova riga è di gestire sia il caso in cui vi è il codice sulla stessa riga del commento sia il caso in cui il commento si trova su una riga da solo.

^\s*\/\/.*\n questo è quello di abbinare i commenti della forma //... in cui il commento è su una riga da solo. Corrisponde a zero o più caratteri di spaziatura che iniziano con l'inizio della riga (^\s*) seguito dalla stringa '//' (\/\/), quindi zero o più di qualsiasi carattere (.*), che termina con una nuova riga (\n).

\s*\/\/.* Questo corrisponde ai commenti del modulo //... dove il commento segue il codice. Corrisponde a qualsiasi quantità di spazi bianchi (\s*) seguita dalla stringa // (\/\/) e quindi a qualsiasi numero di caratteri non newline (.*).

Questo è il meglio che riesco a trovare al momento, se riesco a pensare a un modo per nascondere invece di eliminare i commenti, aggiornerò questo post.

Aggiornamento: Un possibile modo per semplicemente "nascondere" i commenti potrebbe essere quello di colorarli come lo sfondo. Ciò li renderebbe invisibili. Tuttavia, al momento non so quanto sia fattibile quella idea o quanto sarebbe generalizzata. Non ne so abbastanza dei colori in vim da poter scrivere una sceneggiatura per realizzare questo.

+0

L'aggiunta di un metodo per eliminare righe vuote in questo singolo comando farebbe un lavoro sufficientemente buono. Ma qualcosa come aggiungere "| \ s * \ n" nella parte corrispondente non sembra funzionare, qualche idea? – nojhan

+0

@nojhan Ho modificato il comando per rimuovere le newline, l'ho testato e ha funzionato. Ha l'effetto di rimuovere tutte le righe vuote, vedrò se riesco a pensare a un modo per rimuovere solo le righe vuote risultanti dalla rimozione dei commenti. – cledoux

+0

@nojhan Ho aggiornato di nuovo il post con un comando che dovrebbe funzionare ora. Rimuoverà le nuove linee risultanti dalla rimozione dei commenti, ma lascerà tutte le altre righe vuote. – cledoux