Comment puis-je obtenir que Vim affiche le nombre de caractères du fichier actuel?

86

J'aime écrire des tutoriels et des articles pour un forum de programmation que je fréquente. Ce forum a une limite de caractères par publication. Dans le passé, j'ai déjà utilisé Notepad ++ pour rédiger des publications, qui conservent un nombre de caractères actif dans la barre d'état. Je commence à utiliser gVim de plus en plus et je ne souhaite vraiment pas revenir à Notepad ++ pour l'instant, mais il est très utile de disposer de ce nombre de caractères. Si je dépasse le nombre, je finis généralement par coller la publication dans Notepad ++ afin que je puisse voir quand j'ai suffisamment coupé pour respecter la limite.

J'ai vu des suggestions qui :set rulerpourraient aider, mais cela ne donne que le nombre de caractères via l'index de colonne en cours sur la ligne en cours. Ce serait formidable si je n'utilisais pas de sauts de paragraphe, mais je suis sûr que vous conviendrez avec moi que lire plusieurs milliers de caractères dans un paragraphe n'est pas confortable.

J'ai lu l'aide et pensé que rulerformatcela fonctionnerait, mais après avoir examiné le statuslineformat utilisé, je n'ai rien vu qui donne un nombre de caractères pour le tampon actuel.

J'ai vu qu'il y a des plugins qui ajoutent ceci, mais je plonge toujours mes orteils dans gVim et je ne suis pas sûr de vouloir charger des plugins aléatoires avant de comprendre ce qu'ils font. Je préférerais utiliser quelque chose intégré à vim, mais s'il n'existe pas, il n'existe pas.

Que dois-je faire pour atteindre mon objectif? S'il s'agit d'un plugin, l'utilisez-vous et comment fonctionne-t-il?

OwenP
la source

Réponses:

140

Appuyez sur g CTRL-Gen mode normal pour afficher des statistiques sur le curseur et le fichier.

Si vous êtes sous Linux, vous pouvez utiliser wc -mpour obtenir le nombre de caractères dans le fichier actuel.

:!wc -m %

Comme elle n’est pas mise à jour en temps réel, vous pouvez peut-être mapper cette commande à quelque chose comme:

map <F4> :!wc -m %<CR>
mrucci
la source
19
g CTRL-GJe ne savais pas que cela existait. Agréable!
Jason Down
Sympa je n'arrête pas d'oublier les commandes! Bang dans Vim
Eddie B
3
g <cg> fonctionne sur plusieurs plates-formes, ce qui est agréable.
AndrewPK
Où puis-je trouver plus d'informations sur l'utilisation de ! [...] %?
Wok
L'aide est là: vimdoc.sourceforge.net/htmldoc/various.html#:!cmd . Si vous utilisez beaucoup les commandes du shell, vérifiez également le plug-in suivant: stevelosh.com/projects/clam .
mrucci
24
:help count-items

suggère, que vous pourriez soit faire un essai à sec d'un remplacement ala

:%s/./&/gn

(qui rapporte ensuite le nombre de caractères correspondants) ou que vous aimez strlen()le texte sélectionné visuellement:

