¿Cómo puedo hacer que (g) Vim muestre el recuento de caracteres del archivo actual?

86

Me gusta escribir tutoriales y artículos para un foro de programación que frecuente. Este foro tiene un límite de caracteres por publicación. He usado Notepad ++ en el pasado para escribir publicaciones y mantiene un recuento de caracteres en vivo en la barra de estado. Estoy empezando a usar gVim más y realmente no quiero volver a Notepad ++ en este punto, pero es muy útil tener este recuento de caracteres. Si supero el conteo, generalmente termino pegando la publicación en Notepad ++ para poder ver cuándo he recortado lo suficiente para superar el límite.

He visto sugerencias que :set rulerayudarían, pero esto solo da el recuento de caracteres a través del índice de columna actual en la línea actual. Esto sería genial si no usara saltos de párrafo, pero estoy seguro de que estaría de acuerdo en que leer varios miles de caracteres en un párrafo no es cómodo.

Leí la ayuda y pensé que rulerformatfuncionaría, pero después de revisar el statuslineformato que usa, no vi nada que proporcione un recuento de caracteres para el búfer actual.

He visto que hay complementos que agregan esto, pero todavía estoy sumergiendo mis dedos en gVim y no estoy seguro de querer cargar complementos aleatorios antes de entender lo que hacen. Prefiero usar algo integrado en vim, pero si no existe, no existe.

¿Qué debo hacer para lograr mi objetivo? Si se trata de un complemento, ¿lo usa y qué tan bien funciona?

OwenP
fuente

Respuestas:

140

Presione g CTRL-Gen modo normal para mostrar algunas estadísticas en el cursor y el archivo.

Si está en Linux, puede usar wc -mpara obtener el recuento de caracteres en el archivo actual

:!wc -m %

Como no se actualiza en tiempo real, quizás desee asignar este comando a algo como:

map <F4> :!wc -m %<CR>
mrucci
fuente
19
g CTRL-GNo sabía que esto existía. ¡Agradable!
Jason Down
Agradable, sigo olvidando usar! Bang comandos en Vim
Eddie B
3
g <cg> funciona multiplataforma, lo cual es bueno.
AndrewPK
¿Dónde puedo encontrar más información sobre el uso de ! [...] %?
Wok
La ayuda está aquí: vimdoc.sourceforge.net/htmldoc/various.html#:!cmd . Si hace un uso intensivo de los comandos de shell, consulte también este complemento: stevelosh.com/projects/clam .
mrucci
24
:help count-items

sugiere que podrías hacer una prueba en seco de un ala de reemplazo

:%s/./&/gn

(que luego informa el número de caracteres coincidentes) o que le gusta strlen()el texto seleccionado visualmente:

