Подтвердить что ты не робот

Vim: Отступ с одним пространством (не пространством сдвига)

Отступающие команды VIM по умолчанию отступа по пространству сдвига

например.

>>   Indent line by shiftwidth spaces
<<   De-indent line by shiftwidth spaces

Есть ли какой-либо способ отступать с одним или n (где n!= shiftwidth) пространство (s)?

Один из способов сделать это - вертикально выбрать столбец в блоке с Ctrl+V, а затем I, чтобы вставить вертикально, а затем введите space и <Esc>. Но есть ли лучший способ?

4b9b3361

Ответ 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:

  • Откройте файл в VI.
  • Наведите курсор на некоторый код
  • В нормальном режиме нажмите следующие клавиши:

    Vjjjj:le 3
    

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

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.