:echo strlen(@")

("est le registre sans nom)

comme vous pouvez appeler une expression dans votre statut, %{myfunc()}cela pourrait être un bon point de départ. Compter tout le temps peut prendre un peu de temps puisque vous devez sélectionner tout le texte, puis le retirer, mais peut-être que le nombre d'octets dans le registre est correct, si vous voulez vraiment connaître le nombre. de caractères dans le tampon: il suffit de sélectionner visuellement TOUT le texte dans le tampon et de le retirer. La solution serait donc:

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

qui vous donne le nombre de caractères dans le "-register (qui est identique au nombre d'octets si vous sélectionnez et extrayez le tampon courant).

Akira
la source
La solution fonctionne également sous Windows (les commandes bash ne le feront pas).
mardi
J'aime que le décompte ne disparaisse pas après une seconde comme la g<CTRL-g>méthode dans la réponse acceptée.
Chester
8

Une amélioration à la réponse de mrucci:

Vous pouvez utiliser wcsur Linux sans avoir à enregistrer le fichier au préalable en dirigeant la :wsortie de la commande comme suit:

:w !wc -m

et vous pouvez le mapper à quelque chose comme mentionné par mrucci.

architectonique
la source
6
:help statusline

vous donne

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

ce qui est également une bonne solution de contournement pour votre problème. Allez simplement à la fin de la mémoire tampon avec Get le nombre d'octets indiqué dans votre ligne de statut est le nombre de caractères (ce qui n'est pas vrai avec les caractères multi-octets, bien sûr). retournez d'où vous venez avec ctrlo.

Akira
la source
1
Ceci est problématique avec les caractères multi-octets. J'ai trouvé cette question après avoir mis% o dans ma ligne de statut :)
Matt
@ Matt: Alors, quelle est la solution?
Akira
1
La solution de mrucci "g ^ g" en mode normal me suffisait. J'en avais besoin pour un débogage rapide, donc je n'ai pas pris le temps d'essayer d'obtenir cette information dans la ligne d'état.
Matt
1
Étant donné que les documents sont vagues et déroutants, il convient de noter que la commande spécifique à exécuter est set statusline+=\ %o\ %N ( il est intéressant de noter que cela ne fonctionne pas, par exemple, pour l'élément "t S") . Ensuite, si vous voyez la ligne d'état inchangée, c'est parce que vous devez exécuter set laststatus=2. Pour moi, il a remplacé la ligne de statut transparente existante par la nouvelle, noire, et ne contenant que le "nombre d'octets".
Bonjour Angel
3

Si vous avez l’habitude d’utiliser: w pour enregistrer le fichier, l’état d’avancement indique à chaque fois le nombre de caractères écrits. Par exemple, à la fin de cette phrase, j’ai fait a: w (oui, j’utilise Gvim pour écrire cette note) et c’est: 245 C écrit.

Erin Thomas
la source
Cette golfe magnifiquement pour un usage unique.
Ciro Santilli a annoncé le
3

Vous pouvez ajouter une expression pour afficher le nombre de tiers du tampon dans la ligne d'état avec:

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

Ou vous pouvez changer directement la variable d'option pour éviter tout ce qui s'échappe:

:let &statusline .= ' %{ line2byte(line("$")+1)-1 }B'
Akira
la source
Lorsque j'essaie cela, gVim se plaint d'une séquence d'expression non fermée. J'ai remarqué qu'il vous manque une parenthèse, mais résoudre ce problème n'aide pas non plus. Voici ce que j'ai récrit pour:: set statusline =% {line2byte (line ("$"))}
OwenP
@OwenP: devrait être corrigé maintenant
akira le
1
Vous voulez probablement ...%{ line2byte(line(\"$\")+1))-1 }que cela inclue les caractères de la dernière ligne dans le décompte. Cependant, cette approche ne compte pas correctement les caractères multi-octets.
Intuitionné
1
De plus, je pense que vous devez vous échapper des espaces, ou simplement vous en débarrasser.
Intuitionné le
Édité pour inclure les suggestions de @ intuited, également ajoutées à la ligne d'état plutôt que de l'écraser.
joeytwiddle
0

Solution que j'ai utilisée jusqu'à ce que j'accepte la réponse de mrucci:

J'ai découvert par hasard que lorsque je: w enregistre le fichier, la commande affiche le nombre d'octets écrits. Il s’agit plus ou moins d’un nombre de caractères, donc cela a été assez proche jusqu’à présent. J'aime bien la réponse de mrucci également, peut-être plus que celle-ci, car elle compte également un nombre de mots.

OwenP
la source
0

Si vous conservez une copie du fichier de votre texte, écrivez simplement votre texte sur le disque - le nombre de caractères est affiché par défaut.

Si vous ne souhaitez pas conserver un fichier, il suffit de sauvegarder votre texte à /dev/null: :w!/dev/null.

Vous pouvez également laisser wccompter vos personnages: :%!wc -c- mais n'oubliez pas d'appuyer sur Upour restaurer votre texte.

Si vous en avez souvent besoin, associez ces commandes à une séquence de touches: :map #wc :w!/dev/null^[- notez que le ^[doit être entré avec Ctrl+ V Esc.

En tant que premier indicateur de la taille du texte, il suffit d’activer les numéros de ligne; admis: cela nécessite des calculs mentaux ;-)

kdo
la source
0

Après avoir eu cette question et lu les réponses (merci, mrucci), j’ai ajouté ces lignes à mon fichier d’initialisation .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>

Je laisse à vim: aider les utilisateurs à comprendre ce qu’ils font.

Personnellement, je trouve utile de commencer les mappages Vim avec; ou, puisque je les utilise rarement comme premier caractère d'une commande.

David E.
la source