假设我想写一份关于我从窗口看到的报告:公共汽车离开,史密斯夫人去杂货店等等...... 例如:http://withhiddennoise.net/2010/08/12/georges-perec-an-attempt-at-exhausting-a-place-in-paris/
当然,缩写是这种速记的理想选择。我们可以:
:iabbr bd The bus departs
:iabbr sg Mrs Smith goes to the grocer's
但很明显,这些事件将继续重复,我们不应该重复使用相同的词(至少,不要经常)。
是否有可能有这样的东西:
:iabbr bd RANDOM(The bus departs, The bus drives away, The bus takes off)
提前致谢
答案 0 :(得分:2)
您可以定义类似以下的功能
function! BD()
let l:t = localtime()
if l:t % 3 == 0
normal aThe bus departs
elseif l:t % 3 == 1
normal aThe bus drives away
else
normal aThe bus takes off
endif
endfunction
然后声明以下imap
:
:imap bd <ESC>:call BD()<CR>a
从现在开始,在插入模式下输入bd
应该插入三个随机字符串中的一个。
编辑:至于是否存在多种模式的问题:如果我理解正确的问题,可以通过以下方式实现:
let g:abbreviations = [
\ ['The bus departs', 'The bus drives away', 'The bus takes off'],
\ ['foo' , 'bar' , 'baz' ],
\ ['That''s ok' , 'That''s fine' , 'That''s good' ],
\ ['more' , 'less' , 'the same' ],
\ ]
function! ExpandAbbr(abbr_no)
let l:t = localtime()
return g:abbreviations[a:abbr_no][l:t % 3]
endfunction
iabbr <expr> bd ExpandAbbr(0)
iabbr <expr> pg ExpandAbbr(1)
iabbr <expr> ok ExpandAbbr(2)
iabbr <expr> mo ExpandAbbr(3)
答案 1 :(得分:2)
虽然可以将缩写映射到函数执行的结果,但这里的问题是vim没有随机函数,开箱即用。
简单示例:
let l_position = 0
function! GetSome(the_list)
if g:l_position >= len(a:the_list)
let g:l_position = 0
endif
let result = a:the_list[g:l_position]
let g:l_position += 1
return result
endfunction
iabbr <expr> tt GetSome(["asdf", "afawe", "wewefsdf", "wefsdf", "jkhkljo"])
现在,每次输入“tt”时,它都会将其替换为GetSome()函数的结果,该函数循环显示提供的列表。
答案 2 :(得分:1)
据我所知,您无法使用iabbr
执行此操作,但您可以使用某些模板语言/扩展程序(例如snipMate,这是教程http://www.catonmat.net/blog/vim-plugins-snipmate-vim/)。或者在vimscript(或任何支持的语言)中设置功能。