Может ли Vim определить, стоит ли ставить точку с запятой в конце? - PullRequest
1 голос
/ 14 марта 2020

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

Я хочу, чтобы Vim мог различать guish между массивом и Например, оператор if.

Итак, когда я набираю

int arr[] = {1, 2}; // Vim should be able to determine that it is an array and then prepend the semicolon at the end

if ( ... ) { } // Vim should be able to determine that the if-statement doesn't need a semicolon at the end

Возможно ли это с помощью Vim?

Ответы [ 4 ]

1 голос
/ 16 марта 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 .

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

Я не проверял это ни с какими плагинами.

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

В lh-скобках , я частично делаю это, когда открывающиеся фигурные скобки набираются в той же строке, что и декларация struct, class, union или enum.

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

" in after/ftplugin/c/c_brackets.vim
" NB: that's how bracket mappings are defined for insert, normal and visual modes
:Brackets { } -default -visual=0 -insert=1
    \ -open=function('lh#cpp#brackets#curly_open')
    \ -clos=function('lh#cpp#brackets#curly_close')

" in autoload/lh/cpp/brackets.vim
function! lh#cpp#brackets#curly_open() abort
  let c = col('.') - 1
  let l = getline('.')
  let l = strpart(l, 0, c)
  let close =  l =~ 'struct\|class\|enum\|union' ? '};' : '}'
  if lh#brackets#usemarks()
    return '{!cursorhere!'.close.'!mark!'
  else
    return '{!cursorhere!'.close
  endif
endfunction

Как вы Можно увидеть анализ довольно просто c. Это может быть улучшено.

Теперь, хотя ваша идея обоснована для вашего примера, на самом деле это довольно сложно сделать правильно. Я вижу несколько других ситуаций, которые нелегко отличить guish от Vim:

  • N массивов измерений (int t[2][2] = { {1,2}, {3,4}};)
  • C ++ 11 единорог синтаксис инициализации (std::complex<double> i{0,1};)
  • C ++ 11 лямбда-определений (auto pred = [](int i){ return i < 42};)
  • C ++ 11 прямое лямбда-использование (auto it = std::find_if(beg, end, [](int i){ return i < 42});)
  • встроенные искусственные прицелы

Вот почему я не трачу время на расширение этой функции. Для анализа текущего контекста требуется нечто большее, чем просто регулярные выражения.

PS: Это можно легко переопределить, вызвав :Brackets в файле ~/.vim/after/ftplugin/c_brackets.vim, где вы определяете свой собственный хук для {.

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

Я думаю, это было бы возможно, используя ultisnips . Создайте фрагмент с именем arr . Вы бы печатали еще быстрее.

snippet arr "inserts an array" w
${1:int} arr[] = {${2:your values}};
endsnippet

Конечно, вы можете менять заполнители так, как хотите

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

Это было запрошено ранее и отклонено автором автопар.

https://github.com/jiangmiao/auto-pairs/issues/69

В выпуске упоминается другой плагин, delimitMate , который, очевидно, поддерживает эту функцию, установив b:delimitMate_eol_marker, возможно для каждого типа файла. Я не проверял, соответствует ли он вашим требованиям (особенно пропускает его после блока на if или while.)

Если это вас интересует, вы можете попробовать этот плагин .

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