Как вставить блок пробелов, начиная с позиции курсора в vi? - PullRequest
26 голосов
/ 29 сентября 2011

Предположим, у меня есть фрагмент текста ниже с курсором, который в настоящее время остается на первом A,

AAAA
BBB
CC
D

Как я могу добавить пробелы перед каждой строкой, чтобы это было похоже, и это будетбыло бы здорово, если бы число столбцов пробелов можно было задавать на лету, например, два здесь.

  AAAA
  BBB
  CC
  D

Я бы предположил, что есть способ сделать это быстро в визуальном режиме, но любые идеи?

В настоящее время я копирую первый столбец текста в визуальном режиме дважды и заменяю все два столбца на пробелы, что включает> 5 нажатий клавиш, слишком громоздко.

Ограничение:

Извините, что я не сформулировал вопрос четко и может привести к путанице.

Цель - это только часть файла большего размера, поэтому было бы здорово, если бы числоможно указать строки и столбцы, начиная с первого A.

Редактировать:

Спасибо и @DeepYellow и @Johnsyweb, по-видимому >} и >ap все отличные советы, которые я не знал, и ониоба могут быть действительными ответами, прежде чем я уточнить конкретное требование для ответа на мой вопрос, но в любом случае ответ @luser droog выделяется как единственный жизнеспособный ответ.Спасибо всем!

Ответы [ 8 ]

46 голосов
/ 29 сентября 2011

Я бы использовал :%s/^/ /

Вы также можете указать диапазон строк :10,15s/^/ /

Или относительный диапазон :.,+5s/^/ /

Или использовать регулярные выражениядля местоположений :/A/,/D/>.

Для копирования кода для вставки на SO я обычно использую sed из терминала sed 's/^/ /' filename


Ярлык

Я только что выучил новый трюк для этого.Вы входите в визуальный режим v, выбираете регион ( с помощью регулярных команд перемещения ), затем нажимаете :, что дает вам следующее:

:'<,'>

, готовый для ввода только команда часть вышеуказанных команд, для отметок '< и '> автоматически устанавливаются границы визуального выделения.

Для выбора и отступа текущего абзаца:

vip>

или

vip:>

, а затем введите .

Редактировать:

В соответствии с запросом вкомментарии, вы также можете добавить пробелы в середину строки с помощью квантификатора регулярных выражений \{n} в метасимволах any ..

:%s/^.\{14}/& /

Это добавляет пробел 14символы слева на каждой строке.Конечно, % может быть заменен любым из вышеперечисленных параметров для указания диапазона команды ex .

26 голосов
/ 29 сентября 2011

Когда на первом А я перейду в визуальный режим блока ctrl-v, выберите строки, которые вы хотите изменить, нажмите I (вставьте режим с заглавной буквы i) и примените любые изменения, которые я хочупервая строка.Выйдя из визуального режима esc, все изменения в первой строке будут применены ко всем строкам.

Вероятно, не самый эффективный по количеству нажатий клавиш, но дает вам всю необходимую свободу перед выходом из визуального режима.Мне не нравится, когда мне приходится вручную указывать диапазон строк и столбцов в команде regex.

14 голосов
/ 29 сентября 2011

Я бы использовал > } .

Где ...

  • >: сдвиг вправо и
  • }: означает до конца абзаца

Надеюсь, это поможет.

12 голосов
/ 08 июля 2015
  1. Ctrl + v (для входа в визуальный режим)
  2. Используйте клавиши со стрелками для выбора линий
  3. Shift + i (переводит вас в режим вставки)
  4. Нажмите пробелы или все, что вы хотите напечатать перед выбранными строками.
  5. Сохраните изменения (Использование: w), и теперь вы увидите изменения во всех выделенных строках.
6 голосов
/ 29 сентября 2011

Я бы сделал как Нигу Другое решение заключается в использовании :normal:

  1. <S-v> для входа в режим VISUAL-LINE
  2. 3j или jjj или /D<CR> для выбора строк
  3. :norm I<Space><Space>, правильный диапазон ('<,'>) вставляется автоматически

:normal, вероятно, немного излишне для этого конкретного случая, но иногда вам может потребоваться выполнить ряд сложных операций над диапазоном строк.

4 голосов
/ 29 сентября 2011

Вы можете выбрать линии в визуальном режиме и набрать >.Это предполагает, что вы установили вкладки для вставки пробелов, например:

setl expandtab
setl shiftwidth=4
setl tabstop=4

(замените 4 предпочтением в отступе)

Если строки образуют абзац, >apв обычном режиме сместит весь абзац выше и ниже текущей позиции.

2 голосов
/ 09 июля 2015

Еще одна вещь, которую вы можете попробовать - это макрос.Если вы еще не знаете, вы запускаете макрос с q и выбираете регистр для сохранения макроса ... поэтому, чтобы сохранить ваш макрос в регистре a, вы должны набрать qa в обычном режиме.

Внизу должно быть что-то, что говорит запись.Теперь просто делайте свое движение так, как вам хотелось бы.

Так что в этом случае вы хотели, чтобы 2 пробела перед каждой строкой, поэтому, когда курсор уже находится в начале первой строки, перейдите в режим вставки и нажмитепробел дваждыТеперь нажмите escape, чтобы перейти в обычный режим, затем вниз к следующей строке, затем к началу этой строки и нажмите q.Это завершает и сохраняет макрос

(чтобы он находился в одном месте, это полный список комбинаций клавиш, которые вы бы сделали, где <esc> - это когда вы нажимаете клавишу выхода, а <space>где вы нажимаете пробел: qai<space><space><esc>j0q Это сохраняет макрос в регистре a)

Теперь, чтобы воспроизвести макрос, вы делаете @, за которым следует регистр, в котором вы сохранили его ...в этом примере @a.Теперь вторая строка также будет иметь 2 пробела перед ними.

Макросы также могут запускаться несколько раз, поэтому, если бы я сделал 3@a, макрос запустился бы 3 раза, и с этим можно покончить.

Мне нравится использовать макросы для этого, потому что это более интуитивно для меня, потому что я могу делать именно то, что хочу, и просто воспроизводить его несколько раз.

1 голос
/ 10 июля 2019

Предположим, вы хотите сдвинуть блок кода:

  • установить количество пробелов, используемых каждой командой сдвига, :set shiftwidth=1, по умолчанию - 8.
  • нажмите Ctrl+v в соответствующем месте и переместите курсор вверх k или вниз j, чтобы выбрать некоторую область.
  • нажмите >, чтобы сдвинуть блок, и ., чтобы повторить действие до желаемой позиции (если курсор пропущен, вернитесь назад с помощью h или b).

move block of code

...