Contar o comprimento da string destacada no VIM

24

Gostaria de saber se existe uma maneira de contar símbolos destacados vim(incluindo espaços em branco)?

ATUALIZAR

Modo visual VIM

Ele mostra a contagem de linhas se minha seleção estiver em várias linhas. Eu preciso da contagem de símbolos.

Nemoden
fonte

Respostas:

28

A menos que eu esteja perdendo alguma coisa, o Vim já faz isso. Se destacar algum texto usando o mouse ou digitando ve movendo o cursor, vejo na parte inferior da tela

- VISUAL - 12

onde o número à direita é o número de caracteres destacados. Isso funciona apenas se a seleção estiver em uma única linha, caso contrário, mostra a contagem de linhas.

Você também pode selecionar visualmente alguma região de texto e tipo g Ctrl-Gque mostrará o número de linhas, palavras e bytes selecionados.

garyjohn
fonte
4
(atordoado) Como diabos eu usei o Vim por tanto tempo e nunca percebi isso ? Mas, em minha defesa, eu estava pensando em obter o número programaticamente.
njd 27/05
Boa resposta, mas dê uma olhada na pergunta atualizada. Assim como o @njd, eu não percebi isso.
Nemoden
1
@ Nemoden: tente a segunda parte da sugestão de garyjohn (g Ctrl-G). Ele deve mostrar uma linha como "Selecionado # de # linhas; # de # palavras; # de # bytes".
peth 27/05
Oh. Minha culpa. Não sei por que pulei a segunda solução. Funciona. Obrigado!
Nemoden 27/05
12
Isso não está ativado por padrão em alguns sistemas. Basta adicionar set showcmdao seu vimrcpara habilitá-lo.
Tyler Holien
8

O Vim alterna entre exibir a contagem de caracteres e a contagem de linhas para o texto visualizado, dependendo do que e como você visualiza (vim 7.4 corrigido para setembro de 2015)

V will display line count
v$ will display character count

Se você visualizar mais de uma linha, ele exibirá apenas a contagem de linhas

g-CTRL-G displays 'byte count' which seems to be 'char count' +1 per line
zzapper
fonte
Como a pergunta diz, mesmo o normal vmuda de contagem de caracteres para contagem de linhas se a seleção abranger várias linhas. No entanto, g CTRL-Gfaz o trabalho bem.
Joeytwiddle #
2
:function VisualLength()
:  exe 'normal "xy'
:  echo "Visual: " . strlen(@x) . "\n"
:  exe 'normal gv'
:endfunction

:map ,q "xy:call VisualLength()<CR>
  1. Primeiro você puxa a seleção atual (no buffer x)

  2. Em seguida, você exibe o comprimento desse buffer: strlen(@x)
    (O VISUAL - exibido na linha de status oculta isso, então precisamos adicionar uma nova linha)

  3. Destaque o intervalo visual anterior: gv

Isso não leva em consideração se o modo visual era modo de linha, caractere ou bloco, mas é suficiente para a maioria dos casos.

njd
fonte
2

Vejo na sua captura de tela que você está executando no Windows, portanto, esta resposta pode não ajudá-lo tanto. Mas para outros ...

Um recurso subutilizado (IMO) do Vim é permitir que comandos externos façam o trabalho pesado.

Nesse caso, se você estiver em um sistema semelhante ao UNIX, poderá usar o wccomando para fazer isso.

A maneira mais simples é substituir o texto selecionado pela saída do comando, digitando (com o texto selecionado):

:!wc

(depois pressione enter).

Isso será exibido na sua linha de comando como:

'<,'>!wc

Depois de ler as informações, você pode desfazer upara voltar para onde começou.

Nota: Esse processamento é feito apenas em linhas inteiras . Se você quer linhas parciais, acho que a @ garyjohn's g_CTRL-Gé sua melhor aposta.

Você pode evitar a necessidade de desfazer executando:

:w !wc

Isso "grava" as linhas selecionadas na entrada padrão do comando e a saída do comando será exibida em um novo buffer temporário, deixando o original intocado. Veja :help :write_cpara mais informações.

Nota: Eu obtive as :write_cinformações em: /programming/1237780/vim-execute-shell-command-without-filtering

Agora, de maneira mais geral:

Este exemplo com wcé bastante simplista, mas você pode imaginar como essa é uma abordagem poderosa. O UNIX já possui muitos comandos de processamento de texto, e você pode usá-los no Vim com bastante facilidade, sem precisar tocar no Vimscript (yech).

Além disso, qualquer programa de linha de comando que você escreva que lide com stdin / stdout agora pode não apenas beneficiar você no seu terminal, mas também dentro do Vim.

Eu me pego, por exemplo, executando tidye json-formatde dentro do vim para tornar os arquivos que estou vendo mais legíveis.

Você pode fazer o mesmo no Windows, mas o Windows não possui um conjunto de comandos tão rico incorporado. Você sempre pode instalar o GNUWin32 ou similar para obter esses benefícios.

jwd
fonte
1

Para uma maneira programática no vimscript, isso funcionou para mim quando a seleção é limitada a uma linha:

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

(Usando em virtcol(..)vez de col(..), para que funcione conforme o esperado quando :set ve=allestiver ativo.)

Evgeni Sergeev
fonte