1

我正在尝试执行一个用 # 填充当前行的命令,然后转到开头并用日期和时间重写,然后 o,这是我的尝试:

:nnoremap <F6><Home>
set count = 0
normal i
while count <= columns
  normal #

  set count += 1
endwhile
<Home>R =strftime("%c")<CR>
normal o

按 F6 的结果应该是这样的:

日期和时间############################################### #######################

但是是的,这是我第一次尝试扩展 vim,所以请帮助我了解如何使这一切正常。

4

2 回答 2

3

映射的右侧与键入命令基本相同。这使您可以逐步从重复输入内容到录制宏 ( @q),最终制作永久映射。

这是您尝试的直译:

:nnoremap <F6> 80I#<Esc>0R<C-r>=strftime("%c")<CR><Esc>o

它使用 80 的固定宽度。如果你想要更动态的东西(比如'textwidth'它 > 0 时的值),你必须从直接执行转移到通过编程插值:execute,如下所示:

:nnoremap <F6> :execute 'normal' (&textwidth > 0 ? &textwidth : 80) . "I#\<lt>Esc>"<CR>0R<C-r>=strftime("%c")<CR><Esc>o

如您所见,这已经变得更加神秘,混合了 Ex 命令和:normal模式、引用等。

最后一步是一个完全可配置和可重用的插件。只有对于那些具有复杂错误处理和东西的人,您通常会使用单独:function的定义,然后从您的映射中调用它们:

function! s:InsertSeparator()
    ...
endfunction
nnoremap <silent> <F6> :call <SID>InsertSeparator()<CR>
于 2012-11-08T08:42:37.423 回答
0

您可以printf在 vimscript 中使用。

:nnoremap <F6> I<C-r>=substitute(printf("%-80s", strftime("%c")), '\(\s\)\@<=\s', '#', 'g')<CR><Esc>o
于 2012-11-08T14:20:43.970 回答