Автоматический отступ не выполняется при использовании «cc», «S» или «] p» в пустой строке - PullRequest
2 голосов
/ 21 августа 2011

Если я попробую "cc" или "S", когда курсор "|" находится в следующей позиции ...

public function blah()
{
    var i = 0;
|
    i++
    return i;
}

... он остается в 1-м столбце вместо перемещения под v в "var". Паста с "] p" также пасты, начиная с колонки 1.

Моя настройка: autoindent, smartindent, nocindent, indentexpr= в MacVim, если это помогает.

Согласно следующим вопросам SO, возможен правильный отступ:
Vim: Умный отступ при переходе в режим вставки в пустой строке?
Vim: отступ текущей (пустой) строки и вставить
Автоиндент в vim всегда очищает строку, если в ней только пробел, могу ли я это изменить?

В последнем сообщении trVoldemort имел ту же проблему (см. Комментарии ко второму ответу).

Ответы [ 4 ]

2 голосов
/ 21 августа 2011

Из руководства:

                            *cc*
["x]cc          Delete [count] lines [into register x] and start
                insert |linewise|.  If 'autoindent' is on, preserve
                the indent of the first line.

                            *S*
["x]S           Delete [count] lines [into register x] and start
                insert.  Synonym for "cc" |linewise|.

Поскольку удаляемая строка не имеет отступа, этот отступ сохраняется.Если вы вставите пробелы в эту строку, чтобы $ поместил ваш курсор здесь:

public function blah() {
    var i = 0;
    |
    i++
    return i;
}

, затем нажмите 0 , чтобы вернуться к первому столбцу, и, наконецнажмите S , вы получите желаемый результат.

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

:nnoremap cc ddko
:nnoremap S ddko

Эти dd удаляют текущую строку, k перемещаются на предыдущую строку, o открыть ввод в следующей строке (используя smartindent для ввода отступа).

1 голос
/ 22 августа 2011

Можно явно автоматически выравнивать строки перед применением cc, S или ]p, как в следующие сопоставления.

:nnoremap <leader>cc i.<esc>==S
:nnoremap <leader>]p ]p`[v`]=

Вообще говоря, эффект команд = и == не совсем такой же, как эффект применения опции autoindent к cc или ]p (особенно в случае пользовательского equalprg), но в результате поведение, кажется, соответствует вашему описание.

1 голос
/ 22 августа 2011

Включить cindent ...

:set cindent

Это работает для отступов с "cc" и "S", если язык имеет отступ, аналогичный C (или поддерживает cindent).

Однако при этом вставка смарт-отступа (]p) все еще не работает в пустой строке.Для этого переназначим ]p следующим образом:

:nnoremap ]p oX<Esc>]pk"_dd

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

Также можно переназначить альтернативные версии пасты smart-indent:

:nnoremap ]P OX<Esc>]pk"_dd
:vnoremap ]p "_xkoX<Esc>]pk"_dd
:vnoremap ]P "_xkoX<Esc>]pk"_dd
0 голосов
/ 22 августа 2011

Когда я использую :filetype indent on, нажатие cc в этой строке делает отступ правильно.

...