如何用vimscript制作水平标尺?

时间:2012-11-08 06:54:17

标签: vim

我正在尝试用#填充当前行的命令,然后转到开头并重写日期和时间,然后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,所以请帮助我了解如何使这一切正常。

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

您可以在vimscript中使用printf

:nnoremap <F6> I<C-r>=substitute(printf("%-80s", strftime("%c")), '\(\s\)\@<=\s', '#', 'g')<CR><Esc>o