Come posso ottenere (g) Vim per visualizzare il conteggio dei caratteri del file corrente?


86

Mi piace scrivere tutorial e articoli per un forum di programmazione che frequento. Questo forum ha un limite di caratteri per post. Ho usato Notepad ++ in passato per scrivere post e mantiene un conteggio dei personaggi dal vivo nella barra di stato. Sto iniziando a usare gVim di più e non voglio davvero tornare a Notepad ++ a questo punto, ma è molto utile avere questo conteggio dei caratteri. Se esco dal conto, di solito finisco per incollare il post in Notepad ++ in modo da poter vedere quando ho tagliato abbastanza per superare il limite.

Ho visto dei suggerimenti che :set rulerpotrebbero essere d'aiuto, ma ciò fornisce solo il conteggio dei caratteri tramite l'indice di colonna corrente sulla riga corrente. Sarebbe fantastico se non usassi le interruzioni di paragrafo, ma sono sicuro che accetteresti che leggere diverse migliaia di caratteri in un paragrafo non è comodo.

Ho letto l'aiuto e ho pensato che rulerformatavrebbe funzionato, ma dopo aver esaminato il statuslineformato utilizzato non ho visto nulla che fornisse un conteggio dei caratteri per il buffer corrente.

Ho visto che ci sono plugin che aggiungono questo, ma sto ancora immergendo le dita dei piedi in gVim e non sono sicuro di voler caricare plugin casuali prima di capire cosa fanno. Preferirei usare qualcosa incorporato per vim, ma se non esiste non esiste.

Cosa devo fare per raggiungere il mio obiettivo? Se si tratta di un plug-in, lo usi e come funziona?

Risposte:


140

Premere g CTRL-Gin modalità normale per visualizzare alcune statistiche sul cursore e sul file.

Se sei su Linux puoi usare wc -mper ottenere il conteggio dei caratteri nel file corrente

:!wc -m %

Dal momento che non viene aggiornato in tempo reale, forse si desidera mappare questo comando su qualcosa del tipo:

map <F4> :!wc -m %<CR>

19
g CTRL-GNon sapevo che esistesse. Bello!
Jason Down,

Bello, continuo a dimenticare di usare i comandi! Bang in Vim
Eddie B,

3
g <cg> funziona su più piattaforme, il che è carino.
AndrewPK,

Dove posso trovare maggiori informazioni sull'uso di ! [...] %?
Wok,

L'aiuto è qui: vimdoc.sourceforge.net/htmldoc/various.html#:!cmd . Se usi intensamente i comandi della shell, controlla anche questo plugin: stevelosh.com/projects/clam .
mrucci,

24
:help count-items

suggerisce che è possibile eseguire una corsa a secco di un'ala sostitutiva

:%s/./&/gn

(che riporta quindi il numero di caratteri corrispondenti) o che fai una fantasia strlen()sul testo visivamente selezionato:

