Vim отступы в скобках - PullRequest
       4

Vim отступы в скобках

3 голосов
/ 22 ноября 2011

В vim (например, 7.3), как я могу использовать / изменить параметры cindent или smartindent, или как-то иначе увеличить мой .vimrc, чтобы автоматически вставлять фигурные скобки в открытых скобках для выравнивания с первыми »слово "(определено позже), непосредственно предшествующее открытию (?

Параметр fN выглядит многообещающим, но, по-видимому, переопределяется параметром (N в открытых скобках.С :help cinoptions-values:

fN    Place the first opening brace of a function or other block in
      column N.  This applies only for an opening brace that is not
      inside other braces and is at the start of the line.  What comes
      after the brace is put relative to this brace.  (default 0).

        cino=           cino=f.5s       cino=f1s
          func()          func()          func()
          {                 {                 {
              int foo;          int foo;          int foo;

Текущее поведение:

func (// no closing ) 
      // (N behavior, here N=0      
      {    // (N behavior overrides fN ?
        int foo; // >N behavior, here N=2 

, пока я желаю:

func (// no closing )   
      // (N behavior as before   
{ // desired behavior
  int foo; // >N behavior still works

Что я спрашиваюfor это отличается от fN, потому что fN выравнивается с преобладающим отступом, и я хочу выровнять к любому C ++ nested-name-specifier, который непосредственно предшествует открытию (, например

code; f::g<T> (         instead of         code; f::g<T> (
      {                                    { 

Если нет nested-name-specifier, я бы хотел, чтобы оно совпадало с (.Возможно, сопоставление nested-name-specifier слишком сложно, или, может быть, есть другая часть грамматики, которая больше подходит для этого сценария.В любом случае, для моего типичного случая использования, я думаю, я был бы удовлетворен, если бы { совпал с первым непробельным символом максимальной последовательности символов слева от самого внутреннего незамкнутого ( включительно, который не содержит никакихточки с запятой или левые фигурные скобки }.

Кстати, я пришел к этому, пытаясь автоматически добавлять различные конструкции std::for_each(b,e,[]{}); в vim7.3.Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 17 сентября 2014

Не уверен, что любая из функций отступа {auto, smart, c} может быть найдена, чтобы делать то, что вы хотите.Я составил карту, которая может дать некоторое вдохновение:

inoremap ({ <esc>T<space>y0A<space>(<cr><esc>pVr<space>A{

Недостатки в том, что вам может потребоваться сделать что-то более умное, чем «T», чтобы вернуться к началу последнего идентификатора (вы могли бы использовать «?'с регулярным выражением), что он уничтожает ваш регистр по умолчанию, и что если ваш идентификатор перед паренем находится в начале строки, которую вы должны сделать' ({'самостоятельно. Идея состоит в том, чтобы вернуться назад непосредственно перед идентификатором,скопируйте в начало строки, вставьте ее в следующую строку и замените каждый символ пробелом.

Удачи!

...