Подтвердить что ты не робот

Закрывающая скоба Vim

Было бы здорово в vim, если бы я мог набрать ] (или какой-нибудь другой символ, возможно, <C-]>) и автоматически вставить, какая бы скобка не закрывала открывающий кронштейн. Например. если у меня это в моем буфере:

object(function(x) { x+[1,2,3

И я нажимаю ]]], символы ]}) будут вставлены. Как это можно сделать?

4b9b3361

Ответ 1

Вот эскиз того, что вы, вероятно, хотели. Встроенные функции searchpair и searchpairpos оказывают огромную помощь для различных задач редактирования текста:)

" Return a corresponding paren to be sent to the buffer
function! CloseParen()
    let parenpairs = {'(' : ')',
                   \  '[' : ']',
                   \  '{' : '}'}

    let [m_lnum, m_col] = searchpairpos('[[({]', '', '[\])}]', 'nbW')

    if (m_lnum != 0) && (m_col != 0)
        let c = getline(m_lnum)[m_col - 1]
        return parenpairs[c]
    endif
    return ''
endfun

Чтобы использовать его удобно, сделайте imap из этого:

imap <C-e> <C-r>=CloseParen()<CR>

Изменить: чрезмерное экранирование поискового запроса, поэтому \ включен в поиск. Еще одна проблема.

Ответ 2

В сочетании с плагином autoclose вы можете установить:

imap <c-l> <c-o>l

Autoclose вставляет соответствующий кронштейн, тогда ctrl-L пропустит его, не покидая режим вставки. Ctrl-L имеет для меня больше смысла, чем ctrl -].

Это как можно ближе к тому, что я скажу, что вы просите: "Позвольте мне просто нажать один и тот же ключ каждый раз, чтобы пропустить ввод правильной скобки, независимо от того, что это за скобка". Я бы не imap] (без модификатора), но там ничего не останавливает вас, если вы хотите попробовать.

Ответ 3

Вы можете добавить это в свой .vimrc, и он будет автоклинировать скобки

inoremap ( ()<Left>
inoremap [ []<Left>
inoremap { {}<Left>