Estou escrevendo uma tabela de descontos que se parece com isso:
| 13/05/15 | 09:30-16:00 | 6.5 |
| 14/05/15 | 10:00-16:30 | 6.5 |
| 16/05/15 | 15:30-01:00 | 9.5 |
| 21/05/15 | 09:00-16:30 | 7.5 |
| 22/05/15 | 08:30-17:00 | 8.5 |
| 28/05/15 | 09:30-15:30 | 6 |
| 02/06/15 | 09:00-20:00 | 11 |
| 03/06/15 | 08:30-22:30 | 14 |
Estou procurando uma maneira de calcular rapidamente o total da terceira coluna e inseri-lo no buffer. A solução que eu tenho em mente seria usar o modo de bloco visual (para selecionar todos os números) e talvez o registro de expressões (para fazer as contas).
Isso seria possível usando comandos nativos do Vim? Caso contrário, existe um plugin que pode me ajudar?
visual-mode
arithmetic
zool
fonte
fonte
Respostas:
Eu escrevi um plugin: https://github.com/sk1418/HowMuch, que suporta seleção visual e faz cálculos matemáticos.
Por padrão, o plugin suporta três mecanismos de avaliação de expressões matemáticas: Gnu bc, python e vimscript. Você pode fazer os cálculos em um determinado ou permitir que o plugin escolha automaticamente um para você.
Funciona com o seu exemplo assim:
Para detalhes, leia o README no github.
fonte
For details please read the README on github.
Mesmo se eu pressionar as teclas pressionadas para esse problema aqui, não vejo como isso pode ser útil, são apenas 3 ou 4 combinações de teclas. Se meu script for realmente necessário para alguém, ele / ela verificará os detalhes de qualquer maneira.Se você não deseja usar plug-ins ou soltar em um script bash, pode fazer algo como o seguinte:
c-V {motions} "ay
copiar coluna para"a
:let @a = substitute(@a, 'c-V c-J', '+', 'g')
substitua as novas linhas da coluna por+
ic-R=c-Ra
execute o substituído"a
através do registro de expressãoComo alternativa: torne a entrada do histórico de expressões reutilizável para somas adicionais de colunas
ctrl-V {motions} y
colocar coluna no registro de arranco""
ictrl-R=eval(substitute(@", '\n', '+', 'g'))
Repetindo para outra coluna:
ctrl-V {motion} y
(inalterado)ictrl-R=<CR>
ou se você fez outra coisa com o registro de expressão, percorra o histórico com a tecla de seta para cima (ouctrl-P
se você o remapeava):ictrl-R=<up>...<up><CR>
fonte
"
vez de aspas simples'
nosubstitute
comando. Você sabe se existe alguma razão para isso?Explicação:
Eu tenho tentado uma função que funciona aqui:
Usando o mapa acima incluído, tudo o que você precisa fazer após carregar a função é selecionar os números que deseja somar e usar
<leader>s
para resumir a área selecionada.Explicação da função:
Ele usa a estrutura
try/finally/endtry
para capturar erros.Se você quiser experimentar esta função, faça o seguinte: Copie esta função no seu navegador e execute este comando no vim.
:@+
Isso permitirá que você use:call SumVis()
normalmente.É necessário que você faça uma seleção visual do bloco com ctrl+ v, desmarque e, finalmente, chame a função. Ou você pode usar o mapa sugerido, que por si só remove a seleção antes do cálculo.
fonte
Meu plugin csv permite isso. Use o
:SumCol
comando e não deixe de ler a documentação.fonte
Criar um plugin ou codificá-lo no vimscript parece um pouco pesado. Eu acredito em um vim livre de plugins e boa composição com ferramentas externas.
Aqui está um comando único, com base nos user2571881, que funciona mesmo que o buffer não tenha sido salvo.
Se você deseja salvar este comando para uso futuro, convém nomeá-lo:
Funciona com seleção visual. Se você selecionar algumas linhas e entrar no modo de comando, o vim prefixará seu comando
:'<,'>
, que é o intervalo de linhas para a seleção visual. Então você pode executar:e somará apenas a terceira coluna das linhas selecionadas. Por padrão, o intervalo é
%
, entãosomará a terceira coluna de todas as linhas.
EDIT: Se você quiser especificar outros separadores de campos e usar como padrão a coluna contada até a última, poderá cobrir o comando
bash
e manipular os argumentos com ele, assim:Agora,
contará a última coluna de uma tabela com "|" separadores de campo,
contará a terceira coluna de uma tabela com "|" separadores de campo e
contará a terceira coluna de uma tabela com separadores de campos "+".
fonte
SumColumn
vimrc ao @JoL significa que você simplesmente possui seus 'plugins' no seu vimrc. Felizmente, você é bom em manter isso com o tempo. Para mim, os plugins fornecem documentação, separação em partes significativas, tirando proveito de outras habilidades. Eu contribuo para o upstream, que melhora plugins incríveis, que ninguém tem tempo para criar todos eles por conta própria (exceto tpope). Você não usa vim-surround, vim-fugitive, vim-easy-align / vim-lion, vim-impaired, vim-commentary, ultisnips ou ft-specific, como vim-go, vim-rails, vimtex?Se as colunas estiverem alinhadas corretamente, isso poderá ser feito com um oneliner simples.
CTRL-V
+ mover o cursory
:echo eval(join(split(@", '\_s\+'), '+'))
que divide o texto arrancado em espaços e novas linhas, junta novamente o elemento com+
caractere e avalia a string.+
e avalie::echo eval(substitute(@", "\n", '+', 'g'))
-eval()
é a coisa mais próxima dereduce
nós.Caso contrário, você precisará usar outros truques para contar os campos. Por exemplo,
split(getline('.'), "[ \t|]\\+")
pode ser usado para dividir as colunas de uma linha em sua matriz. A partir daí, torna-se tão simples quanto::echo eval(join(map(getline("'<", "'>"), { -> split(v:val, "[ \t|]\\+")[2] }), '+'))
Para se livrar dos valores mágicos (número do campo - 1 e
+
), ele pode se tornar um comandoQue pode ser usado com:
Nota: Aqui eu uso lambdas do Vim 7.4.1xxx
fonte
vmap
++
do pluginvmath
por Damian ConwayInstale o plugin do github (apenas 178 sloc), por exemplo
Adicione mapeamento ao seu vimrc
No entanto, eu sugeriria usar outra coisa, por exemplo
gA
2f|
e selecione a coluna no modo de bloco visual<C-V>G$
++
(ou o mapeamento escolhido)s
)s
, por exemplo, com"sp
Para uma apresentação deste plugin, veja o vídeo do YouTube Damian Conway, "Mais Instantaneamente Melhor Vim" - OSCON 2013 (a partir do minuto 29).
fonte
Ferramenta CLI externa
csvstat
do csvkitBreve explicação das opções
-d DELIMITER
Caractere delimitante do arquivo CSV de entrada. Aqui|
.-H
Especifique que o arquivo CSV de entrada não tenha linha de cabeçalho.-c COLUMNS
Uma lista separada por vírgula de índices ou nomes de colunas a serem examinados. O padrão é todas as colunas.--sum
Somas de saída apenas.Essa ferramenta também fornece min, max, média, mediana, stdev (desvio padrão), conta valores exclusivos, lista de valores frequentes.
Inserir no arquivo com
Instalação
No macOS, o csvkit está disponível via homebrew e no Debian / Ubuntu e similares, com os quais pode ser instalado
$ sudo apt install csvkit
.fonte