Как изменить поведение отображений режима вставки Vim? - PullRequest
1 голос
/ 17 июня 2011

Я вставил в скрипт вставленный шаблон date<Tab> для вставки текущей даты в формате YYYY-MM-DD.

inoremap <script> <silent> <buffer> date<Tab> <C-R>=strftime("%Y-%m-%d")<CR>

Когда я начинаю печатать шаблон в режиме вставки, вместо отображения полного шаблона перед заменой его на строку даты только при нажатии Tab , Vim отображает только последний введенный символ, и это довольно раздражает когда я не хочу использовать это. Например, если я набираю «date», это то, что показывает Vim («|» - это представление курсора):

  • |d
  • |a
  • |t
  • data|

Кроме того, я установил подключаемый модуль Snipmate vim, который использует клавишу Tab для замены фрагментов шаблонами кода, и когда я набираю фрагмент, он не ведет себя так, как я описал ранее. Что делает Snipmate, так это отображает только клавишу Tab , и когда клавиша нажата, она получает предыдущее слово и проверяет, совпадает ли она с одним из его фрагментов.

Тем не менее, я оставлю два вопроса, и ответ на один из них решит мою проблему:

  • Есть ли способ настроить Vim без отображения полного шаблона перед его изменением на сопоставления?

  • Могу ли я иметь два плагина, использующих одно и то же сопоставление? Например, если я сопоставлю клавишу Tab , и всякий раз, когда слово перед курсором - «дата», мои плагины действуют, а Snipmate действует в других случаях.

Ответы [ 2 ]

2 голосов
/ 18 июня 2011

Первый ответ - нет.

Второй тоже нет, но его можно эмулировать:

Общий способ следующий (требуется frawor ):

" plugin/tab.vim
execute frawor#Setup('0.0', {'@/mappings': '0.0'})
" Make sure that mappings were set up
runtime! after/plugin/snipMate.vim

" Get information about already existing mapping
" (it was defined by snipmate)
let s:snipmap=s:_r.map.maparg('<Tab>', 'i', 0)

" Create a new mapping with unique lhs
let s:snipmap.lhs='<SNR>'.s:_sid.'_OldSnipMap'
call s:_r.map.map(s:snipmap)

function s:F.insdate()
    if getline('.')[:(col('.')-1)][-4:] is# 'date'
        return repeat("\<BS>", 4).strftime("%Y-%m-%d")
    else
        " Here is the magic: I have a choice to either use remappable mapping
        " or <C-\><C-o>:call feedkeys()<CR> workaround for nore mapping
        return "\<C-\>\<C-o>:call feedkeys(\"\\<SNR>".s:_sid."_OldSnipMap\")\n"
    endif
endfunction
call s:_f.mapgroup.add('Tab', {'tab': {'lhs': '<Tab>', 'rhs': s:F.insdate, 'mode': 'i'}})

Обратите внимание, что в вашем примере вы не отображаете <Tab>, вы отображаете date<Tab>, поэтому он не мешает отображению фрагмента кода.Приведенный выше код использует тот же подход, что и плагин IMAP: когда последняя клавиша {lhs} нажата, проверьте, есть ли предыдущие клавиши в буфере.Если они удалены, вставьте вместо них {rhs}.Таким образом, вы можете набрать date<Tab> независимо от того, насколько медленно он будет работать.

Примечание 2: это общий способ.Вы можете отбросить зависимости и большую часть кода, просто взглянув на <Tab> {rhs}:

function s:Insdate()
    if getline('.')[:(col('.')-1)][-4:] is# 'date'
        return repeat("\<BS>", 4).strftime("%Y-%m-%d")
    else
        return "\<C-g>u\<C-r>=TriggerSnippet()\n"
    endif
endfunction
inoremap <Tab> <C-r>=<SID>Insdate()<CR>
0 голосов
/ 18 июня 2011
  • Как я знаю, похоже, что нет такой настройки, чтобы "отключать" статус "карты поиска", поскольку vim будет использовать все символы, которые вы вводите, если он является частью какой-то карты в сопоставлении карты ключей.

  • Vim может привязать только один ключ к определенному действию, поэтому нет способа заставить ключ делать две вещи, как вы пожелаете. С другой стороны, вы можете настроить «snipmate» для использования другого ключа для выполнения действия «раскрыть». И это должно быть обычно, когда вы встречаетесь с ключевой проблемой конфликта. Кроме того, вы можете использовать «abbreviate», чтобы сделать что-то:

    :abbreviate <expr> :date: strftime("%Y-%m-%d")  
    

    Но я прошу прощения за это, здесь также существует "соответствие еды".

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