2011-01-24 5 views
2

Предположим, я хочу, чтобы написать отчет о том, что я вижу из окна: автобус отходит, миссис Смит едет в бакалейщика, и т.д ... Пример: http://withhiddennoise.net/2010/08/12/georges-perec-an-attempt-at-exhausting-a-place-in-paris/Аббревиатура Vim со случайными результатами из массива?

Конечно, аббревиатуры идеально подходят для этого типа стенографии , Мы могли бы иметь:

: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) 

Заранее спасибо

ответ

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) 
+0

Я пробовал вашу функцию, и она работала прекрасно. Мне нравится идея использовать локальное время событий как случайный фактор (и вполне верный жизни). Теперь, если вы разрешите мне дополнительный вопрос: нужно ли мне создавать 30 различных функций, если у меня есть 30 разных шаблонов, или возможно иметь 1 функцию, которая будет захватывать - в соответствии с: iabbr - соответствующий массив из 30 разные массивы значений (как долго, конечно, поскольку эти массивы содержат только 3 значения)? – ThG

+0

ThG, см. * Редактировать * –

+0

Он работает точно так, как я хотел. Большое спасибо. Есть ли предел (nb столбцов, nb строк) для такой матрицы? (мои вложенные вопросы остановятся там ...) – ThG

1

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

+0

Спасибо за предложение snipMate. Это, безусловно, превышает мои потребности, но я в конечном итоге попытаюсь. Что касается предложения функции, у меня был ответ от Рене Нюффенеггера, который, похоже, тот, кого я ищу. Еще раз спасибо. – ThG

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

Теперь, каждый раз, когда вы набираете «ТТ», он заменяет его на результат GetSome функции(), какие циклы через поставляемый список.

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

+0

спасибо за ваш ответ, но я хочу получить случайный результат, и предложенные вами трюки на многих уровнях выше моей компетенции. Спасибо, тем не менее. – ThG

+0

@ThG Добро пожаловать. Для достижения наилучших результатов вы можете комбинировать это с ответом от Rene (идея локального превосходства) :) –

Смежные вопросы