:echo strlen(@")

("è il registro senza nome)

poiché puoi chiamare un'espressione nella tua statusline come %{myfunc()}quella potrebbe essere un buon punto di partenza. contare tutto il tempo potrebbe richiedere un po 'di tempo in quanto dovresti selezionare l'intero testo e poi tirarlo, ma forse mostrare il numero di byte nel "-register è già ok per te. se vuoi davvero conoscere il numero di caratteri nel buffer: basta selezionare visivamente TUTTO il testo nel buffer e strapparlo, quindi la soluzione sarebbe:

 :set statusline=%{strlen(@")}

che ti dà il numero di caratteri nel "-register (che è identico al numero di byte se selezioni e strappi il buffer corrente).


La soluzione funziona anche su Windows (i cui comandi bash non lo faranno).
Dastrobu,

Mi piace che il conteggio non scompaia dopo un secondo come il g<CTRL-g>metodo nella risposta accettata.
Chester,

8

Un miglioramento alla risposta di mrucci:

Puoi usare wcsu Linux senza dover prima salvare il file dirigendo l' :woutput del comando come segue:

:w !wc -m

e puoi mapparlo su qualcosa come menzionato da mrucci.


6
:help statusline

ti dà

o N   Byte number in file of byte under cursor, first byte is 1.
      Mnemonic: Offset from start of file (with one added)

che è anche una buona soluzione al tuo problema. vai alla fine del buffer con Ge il numero di byte mostrato nella tua statusline è il numero di caratteri (non vero con i caratteri multibyte ovviamente). torna da dove vieni ctrlo.


1
Ciò è problematico con caratteri multibyte. Ho trovato questa domanda dopo aver inserito% o nella mia statusline :)
Matt,

@Matt: quindi qual è la soluzione?
Akira,

1
La soluzione di mrucci "g ^ g" in modalità normale era abbastanza buona per me. Ne avevo bisogno per un rapido debug, quindi non ho avuto il tempo di provare a ottenere quelle informazioni nella linea di stato.
Matt


1
Dato che i documenti sono vaghi e confusi, vale la pena notare che il comando specifico che uno deve eseguire è set statusline+=\ %o\ %N (interessante, non funziona per esempio "t S") . Quindi se vedi lo statusline invariato, è perché devi eseguire set laststatus=2. Per me ha sostituito la linea di stato trasparente esistente con quella nuova, essendo nera piena e avendo solo l'elemento "conteggio byte".
Hi-Angel,

3

Se hai l'abitudine di usare: w per salvare il file, ogni volta che lo fai lo stato riporta il numero di caratteri scritti. Ad esempio, alla fine di questa frase ho fatto un: w (sì, sto usando gvim per scrivere questa nota) e riportava: 245C scritto.


Questo golf meravigliosamente per un solo utilizzo.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

3

È possibile aggiungere un'espressione per visualizzare il bytecount del buffer nella linea di stato con:

:set statusline+=\ %{\ line2byte(line(\"$\")+1)-1\ }B

Oppure puoi modificare direttamente la variabile opzione per evitare tutto ciò che fuoriesce:

:let &statusline .= ' %{ line2byte(line("$")+1)-1 }B'

Quando provo questo, gVim si lamenta di una sequenza di espressioni non chiuse. Ho notato che ti manca una parentesi, ma la correzione non aiuta neanche. Ecco a cosa l'ho riscritto:: set statusline =% {line2byte (line ("$"))}
OwenP

@OwenP: ora dovrebbe essere risolto
Akira

1
Probabilmente vuoi ...%{ line2byte(line(\"$\")+1))-1 }che includa i caratteri dell'ultima riga nel conteggio. Questo approccio, tuttavia, non conterà correttamente i caratteri multibyte.
intuito l'

1
Inoltre penso che tu debba fuggire dagli spazi, o semplicemente sbarazzartene.
intuito l'

Modificato per includere i suggerimenti di @ intuited, aggiunto anche alla linea di stato anziché sovrascriverlo.
joeytwiddle,

0

Soluzione alternativa che ho usato fino a quando ho accettato la risposta di mrucci:

Ho scoperto per caso che quando I: w per salvare il file, il comando genera il numero di byte scritti. Questo è più o meno un conteggio dei personaggi, quindi finora è stato abbastanza vicino. Mi piace anche la risposta di Mrucci, forse più di questa perché ha anche un conteggio delle parole.


0

Se conservi una copia del tuo testo, scrivi semplicemente il testo sul disco: il conteggio dei caratteri viene visualizzato per impostazione predefinita.

Se non si desidera mantenere un file, basta salvare il testo /dev/null: :w!/dev/null.

Puoi anche wccontare i tuoi personaggi: :%!wc -c- ma non dimenticare di premere Uper ripristinare il testo.

Se avete bisogno di questo, spesso, basta mappare questi comandi per una sequenza di tasti: :map #wc :w!/dev/null^[- notare che il ^[deve essere inserito come Ctrl+ V Esc.

Come primo indicatore della dimensione del testo, basta attivare i numeri di riga; ammesso: questo ha bisogno di un po 'di aritmetica mentale ;-)


0

Dopo aver fatto questa domanda e aver letto le risposte (grazie mrucci) ho aggiunto queste righe al mio file di inizializzazione .vimrc.

# get full statistics on the current buffer (not perfect, may redraw screen)
map ;gg           G$g<C-G>''
# get full statistics on the current position in the buffer
map ;gh           g<C-G>

Lascio a Vim: aiutare gli utenti a capire cosa fanno.

Personalmente trovo utile avviare le mappature di Vim con; o, dal momento che li uso raramente come primo carattere di un comando.

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.