Как вставить пробелы до столбца X, чтобы выровнять вещи в Столбцах?
у меня есть исходный код для операторов копия записывается следующим образом.
foo = rhs.foo;
foobar = rhs.foobar;
bar = rhs.bar;
toto = rhs.toto;
Я хотел бы выстроить вещи следующим образом (более читаемый человек, не так ли?).
foo = rhs.foo;
foobar = rhs.foobar;
bar = rhs.bar;
toto = rhs.toto;
есть ли Vim magic insert-up-to-column-N или что-то в этом роде, что позволило бы мне выровнять вещи, используя пару нажатий клавиш на строку?
7 ответов:
есть хороший плагин, который делает именно это и многое другое, называется выровнять.ВИМ
в вашем случае вам нужно будет выбрать выражение, а затем ввести
:Align =
. Он будет выравнивать все, используя=
в качестве разделителя и ссылка.(есть много вариантов, чтобы выровнять, влево, вправо, циклически и т. д.)
вы также можете проверить "таблица".ВИМ, который имеет аналогичные функции. Смотрите скринкаст здесь для a демонстрация.
другие ответы здесь велики, особенно комментарий @nelstrom для табличного.ВИМ и его отличный скринкаст.
но если бы я чувствовал себя слишком ленивым, чтобы установить какие-либо плагины Vim, но как-то готов использовать макросы Vim, я бы использовал макросы.
алгоритм:
For each line, Add tons of spaces before the symbol = Go to the column you want to align to Delete all text up to =, thereby shifting the = into the spot you want.
для примера
foo = rhs.foo; foobar = rhs.foobar; bar = rhs.bar; toto = rhs.toto;
поместите курсор в любом месте на первой строке и запишите макрос для этой строки, введя, в обычном режиме режим:
qa0f=100i <Esc>8|dwjq
что переводится как:
qa
-- запишите макрос в горячую клавишуa
0
-- перейти к началу строкиf=
-- перейти к первому знаку равенства100i <Esc>
-- (есть один пробел послеi
и<Esc>
означает, что нажмите escape, не набирайте "".) Вставка 100 мест 8|
-- перейти к 8-й колонке (Извините, вам придется вручную вычислить из какого столбца выравнивать)dw
-- удалить до следующего символа без пробелаj
-- перейти к следующей строкеq
-- остановить запись.затем запустите макрос, хранящийся в горячей клавише
a
, 3 раза (для 3 оставшихся строк), поставив курсор на вторую строку и нажав:3@a
если вы используете unix-подобную среду, вы можете использовать инструмент командной строки
column
. Отметьте свои линии с помощью визуального режима, затем::'<,'>!column -t
это вставляет выделенный текст в stdin команды после
'<,'>!
. Обратите внимание, что'<,'>!
вставляется автоматически при нажатии:
в визуальном режиме.
быстрый и простой способ продолжить-добавить X пробелов, а затем удалить обратно в столбец X. Например, если X=40, введите
40a<Space><Esc>d40|
мы можем использовать эти две функции, которые я описал в приведенном ниже пути для одного и того же сценария:https://stackoverflow.com/a/32478708/3146151
просто поместите эти две функции в свой .vimrc или .gvimrc и вызывать эти функции как обычный вызов функции в Редакторе, когда вы хотите.
функции я разместил его здесь:https://github.com/imbichie/vim-vimrc-/blob/master/MCCB_MCCE.vim
мы должны назвать это функция в Редакторе vim и дать номер вхождения символа или пространства, которое вы хотите переместить и символ внутри " и номер столбца.
число вхождений может быть от начала каждой строки (функция MCCB) или может быть в конце каждой строки (функция MCCE).
для приведенного выше примера, упомянутого в вопросе, мы можем использовать функцию MCCB и символ, который мы можем использовать '=', поэтому использование будет похоже на это в vim редактор.
:1,4call MCCB(1,'=',8)
Так что это будет Шаг первый
=
войдите в 8-й столбец от строки № 1 до 4.функции :
" MCCB - Move the Character to the Column from the Begin of line " This is a function for Moving the specified Character " in a given range of lines to a the specified Column from the Begin of the line " NOTE 1 :- If the specified character and the first character of the line are same " then the number of Occurance (num_occr) will be one less than the actual " NOTE 2 :- Maximum space between the specified character with in the range " of lines should be less than or equal to 80, if we need more than 80 " then we need to insert more spaces by increasing the value 80 in the " "nmap s 80i <ESC>" line inside the function " Usage :- in command mode do it like below " Eg 1:- :5,11call MCCB(1, '=', 8) " The above command will move the 1st Occurance from the begin of Character = " to the 8th Column of the lines from 5 to 11 " Eg 2 :- :7,10call MCCB(2, '+', 12) " The above command will move the 2nd Occurance of Character = to the 12th " Column of the lines from 7 to 10 function! MCCB (num_occr, mv_char, col_num) range if (a:firstline <= a:lastline) nmap s 80i <ESC> let line_num = a:firstline while line_num <= a:lastline execute "normal " . line_num . "G0" . a:num_occr . "f" . a:mv_char . "s" . a:col_num . "|dw" let line_num = line_num + 1 endwhile nunmap s else execute printf('ERROR : Start line %d is higher thatn End line %d, a:firstline, a:lastline) endif endfunction " MCCE - Move the Character to the Column from the End of line " This is a function for Moving the specified Character " in a given range of lines to a the specified Column from the End of the line " NOTE 1 :- If the specified character and the last character of the line are same " then the number of Occurance (num_occr) will be one less than the actual " NOTE 2 :- Maximum space between the specified character with in the range " of lines should be less than or equal to 80, if we need more than 80 " then we need to insert more spaces by increasing the value 80 in the " "nmap s 80i <ESC>" line inside the function " Usage :- in command mode do it like below " Eg 1:- :5,11call MCCE(1, ';', 20) " The above command will move the 1st Occurance from the End of Character ; " to the 20th Column of the lines from 5 to 11 " Eg 2 :- :7,10call MCCE(5, 'i', 26) " The above command will move the 5th Occurance from the End of Character i " to the 26th Column of the lines from 7 to 10 function! MCCE (num_occr, mv_char, col_num) range if (a:firstline <= a:lastline) nmap s 80i <ESC> let line_num = a:firstline while line_num <= a:lastline execute "normal " . line_num . "G$" . a:num_occr . "F" . a:mv_char . "s" . a:col_num . "|dw" let line_num = line_num + 1 endwhile nunmap s else execute printf('ERROR : Start line %d is higher thatn End line %d, a:firstline, a:lastline) endif endfunction