Cuente la longitud de la cadena resaltada en VIM

24

Me pregunto ¿hay alguna manera de contar los símbolos resaltados vim(incluidos los espacios en blanco)?

ACTUALIZAR

Modo visual VIM

Muestra el recuento de filas si mi selección está en varias filas. Necesito los símbolos cuentan.

Nemoden
fuente

Respuestas:

28

A menos que me falte algo, Vim ya lo hace. Si resalto algo de texto usando el mouse o escribiendo vy moviendo el cursor, veo en la parte inferior de la pantalla

- VISUAL - 12

donde el número a la derecha es el número de caracteres resaltados. Esto solo funciona si la selección está en una sola fila, de lo contrario, muestra el recuento de filas.

También puede seleccionar visualmente alguna región de texto y tipo g Ctrl-Gque mostrará el número de líneas, palabras y bytes seleccionados.

garyjohn
fuente
44
(aturdido) ¿Cómo diablos lo utilizo Vim durante tanto tiempo y nunca se dan cuenta de que ? Pero en mi defensa, estaba pensando en obtener el número mediante programación.
njd
Buena respuesta, pero eche un vistazo a la pregunta actualizada. Además de @njd, no me di cuenta de eso.
Nemoden
1
@Nemoden: Pruebe la segunda parte de la sugerencia de garyjohn (g Ctrl-G). Debería mostrar una línea como "Seleccionado # de # Líneas; # de # Palabras; # de # Bytes".
peth
Oh. Mi error. No sé por qué me he saltado la segunda solución. Funciona. ¡Gracias!
Nemoden
12
Esto no está habilitado por defecto en algunos sistemas. Simplemente agréguelo set showcmda su vimrcpara habilitarlo.
Tyler Holien
8

Vim cambia entre mostrar el recuento de caracteres y el recuento de líneas para el texto visualizado dependiendo de qué y cómo visualiza (vim 7.4 parcheado a septiembre de 2015)

V will display line count
v$ will display character count

Si visualiza más de una línea, solo muestra el recuento de líneas

g-CTRL-G displays 'byte count' which seems to be 'char count' +1 per line
zzapper
fuente
Como dice la pregunta, incluso los vcambios normales de recuento de caracteres a recuento de líneas si la selección abarca varias líneas. Sin embargo, g CTRL-Ghace bien el trabajo.
joeytwiddle
2
:function VisualLength()
:  exe 'normal "xy'
:  echo "Visual: " . strlen(@x) . "\n"
:  exe 'normal gv'
:endfunction

:map ,q "xy:call VisualLength()<CR>
  1. Primero tira la selección actual (en el búfer x)

  2. Luego, muestra la longitud de ese búfer: strlen(@x)
    (El - VISUAL - que se muestra en la línea de estado lo oculta, por lo que debemos agregar una nueva línea)

  3. Resalta el rango visual anterior: gv

Esto no tiene en cuenta si el modo visual era el modo de línea, carácter o bloque, pero es suficiente para la mayoría de los casos.

njd
fuente
2

Veo en su captura de pantalla que está ejecutando en Windows, por lo que esta respuesta puede no serle tan útil. Pero para otros ...

Una característica infrautilizada (IMO) de Vim es dejar que los comandos externos hagan el trabajo pesado.

Para este caso, si está en un sistema similar a UNIX, puede usar el wccomando para hacerlo.

La forma más simple es reemplazar el texto seleccionado con la salida del comando, escribiendo (con el texto seleccionado):

:!wc

(luego presione enter).

Esto se mostrará en su línea de comando como:

'<,'>!wc

Una vez que haya leído la información, puede deshacerla upara volver a donde comenzó.

Nota: Este procesamiento se realiza solo en líneas completas . Si quieres líneas parciales, creo que @ garyjohn's g_CTRL-Ges tu mejor opción .

Puede evitar la necesidad de deshacer ejecutando en su lugar:

:w !wc

Esto "escribe" las líneas seleccionadas en la entrada estándar del comando, y la salida del comando se mostrará en un nuevo búfer temporal, dejando intacto el original. Ver :help :write_cpara más información.

Nota: Recibí la :write_cinformación de: /programming/1237780/vim-execute-shell-command-without-filtering

Ahora, más generalmente:

Este ejemplo con wces bastante simplista, pero puedes imaginar cómo este es un enfoque poderoso. UNIX ya tiene muchos comandos de procesamiento de texto disponibles, y puede usarlos dentro de Vim con bastante facilidad, sin necesidad de tocar Vimscript (yech).

Además, cualquier programa de línea de comandos que escriba que trate con stdin / stdout ahora no solo puede beneficiarlo en su terminal, sino también dentro de Vim.

Me encuentro, por ejemplo, corriendo tidyy json-formatdesde adentro de vim para hacer que los archivos que estoy viendo sean más legibles.

Puede hacer lo mismo en Windows, pero Windows no tiene un conjunto de comandos tan rico incorporado. Sin embargo, siempre puede instalar GNUWin32 o similar para obtener esos beneficios.

jwd
fuente
1

Para una forma programática dentro de vimscript, esto funcionó para mí cuando la selección se limita a una sola línea:

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

(Utilizando en virtcol(..)lugar de col(..), de modo que funcione como se espera cuando :set ve=allestá activo).

Evgeni Sergeev
fuente