Ad esempio, :echo strftime(%c)
mostrerà l'ora corrente in basso, ma come inserire questa stringa di tempo nel testo (subito dopo il cursore)?
Ad esempio, :echo strftime(%c)
mostrerà l'ora corrente in basso, ma come inserire questa stringa di tempo nel testo (subito dopo il cursore)?
Risposte:
È possibile utilizzare il registro delle espressioni "=
, con p
(o P
) in modalità normale o <C-R>
in modalità inserimento:
In modalità normale:
( <C-M>
qui significa Control+ M, oppure basta premere Enter/ Return)
"=strftime('%c')<C-M>p
In modalità insert:
( <C-M>
ha lo stesso significato di cui sopra, <C-R>
significa Control+ R)
<C-R>=strftime('%c')<C-M>
Se vuoi inserire più volte il risultato della stessa espressione, allora potresti voler mapparli su chiavi nel tuo .vimrc
:
(qui il <C-M>
e <C-R>
dovrebbe essere digitato letteralmente (una sequenza di cinque caratteri stampabili - Vim li tradurrà internamente))
:nmap <F2> "=strftime('%c')<C-M>p
:imap <F2> <C-R>=strftime('%c')<C-M>
"=
registro. : - /
<C-R>=&sessionoptions
- esegue anche il completamento con tab wildmode!
<c-r>=
è lento per il comando che può avere un sacco di output e può anche rompere il rientro in modo che il testo di output sia illeggibile. Ad esempio, <c-r>=execute('nmap')
l'output verrà scritto riga per riga, il che è molto lento.
:r!date +\%c
vedere :help :r!
date
è un comando esterno e !
chiama comandi esterni mentre OP richiede comandi vim.
!
è un comando vi (m) che chiama comandi esterni . Potresti avere ragione OP non voler emettere solo i comandi vim ma se lo fa, !
non lo farà.
Questi comandi inseriranno l'output di strftime("%c")
destra nel punto in cui si trova il cursore:
:exe ":normal i" . strftime("%c")
e
:call feedkeys("i". strftime("%c"))
Esistono altri modi per fare ciò che vuoi (come, ad esempio, quelli sulla risposta di Mikel ).
Modifica : ancora meglio, per l'inserimento sul posto, utilizzare il =
registro come descritto da Chris Johnsen
Se si desidera inserire l'output di un comando vim (al contrario del valore restituito di una chiamata di funzione ), è necessario acquisirlo. Ciò si ottiene tramite il :redir
comando, che consente di reindirizzare l'equivalente di Vim dell'output standard in una variabile, un file, un registro o un'altra destinazione.
:redir
è dolorosamente scomodo da usare; Scriverei una funzione per incapsulare la sua funzionalità in un modo più conveniente, qualcosa del genere
funct! Exec(command)
redir =>output
silent exec a:command
redir END
return output
endfunct!
Dopo aver dichiarato tale funzione, è possibile utilizzare il registro delle espressioni (come spiegato da Chris Johnsen) per inserire l'output di un comando nella posizione del cursore. Quindi, dalla modalità normale, premi i^R=Exec('ls')
per inserire l'elenco dei buffer correnti di vim.
Tenere presente che il comando verrà eseguito nello spazio dei nomi delle funzioni, quindi se si utilizza una variabile globale, sarà necessario specificarlo nello spazio prefissandolo con il prefisso g:
. Si noti inoltre che Exec()
, come scritto sopra, verrà aggiunta una nuova riga finale anche all'output di una riga. Potresti voler aggiungere una chiamata alla substitute()
funzione per evitarlo.
Vedi anche https://stackoverflow.com/questions/2573021/vim-how-to-redirect-ex-command-output-into-current-buffer-or-file/2573054#2573054 per maggiori informazioni su redir
e un link a un comando correlato.
set paste
comando prima di restituire l'output e un set nopaste
dopo, per evitare il rientro della scala quando le linee iniziano con gli spazi. In realtà, volevo salvare il valore dell'opzione incolla corrente e restituirlo, ma non sono riuscito a farlo.
set nopaste
dovrebbe funzionare dopo return output
, perché l'istruzione return è un punto di uscita fuori dalla funzione. Ho inserito la mia soluzione a questo problema come risposta separata in questa pagina.
:call append(line('.'), strftime("%c"))
Lo metterà sulla riga successiva, quindi potresti premere J
( Shift+ J) per unirlo alla posizione corrente.
O se hai bisogno di tutto in un solo comando, puoi farlo
:call setline(line('.'), getline(line('.')) . strftime("%c"))
o
:call setline(line('.'), getline(line('.')) . " " . strftime("%c"))
a seconda che si desideri inserire uno spazio prima della data o meno.
Migliorare la risposta @intuited per evitare il problema con i principali spazi bianchi e il rientro crescente:
"Examples:
":call Exec('buffers')
"This will include the output of :buffers into the current buffer.
"
"Also try:
":call Exec('ls')
":call Exec('autocmd')
"
funct! Exec(command)
redir =>output
silent exec a:command
redir END
let @o = output
execute "put o"
return ''
endfunct!
Questo verrà semplicemente inserito nella posizione corrente nel file quando si :call Exec('command')
passa dalla modalità normale. Come notato nel commento , l' =Exec('command')
approccio originale (insert-mode) Ctrl + R con la Exec(..)
restituzione di una stringa potrebbe essere parzialmente corretto usando set paste
, ma non offre l'opportunità di mettere set nopaste
ovunque.
La let @o = output
sintassi imposta il registro o
sul contenuto della variabile output
, come spiegato qui: https://stackoverflow.com/a/22738310/1143274
La return ''
linea è in modo che il valore di ritorno predefinito di 0
non venga inserito nel buffer.
Questo è come lo faccio. Lo mette subito dopo il cursore perché lo usa p
.
" save previous yank
let reg_save = @@
" save your text to the '@' register
let @@ = strftime('%c')
" paste it after the cursor
exec "normal! p"
" restore previous yank
let @@ = reg_save