Быстрый отступ нескольких строк в vi


2158

Это должно быть тривиально, и это может даже помочь, но я не могу понять, как с этим справиться. Как быстро сделать отступ в нескольких строках в vi?

Ответы:


2552

Используйте >команду. Для отступа пяти строк 5>>. Чтобы отметить блок строк и сделать отступ, Vjj>выделите три строки (только Vim). Чтобы сделать отступ для блока фигурных скобок, наведите курсор на одну из фигурных скобок и используйте >%или из любого места внутри блока >iB.

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

Кроме того, shiftwidthнастройка позволяет вам контролировать количество пробелов для отступа.


77
Я использую> i} (отступ внутреннего блока {}). Работает в VIM. Не уверен, что это работает в vi.
Р. Мартиньо Фернандес

11
Моя проблема (в gVim) состоит в том, что команда> делает отступ больше, чем 2 пробела (я хочу только два пробела, но> делаю что-то вроде 5 пробелов)
Kamran Bigdely

28
@Kamran: см. shiftwidthНастройки для способа изменить это.
Грег Хьюгилл

4
@MattStevens: Вы можете найти подробное обсуждение этого явления здесь: meta.stackexchange.com/questions/9731/…
Грег Хьюгилл,

5
Я часто делаю отступы визуальных блоков несколько раз подряд, например, фиксирую некоторые теги, вставленные в файл XML. Вместо того, чтобы повторно выбирать блок в визуальном режиме каждый раз, можно использовать «gv» для повторного использования последнего визуального блока. Ссылка superuser.com/questions/220666/…
Дэвид Манн

958

Этот ответ суммирует другие ответы и комментарии на этот вопрос, а также добавляет дополнительную информацию на основе документации Vim и вики- сайта Vim . Для краткости этот ответ не различает команды Vi и Vim.

В приведенных ниже командах «re-indent» означает «отступ строк в соответствии с вашими настройками отступов ». shiftwidthявляется основной переменной, которая контролирует отступы.

Общие команды

>>   Indent line by shiftwidth spaces
<<   De-indent line by shiftwidth spaces
5>>  Indent 5 lines
5==  Re-indent 5 lines

>%   Increase indent of a braced or bracketed block (place cursor on brace first)
=%   Reindent a braced or bracketed block (cursor on brace)
<%   Decrease indent of a braced or bracketed block (cursor on brace)
]p   Paste text, aligning indentation with surroundings

