Question Comment puis-je obtenir (g) Vim pour afficher 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 article. J'ai utilisé Notepad ++ dans le passé pour écrire des articles et il garde un nombre de caractères en direct dans la barre d'état. Je commence à utiliser plus gVim et je ne veux vraiment pas retourner à Notepad ++ à ce stade, mais il est très utile de compter ce caractère. Si je passe en revue le compte, je finis généralement par coller le message dans Notepad ++ afin que je puisse voir quand je suis suffisamment réduit pour être à la limite.

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

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

J'ai vu qu'il y avait des plugins qui ajoutaient ceci, mais je suis toujours en train de plonger 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 de construit pour vim, mais s'il n'existe pas, il n'existe pas.

Que dois-je faire pour atteindre mon objectif? Si cela implique un plugin, l'utilisez vous et comment ça marche?


73
2018-06-07 16:26


origine




Réponses:


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

Si vous êtes sous Linux, vous pouvez utiliser wc -m obtenir le nombre de caractères dans le fichier en cours

:!wc -m %

Comme il n'est pas mis à jour en temps réel, vous souhaitez peut-être mapper cette commande à quelque chose comme:

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

127
2018-06-07 21:23



g CTRL-G Je ne savais pas que cela existait. Agréable! - Jason Down
Nice j'oublie toujours d'utiliser les commandes! Bang dans Vim - Eddie B
g <c-g> fonctionne en multiplateforme ce qui est bien. - AndrewPK
Où puis-je trouver plus d'informations sur l'utilisation de ! [...] %? - Wok
L'aide est ici: vimdoc.sourceforge.net/htmldoc/various.html#:!cmd . Si vous utilisez beaucoup les commandes shell, vérifiez aussi ce plugin: stevelosh.com/projects/clam . - mrucci


:help count-items

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

:%s/./&/gn

(qui rapporte alors le nombre de caractères correspondants) ou que vous faites un fantaisie strlen() sur le texte sélectionné visuellement:

:echo strlen(@")

("est le registre sans nom)

puisque vous pouvez appeler une expression dans votre état comme %{myfunc()} cela pourrait être un bon point de départ. compter tout le temps peut être un peu long car vous devrez sélectionner le texte entier et ensuite le tirer, mais peut-être que montrer le nombre d'octets dans "-register vous convient déjà, si vous voulez vraiment connaître le nombre de caractères dans le tampon: sélectionnez simplement ALL ALL le texte dans le tampon et tirez-le. La solution serait donc:

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

ce qui vous donne le nombre de caractères dans le registre "(qui est identique au nombre d'octets si vous sélectionnez et modifiez le tampon actuel).


22
2018-06-07 16:58



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


: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 pour votre problème. il suffit d'aller à la fin du tampon avec g et le nombre d'octets indiqué dans votre barre d'état est le nombre de caractères (pas vrai avec les caractères multi-octets bien sûr). Retournez d'où vous venez avec ctrlo.


6
2018-06-08 05:03



Ceci est problématique avec les caractères multi-octets. J'ai trouvé cette question après avoir mis% o dans ma ligne d'état :) - Matt
@Matt: quelle est la solution? - akira
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
vimdoc.sourceforge.net/htmldoc/options.html#'statusline '; - Tyler Szabo
Étant donné que les documents sont vagues et confus, il convient de noter que la commande spécifique à exécuter est la suivante: set statusline+=\ %o\ %N  (Fait intéressant, cela ne fonctionne pas, par exemple, pour un élément "t S"). Alors si vous voyez la ligne de statut inchangée, c'est parce que vous devez exécuter set laststatus=2. Pour moi, il a remplacé la ligne d'état transparente existante par la nouvelle, qui est un noir uni et qui ne contient qu'un élément "nombre d'octets". - Hi-Angel


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

Vous pouvez utiliser wc sur Linux sans avoir à enregistrer le fichier en premier en dirigeant le :wsortie de commande comme suit:

:w !wc -m

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


5
2017-07-15 08:48





Si vous avez l'habitude d'utiliser: w pour enregistrer le fichier, chaque fois que vous faites cela, le statut indique le nombre de caractères écrits. Par exemple, à la fin de cette phrase, j'ai fait un: w (oui, j'utilise gvim pour écrire cette note) et il a écrit: 245C écrit.


3
2018-05-31 11:03



Ce golf magnifiquement pour une utilisation unique. - Ciro Santilli 新疆改造中心 六四事件 法轮功


Vous pouvez ajouter une expression pour afficher le bytecount du tampon dans le statusline avec:

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

Ou vous pouvez changer directement la variable d’option pour éviter tout échappement:

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

3
2018-06-07 17:00



Lorsque j'essaie ceci, gVim se plaint d'une séquence d'expression non fermée. J'ai remarqué qu'il vous manque une parenthèse, mais ce qui n'aide pas non plus. Voici ce que j'ai réécrit pour:: set statusline =% {line2byte (line ("$"))} - OwenP
@OwenP: devrait être résolu maintenant - akira
Probablement que tu veux ...%{ line2byte(line(\"$\")+1))-1 } de sorte qu'il inclut les caractères de la dernière ligne dans le compte. Cependant, cette approche ne comptera pas correctement les caractères multi-octets. - intuited
Je pense aussi que vous devez vous échapper des espaces ou simplement vous en débarrasser. - intuited
Édité pour inclure les suggestions de @ intuited, également ajouté à la ligne d'état plutôt que de l'écraser. - joeytwiddle


Solution de contournement que j'utilise jusqu'à ce que j'accepte la réponse de mrucci:

J'ai découvert par hasard que lorsque je: w sauvegarde le fichier, la commande affiche le nombre d'octets écrits. C'est plus ou moins un décompte de caractères, de sorte que cela a été assez proche jusqu'à présent. J'aime aussi la réponse de mrucci, peut-être plus que celle-ci car elle compte aussi un mot.


0
2017-10-22 15:47





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

Si vous ne voulez pas conserver un fichier, enregistrez simplement votre texte dans /dev/null: :w!/dev/null.

Vous pouvez également laisser wc compte tes personnages: :%!wc -c - mais n'oubliez pas de frapper U pour restaurer votre texte.

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

En tant que premier indicateur de la taille du texte, activez simplement les numéros de ligne; admis: cela nécessite une arithmétique mentale ;-)


0
2018-06-08 06:59