web-dev-qa-db-fra.com

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

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 davantage gVim et je ne souhaite vraiment pas revenir à Notepad ++, mais il est très utile d’avoir 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 que :set ruler pourrait 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 rulerformat fonctionnerait, mais après avoir examiné le format statusline 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?

81
OwenP

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

Si vous êtes sur Linux, vous pouvez utiliser wc -m pour 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>
137
mrucci
: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 faites une strlen() de fantaisie sur le texte sélectionné visuellement:

:echo strlen(@")

("est le registre sans nom)

puisque vous pouvez appeler une expression dans votre statut, telle que %{myfunc()}, ce 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 tirer, mais peut-être qu'indiquer le nombre d'octets dans "-register vous convient déjà. 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).

23
akira

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

Vous pouvez utiliser wc sur Linux sans avoir à enregistrer le fichier au préalable en dirigeant la sortie de la commande :w comme suit:

:w !wc -m

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

7
architectonic
: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. il suffit d'aller à la fin du tampon avec G et le nombre d'octets indiqué dans votre statusline est le nombre de caractères (ce n'est pas vrai avec les caractères multi-octets, bien sûr). retourne d'où tu viens ctrlo.

6
akira

Vous pouvez ajouter une expression pour afficher le nombre de octets 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'
3
akira

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.

3
Erin Thomas

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 de fichier, enregistrez simplement votre texte dans /dev/null: :w!/dev/null.

Vous pouvez également laisser wc compter vos caractères: :%!wc -c - mais n'oubliez pas d'appuyer sur U pour restaurer votre texte.

Si vous en avez souvent besoin, associez simplement ces commandes à une séquence de touches: :map #wc :w!/dev/null^[ - notez que le ^[ doit être entré de la manière suivante: Ctrl+VEsc.

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 ;-)

0
kdo

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 aussi un mot.

0
OwenP

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.

0
David E.