Как вставить пробелы до столбца 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-up-to-column-N или что-то подобное, что позволит мне выстраивать строки с помощью нескольких нажатий клавиш на строку?
Ответы
Ответ 1
Есть хороший плагин, который делает именно это и многое другое, называемое Align.vim
В этом случае вам нужно будет выбрать свое выражение, а затем введите :Align =
. Он будет выравнивать все, используя =
как разделитель и ссылку.
(Существует множество вариантов выравнивания, слева, справа, циклически и т.д.)
Вы также можете проверить Tabular.vim, который предоставляет аналогичные функции. Смотрите демонстрационную версию для демонстрации.
Ответ 2
Другие ответы здесь замечательные, особенно комментарий @nelstrom для Tabular.vim и его отличный скринкаст.
Но если бы я чувствовал себя слишком ленив, чтобы установить какие-либо плагины 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, не наберите "<Esc> ".) Вставьте 100 пробелов
-
8|
- Перейдите в 8-й столбец (извините, вам придется вручную определить, для какого столбца выровнять)
-
dw
- Удалить до следующего непространственного символа
-
j
- переход к следующей строке
-
q
- Остановить запись.
Затем запустите макрос, сохраненный в горячей клавише a
, 3 раза (для 3 оставшихся строк), поместив курсор во вторую строку и нажав:
[email protected]
Ответ 3
Если вы используете unix-подобную среду, вы можете использовать инструмент командной строки column
. Отметьте свои линии с помощью визуального режима, затем:
:'<,'>!column -t
Это вставляет выделенный текст в stdin команды после '<,'>!
. Обратите внимание, что '<,'>!
устанавливается автоматически, когда вы нажимаете :
в визуальном режиме.
Ответ 4
Мы можем использовать эти две функции, которые я описал в приведенном ниже пути для одного и того же сценария: fooobar.com/questions/59553/...
просто поместите эти две функции в ваши .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
Ответ 5
Быстрый, простой способ продолжения - добавить пробелы X и затем удалить обратно в столбец X. Например, если X = 40, введите
40a<Space><Esc>d40|
Ответ 6
Я знаю, что это старо, но я думал, что @talklittle имеет правильную идею, ответ просто получил многословие. Более быстрый способ - вставить пробелы после =, а затем удалить все пробелы после 10-го столбца следующим образом:
:1,4 s/^\(.*=\) *\(.*\)$/\1 \2/
:1,4 s/^\(.\{10\}\) *\(.*\)$/\1\2/