Estoy escribiendo una tabla de rebajas que se ve así:
| 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 |
Estoy buscando una manera de calcular rápidamente el total de la tercera columna e insertarlo en el búfer. La solución que tengo en mente haría uso del modo de bloque visual (para seleccionar todos los números) y tal vez del registro de expresión (para hacer los cálculos).
¿Sería esto posible usando los comandos nativos de Vim? Si no, ¿hay algún complemento que pueda ayudarme?
visual-mode
arithmetic
zool
fuente
fuente
Respuestas:
Escribí un complemento: https://github.com/sk1418/HowMuch que admite la selección visual y hace cálculos matemáticos.
Por defecto, el complemento admite tres motores de evaluación de expresiones matemáticas: Gnu bc, python y vimscript. Puede hacer los cálculos en uno determinado o dejar que el complemento elija uno automáticamente.
Funciona con tu ejemplo así:
Para más detalles, lea el archivo README en github.
fuente
For details please read the README on github.
Incluso si pongo las teclas presionadas para este problema aquí, no veo cuán útil podría ser, son solo 3 o 4 combinaciones de teclas. Si alguien realmente necesita mi guión, él / ella verificará los detalles de todos modos.Si no desea usar complementos o pasar a un script bash, puede hacer algo como lo siguiente:
c-V {motions} "ay
copiar columna en"a
:let @a = substitute(@a, 'c-V c-J', '+', 'g')
reemplazar las nuevas líneas de columna con+
ic-R=c-Ra
ejecutar el reemplazado a"a
través del registro de expresiónAlternativamente: haga que la entrada del historial de expresiones sea reutilizable para otras sumas de columnas
ctrl-V {motions} y
poner columna en registro de extracción""
ictrl-R=eval(substitute(@", '\n', '+', 'g'))
Repitiendo para otra columna:
ctrl-V {motion} y
(sin alterar)ictrl-R=<CR>
o si hizo algo más con el registro de expresión, recorra el historial con la tecla de flecha hacia arriba (o conctrl-P
si lo reasignó):ictrl-R=<up>...<up><CR>
fuente
"
lugar de comillas simples'
en elsubstitute
comando. ¿Sabes si hay alguna razón para eso?Explicación:
He estado probando una función que funciona aquí:
Usando el mapa anterior incluido, todo lo que tiene que hacer después de cargar la función es seleccionar los números que desea sumar y usar
<leader>s
para resumir el área seleccionada.Explicación de la función:
Utiliza
try/finally/endtry
extructure para capturar errores.Si desea probar esta función, haga lo siguiente: Copie esta función en su navegador y ejecute este comando en vim,
:@+
esto le permitirá usarlo:call SumVis()
normalmente.Necesita que hagas una selección de bloque visual con ctrl+v , anule la selección y finalmente llame a la función. O puede usar el mapa sugerido que elimina por sí solo la selección antes de calcular.
fuente
Mi complemento csv lo permite. Use el
:SumCol
comando y asegúrese de leer la documentación.fuente
Hacer un complemento o codificar esto en vimscript parece un poco pesado. Creo en un vim sin complementos y una buena composición con herramientas externas.
Aquí hay un comando de 1 vez, basado en user2571881, que funciona incluso si el búfer no se ha guardado.
Si desea guardar este comando para usarlo en el futuro, puede nombrarlo:
Funciona con selección visual. Si selecciona algunas filas y entra en modo de comando, vim agregará un prefijo a su comando
:'<,'>
, que es el rango de línea para la selección visual. Para que pueda ejecutar:y solo sumará la tercera columna de las filas seleccionadas. Por defecto el rango es
%
, entoncessumará la 3ra columna de todas las líneas.
EDITAR: si desea poder especificar otros separadores de campo y predeterminar la columna contada hasta el último, puede cubrir el comando
bash
y manejar los argumentos con él, de esta manera:Ahora,
contará la última columna de una tabla con "|" separadores de campo,
contará la tercera columna de una tabla con "|" separadores de campo, y
contará la tercera columna de una tabla con separadores de campo "+".
fuente
SumColumn
vimrc significa que simplemente tiene sus 'complementos' en su vimrc. Con suerte, eres bueno para mantener esto con el tiempo. Para mí, los complementos proporcionan documentación, separación en partes significativas, aprovechando el ingenio de otros. Contribuyo a upstream que mejora los complementos increíbles que nadie tiene tiempo para crearlos por su cuenta (excepto tpope). ¿No utilizas vim-surround, vim-fugitive, vim-easy-align / vim-lion, vim-unimpaired, vim-commentary, ultisnips o ft-específicas como vim-go, vim-rails, vimtex?Si las columnas están alineadas correctamente, esto se puede hacer con un simple revestimiento.
CTRL-V
+ mueva el cursory
:echo eval(join(split(@", '\_s\+'), '+'))
que divide el texto extraído en espacios y líneas nuevas, une el elemento con+
carácter y evalúa la cadena.+
y evaluar::echo eval(substitute(@", "\n", '+', 'g'))
-eval()
es lo más parecido a loreduce
que tenemos.Si no, tendrás que usar otros trucos para contar campos. Por ejemplo,
split(getline('.'), "[ \t|]\\+")
se puede usar para dividir las columnas de una fila en su matriz. A partir de ahí, se vuelve tan simple como::echo eval(join(map(getline("'<", "'>"), { -> split(v:val, "[ \t|]\\+")[2] }), '+'))
Para deshacerse de los valores mágicos (campo número - 1, y
+
), puede convertirse en un comandoQue se puede usar con:
Nota: Aquí uso lambdas de Vim 7.4.1xxx
fuente
vmap
++
del complementovmath
de Damian ConwayInstale el complemento desde github (solo 178 sloc), por ejemplo
Agregue mapeo a su vimrc
Sin embargo, sugeriría usar otra cosa, por ejemplo
gA
2f|
y seleccione la columna en modo de bloque visual<C-V>G$
++
(o su mapeo elegido)s
)s
, por ejemplo, con"sp
Para una presentación de este complemento, vea el video de YouTube Damian Conway, "Más instantáneamente mejor Vim" - OSCON 2013 (a partir del minuto 29).
fuente
Herramienta externa de cli
csvstat
de csvkitBreve explicación de las opciones.
-d DELIMITER
Carácter delimitador del archivo CSV de entrada. aquí|
.-H
Especifique que el archivo CSV de entrada no tiene una fila de encabezado.-c COLUMNS
Una lista separada por comas de índices de columna o nombres para ser examinados. El valor predeterminado es todas las columnas.--sum
Solo sumas de salida.Esta herramienta también proporciona min, max, mean, median, stdev (desviación estándar), cuenta valores únicos, lista de valores frecuentes.
Insertar en archivo con
Instalación
En macOS, csvkit está disponible a través de homebrew y en Debian / Ubuntu y similares con los que se puede instalar
$ sudo apt install csvkit
.fuente