Como posso (g) Vim exibir a contagem de caracteres do arquivo atual?

86

Eu gosto de escrever tutoriais e artigos para um fórum de programação que frequento. Este fórum tem um limite de caracteres por postagem. Eu usei o Notepad ++ no passado para escrever postagens e mantém uma contagem de caracteres ativos na barra de status. Estou começando a usar o gVim mais e realmente não quero voltar ao Notepad ++ neste momento, mas é muito útil ter essa contagem de caracteres. Se eu ultrapassar a contagem, geralmente acabo colando a postagem no Notepad ++ para que eu possa ver quando apara o suficiente para atingir o limite.

Vi sugestões que :set rulerajudariam, mas isso só fornece a contagem de caracteres pelo índice da coluna atual na linha atual. Isso seria ótimo se eu não usasse quebras de parágrafo, mas tenho certeza de que você concorda que ler vários milhares de caracteres em um parágrafo não é confortável.

Li a ajuda e pensei que rulerformatfuncionaria, mas, depois de examinar o statuslineformato usado, não vi nada que contasse caracteres para o buffer atual.

Vi que existem plugins que adicionam isso, mas ainda estou mergulhando no gVim e não tenho certeza se quero carregar plugins aleatórios antes de entender o que eles fazem. Eu preferiria usar algo embutido no vim, mas se não existe, não existe.

O que devo fazer para alcançar meu objetivo? Se envolve um plug-in, você o usa e como funciona?

OwenP
fonte

Respostas:

140

Pressione g CTRL-Gno modo normal para exibir algumas estatísticas no cursor e no arquivo.

Se você estiver no Linux, poderá usar wc -mpara obter a contagem de caracteres no arquivo atual

:!wc -m %

Como não é atualizado em tempo real, talvez você queira mapear este comando para algo como:

map <F4> :!wc -m %<CR>
mrucci
fonte
19
g CTRL-GEu não sabia que isso existia. Agradável!
Jason Baixo
Bom eu continuo esquecendo de usar bater comandos no Vim!
Eddie B
3
g <cg> funciona em várias plataformas, o que é legal.
precisa saber é o seguinte
Onde posso encontrar mais informações sobre o uso de ! [...] %?
wok
A ajuda está aqui: vimdoc.sourceforge.net/htmldoc/various.html#:!cmd . Se você usa muito os comandos do shell, verifique também este plugin: stevelosh.com/projects/clam .
Mrucci
24
:help count-items

sugere que você poderia fazer uma operação a seco de uma ala de substituição

:%s/./&/gn

(que informa o número de caracteres correspondentes) ou que você gosta strlen()do texto visualmente selecionado:

