Я не уверен, что есть лучший способ.Но есть несколько способов, которыми вы могли бы сделать это (о чем я могу думать в любом случае) ...
Ваше решение для визуального блока
Как вы сказали: нажмите Ctl-V
, выберите нужные строки, нажмите I
, чтобы вставить, и введите количество пробелов.
Поиск
АналогичноВыше, но немного более гибко - вы можете использовать с командой vip
«выбрать абзац» или с любым другим диапазоном: нажмите v
или vip
, или что у вас есть, чтобы выбрать диапазон, и введите :s/^/{n spaces}
где {n пробелов} - это количество пробелов, которые вы хотите вставить.
Это немного более многословно, но работает довольно хорошо для практически любого диапазона.Черт возьми, если вы хотите сделать весь файл, вы можете сделать Ctl-A
или что у вас (зависит от ОС) и сделать отступ для всего файла (или просто пропустить весь процесс визуального режима и просто сделать это в командном режиме ... как в :1,$s/^/{n spaces}
Обратите внимание, что вам не нужно включать третью косую черту в s ///, так как вы не ставите никаких тегов в конце.
Global
Может быть, вы хотите сделать отступ только для тех строк, которые соответствуют некоторому шаблону. Скажем ... Все строки, содержащие foo. Нет проблем: введите :g/foo/s/^/{n spaces}
Global особенно удобен, если его многострочныйучастки с похожим рисунком. Вы можете просто уйти в землю обычного режима и выбрать нужные линии и сделать отступ соответственно: :g/foo/norm Vjj:s/^/{n spaces}Ctl-V{Enter}
. Немного сложнее с этим дополнительным Ctl-V{Enter}
в конце, но полезно при определенных обстоятельствах.
Используйте tabstop и shiftwidth
Да, если вы делаете это много - я бы сделал :set ts=2
и :set et
и :set sw=2
и использовал бы >>
и <<
в разные стороны ...
Создать функцию
Хорошо, так что все еще недостаточно кратко, и по какой-то причине вам нужно много делать, и вы не можете терпеть неудачи с настройками sw
, et
и ts
.Нет проблем, просто напишите быструю функцию и присвойте ей localleader
сопоставление:
function! AddSpace(num) range
let s:counter = 0
let s:spaces = ''
while s:counter < a:num
let s:spaces .= ' '
let s:counter = s:counter + 1
endwhile
execute a:firstline .','. a:lastline .'s/^/'. s:spaces
endfunction
:map <LocalLeader>i :call AddSpace(3)Ctl-V{enter}
Может быть, просто знать, что для этого есть несколько способов, лучше, чем знать только один?Ведь иногда лучшее решение зависит от проблемы:)