Закрывающая скобка Vim (без использования плагина) действует иначе, когда я нажимаю ввод или когда я не нажимаю ввод сразу после первой скобки - PullRequest
1 голос
/ 06 марта 2020

Как я могу добиться следующего поведения автоматического закрытия скобок в Vim 8 без внешних плагинов?

Если я использую

inoremap { {};<Left><Left>

, тогда, если я введу

int array[2] = {

он будет автоматически работать правильно, разместив}; а также помещая курсор в скобки.

Но я хочу, чтобы при работе со структурами я хотел, чтобы после нажатия первой клавиши сразу после ввода первой скобки происходило следующее:

struct test {
    | <- cursor is here
};

Что я должен изменить, чтобы достичь обоих поведений, показанных выше в Vim 8?

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Часть «использование внешних плагинов» сложная.

Чтобы получить желаемое поведение, вам нужно inoremap ключ <CR>, возможно, с использованием сопоставления <expr>, который будет смотреть на символ под курсором, посмотреть, является ли он }, и, в этом случае, переместить его на две строки вниз, удалить отступ этой строки (только если первый был с отступом), go сделать резервную копию одной, повторно -поставить отступ ...

И если это не }, то просто ведите себя как обычный <CR> (эта часть проста с отображением <expr>.)

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

Если Вы хотите что-то действительно простое:

inoremap <expr> <CR>
    \ getline('.')[col('.')-1]=='}'
    \ ? "\<CR>\<C-d>\<C-o>O" : "\<CR>"

Он использует <CR> с последующим CTRL-D для отступа }, затем CTRL-O для использования команды O normal mode, которая вставляет новую строку над этой. (Используя O здесь, чтобы получить правильный отступ.)

Но, как уже упоминалось, это не всегда будет работать так, как ожидалось. Это очень просто.

А затем вы захотите исправить backspace или исправить это так, что когда вы наберете }, если вы уже наберете }, вы пропустите это ... Вы ' Вам понадобится плагин, поверьте мне!

0 голосов
/ 15 марта 2020

Как насчет добавления этого в ваш файл ftplugin:

function! CloseBracket()
        if getline('.') =~ '^struct\s\w\+\s'
                return "{}\<left>\<cr>\<c-o>O\<tab>"
        endif
        return "{};\<left>\<left>"
endfunction

inoremap { <C-R>=CloseBracket()<CR>

Так, когда { нажимается в режиме вставки, мы вставляем содержимое регистра , затем = заявляет, что мы хотим использовать регистр выражений, который в данном случае является функцией CloseBracket .

Функция, которая сама получает текущую строку и выполняет некоторое regex, чтобы увидеть, является ли строка определением структуры, если это так, она выполняет некоторую сложную работу по запросу, в противном случае она просто закрывает скобки и перемещает курсор влево.

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