:echo strlen(@")

("é o registro sem nome)

como você pode chamar uma expressão em sua linha de status como %{myfunc()}essa pode ser um bom ponto de partida. contar o tempo todo pode ser um pouco demorado, já que você teria que selecionar o texto inteiro e, em seguida, puxá-lo, mas talvez mostrar o número de bytes no registro "-registo já esteja bom para você. se você realmente deseja saber o número de caracteres no buffer: apenas selecione visualmente TODO o texto no buffer e puxe-o para que a solução seja:

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

que fornece o número de caracteres no registro "" (que é idêntico ao número de bytes se você selecionar e puxar o buffer atual).

akira
fonte
A solução também funciona no Windows (que comandos do bash não).
Dastrobu
Gosto que a contagem não desapareça após um segundo, como o g<CTRL-g>método na resposta aceita.
9777 Chester
8

Uma melhoria na resposta de mrucci:

Você pode usar wcno linux sem precisar salvar o arquivo primeiro, direcionando a :wsaída do comando da seguinte maneira:

:w !wc -m

e você pode mapeá-lo para algo como mencionado por mrucci.

arquitetônico
fonte
6
:help statusline

da-te

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

o que também é uma boa solução alternativa para o seu problema. basta ir até o final do buffer com Ge o número de bytes mostrado na sua linha de status é o número de caracteres (não é verdade com caracteres de vários bytes, é claro). volte para onde você veio ctrlo.

akira
fonte
1
Isso é problemático com caracteres de vários bytes. Eu encontrei esta pergunta depois de colocar% o na minha linha de status :)
Matt
@ Matt: então, qual é a solução?
Akira
1
A solução de mrucci "g ^ g" no modo normal foi boa o suficiente para mim. Eu precisava disso para uma depuração rápida, por isso não tomei tempo para tentar obter essas informações na linha de status.
Matt
1
Como os documentos são vagos e confusos, é importante notar que o comando específico que você precisa executar é set statusline+=\ %o\ %N (curiosamente, ele não funciona para, por exemplo, o item "t S") . Então, se você vê a linha de status inalterada, é porque você precisa executar set laststatus=2. Para mim, substituiu a linha de status transparente existente pela nova, sendo preto sólido e tendo apenas o item "contagem de bytes".
Hi-Angel
3

Se você costuma usar: w para salvar o arquivo, cada vez que você faz isso, o status reporta o número de caracteres gravados. Por exemplo, no final desta frase, fiz a: w (sim, estou usando o gvim para escrever esta nota) e relatou: 245C redigida.

Erin Thomas
fonte
Este golfe lindamente para uso único.
Ciro Santilli escreveu
3

Você pode anexar uma expressão para exibir o bytecount do buffer na linha de status com:

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

Ou você pode alterar a variável de opção diretamente para evitar tudo isso escapando:

:let &statusline .= ' %{ line2byte(line("$")+1)-1 }B'
akira
fonte
Quando tento isso, o gVim reclama de uma sequência de expressão não fechada. Notei que falta um parêntese, mas corrigir isso também não ajuda. Aqui está o que eu reescrevi para:: set statusline =% {line2byte (line ("$")))}
OwenP
@OwenP: deve ser corrigido agora
akira
1
Provavelmente você deseja ...%{ line2byte(line(\"$\")+1))-1 }que inclua os caracteres da última linha na contagem. Entretanto, essa abordagem não conta caracteres multibyte corretamente.
intui
1
Também acho que você precisa escapar dos espaços ou simplesmente se livrar deles.
intuited
Editado para incluir as sugestões de @ intuited, também anexado à linha de status em vez de substituí-la.
joeytwiddle
0

Solução alternativa que tenho usado até aceitar a resposta de mrucci:

Descobri por acidente que, quando eu: w para salvar o arquivo, o comando gera o número de bytes gravados. Isso é mais ou menos uma contagem de caracteres, então já foi suficientemente próximo. Também gosto da resposta de mrucci, possivelmente mais do que essa, porque ela também conta com palavras.

OwenP
fonte
0

Se você mantiver uma cópia de arquivo do seu texto, basta escrever seu texto no disco - a contagem de caracteres é exibida por padrão.

Se você não quiser manter um arquivo, basta salvar seu texto para /dev/null: :w!/dev/null.

Você também pode wccontar seus caracteres: :%!wc -c- mas não se esqueça de clicar Upara restaurar seu texto.

Se você precisar disso com frequência, apenas mapeie esses comandos para uma sequência de teclas: :map #wc :w!/dev/null^[- observe que ^[deve ser inserido como Ctrl+ V Esc.

Como primeiro indicador do tamanho do texto, basta ativar os números de linha; admitido: isso precisa de aritmética mental ;-)

kdo
fonte
0

Depois de fazer essa pergunta e ler as respostas (obrigado mrucci), adicionei essas linhas ao meu arquivo de inicialização .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>

Deixo para o vim: ajude os usuários a descobrir o que fazem.

Pessoalmente, acho útil iniciar os mapeamentos do Vim; ou, já que raramente os uso como o primeiro caractere de um comando.

David E.
fonte