开发者

Vim abbreviation with random results from array?

Suppose I want to write a report on what I see from my window : the bus departs, Mrs Smith goes to the grocer's, etc… An example : http://withhiddennoise.net/2010/08/12/georges-perec-an-attempt-at-exhausting-a-place-in-paris/

Of course, abbreviations are ideal for that type of shorthand. We could have :

:iabbr bd The bus departs
:iabbr sg Mrs Smith goes to the grocer's

But it is evident that these events will keep on repeating, and we are supposed not to re-use the same words (at least, not too often).

Is it possible then to have something which would look like this :

:iabbr bd RANDOM(The bus departs, The bus drives away, The bus ta开发者_开发技巧kes off)

Thanks in advance


You could define a function like the following one

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

and then declare the following imap:

:imap bd <ESC>:call BD()<CR>a

From now on, entering bd in insert mode should insert one of the three random strings.

Edit: As for the question if there can be multiple patterns: if I understood the question right, this is possible with something like:

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)


While it is possible to map the abbreviation to the result of the function execution, the problem here is that vim does not have random function, out of the box.

Simple example:

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"])

Now, every time you type "tt", it will substitute it for the result of GetSome() function, which cycles through the supplied list.

If you need the result to be random, you have to use some tricks.


As far as I know you can't do that with iabbr, but you can do that with some templating language/extension (e.g. snipMate, here is a tutorial http://www.catonmat.net/blog/vim-plugins-snipmate-vim/ ). Or with setting up a function in vimscript (or any of the supported languages).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