vim r! nella posizione del cursore


Risposte:


16

Con " :read" Vim inserirà sempre l'output su una nuova riga. Purtroppo la soluzione non è semplice.

È possibile inserire l'output di un comando nella posizione corrente del cursore quando si è in modalità inserimento premendo ControlRe digitando =system('command')Enter. Sfortunatamente, se l'output del comando ha una nuova riga finale (come la maggior parte lo farà) che verrà inserita, quindi la linea verrà interrotta.

Ciò può essere risolto aggiungendo una substitute()chiamata per eliminare le nuove righe finali, ma ciò rende il comando più problematico di quanto valga la pena digitare a mano.

La soluzione definitiva è quella di creare una sorta di mappatura, ma che diventa ancora più complessa a causa di come Vim gestisce ciò che chiama "digitare in anticipo"; mentre puoi fare qualcosa del tipo:

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

Dove il comando è "cablato" nella mappatura, non puoi fare qualcosa del tipo:

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

Dove si tenta di richiedere all'utente l'esecuzione del comando, perché Vim si confonderà, emetterà un segnale acustico e accederà alla modalità di inserimento.

Quindi è necessario richiedere prima l'esecuzione del comando, memorizzarlo in una variabile e quindi inserire l'output elaborato. A questo punto è probabilmente necessaria una funzione di aiuto per evitare che la mappatura stessa diventi ingestibilmente disordinata, quindi finiamo con qualcosa del genere:

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>

Si noti che nmapcrea mappature che vengono eseguite solo se digitate in modalità normale.

Per inciso, se si desidera solo inserire la data o l'attuale directory di lavoro, la risposta iniziale che ho dato è fattibile. Basta inserire la modalità di inserimento e digitare ControlR=strftime('%c')Entero ControlR=getcwd()Enter.


Sarebbe possibile incatenare i comandi per risolvere questo. : r! date | : - | J or i \ n \ n ^ [-:.! Data \ n -JJ
Alexx Roche,

4

Se lo desideri nella riga corrente, provi solo, ma tieni presente che il vecchio contenuto della riga verrà cancellato:

:.!date

Se vuoi la posizione esatta del cursore puoi:

:let a=system("date") | let b=substitute(a,"[\r\n]*$","","g") | exec 'normal i'.b

Per farla breve: è necessario sostituire la causa in cui si desidera eliminare ^ @ (caratteri null) che è anche possibile sostituire con .s / \% x00 // g. Questa è una versione più corta con meno tubi:

:exec 'normal i'.substitute(system("date"),"[\n]*$","","")

E puoi anche impostare tag se vuoi sostituire in vari punti sulla stessa riga:

Data questa riga 1:

1 Date: <datehere> and also <datehere>

Eseguire:

:let a=system("date") | exec ".s/<datehere>/".a."/g" | .s/\%x00//g

Dopo la sostituzione:

1 Date: jue ago 9 02:34:52 ART 2012 and also jue ago 9 02:34:52 ART 2012

Testato su Vim 7.2


1

Puoi aggiungere questo tipo di cose nel tuo .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 segna la posizione corrente.
  • :r !date +\%F<CR>mette la data sulla riga successiva nel formato AAAA-MM-GG (puoi cambiarla come preferisci, basta scappare %con \).
  • A <Esc> aggiunge uno spazio alla fine dell'output della data.
  • 0Delimina la data, `eti riporta nella posizione contrassegnata e PJxmette la data prima del cursore, unisce le linee (per sbarazzarsi di quella vuota in basso) e uccide lo spazio finale. Modifica la mappatura come ritieni opportuno.

Se vuoi farlo dalla modalità di inserimento, ho letto questa gemma oggi su https://vimways.org/2018/the-mapping-business/

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

Puoi modificare l'output della data in base alle tue esigenze ( man datepuò aiutarti in questo).


0

In modalità normale (modalità escape / bleep) incollare

:exec 'normal i'.system("date \| tr '\n' ' '")

per inserire la data nella posizione corrente. Se copi quella riga con un ritorno a capo, Maiusc + Inserisci diventa il tuo comando DateTime-Here.

Inoltre puoi associare F12 a un comando con

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

quindi è possibile inserire la data con il tasto funzione-12 mentre la modalità di inserimento è attiva. Io uso

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

(Sono passato da DHERE dopo aver scoperto che incollare ADHERE è stato attivato) perché utilizzo già F12 per altre cose.

Io uso

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

per verificare scontri evidenti con parole esistenti, che suggeriscono che sei relativamente sicuro da usare:

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

(a meno che tu non stia scrivendo una certa documentazione.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.