Автоматически вставлять соответствующую фигурную скобку в Vim - PullRequest
62 голосов
/ 23 декабря 2010

Я трачу в сторону слишком много времени, копаясь, потому что Vim не обрабатывает закрывающие скобки, как большинство IDE. Вот что я хочу, чтобы произошло:

Введите это:

if( whatever )
{ <CR>

и получите это:

if( whatever )
{
  |  
}

, где <CR> означает нажатие клавиши ENTER , а | - положение курсора. Это то, что делает Eclipse. Это то, что делает Visual Studio. И это то, что я хочу, чтобы Вим сделала.

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

Ответы [ 17 ]

32 голосов
/ 23 декабря 2010

В VimL вы можете сопоставить { так, как вы хотите:

inoremap { {<CR>}<Esc>ko

, в зависимости от настроек автоиндента, вы можете добавить <BS> после <CR>.

Для более полного решения, я бы посоветовал вам взглянуть на vim plugins Люка Эрмита .Они никогда меня не подводили.

16 голосов
/ 23 декабря 2010

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

9 голосов
/ 05 июля 2013

Использование AutoClose со следующими корректно работает.

inoremap {<CR> {<CR>}<C-o>O

Это верно по крайней мере для моей системы (терминал Unix в Mac OS X).

4 голосов
/ 24 декабря 2010

Вот что у меня есть в моем vimrc:

let s:pairs={
            \'<': '>',
            \'{': '}',
            \'[': ']',
            \'(': ')',
            \'«': '»',
            \'„': '“',
            \'“': '”',
            \'‘': '’',
        \}
call map(copy(s:pairs), 'extend(s:pairs, {v:val : v:key}, "keep")')
function! InsertPair(left, ...)
    let rlist=reverse(map(split(a:left, '\zs'), 'get(s:pairs, v:val, v:val)'))
    let opts=get(a:000, 0, {})
    let start   = get(opts, 'start',   '')
    let lmiddle = get(opts, 'lmiddle', '')
    let rmiddle = get(opts, 'rmiddle', '')
    let end     = get(opts, 'end',     '')
    let prefix  = get(opts, 'prefix',  '')
    let start.=prefix
    let rmiddle.=prefix
    let left=start.a:left.lmiddle
    let right=rmiddle.join(rlist, '').end
    let moves=repeat("\<Left>", len(split(right, '\zs')))
    return left.right.moves
endfunction
 noremap! <expr> ,f   InsertPair('{')
 noremap! <expr> ,h   InsertPair('[')
 noremap! <expr> ,s   InsertPair('(')
 noremap! <expr> ,u   InsertPair('<')

И, для некоторых типов файлов:

inoremap {<CR> {<C-o>o}<C-o>O

// Я знаю, что функция InsertPair тривиальна, но она экономит время, потому что с ее помощью я могу определять сопоставления как команд, так и обычного режима с помощью одной команды без необходимости писать множество <Left> с.

4 голосов
/ 27 июля 2018

Решение для фигурных скобок, скобок и скобок с вкладкой между ними.

" Automatically closing braces
inoremap {<CR> {<CR>}<Esc>ko<tab>
inoremap [<CR> [<CR>]<Esc>ko<tab>
inoremap (<CR> (<CR>)<Esc>ko<tab>

Результат:

function() {
  |
}
3 голосов
/ 14 июня 2012

Для всех, кто сталкивался с этим, как я, и искал что-то более свежее, чем AutoClose: delimitMate Я считаю, что не только предпочтительным решением AutoClose, с точки зрения поведения, но и в активном развитии. Согласно vim.org , AutoClose не обновлялось с 2009 года.

3 голосов
/ 24 декабря 2010

Как вы увидите в вики подсказке : есть много вариантов решения этого повторяющегося вопроса (у меня даже есть мое ).

Это если вы ограничиваете себя парами скобок. Здесь вы находитесь в контексте контрольного оператора. Таким образом, вы с большей вероятностью найдете системы с фрагментами, которые не ожидают, что вы наберете ") {" при вводе оператора "if". Ярлык Vim, как правило, короче того, что я прочитал в вашем вопросе. Здесь снова есть много вариантов, вы найдете наиболее вероятный фрагмент кода, и это может быть мой C & C ++ пакет .

2 голосов
/ 18 января 2016

Я всегда предпочитал что-то вроде того, что делает возвышенный текст, где он добавляет закрывающую фигурную скобку в качестве следующего символа, поэтому я добавил следующее в мой .vimrc:

inoremap (  ()<ESC>hli

, который перемещает курсор между двумя скобками.

2 голосов
/ 09 января 2016

В патче Vim 7.4.849 добавлена ​​привязка, позволяющая перемещать курсор без перезапуска последовательности отмены.После обновления до> = 7.4.849 что-то вроде этого прекрасно работает.

inoremap ( ()<C-G>U<Left>

Обратите внимание, что я взял это прямо из документации, включенной в патч.Лучшее простое решение для этой функции.

2 голосов
/ 18 сентября 2015

Добавьте в файл .vimrc следующее:

inoremap { {}<ESC>ha

Всякий раз, когда вы нажимаете { в режиме вставки, генерируется {}, и курсор помещается в правую скобку, чтобы вы могли сразу начать печатать между ними. Размещая фигурные скобки по порядку, а не по разным строкам, вы можете поместить вкладки перед } вручную. Таким образом, перед вами никогда не будет неправильного количества вкладок.

Возможно, кто-то может выяснить, как подсчитать количество вкладок, на которых находится курсор, а затем сгенерировать равное количество вкладок перед } в новой строке.

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