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

76

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 posts e manter uma contagem de caracteres ao vivo na barra de status. Eu estou começando a usar gVim mais e eu realmente não quero voltar para o Notepad ++ neste momento, mas é muito útil ter essa contagem de caracteres. Se eu ultrapassar a contagem, normalmente acabo colando o post no Notepad ++ para que eu possa ver quando aparar o suficiente para chegar ao limite.

Já vi sugestões de que :set ruler ajudaria, mas isso apenas fornece a contagem de caracteres por meio do índice da coluna atual na linha atual. Isso seria ótimo se eu não usasse quebra de parágrafos, mas tenho certeza que você concordaria que ler vários milhares de caracteres em um parágrafo não é confortável.

Eu li a ajuda e achei que rulerformat funcionaria, mas depois de examinar o formato statusline que ele usa, não vi nada que fornecesse uma contagem de caracteres para o buffer atual.

Eu vi que existem plugins que adicionam isso, mas eu ainda estou colocando meus dedos no gVim e não tenho certeza se quero carregar plugins aleatórios antes de entender o que eles fazem. Eu prefiro usar algo embutido no vim, mas se ele não existir, não existe.

O que devo fazer para atingir meu objetivo? Se envolve um plugin, você o usa e como funciona?

    
por OwenP 07.06.2010 / 18:26

9 respostas

130

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

Se você está no linux você pode usar wc -m para 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>
    
por 07.06.2010 / 23:23
23
:help count-items

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

:%s/./&/gn

(que informa o número de caracteres correspondentes) ou que você faz uma fantasia strlen() no texto visualmente selecionado:

:echo strlen(@")

("é o registrador sem nome)

desde que você pode chamar uma expressão na sua linha de status, como %{myfunc()} , que pode ser um bom ponto de partida. contar o tempo todo pode ser um pouco demorado, já que você teria que selecionar todo o texto e depois puxá-lo, mas talvez mostrar o número de bytes no "-register já está ok para você. Se você realmente quer saber o número de chars no buffer: basta selecionar visualmente TODO o texto no buffer e arrancá-lo, então, a solução seria:

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

que lhe dá o número de caracteres no "-register (que é idêntico ao número de bytes se você selecionar e puxar o buffer atual).

    
por 07.06.2010 / 18:58
6
:help statusline

te dá

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

que também é uma boa solução para o seu problema. basta ir para o final do buffer com G e o número de bytes mostrado na sua linha de status é o número de caracteres (não é verdade com caracteres multi-byte, é claro). volte para onde você veio com ctrl o .

    
por 08.06.2010 / 07:03
6

Um aprimoramento para a resposta do mrucci:

Você pode usar wc no linux sem ter que salvar o arquivo primeiro direcionando a saída do comando :w da seguinte forma:

:w !wc -m

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

    
por 15.07.2014 / 10:48
3

Se você tem o hábito de usar: w para salvar o arquivo, toda vez que fizer isso, o status informa o número de caracteres gravados. Por exemplo, no final desta frase eu fiz um: w (sim estou usando o gvim para escrever esta nota) e ele relatou: 245C escrito.

    
por 31.05.2012 / 13:03
3

Você pode anexar uma expressão para exibir a contagem de bytes 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 todos os que escapam:

:let &statusline .= ' %{ line2byte(line("$")+1)-1 }B'
    
por 07.06.2010 / 19:00
0

Solução que usei até aceitar a resposta de mrucci:

Descobri acidentalmente que quando eu: w salva o arquivo, o comando gera o número de bytes gravados. Isso é mais ou menos uma contagem de caracteres, então isso está perto o suficiente até agora. Eu também gosto da resposta do mrucci, possivelmente mais do que esta porque ela tem uma contagem de palavras também.

    
por 22.10.2010 / 17:47
0

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

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

Você também pode deixar wc contar seus caracteres: :%!wc -c - mas não se esqueça de pressionar U para 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^[ - note que ^[ deve ser digitado como Ctrl + V < kbd> Esc .

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

    
por 08.06.2010 / 08:59
0

Depois de ter essa pergunta e de 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: ajudar os usuários a descobrir o que eles fazem.

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

    
por 11.11.2012 / 18:06

Tags