Повторне відступ коду з відступом


39

Мені подобається функція розумного відступу Vim, вона дозволяє мені створювати добре відрізні кодові блоки.

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

Що було б ідеально - це "повторна обробка" коду через систему розумного відступу.

Чи таке можливо?

Наприклад, як би ви "виправили" такий код (витяг із більшого блоку - я не хочу виправляти кожен рядок вручну ...):

    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" ;
                }
        }

1
Ви говорите про вставку коду, який спочатку був погано відрізаний або правильно відрізаний код, який змінюється, коли ви вставляєте його у Vim?
Jamessan

Початок вставленого коду з поганим відступом. Дозвольте включити приклад ....
rolfl

Відповіді:


48

Я роблю це одним із двох способів.

Паста з коригуванням відступу

По-перше, якщо код у буфері відформатований, але на іншому рівні відступу, я використовую ]pзамість p, який вставляє код таким, який є, але з відступом зміщеним таким чином, що перший вставний рядок має ту саму глибину, що і рядок I я на.

Джерело EG скопійовано в буфер

while (1) {
    dostuff();
}

Результат EG, вставивши його ]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 Просто для уточнення, це backtick-bracket-v-backtick-bracket?
phatskat

1
так .. textarea
вибухнула ззаду

Оператор = vim переформатує код на основі налаштованих правил форматування, я б дав +100, якщо зможу. Я міг би врятувати дні.
Wossname

1
Я використовую <control + R> "для вставки, щоб мені не довелося виходити з режиму вставки. Що таке] p еквівалент <control + R>"?
A --- B

15

=Команда може бути використана для створення відступу.

Як і більшість команд звичайного режиму, він може бути застосований до руху, тому ви можете нагадати щойно вставлений код =']. Це нагадує від поточного положення курсору до ']позначки, яка є останнім рядком вставки.

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

Ще одна корисна команда ]p, яка вставляє на той же рівень відступу, що і поточний рядок. Це може допомогти вставити належним чином відступний текст, хоча на різній глибині відступу, відповідно до навколишнього тексту.


7

Використання =ap (mnemonic - "форматування абзацу") матиме спробу vim автоматичного форматування поточного абзацу.

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


4

Щоб повторно нагадати файл, який уже знаходиться в буфері, використовуйте gg=G: Див. Розділ Виправлення відступу

Для повторного нагадування частини файлу до =фільтра можна застосувати різні межі (наприклад, ==фіксує лише поточний рядок).

Щоб відступ не змінився під час вставки тексту, який ви зможете :set pasteперед тим, як вставити текст у буфер, це запобіжить автоматичному відступ тексту, який ви тільки що вставили. Після вставки матеріалів ви можете повернутися, set :nopasteколи закінчите. Дивіться vimdoc тут .

Якщо вам здається часто вставляти речі, було б корисно скористатися цією порадою на VimWiki та встановити ключ для перемикання "режим вставки", додавши ці рядки до свого .vimrc:

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

Потім ви можете натиснути, <F2>щоб переключити режим вставки. vim покаже слова "PASTE" у рядку статусу, коли активований режим вставки.


2
Це питання не про вставлення коду з відступом, а про виправлення погано відрізаного коду.
rolfl

4
Я не побачив коментар, який ви опублікували. Однак ви все одно можете використовувати gg=Gдля повторного введення всього файлу.
Bhargav Bhat

@rolfl Ось, як правило, я починаю в таких випадках:, gg=Gтоді подивіться на частини, які vimвийшли з ладу.
муру

Якщо ви хочете отримати більше контролю (або зменшити повторне клопотання), подумайте про додавання автоматичної команди, щоб викликати інструмент форматування коду, наприклад, astyleколи ви зберігаєте буфер. Дивіться це питання на SO для деталей.
Bhargav Bhat

2

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

Якщо це не спрацює, як очікувалося, для зменшення відступу вручну ( застарілого ) спробуйте <%повторити з .(якщо необхідно). Використовуйте >%для протилежного.

Так:

else
       {
         // some code
       }

стає:

else
{
  // some code
}

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

  • == для повторного відступу поточного рядка
  • 5== повторне відступ 5 рядків

Щоб збільшити / зменшити відступ вручну на один рядок або кілька рядків, спробуйте:

  • << для відміни відрізу поточного рядка пробілами зсуву
  • 5<< для відміни 5 рядків за допомогою пробілів у ширині
  • >> відступити поточний рядок пробілами зрушення
  • 5>> відступити 5 рядків за пробілами зі зрушенням
  • . повторити, якщо потрібно

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

Ще одна хитрість полягає в правильному відступу всього файлу з допомогою: gg=G.

Якщо ви маєте вкладки замість пробілів, використовуйте: :retabкотрий замінить усі вкладки пробілами (див. Як замінити вкладки пробілами? ).


Для зовнішніх методів можна спробувати:

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

    :%!pythonTidy
    

Пов'язані:



1

У існуючих відповідях вже багато речей. Мені просто подобається додати одне відображення, яке я дуже часто використовую для відступу.

nnoremap <Leader>i  mzgg=G`z

Я бачив деякі vimrc з цим картографом ===.

У будь-якому випадку це велике відображення, і я використовую це майже кожного разу, особливо коли вставляти код, скопійований з іншого місця.

Або ще краще поставити це autocmdтак, щоб Vim відступив його перед тим, як записати зміни на диск.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.