Vim аббревиатура со случайными результатами из массива? - PullRequest
2 голосов
/ 24 января 2011

Предположим, я хочу написать отчет о том, что я вижу из своего окна: автобус отходит, миссис Смит идет к бакалейщику и т. Д. Пример: 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 ]

2 голосов
/ 24 января 2011

Вы можете определить функцию, подобную следующей

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)
2 голосов
/ 24 января 2011

Хотя можно сопоставить сокращение с результатом выполнения функции, проблема здесь в том, что 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 (), которая циклически перебирает предоставленный список.

Если вам нужен случайный результат, выпридется использовать некоторые трюки .

1 голос
/ 24 января 2011

Насколько я знаю, вы не можете сделать это с iabbr, но вы можете сделать это с помощью некоторого языка / расширения шаблонов (например, snipMate, вот учебник http://www.catonmat.net/blog/vim-plugins-snipmate-vim/). Или с настройкой функции в vimscript (или любом из поддерживаемых языков).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...