:echo strlen(@")

("es el registro sin nombre)

ya que puede llamar a una expresión en su línea de estado como %{myfunc()}ese podría ser un buen punto de partida. contar todo el tiempo puede llevar un poco de tiempo, ya que tendrías que seleccionar todo el texto y luego tirarlo, pero tal vez mostrar el número de bytes en el "registro" ya está bien para ti. Si realmente quieres saber el número de caracteres en el búfer: solo seleccione visualmente TODO el texto en el búfer y tírelo. Entonces, la solución sería:

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

que le da el número de caracteres en el "registro" (que es idéntico al número de bytes si selecciona y tira del búfer actual).

akira
fuente
La solución también funciona en Windows (que los comandos bash no).
dastrobu
Me gusta que la cuenta no desaparezca después de un segundo como el g<CTRL-g>método en la respuesta aceptada.
Chester
8

Una mejora a la respuesta de mrucci:

Puede usarlo wcen Linux sin tener que guardar primero el archivo dirigiendo la :wsalida del comando de la siguiente manera:

:w !wc -m

y puedes mapearlo a algo como lo menciona mrucci.

arquitectónico
fuente
6
:help statusline

te dio

o N   Byte number in file of byte under cursor, first byte is 1.
      Mnemonic: Offset from start of file (with one added)

que también es una buena solución para su problema. simplemente vaya al final del búfer con Gy el número de bytes que se muestra en su línea de estado es el número de caracteres (por supuesto, no es cierto con caracteres de varios bytes). vuelve a donde viniste ctrlo.

akira
fuente
1
Esto es problemático con los caracteres de varios bytes. Encontré esta pregunta después de poner% o en mi línea de estado :)
Matt
@ Matt: entonces, ¿cuál es la solución?
akira
1
La solución de mrucci "g ^ g" en modo normal fue lo suficientemente buena para mí. Lo necesitaba para una depuración rápida, así que no me he tomado el tiempo para tratar de obtener esa información en la línea de estado.
Matt
1
Dado que los documentos son vagos y confusos, vale la pena señalar que el comando específico que uno necesita ejecutar es set statusline+=\ %o\ %N (curiosamente, no funciona para, por ejemplo, el elemento "t S") . Entonces, si ve que la línea de estado no ha cambiado, es porque tiene que ejecutar set laststatus=2. Para mí, reemplazó la línea de estado transparente existente con la nueva, que es de color negro sólido y solo tiene un elemento de "conteo de bytes".
Hola Ángel,
3

Si tiene la costumbre de usar: w para guardar el archivo, cada vez que lo haga, el estado informará el número de caracteres escritos. Por ejemplo, al final de esta oración hice un: w (sí, estoy usando gvim para escribir esta nota) e informó: 245C escrito.

Erin Thomas
fuente
Este golf muy bien para un solo uso.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
3

Puede agregar una expresión para mostrar el bytecount del búfer en la línea de estado con:

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

O puede cambiar la variable de opción directamente para evitar todo ese escape:

:let &statusline .= ' %{ line2byte(line("$")+1)-1 }B'
akira
fuente
Cuando intento esto, gVim se queja de una secuencia de expresión no cerrada. Noté que te falta un paréntesis, pero arreglar eso tampoco ayuda. Esto es lo que lo reescribí para: establecer setlineline =% {line2byte (line ("$"))}
OwenP
@OwenP: debería arreglarse ahora
akira
1
Probablemente desee ...%{ line2byte(line(\"$\")+1))-1 }para que incluya los caracteres de la última línea en el recuento. Sin embargo, este enfoque no contará caracteres multibyte correctamente.
intuido
1
También creo que necesitas escapar de los espacios, o simplemente deshacerte de ellos.
intuido
Editado para incluir las sugerencias de @ intuited, también adjuntado a la línea de estado en lugar de sobrescribirlo.
joeytwiddle
0

Solución alternativa que he estado usando hasta que acepté la respuesta de mrucci:

Descubrí por accidente que cuando: w para guardar el archivo, el comando genera el número de bytes escritos. Esto es más o menos un recuento de personajes, por lo que hasta ahora ha sido lo suficientemente cercano. También me gusta la respuesta de mrucci, posiblemente más que esta porque también tiene un recuento de palabras.

OwenP
fuente
0

Si mantiene una copia del archivo de su texto, simplemente escriba su texto en el disco; el recuento de caracteres se muestra de forma predeterminada.

Si no desea guardar un archivo, simplemente guardar el texto a /dev/null: :w!/dev/null.

También puedes dejar que wccuentes tus personajes: :%!wc -c- pero no olvides presionar Upara restaurar tu texto.

Si necesita esto con frecuencia, simplemente asigne estos comandos a una secuencia de teclas: :map #wc :w!/dev/null^[- tenga en cuenta que ^[debe ingresarse como Ctrl+ V Esc.

Como primer indicador del tamaño del texto, solo active los números de línea; admitido: esto necesita algo de aritmética mental ;-)

kdo
fuente
0

Después de tener esta pregunta y leer las respuestas (gracias mrucci) agregué estas líneas a mi archivo de inicialización .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>

Lo dejo a vim: ayuda a los usuarios a descubrir lo que hacen.

Personalmente, me parece útil comenzar con las asignaciones de Vim; o, ya que rara vez los uso como el primer personaje de un comando.

David E.
fuente