Eu tenho um arquivo cheio de texto (por exemplo, Markdown ou LaTeX). Eu gostaria de contar o número de palavras em uma parte deste arquivo.
Eu sei que posso fazer :! wc -w %para executar wc -w no buffer atual. E sei que posso arrancar a seção de interesse em um registro nomeado. Acho que existe uma maneira de enviar um registro nomeado para o sistema operacional para uso em um comando ou canal, mas não consegui encontrar um. Ou existe uma maneira melhor de contar as palavras em um registro?
Meu caso de uso é que eu escrevo bastante não programação (notas, tese, etc.) no vim e gostaria de contar quantas palavras adicionei a uma determinada seção do arquivo no meio de uma edição sessão.
fonte
g<C-g>
dessa maneira. Impressionante!Há duas maneiras de se conseguir isso: a maneira pura de vimscript e a
wc
maneira.A maneira pura do vim
Você pode usar o comando de pesquisa e substituição para fazer isso. Por exemplo:
O que isso faz é, em vez de substituir um determinado padrão por algo, apenas conta as ocorrências do padrão. Isso é por causa da
n
bandeira. Para contar as palavras em uma seção específica (neste caso, linhas 5 a 15), você pode fazer algo assim:Isso elimina a necessidade de puxar o conteúdo de uma seleção para um registro. Para ver mais possibilidades do que pode ser colocado no lugar
5-15
, leia o tópico de ajuda paracmdline-ranges
. Se você deseja fazer isso com frequência, provavelmente é bom criar um mapeamento (ou comando) para ele. Além disso, se você tiverhlsearch
ativado, poderá executar:nohlsearch
posteriormente para limpar o realce.O
wc
caminhoA mesma coisa pode ser realizada com
wc
. Da mesma maneira que você pode usarcmdline-ranges
para selecionar a área com o:s
comando, você pode usá-los com comandos externos. Por exemplo:Isso executa as linhas 5 a 15 através do
wc
comando A desvantagem disso é que ele substitui esse intervalo de linhas pela saída do comando. Você pode desfazer essa alteração pressionandou
. Observe também que a solução vimscript pode não funcionar com idiomas diferentes, porque\w
não corresponde ao que normalmente seriam caracteres de palavra em outros idiomas.wc
pode fazer melhor nisso do que\w
. Além disso, aqui está um comando sofisticado para torná-lo mais rápido:Observe que isso derruba o
a
registro.Nota
Parece que isso também pode ser realizado no modo visual com a
g<C-g>
combinação de teclas. Veja a resposta de Carpetsmoker para uma explicação disso.fonte
\w
sons como uma boa ideia no começo, mas depois de testá-lo, encontrei vários problemas. O maior é que ele não corresponde a caracteres não-ascii, então uma palavra comoüber
é simplesmente ignorada (houve uma pergunta sobre isso ontem). Além disso, uma palavra comoe-mail
é contada como 2 palavras, já que-
não está em\w
(usar a-
é um tanto incomum em inglês, mas muito comum em holandês, por exemplo). Pode haver outros personagens que são ignorados desta forma, o que nos leva ao meu último ponto: convenções, como o que é considerado uma "palavra" podem ser diferentes ...wc
podem ser encontradas no local (não sei se o GNUwc
realmente lida com isso a propósito, as ferramentas GNU não são bem conhecidas por seu excelente suporte unicode).wc
solução.Para palavras, use:
.
indica a linha atual.Também coloquei o seguinte no meu arquivo .vimrc:
Eu posso digitar:
e o
zzcw
expandirá paras/\i\+/&/g
O
zzcw
é apenas um nome estranho que não corresponde a nada (para mim).Um efeito colateral é que o arquivo inteiro é selecionado e destacado.
Queria poder digitar tweets com várias linhas em um arquivo, garantir que não houvesse muitos caracteres e colar o tweet no twitter.
fonte