J'ai un fichier plein de texte (disons Markdown ou LaTeX). Je voudrais compter le nombre de mots dans une partie de ce fichier.
Je sais que je peux faire :! wc -w %pour exécuter wc -w sur le tampon actuel. Et je sais que je peux extraire la section d'intérêt dans un registre nommé. Je suppose qu'il existe un moyen d'envoyer un registre nommé au système d'exploitation pour une utilisation dans une commande ou un canal, mais je n'ai pas pu en trouver un. Ou existe-t-il une meilleure façon de compter les mots dans un registre?
Mon cas d'utilisation est que je fais beaucoup d'écriture hors programmation (notes, thèses, etc.) dans vim, et je voudrais compter le nombre de mots que j'ai ajoutés à une section donnée du fichier au milieu d'une édition session.
la source
g<C-g>
ça. Impressionnant!Il y a deux façons d'accomplir cela, la voie pure vimscript et la
wc
voie.La pure voie Vim
Pour ce faire, vous pouvez utiliser la commande Rechercher et remplacer. Par exemple:
Au lieu de remplacer un motif donné par quelque chose, cela compte simplement les occurrences du motif. C'est à cause du
n
drapeau. Pour compter les mots dans une section spécifique (dans ce cas, les lignes 5 à 15), vous pouvez faire quelque chose comme ceci:Cela supprime la nécessité de copier le contenu d'une sélection dans un registre. Pour voir plus de possibilités pour ce qui peut être mis en place
5-15
, lisez la rubrique d'aide pourcmdline-ranges
. Si vous voulez le faire souvent, il est probablement bon de créer un mappage (ou une commande) pour cela. De plus, si vous l'avezhlsearch
activé, vous voudrez peut-être exécuter:nohlsearch
ensuite pour effacer la surbrillance.Le
wc
cheminLa même chose peut être accomplie avec
wc
. De la même manière que vous pouvez utilisercmdline-ranges
pour sélectionner la zone avec la:s
commande, vous pouvez les utiliser avec des commandes externes. Par exemple:Cela exécute les lignes 5 à 15 via la
wc
commande. L'inconvénient est qu'il remplace cette plage de lignes par la sortie de la commande. Vous pouvez annuler cette modification en appuyant suru
. Notez également que la solution vimscript peut ne pas fonctionner avec différentes langues, car\w
elle ne correspond pas à ce qui serait normalement des caractères de mot dans d'autres langues.wc
peut faire mieux que cela\w
. En outre, voici une commande sophistiquée pour le faire plus rapidement:Notez que cela encombre le
a
registre.Remarque
Il semble que cela puisse également être accompli en mode visuel avec la
g<C-g>
combinaison de touches. Voir la réponse de Carpetsmoker pour une explication à ce sujet.la source
\w
sons comme une bonne idée au début, mais après l'avoir testée, j'ai trouvé un certain nombre de problèmes. Le plus important est qu'il ne correspondra pas aux caractères non ascii, donc un mot commeüber
est simplement ignoré (il y avait une question à ce sujet hier). De plus, un mot commee-mail
est compté comme 2 mots, car il-
n'est pas en\w
(l'utilisation de a-
est quelque peu rare en anglais, mais très courante en néerlandais par exemple). Il peut y avoir d'autres personnages qui sont ignorés de cette façon, ce qui nous amène à mon dernier point: les conventions sur ce qui est considéré comme un "mot" peuvent différer ...wc
peuvent être récupérés sur les paramètres régionaux (je ne sais pas si GNUwc
gère réellement cela en passant, les outils GNU ne sont pas bien connus pour leur excellent support Unicode).wc
solution.Pour les mots, utilisez:
.
désigne la ligne actuelle.J'ai également mis ce qui suit dans mon fichier .vimrc:
Je peux taper:
et
zzcw
va s'étendre às/\i\+/&/g
C'est
zzcw
juste un nom étrange qui ne correspondra à rien (pour moi).Un effet secondaire est que le fichier entier est sélectionné et mis en évidence.
Je voulais pouvoir taper des tweets sur plusieurs lignes dans un fichier, m'assurer qu'il n'y avait pas trop de caractères et coller le tweet sur Twitter.
la source