:echo strftime(%c) will show the current time on the bottom, but how to insert this time string into the text (right after the cursor)?
In normal mode:
<C-M> here means Control+M, or just press Enter/Return)
In insert mode:
<C-M> has the same meaning as above,
<C-R> means Control+R)
If you want to insert the result of the same expression many times, then you might want to map them onto keys in your
<C-R> should be typed literally (a sequence of five printable characters—Vim will translate them internally))
:nmap <F2> "=strftime('%c')<C-M>p :imap <F2> <C-R>=strftime('%c')<C-M>
If you want to insert the output of a vim command (as opposed to the return value of a function call or an expression), you have to capture it. This is accomplished via the
:redir command, which allows you to redirect vim's equivalent of standard output into a variable, file, register, or other target.
:redir is sort of painfully inconvenient to use; I would write a function to encapsulate its functionality in a more convenient way, something like
funct! Exec(command) redir =>output silent exec a:command redir END return output endfunct!
Once you've declared such a function, you can use the expression register (as explained by Chris Johnsen) to insert the output of a command at the cursor position. So, from normal mode, hit
i^R=Exec('ls') to insert the list of vim's current buffers.
Be aware that the command will execute in the function namespace, so if you use a global variable you will have to explicitly namespace it by prefixing it with
g:. Also note that
Exec(), as written above, will append a terminating newline to even one-line output. You might want to add a call to
substitute() into the function to avoid this.
Also see https://stackoverflow.com/questions/2573021/vim-how-to-redirect-ex-command-output-into-current-buffer-or-file/2573054#2573054 for more blathering on about
redir and a link to a related command.
These commands will insert the output of
strftime("%c") right where your cursor is:
:exe ":normal i" . strftime("%c")
:call feedkeys("i". strftime("%c"))
There are other ways to do what you want (like, for example, those on Mikel's answer).
Edit: Even better, for in-place insert, use the
= register as Chris Johnsen describes
:call append(line('.'), strftime("%c"))
Will put it on the next line, then you could press
J (Shift+J)to join it up to the current position.
Or if you need it all in one command, you could do
:call setline(line('.'), getline(line('.')) . strftime("%c"))
:call setline(line('.'), getline(line('.')) . " " . strftime("%c"))
depending on whether you want a space inserted before the date or not.
Improving @intuited answer to avoid the problem with leading whitespace and growing indent:
"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!
This will simply insert at the current location in the file when you
:call Exec('command') from normal mode. As noted in the comment, the original (insert-mode) Ctrl+R
=Exec('command') approach with
Exec(..) returning a string could be partially corrected by using
set paste, but doesn't offer an opportunity to put the
set nopaste anywhere.
let @o = output syntax sets the register
o to the contents of the variable
output, as explained here: https://stackoverflow.com/a/22738310/1143274
return '' line is so that the default return value of
0 doesn't get inserted to the buffer.
You can use
:put with the expression register
This method allows you to make an alternative command to
:InsertExpr that would insert your expression:
command! -nargs=* InsertExpr put =<args>
Or to insert commands like
command! -nargs=* InsertCmd put =execute('<args>')
(Not sure why I can't get q-args to work.)
:InsertExpr strftime('%c') :InsertCmd ls