Vim: Отступ с одним пространством (не пространством сдвига)
Отступающие команды VIM по умолчанию отступа по пространству сдвига
например.
>> Indent line by shiftwidth spaces
<< De-indent line by shiftwidth spaces
Есть ли какой-либо способ отступать с одним или n (где n!= shiftwidth) пространство (s)?
Один из способов сделать это - вертикально выбрать столбец в блоке с Ctrl+V
, а затем I
, чтобы вставить вертикально, а затем введите space
и <Esc>
. Но есть ли лучший способ?
Ответы
Ответ 1
Я не уверен, что есть лучший способ. Но, есть несколько способов, которыми вы могли бы это сделать (что я могу думать в любом случае)...
Ваше решение Visual Block
Как вы сказали: нажмите Ctl-V
выберите нужные строки, нажмите I
, чтобы вставить, и введите количество пробелов.
Поиск
Как и в приведенном выше, но немного более гибком, вы можете использовать с командой "select paragraph" 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}
Может быть, просто знать больше, чем один способ сделать это лучше, чем только знать? В конце концов, иногда лучшее решение зависит от проблемы:)
Ответ 2
Отметьте блок кода в vi тремя пробелами с режимом Visual Block:
-
Выберите блок кода, который вы хотите отступом. Сделайте это с помощью Ctrl+V в нормальном режиме и со стрелкой вниз, чтобы выбрать текст. Пока он выбран, введите ":", чтобы дать команду блоку выбранного текста.
-
В командной строке появится следующее: :'<,'>
-
Чтобы установить отступ в 3 пробела, введите le 3
и нажмите enter. Вот что появляется: :'<,'>le 3
-
Выбранный текст сразу же отбрасывается в 3 пробела.
Отступьте блок кода в vi тремя пробелами в режиме Visual Line:
Интерпретация того, что вы сделали:
V
означает начало выбора текста.
jjjj
стрелка вниз по 4 линиям, выделив 4 строки.
:
сообщает vi, что вы вводите инструкцию для выделенного текста.
le 3
означает выделение выделенного текста 3 строки.
Ответ 3
Чтобы изменить количество символов пробела, вставленных для отступов, используйте параметр shiftwidth
:
:set shiftwidth = <number>
Посмотрите здесь больше подробнее.
Вы также можете добавить это в свой .vimrc
файл.
Ответ 4
Если я правильно понимаю, вы можете использовать:
ctrl + V, jj then ': le n', где n - количество пробелов в отступ.
http://vim.wikia.com/wiki/Shifting_blocks_visually
Ответ 5
Пометьте метки ('a' и 'b') между кодом, который вы хотите отступать:
<position cursor at top of block>
m a
<position cursor at bottom of block>
m b
Выполните команду replace, чтобы каждый символ новой строки между вашими метками был заменен на количество желаемых пробелов (в этом примере два пробела):
:'a,'bs/^/ /g
Ответ 6
Мне пришлось выделить определенное количество пробелов, amount
, внутри vim script. Это сработало:
let sw_setting = &shiftwidth
set shiftwidth=1
exe "normal v" . amount . "<"
let &shiftwidth = sw_setting
Побочным эффектом является то, что он сбрасывает последний выбор визуального режима. Вместо этого вы можете отредактировать строку exe...
так, чтобы она выполняла "< <" < повторяется amount
раз в нормальном режиме. То есть: вместо normal v3<
сделать normal <<<<<<
, если amount
равно 3.