vim r! en posición de cursor

16

con vim, si uso

:r!date

vim inserte la fecha en la línea siguiente, similar a

:r!pwd

¿Cómo puedo insertar el comando de salida bajo la posición del cursor y no en una nueva línea?

Juan Pablo
fuente
1
vi.stackexchange.com/questions/862/…
Ciro Santilli 新疆 改造 中心 996ICU 六四 事件

Respuestas:

16

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:

:nmap \e i<c-r>=substitute(system('date'),'[\r\n]*$','','')<cr><esc>

Cuando el comando está "cableado" en la asignación, no puede hacer algo como:

:nmap \e i<c-r>=substitute(system(input('Command: ')),'[\r\n]*$','','')<cr><esc>

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.

Heptita
fuente
¿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:

: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

Crisboot
fuente
1

Puede agregar este tipo de cosas en su .vimrc:

" 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.

Si desea hacerlo desde el modo de inserción, leí esta joya hoy en https://vimways.org/2018/the-mapping-business/

inoremap <C-g><C-t> <C-r>=strftime("%F")<CR>

Puede modificar la salida de fecha para satisfacer sus necesidades ( man datepuede ayudar con esto).

Tristan Chase
fuente
0

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

:inoremap <F12> <C-r>=system("date \| tr '\n' ' '")<CR>

entonces puede insertar la fecha con la tecla de función 12 mientras el modo de inserción está activo. yo suelo

:inoremap DHRE <C-r>=system("date \| tr '\n' ' '")<CR>

(Cambié de DHERE después de encontrar que se activó el pegado ADHERE) porque ya uso F12 para otras cosas.

yo suelo

grep -iE "dhere" /usr/share/dict/words

para verificar conflictos obvios con las palabras existentes, lo que sugiere que es relativamente seguro de usar:

:inoremap PWD <C-r>=system("pwd \| tr '\n' ' '")<CR>

(a menos que esté escribiendo cierta documentación).

Alexx Roche
fuente