Vim: Устранить неоднозначность сопоставлений клавиш в определенном буфере, чтобы избежать тайм-аута - PullRequest
9 голосов
/ 02 февраля 2012

Я использую плагин " Buffet ", и есть локальное сопоставление с буфером "d" для удаления буфера под курсором.

Я также использую plugun Surround , и есть глобальное отображение "ds", которое означает " delete Surround ".

Итак, когда я нажимаю "d" в окне шведского стола, Vim ждет секунду, прежде чем выполнить отображение "d". Я знаю о &timeoutlen, но я не хочу его менять. Так что я хочу разрешить неоднозначность сопоставления клавиш для "d" в окне буфета, чтобы избежать тайм-аута на d выбор буфера.

Чтобы решить эту проблему, я хочу удалить в окне Buffet все сопоставления, которые начинаются с "d", за исключением собственных сопоставлений Buffet. Как я могу это сделать?

P.S. Я читал о maparg() и mapcheck(), но, к сожалению, они мне не подходят.

Ответы [ 6 ]

4 голосов
/ 02 февраля 2012

Кажется, я нашел решение сам:

au BufEnter buflisttempbuffer* nunmap ds
au BufLeave buflisttempbuffer* nmap   ds <Plug>Dsurround

Я надеялся, что есть более универсальный подход (удалить действительно все отображения, начиная с "d"), но в этот момент мне не удалось его найти.

Даже если я узнаю, как получить все эти сопоставления, к сожалению, я не смогу сделать unmap <buffer> ds, потому что ds - это глобальное сопоставление. Я уверен, что я должен иметь возможность отключить глобальное отображение для некоторого буфера, хотя. Vim отличный, но не идеальный.

Ну, теперь это работает для меня.

2 голосов
/ 02 февраля 2012

Теперь, когда вопрос «перефразирован», это решение больше не актуально, но я все равно опубликую его, так как потратил на него несколько минут.map <letter> и извлекает отдельные карты.Затем он отображает их все.

function! Unmap(leader)
    redir => maps
        sil exe "map " . a:leader
    redir END
    let maps_list = split(strtrans(maps),'\^@')
    if len(maps_list) > 1
        for this in maps_list
            let mapn = matchstr(this,"^\\w\\s*\\zsd\\w*\\>")
            exe "unmap " . mapn
        endfor
    endif
endfunction

Пример использования: call Unmap("d").Это удалит все сопоставления, начинающиеся с d, оставляя только значения по умолчанию Vim.

Отказ от ответственности: это не было тщательно проверено.В частности, я не знаю, насколько переносим символ \^@, но так он выглядит на моей (Win32) машине.

0 голосов
/ 05 января 2017

Дешевая уловка, которая сработала для меня, заключалась в том, чтобы сделать timeoutlen настолько коротким, что он становится практически мгновенным. Пока вы сами не используете множественные сопоставления клавиш, это покроет все плагины за один раз.

Однако мы не хотим, чтобы этот параметр сохранялся, поэтому мы удаляем его каждый раз, когда покидаем буфер.

Добавьте это так, чтобы он работал внутри вашего собственного буфера:

augroup no_map_chords
  autocmd!
  autocmd BufEnter <buffer> let g:bak_timeoutlen = &timeoutlen | set timeoutlen=1
  autocmd BufLeave <buffer> let &timeoutlen = g:bak_timeoutlen | unlet g:bak_timeoutlen
augroup END

Подобный метод может быть использован для определенного типа файла или других подобных «глобальных» настроек.

0 голосов
/ 07 июня 2014

Этот вопрос довольно старый, но если вы все еще заинтересованы, вы можете попробовать Bufstop .

Эта проблема решается плагином, вы можете нажать клавишу d , чтобы удалить буфер, и вы не получите никакого таймаута, если вы установили другие плагины, которые имеют глобальные сопоставления.

0 голосов
/ 02 февраля 2012

Buffet - очень молодой плагин, я не думаю, что он используется таким количеством людей, как Command-T или NERDTree, поэтому вы можете не получить много ответов.Его автор очень отзывчив на многочисленные созданные им темы, вы должны связаться с ним напрямую или создать проблему на github .

Баффета.
0 голосов
/ 02 февраля 2012

Самый простой способ сделать это:

:e /WHERE/YOU/HAD/INSTALLED/buffet.vim
:%s:map <buffer> <silent> d:"&: 
:wq
$ vim # Restart Vim to take effect...

Как правило, вы не можете unmap на основе шаблона.

Если вы хотите использовать другую клавишу (например, с <leader>, просто измените эту строку в плагине:

map <buffer> <silent> d :call <sid>deletebuffer(0)<cr>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...