在 Vim 中插入时间戳的最佳方法?

EditPad Lite 有一个很好的特性(CTRL-ECTRL-I) ,它在你的代码中插入一个时间戳,例如“2008-09-1110:34:53”。

在 Vim 中获得此功能的最佳方法是什么?

(我通过 SSH 在 Linux 服务器上使用 Vim 6.1。在目前的情况下,我们很多人共享一个登录名,所以如果有另一种获取时间戳的内置方法,我不想在 home 目录中创建缩写。)

41619 次浏览

http://kenno.wordpress.com/2006/08/03/vim-tip-insert-time-stamp/

Tried it out, it works on my mac:

:r! date

produces:

Thu Sep 11 10:47:30 CEST 2008

This:

:r! date "+\%Y-\%m-\%d \%H:\%M:\%S"

produces:

2008-09-11 10:50:56

:r! date

You can then add format to the date command (man date) if you want the exact same format and add this as a vim alias as well

:r! date +"\%Y-\%m-\%d \%H:\%M:\%S"

That produces the format you showed in your example (date in the shell does not use \%, but just %, vim replaces % by the name of the current file, so you need to escape it).

You can add a map in your .vimrc for it to put the command automatically, for instance, each time you press F3:

:map <F3> :r! date +"\%Y-\%m-\%d \%H:\%M:\%S"<cr>

(Edited the from above :) ) (Edit: change text part to code, so that

<F3>

can be displayed)

For a unix timestamp:

:r! date +\%s

You can also map this command to a key (for example F12) in VIM if you use it a lot:

Put this in your .vimrc:


map  <F12> :r! date +\%s<cr>

To make it work cross-platform, just put the following in your vimrc:

nmap <F3> i<C-R>=strftime("%Y-%m-%d %a %I:%M %p")<CR><Esc>
imap <F3> <C-R>=strftime("%Y-%m-%d %a %I:%M %p")<CR>

Now you can just press F3 any time inside Vi/Vim and you'll get a timestamp like 2016-01-25 Mo 12:44 inserted at the cursor.

For a complete description of the available parameters check the documentation of the C function strftime().

As an extension to @Swaroop C H's answer,

^R=strftime("%FT%T%z")

is a more compact form that will also print the time zone (actually the difference from UTC, in an ISO-8601-compliant form).

If you prefer to use an external tool for some reason,

:r !date --rfc-3339=s

will give you a full RFC-3339 compliant timestamp; use ns instead of s for Spock-like precision, and pipe through tr ' ' T to use a capital T instead of a space between date and time.

Also you might find it useful to know that

:source somefile.vim

will read in commands from somefile.vim: this way you could set up a custom set of mappings, etc., and then load it when you're using vim on that account.

Why is everybody using :r!? Find a blank line and type !!date from command-mode. Save a keystroke!

[n.b. This will pipe the current line into stdin, and then replace the line with the command output; hence the "find a blank line" part.]

Another quick way not included by previous answers: type-

!!date

From the Vim Wikia.

I use this instead of having to move my hand to hit an F key:

:iab <expr> tds strftime("%F %b %T")

Now in Insert mode it just type tds and as soon as I hit the space bar or return, I get the date and keep typing.

I put the %b in there, because I like seeing the month name. The %F gives me something to sort by date. I might change that to %Y%m%d so there are no characters between the units.

Unix,use:

!!date

Windows, use:

!!date /t

More details:see Insert_current_date_or_time

I wanted a custom command :Date (not a key mapping) to insert the date at the current cursor position.

Unfortunately straightforward commands like r!date result in a new line. So finally I came up with the following:

command Date execute "normal i<C-R>=strftime('%F %T')<CR><ESC>"

which adds the date/time string at the cursor position without adding any new line (change to normal a add after the cursor position).

I'm using vi in an Eterm for reasons and it turns out that strftime() is not available in vi.

Fought long and hard and finally came up with this:

map T :r! date +"\%m/\%d/\%Y \%H:\%M" <CR>"kkddo<CR>

Result: 02/02/2021 16:45

For some reason, adding the date-time alone resulted in a blank line above the date-time and the cursor set on the date-time line.

date +"[etc]" <CR> Enters the date-time
"kk Moves up two lines
dd Deletes the line above the date-time
o <CR> Opens a line below the time and adds a carriage return (linefeed)

Bonus:

vi doesn't read ~/.vimrc, it reads ~/.exrc

Also, this is how it looks in vim/.vimrc:

map T  "=strftime("%m/%d/%y %H:%M")<CR>po<CR>