Con " :read" Vim siempre insertará la salida en una nueva línea. La solución desafortunadamente no es simple.
Puede insertar la salida de un comando en la posición actual del cursor cuando esté en modo de inserción presionando y ControlRluego escribiendo =system('command')Enter. Desafortunadamente, si la salida del comando tiene una nueva línea final (como la mayoría lo hará) que también se insertará, entonces su línea se interrumpirá.
Eso se puede solucionar agregando una substitute()llamada para eliminar las nuevas líneas finales, pero eso hace que el comando sea más problemático de lo que vale la pena escribir a mano.
La solución definitiva es crear algún tipo de mapeo, pero eso se vuelve aún más complejo debido a cómo Vim maneja lo que llama "escribir con anticipación"; mientras puedes hacer algo como:
Donde intentas pedirle al usuario que ejecute el comando, porque Vim simplemente se confundirá, emitirá un pitido e ingresará al modo de inserción.
Por lo tanto, primero debe solicitar que se ejecute el comando, almacenarlo en una variable y luego insertar el resultado procesado. En este punto, es probable que se necesite una función auxiliar para evitar que el mapeo se vuelva desordenadamente inmanejable, por lo que terminamos con algo como esto:
function InlineCommand()
let l:cmd = input('Command: ')
let l:output = system(l:cmd)
let l:output = substitute(l:output, '[\r\n]*$', '', '')
execute 'normal i' . l:output
endfunction
nmap <silent> \e :call InlineCommand()<CR>
Tenga en cuenta que nmapcrea asignaciones que solo se ejecutan cuando se escriben en modo normal.
Por cierto, si solo desea insertar la fecha o el directorio de trabajo actual, la respuesta inicial que le di es factible. Simplemente ingrese el modo de inserción y escriba ControlR=strftime('%c')Entero ControlR=getcwd()Enter.
¿Sería posible encadenar comandos para resolver esto? : r! date | : - | J or i \ n \ n ^ [-:.! Date \ n -JJ
Alexx Roche
4
Si lo desea en la línea actual, intente simplemente, pero tenga en cuenta que el contenido anterior de la línea se borrará:
:.!date
Si desea la posición exacta del cursor puede:
:let a=system("date") | let b=substitute(a,"[\r\n]*$","","g") | exec 'normal i'.b
Larga historia corta: debe sustituir porque desea deshacerse de ^ @ (caracteres nulos) que también puede reemplazar con .s / \% x00 // g. Esta es una versión más corta con menos tuberías:
" Insert the date in YYYY-MM-DD format inline just before cursor position (normal mode)
nnoremap <Leader>di me:r !date +\%F<CR>A <Esc>0D`ePJx
me marca la posición actual.
:r !date +\%F<CR>pone la fecha en la siguiente línea en formato AAAA-MM-DD (puede cambiar esto como quiera, simplemente escape %con cada uno \).
A <Esc> agrega un espacio al final de la salida de la fecha.
0Delimina la fecha, lo `elleva de vuelta a la posición marcada y PJxcoloca la fecha antes del cursor, une las líneas (para deshacerse de la que está debajo) y elimina el espacio final. Modifique la asignación como mejor le parezca.
para obtener la fecha insertada en la posición actual. Si copia esa línea con un retorno de carro, Shift + Insert se convierte en su comando DateTime-Here.
Respuestas:
Con "
:read
" Vim siempre insertará la salida en una nueva línea. La solución desafortunadamente no es simple.Puede insertar la salida de un comando en la posición actual del cursor cuando esté en modo de inserción presionando y ControlRluego escribiendo
=system('command')
Enter. Desafortunadamente, si la salida del comando tiene una nueva línea final (como la mayoría lo hará) que también se insertará, entonces su línea se interrumpirá.Eso se puede solucionar agregando una
substitute()
llamada para eliminar las nuevas líneas finales, pero eso hace que el comando sea más problemático de lo que vale la pena escribir a mano.La solución definitiva es crear algún tipo de mapeo, pero eso se vuelve aún más complejo debido a cómo Vim maneja lo que llama "escribir con anticipación"; mientras puedes hacer algo como:
Cuando el comando está "cableado" en la asignación, no puede hacer algo como:
Donde intentas pedirle al usuario que ejecute el comando, porque Vim simplemente se confundirá, emitirá un pitido e ingresará al modo de inserción.
Por lo tanto, primero debe solicitar que se ejecute el comando, almacenarlo en una variable y luego insertar el resultado procesado. En este punto, es probable que se necesite una función auxiliar para evitar que el mapeo se vuelva desordenadamente inmanejable, por lo que terminamos con algo como esto:
Tenga en cuenta que
nmap
crea asignaciones que solo se ejecutan cuando se escriben en modo normal.Por cierto, si solo desea insertar la fecha o el directorio de trabajo actual, la respuesta inicial que le di es factible. Simplemente ingrese el modo de inserción y escriba ControlR
=strftime('%c')
Entero ControlR=getcwd()
Enter.fuente
Si lo desea en la línea actual, intente simplemente, pero tenga en cuenta que el contenido anterior de la línea se borrará:
:.!date
Si desea la posición exacta del cursor puede:
:let a=system("date") | let b=substitute(a,"[\r\n]*$","","g") | exec 'normal i'.b
Larga historia corta: debe sustituir porque desea deshacerse de ^ @ (caracteres nulos) que también puede reemplazar con .s / \% x00 // g. Esta es una versión más corta con menos tuberías:
:exec 'normal i'.substitute(system("date"),"[\n]*$","","")
Y también puede establecer etiquetas si desea reemplazar en varios puntos en la misma línea:
Dada esta línea 1:
1 Date: <datehere> and also <datehere>
Ejecutar:
:let a=system("date") | exec ".s/<datehere>/".a."/g" | .s/\%x00//g
Después del reemplazo:
1 Date: jue ago 9 02:34:52 ART 2012 and also jue ago 9 02:34:52 ART 2012
Probado en Vim 7.2
fuente
Puede agregar este tipo de cosas en su .vimrc:
me
marca la posición actual.:r !date +\%F<CR>
pone la fecha en la siguiente línea en formato AAAA-MM-DD (puede cambiar esto como quiera, simplemente escape%
con cada uno\
).A <Esc>
agrega un espacio al final de la salida de la fecha.0D
elimina la fecha, lo`e
lleva de vuelta a la posición marcada yPJx
coloca la fecha antes del cursor, une las líneas (para deshacerse de la que está debajo) y elimina el espacio final. Modifique la asignación como mejor le parezca.Si desea hacerlo desde el modo de inserción, leí esta joya hoy en https://vimways.org/2018/the-mapping-business/
Puede modificar la salida de fecha para satisfacer sus necesidades (
man date
puede ayudar con esto).fuente
En modo normal (modo de escape / bleep) pegue
:exec 'normal i'.system("date \| tr '\n' ' '")
para obtener la fecha insertada en la posición actual. Si copia esa línea con un retorno de carro, Shift + Insert se convierte en su comando DateTime-Here.
Además, puede vincular F12 a un comando con
entonces puede insertar la fecha con la tecla de función 12 mientras el modo de inserción está activo. yo suelo
(Cambié de DHERE después de encontrar que se activó el pegado ADHERE) porque ya uso F12 para otras cosas.
yo suelo
para verificar conflictos obvios con las palabras existentes, lo que sugiere que es relativamente seguro de usar:
(a menos que esté escribiendo cierta documentación).
fuente