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

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

Введите это:

if( whatever )
{ <CR>

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

if( whatever )
{
  |  
}

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

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

Ответы [ 17 ]

2 голосов
/ 03 марта 2015

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

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

delimitMate имеет настройку для этого.

1 голос
/ 14 января 2011

Просто записка @ Бобу.

AutoClose Карла Гуэртина имеет функцию с именем `` double brace '', то есть вы можете ввести фигурную скобку дважды, как показано ниже.

int func_name(void) {{ ==> Type `{' twice here.

приведет к:

int func_name(void) {
| ==> Cursor here.
}

Затем вы можете набрать single Tab, получить отступ в соответствии с настройкой `shiftwidth ', затем набрать.

1 голос
/ 22 мая 2019
inoremap ( ()<ESC>i
inoremap " ""<ESC>i
inoremap ' ''<ESC>i
inoremap { {<Cr>}<Esc>O
1 голос
/ 23 декабря 2010

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

0 голосов
/ 18 августа 2012

Вам не нужен специальный плагин для этого - но это двухэтапный процесс.

Сначала добавьте следующее к вашему .vimrc, чтобы съесть символ запуска:

" eat characters after abbreviation
function! Eatchar(pat)
    let c = nr2char(getchar(0))
    return (c =~ a:pat) ? '' : c
endfunction

и затем добавьте это сокращение к вашему .vimrc:

inoreabbr <silent> { {
      \<cr><space><space>
      \<cr><esc>0i}<esc>k$i<c-r>=Eatchar('\m\s\<bar>\r')<cr>

\ в начале строк второй и третьей - это просто символ продолжения строки. Однако вы могли бы сделать все это в одной строке, и я добавил это, чтобы можно было распространять аббревиатуру так, чтобы она отражала искомый вывод - просто чтобы все было немного более интуитивно понятным.

0 голосов
/ 02 марта 2019

Мое решение:

inoremap <expr> <CR> InsertMapForEnter()
function! InsertMapForEnter()
    if pumvisible()
        return "\<C-y>"
    elseif strcharpart(getline('.'),getpos('.')[2]-1,1) == '}'
        return "\<CR>\<Esc>O"
    elseif strcharpart(getline('.'),getpos('.')[2]-1,2) == '</'
        return "\<CR>\<Esc>O"
    else
        return "\<CR>"
    endif
endfunction

Explaination:

Приведенный выше код сначала проверяет, используете ли вы Enter, чтобы подтвердить завершение кода, если нет, то при вводе Enter будет отступать {|}. Кроме того, он предоставляет HTML-теги с автоматическим отступом.

Примеры:

if( whatever ){|}

нажмите Enter и вы получите

if( whatever )
{
  |  
}

Это также работает для HTML-файла. Смотрите следующий пример

<html>|<html>

нажмите Enter и вы получите

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