Повторный отступ плохо с отступом кода

39

Мне нравится функция интеллектуального отступа в Vim, которая позволяет создавать хорошо кодированные блоки кода.

Я регулярно копирую / вставляю код в буферы, но этот код часто плохо отформатирован.

Что было бы идеально, так это «переработать» код через систему smart-indent.

Это возможно?

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

    else 
                {
                        m[c] = 5;
                Finished = true;
std::cout<<"(ID,R,E)"<<"-->"<<"("<<g[c]<<","<<r[c]<<","<<E1 <<")"<< std::endl;
std::cout << "\n"<<"finish-->" << r[c] << "\t" <<"E1-->"<< E1 <<"\n" ;
                }
        }
rolfl
источник
1
Вы говорите о вставке кода, который изначально был плохо или с отступом, который изменяется, когда вы вставляете его в Vim?
Jamessan
Вставленный код плохо отступ с самого начала. Позвольте мне привести пример ....
rolfl

Ответы:

48

Я делаю это одним из двух способов.

Отрегулировать отступ

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

EG источник скопирован в буфер

while (1) {
    dostuff();
}

Например, результат вставки ]p

int myfunc() {
    int i = 5; /* Cursor on this line before paste */
    while (1) {
        dostuff();
    }
 }

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

Переформатировать после вставки

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

Для больших вставок я использую тот факт, что курсор переходит на первую вставленную строку и что vim говорит что-то вроде «еще 84 строки». Затем я могу ввести, 84==чтобы переформатировать эти 84 строки (конечно, замените 84 тем количеством строк, которое вы фактически вставили).

Ссылки

:help ]p для скорректированной пасты

:help =крышки ={motion}, [count]==и {Visual}=для фильтрации через обычай или правила отступа встроенных

Джон О'М.
источник
6
Вы можете красиво выбрать код, который вы вставили в визуальном режиме, используя `[v`]
craigp
1
@Badger Просто чтобы уточнить, это обратная скобка-скобка-скобка?
phatskat
1
да ... текстовая область взбесилась из-за обратных черт, поэтому я не мог поместить это в блок кода: P
craigp
Оператор = в vim переформатирует код на основе настроенных правил форматирования, которые я бы дал +100, если бы мог. Я мог бы сэкономить дни.
Wossname
1
Я использую <control + R> "для вставки, так что мне не нужно выходить из режима вставки. Что является эквивалентом] p для <control + R>"?
A --- B
15

Команда =может быть использована для повторного отступа.

Как и большинство команд в обычном режиме, его можно применить к движению, чтобы вы могли переименовать только что вставленный код =']. Это переопределяет от текущей позиции курсора до ']метки, которая является последней строкой вставки.

= также может быть использован из визуального режима.

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

jamessan
источник
7

Использование =ap (мнемоника - это «форматировать абзац») приведет к попытке vim автоматически отформатировать текущий абзац.

Если вы хотите обратить пристальное внимание на то, что вы потенциально можете переформатировать, вам может показаться более разумным и быстрым использование vapдля визуального выбора текущего абзаца (что дает вам визуальное представление о том, что переформатируется), а затем =. Я нахожу это полезным в файлах, где я знаю, что vim будет переформатировать неправильно, и я не хочу ошибочно форматировать другие строки.

davidlowryduda
источник
4

Чтобы повторно сделать отступ для файла, уже находящегося в буфере, используйте gg=G: См. Fix Indentation

Для перерасчета части файла к =фильтру могут быть применены различные границы (например, ==фиксирует только текущую строку).

Чтобы сохранить отступ без изменений при вставке текста, который вы можете сделать :set pasteперед вставкой текста в буфер, это предотвратит автоматическую вставку в vim текста, который вы только что вставили. После вставки, вы можете вернуться, используя, set :nopasteкогда вы закончите. Смотрите Vimdoc здесь .

Если вы часто вставляете что- то, было бы неплохо использовать этот совет в VimWiki и установить ключ для переключения «режим вставки», добавив следующие строки в .vimrc:

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode

Затем вы можете нажать, <F2>чтобы переключить режим вставки. vim покажет слова «PASTE» в строке состояния, когда активен режим вставки.

Бхаргав Бхат
источник
2
Этот вопрос не о вставке кода с отступом, а об исправлении плохо зарезервированного кода.
rolfl
4
Я не видел ваш комментарий. Тем не менее, вы все равно можете использовать gg=Gдля повторного отступа всего файла.
Бхаргав Бхат
@rolfl Вот где я обычно начинаю в таких случаях: gg=Gзатем посмотри, какие части vimошиблись.
Муру
Если вы хотите больше контроля (или уменьшить количество повторяющихся хлопот), подумайте о добавлении автоматической команды для вызова инструмента форматирования кода, как astyleпри сохранении буфера. Смотрите этот вопрос на SO для деталей.
Бхаргав Бхат
2

Для автоматического повторного отступа всего блока в скобках или скобках поместите курсор на ту же строку, где находится скобка, и попробуйте =%. Чтобы изменить ширину смещения, используйте, например :set sw=2.

Если это не сработает, как ожидалось, для уменьшения отступа вручную ( outdent ), попробуйте <%и повторите с .(при необходимости). Используйте >%для противоположного.

Так:

else
       {
         // some code
       }

будет выглядеть так:

else
{
  // some code
}

Для конкретного кода, чтобы автоматически переопределить одну или несколько строк, попробуйте:

  • == переопределить текущую строку
  • 5== сделать отступ в 5 строк

Чтобы увеличить / уменьшить отступ вручную для одной или нескольких строк, попробуйте:

  • << для отступа текущей строки по пробелам смещения
  • 5<< отступить 5 строк по ширине смещения
  • >> сделать отступ для текущей строки по пробелам смещения
  • 5>> сделать отступ в 5 строк по ширине
  • . повторить при необходимости

Вы также можете сделать отступ в визуальном режиме ( v), выбрав текст и нажав =(авто-отступ), <(де-отступ) или >(отступ).

Еще одна хитрость заключается в правильном отступа всего файла с помощью: gg=G.

Если у вас вместо табуляции есть табуляция, используйте: :retabкоторая заменяет все табуляции пробелами (см. Как заменить табуляцию пробелами? ).


Для внешних методов вы можете попробовать:

  • pythonTidy для переформатирования кода Python, например:

    :%!pythonTidy
    

Связанный:

kenorb
источник
1

Я недавно установил vim-pasta ( https://github.com/sickill/vim-pasta ), и это, кажется, улучшает отступ кода при вставке. В README также есть хорошее обсуждение различных стратегий вставки кода.

Роб Уорнер
источник
1

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

nnoremap <Leader>i  mzgg=G`z

Я видел некоторый vimrc с этим сопоставленным ===.

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

Или, что еще лучше, вставьте это autocmdтак, чтобы Vim делал отступ перед тем, как записать изменения на диск.

Дурга Сваруп
источник