=i{  Re-indent the 'inner block', i.e. the contents of the block
=a{  Re-indent 'a block', i.e. block and containing braces
=2a{ Re-indent '2 blocks', i.e. this block and containing block

>i{  Increase inner block indent
<i{  Decrease inner block indent

Вы можете заменить {на }или B, например, =iBдопустимой командой отступа блока. Посмотрите на «Отступ блока кода» для хорошего примера, чтобы попробовать эти команды.

Кроме того, помните, что

.    Repeat last command

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

Повторный отступ полных файлов

Другая распространенная ситуация требует исправления отступа в исходном файле:

gg=G  Re-indent entire buffer

Вы можете распространить эту идею на несколько файлов:

" Re-indent all your C source code:
:args *.c
:argdo normal gg=G
:wall

Или несколько буферов:

" Re-indent all open buffers:
:bufdo normal gg=G:wall

В визуальном режиме

Vjj> Visually mark and then indent three lines

В режиме вставки

Эти команды применяются к текущей строке:

CTRL-t   insert indent at start of line
CTRL-d   remove indent at start of line
0 CTRL-d remove all indentation from line

Ex команды

Они полезны, когда вы хотите сделать отступ для определенного диапазона строк, не перемещая курсор.

:< and :> Given a range, apply indentation e.g.
:4,8>   indent lines 4 to 8, inclusive

Отступ с использованием маркеров

Другой подход с помощью маркеров :

ma     Mark top of block to indent as marker 'a'

... переместить курсор в конечную позицию

>'a    Indent from marker 'a' to current location

Переменные, которые управляют отступом

Вы можете установить их в своем файле .vimrc .

set expandtab       "Use softtabstop spaces instead of tab characters for indentation
set shiftwidth=4    "Indent by 4 spaces when using >>, <<, == etc.
set softtabstop=4   "Indent by 4 spaces when pressing <TAB>

set autoindent      "Keep indentation from previous line
set smartindent     "Automatically inserts indentation in some cases
set cindent         "Like smartindent, but stricter and more customisable

Vim имеет интеллектуальные отступы, основанные на типе файла. Попробуйте добавить это в ваш .vimrc:

if has ("autocmd")
    " File type detection. Indent based on filetype. Recommended.
    filetype plugin indent on
endif

Ссылки


13
И этот ответ и тот, что выше, были великолепны. Но я добавил +1, потому что он напомнил мне оператор «точка», который повторяет последнюю команду. Это чрезвычайно полезно, когда нужно сделать отступ всего блока на несколько смен (или отступов), не нажимая кнопку >}. Большое спасибо
Amit

1
5 >> Отступ в 5 строк: эта команда делает отступ в пятой строке, а не в 5 строк. Может ли это быть из-за моих настроек VIM или неверная формулировка?
Wipqozn

1
@Wipqozn - Странно. Это определенно выравнивает следующие пять строк для меня, протестировано на Vim 7.2.330.
ire_and_curses

8
> Отступ 42гг от того, где вы находитесь в строке 42.
Стив

Отличное резюме! Также обратите внимание, что «indent inside block» и «indent all block» (<i {> a {и т. Д.) Также работают с круглыми скобками и скобками:> a (<i] и т. Д. (И пока я в этом, в кроме <>, они также работают с d, c, y и т. д.)
2011 г.,

123

Большой выбор будет:

gg=G

Это действительно быстро, и все становится с отступом ;-)


1
У меня есть файл XML и включена подсветка синтаксиса. Печатание gg=Gпросто помещает каждую строку, начиная с позиции 1. Все пробелы были удалены. Есть ли что-то еще специфичное для XML?
спрашивает

2
Я думаю, что set cindentдолжен быть в vimrc или должен запускаться :set cindentперед выполнением этой команды
Amanuel Nega

3
Я думаю, что cindent должен быть установлен первым. и @asgs я думаю, что это работает только для языков программирования cstyle.
Амануэль Нега

110

Также попробуйте это для отступа C-отступа . Есть :help =для получения дополнительной информации:

={

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

Или просто:

==

для автоматического отступа текущей строки.


2
не работает для меня, просто выводит мой курсор на строку над открывающей скобкой «текущий блок кода, в котором я нахожусь».
underscore_d

79

Нажатие клавиш для более визуальных людей:

  1. Войдите в командный режим:
    Escape

  2. Переместитесь в начало области, чтобы сделать отступ:
    hjkl

  3. Начать блок:
    v

  4. Переместитесь в конец области, чтобы сделать отступ:
    hjkl

  5. (Необязательно) Введите желаемое количество уровней отступов
    0..9

  6. Выполните отступ на блоке:
    >


2
Это замечательно, но использует пробелы, а не вкладки. Любой возможный способ исправить это?
Шейн Рустл

12
Если вместо табуляции используются пробелы, то, вероятно, потому, что для отступа задано использование пробелов. знак равно
Кент Фредрик

4
Когда опция 'expandtab' отключена (это значение по умолчанию), Vim использует <Tab> как можно больше, чтобы сделать отступ. (: help:>)
Кент Фредрик

1
Единственная настройка vim, связанная с табуляции / пробелом, которую я изменил: set tabstop = 3. Это фактически вставляет это каждый раз, когда я использую >>: "<tab> <пробел> <пробел>". То же самое с отступом блока. Любые идеи?
Шейн Рустл

3
Три параметра, которые вы хотите просмотреть для «пробелов и вкладок»: 1. tabstop 2. shiftwidth 3. expandtab. Вероятно, у вас есть «shiftwidth = 5 noexpandtab», поэтому «tab» - это 3 пробела, а уровень отступа - «5», поэтому он составляет 5 с 1 табуляцией и 2 пробелами.
Кент Фредрик

66

Мастер всех команд
gg=G

Это отступы всего файла!

Ниже приведены некоторые простые и элегантные команды, используемые для быстрого отступа строк в Vim или gVim.

Для отступа текущей строки
==

Чтобы сделать отступ для всех строк под текущей строкой

=G

Для отступа nстрок ниже текущей строки

n==

Например, чтобы сделать отступ на 4 строки ниже текущей

4==

Чтобы сделать отступ для блока кода, перейдите к одной из фигурных скобок и используйте команду

=%

Это самые простые, но мощные команды для отступа в несколько строк.


3
Это только в vim, нет vi.
Рожомок

3
Не на моем Solaris или AIX, это не так. Ключ равенства всегда был одним из моих стандартных специальных макро назначений. Вы уверены, что не смотрите на vimчто было связано с как vi?
rojomoke

3
Да, в Linux vi почти всегда является ссылкой на vim. Попробуйте запустить команду: ve внутри vi.
rojomoke

4
Мне нравятся такие ответы: четкие, точные и сжатые. Работал для меня в Debian, Джесси. Спасибо, @SJain
digitai

1
Так как я использую vim, а не vi, я очень взволнован, этот ответ здесь. Спасибо.
Дан Ниссенбаум

66

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

Таким образом, введите, maгде вы хотите, верхнюю часть блока с отступом, наведите курсор вниз, сколько вам нужно, и затем введите >'a(обратите внимание, что « a» может быть заменено на любое допустимое имя маркера). Это иногда проще, чем 5>>или vjjj>.


1
Это действительно полезно. Я собираюсь посмотреть, что все работает с этим. Я знаю тебя, а что еще?
user606723

2
Это очень полезно, так как избавляет от необходимости подсчитывать, сколько строк вы хотите сделать отступом.
Зигги

29

Перейти к началу текста

  • нажмите vдля визуального режима.
  • используйте up/ downстрелку, чтобы выделить текст.
  • нажмите, =чтобы сделать отступ для всех выделенных строк.

28

Помимо предлагаемых решений, мне нравится делать вещи по параграфу одновременно с >}


2
Да, и именно поэтому одна из моих больших мозолей - это пробелы в пустой строке: они портят представление Вима о «параграфе».
2011 г.

28

Когда вы выбираете блок и используете >отступ, он отступает и возвращается в нормальный режим. У меня есть это в моем файле .vimrc:

vnoremap < <gv

vnoremap > >gv

Это позволяет вам делать отступы столько раз, сколько вы хотите.


17
Чтобы сделать отступ несколько раз, вы можете просто нажать. повторить предыдущую команду.
sundar - Восстановить Монику

2
Проблема с. В этой ситуации вам нужно двигать пальцами. С помощью решения @ mike (того же, который я использую) вы уже держите пальцы на ключе отступа и можете просто продолжать его, чтобы оставить отступ, а не переключаться и делать что-то еще. Использование периода занимает больше времени, потому что вам нужно двигать руками, и это требует больше размышлений, потому что это вторая, другая операция.
Масукоми

21

Предположим, вы используете 2 пробела для отступа вашего кода. Тип:

:set shiftwidth=2
  • Тип v(чтобы войти в режим редактирования визуального блока)
  • Переместите курсор с помощью клавиш со стрелками (или с помощью h/ j/k / l), чтобы выделить линии, которые вы хотите сделать отступами или отступами.

Затем:

  • Тип > отступ один раз (2 пробела).
  • Тип 2> отступ в два раза (4 пробела).
  • Тип 3> отступ трижды (6 пробелов).
  • ...
  • Введите <один раз, чтобы удалить отступ (2 пробела).
  • Введите 2<в Unindent дважды (4 пробела).
  • Тип 3<для отступа трижды (6 пробелов).
  • ...

Вы поняли идею.

( Пустые строки не получат отступ, что, я думаю, неплохо. )


Я нашел ответ в документации (g) vim для блоков отступов:

:help visual-block
/indent

Если вы хотите дать счет команде, сделайте это непосредственно перед вводом символа оператора: «v {move-around} 3>» (переместите строки на 3 отступа вправо).


18

Прелесть пользовательского интерфейса Vim в том, что он согласован. Команды редактирования состоят из команды и перемещения курсора. Движения курсора всегда одинаковы:

  • Hвверху экрана, Lвнизу, Mк середине
  • n,G чтобы перейти к строке n , Gодин к концу файла, ggк началу
  • nперейти к следующему поисковому совпадению, Nк предыдущему
  • } до конца абзаца
  • % к следующей соответствующей скобке, либо из скобок, либо типа тега
  • enter на следующую строку
  • 'xотметить х, где х буква или другое '.
  • многие другие, в том числе wи Wдля слова, $или 0для кончиков строки и т. д., не применимы здесь, поскольку не являются движениями строки .

Итак, чтобы использовать vim, вы должны научиться перемещать курсор и запоминать набор команд, например, >для отступа (и< отступ).

Таким образом, для отступа строки из позиции курсора в верхней части экрана вы делаете >H, >Gчтобы сделать отступ в нижней части файла.

Если вместо ввода >Hвы набираете , dHто удаляете тот же блок строк, cHчтобы заменить его и т. Д.

Некоторые движения курсора лучше соответствуют определенным командам. В частности, %команда удобна для отступа всего блока HTML или XML. Если для файла выделен синтаксис ( :syn on), установите курсор в тексте тега (например, в «i» элемента <div> и введите>% будет делать отступ до закрывающего тега </ div>.

Вот как работает Vim: нужно помнить только движения курсора и команды, и как их смешивать. Поэтому мой ответ на этот вопрос будет следующим: «перейдите к одному концу блока строк, для которого вы хотите сделать отступ, а затем введите >команду и движение к другому концу блока», если отступ интерпретируется как смещение строк,= если отступ интерпретируется как в симпатичной печати.


2
Я бы сказал, что vi / vim в основном соответствует. Например, D не ведет себя так же, как S и Y! :)
Aqn

14

Сделай это:

$vi .vimrc

И добавьте эту строку:

autocmd FileType cpp setlocal expandtab shiftwidth=4 softtabstop=4 cindent

Это только для файла cpp. Вы можете сделать это для другого типа файла, также просто изменив тип файла ...


13

Вы можете использовать norm iкоманду, чтобы вставить данный текст в начале строки. Чтобы вставить 10 пробелов перед строками 2-10:

:2,10norm 10i 

Помните, что в конце команды должен быть символ пробела - это будет символ, который мы хотим вставить. Мы также можем сделать отступ для строки с любым другим текстом, например, чтобы сделать отступ для каждой строки в файле с пятью символами подчеркивания:

:%norm 5i_

Или что-то еще более причудливое:

:%norm 2i[ ]

Более практический пример - комментирование кода Bash / Python / etc символом #:

:1,20norm i#

Для повторного отступа используйте xвместо i. Например, чтобы удалить первые 5 символов из каждой строки:

:%norm 5x

1
это начинается с левой стороны файла ... не текущая позиция блока
Eliethesaiyan

12

Быстрый способ сделать это с помощью VISUAL MODE использованием того же процесса, что и комментирование блока кода.

Это полезно, если вы предпочитаете не менять shiftwidthили использовать какие-либо setдирективы и достаточно гибки для работы с TABS, SPACES или любым другим символом.

  1. Установить курсор в начале блока
  2. v переключиться на -- VISUAL MODE --
  3. Выберите текст для отступа
  4. Тип, :чтобы переключиться на приглашение
  5. Замена на 3 ведущих пробела:

    :'<,'>s/^/ /g

  6. Или заменить ведущими вкладками:

    :'<,'>s/^/\t/g

  7. Краткое объяснение:

    '<,'> - в пределах визуально выбранного диапазона

    s/^/ /g - Вставьте 3 пробела в начале каждой строки во всем диапазоне

    (или)

    s/^/\t/g- Вставлять Tabв начале каждой строки во всем диапазоне


12

>}или >{отступ от текущей строки до следующего абзаца

<}или <{такой же отступ


11

Мне нравится отмечать текст для отступа:

  1. перейти к началу строки текста, затем введите ma( aэто метка из 'm'ark: это может быть любая буква)
  2. перейти к концу строки текста и набрать mz(опять же, zможет быть любая буква)
  3. :'a,'z>или :'a,'z<будет отступ или отступ (это слово?)
  4. Вуаля! Текст перемещается (пустые строки остаются пустыми без пробелов)

PS: вы можете использовать эту :'a,'zтехнику, чтобы отметить диапазон для любой операции (d, y, s /// и т. Д.), Где вы можете использовать строки, числа или %.


10

:help left

В ex modeвы можете использовать :leftили :leдля выравнивания линий указанного количества. В частности, :leftвыровняйте по левому краю линии в [диапазоне]. Устанавливает отступ в строках на [отступ] (по умолчанию 0).

:%le3или :%le 3 или :%left3или :%left 3выровняет весь файл, добавляя три пробела.

:5,7 le 3 выровняйте строки с 5 по 7, заполнив их тремя пробелами.

:leбез какого-либо значения или :le 0будет выравниваться по левому краю с отступом 0.

Это работает в Vim и gVim.


1
Удивительно, именно то, что я искал (способ вставить определенное количество пробелов - 4 пробела для кода уценки - чтобы переопределить мой обычный отступ). В моем случае я хотел сделать отступ в определенном количестве строк в визуальном режиме, поэтому с помощью shift-v выделите строки, а затем :'<,'>le4вставьте пробелы. Спасибо!
Subfuzion

9

Для меня решение MacVim (Visual) было, выберите с помощью мыши и нажмите «>», но после добавления следующих строк в «~ / .vimrc», так как я люблю пробелы вместо вкладок:

set expandtab
set tabstop=2
set shiftwidth=2

Также полезно иметь возможность вызывать MacVim из командной строки (Terminal.app), так как у меня есть следующий вспомогательный каталог «~ / bin», где я размещаю скрипт с именем «macvim»:

#!/usr/bin/env bash
/usr/bin/open -a /Applications/MacPorts/MacVim.app $@

И, конечно, в "~ / .bashrc":

export PATH=$PATH:$HOME/bin

MacPorts много путается с ~ / .profile, поэтому переменная окружения PATH может быть довольно длинной.


9

5== будет отступать пять строк от текущей позиции курсора.

Таким образом, вы можете ввести любой номер раньше ==. Это будет отступать количество строк. Это в командном режиме.

gg=G будет отступать весь файл сверху вниз.


9

Я не нашел метод, который я использую в комментариях, поэтому я поделюсь им (я думаю, только Vim):

  1. Esc войти в командный режим
  2. Перейти к первому символу последней строки, для которой вы хотите сделать отступ
  3. Ctrl+ Vдля начала выбора блока
  4. Перейти к первому символу первой строки, которую вы хотите сделать отступом
  5. Shift+ Iдля входа в специальный режим вставки
  6. Введите столько пробелов / табуляций, сколько нужно для отступа (например, два
  7. Нажмите Escи пробелы появятся во всех строках

Это полезно, если вы не хотите изменять настройки отступа / вкладки vimrcили запоминать их для изменения во время редактирования.

Чтобы удалить отступ, я использую тот же самый блок Ctrl+ Vвыбор, чтобы выделить пробелы и удалить его с помощью D.


9

Я не знаю, почему так сложно найти простой ответ, как этот ...

Мне самому пришлось много бороться, чтобы узнать это. Это очень просто:

  • Отредактируйте ваш .vimrcфайл в домашнем каталоге.
  • Добавить эту строку

    set cindent
    

    в вашем файле, где вы хотите сделать отступ правильно.

  • В нормальном / командном режиме типа

    10==   (This will indent 10 lines from the current cursor location)
    gg=G   (Complete file will be properly indented)
    

8
:line_num_start,line_num_end>

Например,

14,21> shifts line number 14 to 21 to one tab

Увеличьте символ «>» для большего количества вкладок.

Например,

14,21>>> for three tabs

1
Существует много способов решить эту проблему, но это проще всего реализовать, так как номера строк по умолчанию отображаются в vim и не требуют математических операций.
HoldOffHunger

@HoldOffHunger Номера строк не отображаются по умолчанию. Вам нужно использовать :set numberдля переключения номеров строк ( по умолчанию они отключены ) или ввести set numberваш vimrc.
DryLabRebel

7

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

Например, V5j3>три строки отступят пять раз - это 12 пробелов, если вы используете четыре пробела для отступов.


7

Чтобы сделать отступ для каждой строки в типе файла, Escа затем G=gg.


6

Как сделать отступ для выделенного кода в vi сразу по нескольким пробелам:

Вариант 1. Отступ блока кода в vi от трех пробелов в режиме Visual Block:

  1. Выберите блок кода, который вы хотите сделать отступ. Сделайте это с помощью Ctrl+Vобычного режима и используйте стрелки вниз для выбора текста. Пока он выбран, введите, :чтобы дать команду блоку выделенного текста.

  2. В командной строке появится следующее: :'<,'>

  3. Чтобы установить отступ в три пробела, введите le 3и нажмите ввод. Вот что появляется::'<,'>le 3

  4. Выделенный текст сразу же отступает в три пробела.

Вариант 2. Отступ блока кода в vi от трех пробелов в режиме Visual Line:

  1. Откройте свой файл в vi.
  2. Наведите курсор на код
  3. Перейдите в обычный режим и нажмите следующие клавиши:

    Vjjjj:le 3
    

    Интерпретация того, что вы сделали:

    V означает начать выделять текст.

    jjjj стрелки вниз на четыре строки, выделяя четыре строки.

    : говорит vi, что вы введете инструкцию для выделенного текста.

    le 3 означает отступ выделенного текста на три строки.

    Выбранный код сразу увеличивается или уменьшается до трех пробелов.

Вариант 3: используйте режим Visual Block и специальный режим вставки для увеличения отступа:

  1. Откройте свой файл в vi.
  2. Наведите курсор на код
  3. Находясь в обычном режиме, нажмите следующие клавиши:

    Ctrl+V

    jjjj
    

    (нажмите пробел пять раз)

    Esc Shift+i

    Весь выделенный текст имеет отступ в пять дополнительных пробелов.


6

Я использую блочный режим визуального выбора:

  • Перейти к передней части блока для перемещения (вверху или внизу).
  • Нажмите Ctrl+, Vчтобы войти в режим визуального блока.
  • Перейдите, чтобы выбрать столбец перед строками.
  • Нажмите I( Shift+ I), чтобы войти в режим вставки.
  • Введите несколько пробелов.
  • Нажмите Esc. Все линии будут смещены.

Это не однозадачность. Оно работает:

  • Посередине строк.
  • Вставить любую строку во все строки.
  • Чтобы изменить столбец (используйте cвместо I).
  • дергать, удалять, заменять и т.д ...

Это громоздко, но это путь, если вы выполняете форматирование вне основного VIM (например, используя vim-prettierвместо механизма отступа по умолчанию). В >противном случае использование по-королевски улучшит форматирование, выполненное Преттиером.
oligofren

Забавно, я нахожу это совсем не громоздким. Это не однозадачник! Изучение этого метода имеет много применений, кроме отступов.
sqqqrly

Я нахожу это лучше, чем принятый ответ, так как я вижу, что происходит, линии, которые я выбираю, и действие, которое я делаю, а не просто набираю какое-то заклинание vim.
user4052054

5
  • Для блока кода {}: =+%

  • Для выбранной строки: Shift+ vвыберите с помощью клавиш со стрелками вверх / вниз, а затем нажмите =.

  • Для всего файла: gg+ =+G

Примечание: «gg» означает переход к строке 1, «=» - команда отступа, а «G» перемещает курсор в конец файла .


4

Чтобы сделать отступ для всего файла на четыре:

esc 4G=G

3
...что? 'отступ на 4 пробела'? Нет, это переходит к строке 4, а затем делает отступ от всего до конца файла, используя текущий выбранный режим отступа (если есть).
underscore_d

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.