Compter la longueur de chaîne en surbrillance dans VIM

24

Je me demande s'il existe un moyen de compter les symboles en surbrillance vim(y compris les espaces blancs)?

MISE À JOUR

Mode visuel VIM

Il montre le nombre de lignes si ma sélection est sur plusieurs lignes. J'ai besoin que les symboles comptent.

Nemoden
la source

Réponses:

28

À moins que je manque quelque chose, Vim le fait déjà. Si je surligne du texte à l'aide de la souris ou en tapant vet en déplaçant le curseur, je vois en bas de l'écran

- VISUEL - 12

où le nombre à droite est le nombre de caractères en surbrillance. Cela ne fonctionne que si la sélection se trouve sur une seule ligne, sinon elle affiche le nombre de lignes.

Vous pouvez également sélectionner visuellement une région de texte et un type g Ctrl-Gqui afficheront le nombre de lignes, de mots et d'octets sélectionnés.

garyjohn
la source
4
(stupéfait) Comment diable ai-je utilisé Vim pendant si longtemps et que je ne l'ai jamais remarqué ? Mais pour ma défense, je pensais obtenir le numéro par programme.
njd
Bonne réponse, mais jetez un œil à la question mise à jour. En plus de @njd, je ne l'ai pas remarqué.
Nemoden
1
@Nemoden: Essayez la deuxième partie de la suggestion de garyjohn (g Ctrl-G). Il doit afficher une ligne comme "# sélectionné de # lignes; # de # mots; # de # octets".
peth
Oh. Ma faute. Je ne sais pas pourquoi j'ai sauté la deuxième solution. Ça marche. Merci!
Nemoden
12
Ceci n'est pas activé par défaut sur certains systèmes. Ajoutez simplement set showcmdà votre vimrcpour l'activer.
Tyler Holien
8

Vim bascule entre l'affichage du nombre de caractères et du nombre de lignes pour le texte visualisé en fonction de ce que vous visualisez et de la façon dont vous le visualisez (vim 7.4 corrigé en septembre 2015)

V will display line count
v$ will display character count

Si vous visualisez plus d'une ligne, elle n'affiche que le nombre de lignes

g-CTRL-G displays 'byte count' which seems to be 'char count' +1 per line
zzapper
la source
Comme le dit la question, même normal vpasse du nombre de caractères au nombre de lignes si la sélection s'étend sur plusieurs lignes. Cependant, g CTRL-Gle travail est bien.
joeytwiddle
2
:function VisualLength()
:  exe 'normal "xy'
:  echo "Visual: " . strlen(@x) . "\n"
:  exe 'normal gv'
:endfunction

:map ,q "xy:call VisualLength()<CR>
  1. D'abord, vous tirez sur la sélection actuelle (dans le tampon x)

  2. Ensuite, vous affichez la longueur de ce tampon: strlen(@x)
    (Le - VISUAL - affiché dans la ligne d'état masque cela, nous devons donc ajouter une nouvelle ligne)

  3. Mettez en surbrillance la plage visuelle précédente: gv

Cela ne tient pas compte du fait que le mode visuel était en mode ligne, caractère ou bloc, mais c'est suffisant dans la plupart des cas.

njd
la source
2

Je vois sur votre capture d'écran que vous exécutez dans Windows, donc cette réponse peut ne pas vous aider autant. Mais pour les autres ...

Une fonction sous-utilisée (IMO) de Vim est de laisser les commandes externes faire le gros du travail.

Dans ce cas, si vous êtes sur un système de type UNIX, vous pouvez utiliser la wccommande pour ce faire.

Le moyen le plus simple consiste à remplacer le texte sélectionné par la sortie de la commande, en tapant (avec le texte sélectionné):

:!wc

(puis appuyez sur Entrée).

Cela apparaîtra dans votre ligne de commande comme:

'<,'>!wc

Après avoir lu les informations, vous pouvez annuler avec upour revenir à votre point de départ.

Remarque: ce traitement est effectué sur des lignes entières uniquement. Si vous voulez des lignes partielles, je pense que @ garyjohn g_CTRL-Gest votre meilleur pari.

Vous pouvez éviter d'avoir à annuler en exécutant à la place:

:w !wc

Cela "écrit" les lignes sélectionnées dans l'entrée standard de la commande, et la sortie de la commande sera affichée dans un nouveau tampon temporaire, laissant l'original intact. Voir :help :write_cpour plus d'informations.

Remarque: j'ai obtenu les :write_cinformations de: /programming/1237780/vim-execute-shell-command-without-filtering

Maintenant, plus généralement:

Cet exemple avec wcest assez simpliste, mais vous pouvez imaginer à quel point c'est une approche puissante. UNIX dispose déjà de nombreuses commandes de traitement de texte, et vous pouvez les utiliser assez facilement dans Vim, sans avoir besoin de toucher Vimscript (yech).

De plus, tout programme de ligne de commande que vous écrivez qui traite de stdin / stdout peut désormais non seulement vous bénéficier sur votre terminal, mais aussi dans Vim.

Je me retrouve, par exemple, à exécuter tidyet json-formatà l'intérieur de vim pour rendre les fichiers que je regarde plus lisibles.

Vous pouvez faire la même chose sous Windows, mais Windows n'a pas un tel ensemble de commandes intégré. Vous pouvez toujours installer GNUWin32 ou similaire pour obtenir ces avantages.

jwd
la source
1

Pour une manière programmatique dans vimscript, cela a fonctionné pour moi lorsque la sélection est limitée à une seule ligne:

let amount = virtcol("'>") - virtcol("'<")

(Utiliser virtcol(..)au lieu de col(..), de sorte qu'il fonctionne comme prévu lorsque :set ve=allest actif.)

Evgeni Sergeev
la source