Vim缩写与数组的随机结果?

时间:2011-01-24 10:53:23

标签: vim

假设我想写一份关于我从窗口看到的报告:公共汽车离开,史密斯夫人去杂货店等等...... 例如: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)

提前致谢

3 个答案:

答案 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()函数的结果,该函数循环显示提供的列表。

如果您需要结果是随机的,则必须使用some tricks

答案 2 :(得分:1)

据我所知,您无法使用iabbr执行此操作,但您可以使用某些模板语言/扩展程序(例如snipMate,这是教程http://www.catonmat.net/blog/vim-plugins-snipmate-vim/)。或者在vimscript(或任何支持的语言)中设置功能。