Как эффективно разбить строку на несколько строк?

11

Я получаю зарегистрированные данные в текстовом файле, который представляет собой одну длинную строку с каждым значением, разделенным пробелом. Есть ли команда или набор команд, которые разбивают одну строку на несколько строк?

Дом
источник

Ответы:

21

Вы можете просто заменить любой последовательный пробел в строке новой строкой, используя команду :s/\s\+/\r/g. \s\+означает один или несколько пробельных символов и \rявляется новой строкой, смотрите :help :substituteи :help regexpдля деталей. Если вы запустите команду в строке вроде:

foo bar baz

Ты получаешь:

foo
bar
baz

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

function! SplitLineNicely()
    " Save previous value of last search register
    let saved_last_search_pattern = @/

    " :substitute replaces the content of the search register with the `\s\+` 
    " pattern highlighting all whitespaces in the file
    substitute /\s\+/\r/g

    " Restore previous search register
    let @/ = saved_last_search_pattern
endfunction
toro2k
источник
«Если вы не хотите загромождать свой экран выделенными пробелами повсюду», это предполагает слишком много настроек OP.
romainl
@romainl лучше?
toro2k
1
Да, лучше ИМО.
romainl
2
Это \r, видите :help s/\r. Его можно заменить буквальным вводом новой строки <c-v><cr>. В этом контексте \nнулевой символ, см :help s/\n.
toro2k
1
replaces the content of the register- какой регистр?
stillanoob
5

Использование vimподстановки, вероятно, является одним из лучших способов выполнить вашу задачу, но вы также можете использовать макрос. Предположим, у нас есть следующие данные с курсором в строке 1:

1 a b c d e f
~

При запуске в обычном режиме нажатие qqзапускает запись макроса, вызываемого с помощью @q. Все, что qqбудет напечатано после, будет повторяться через вышеупомянутый вызов. Наша цель - записать обычные команды, которые будут достаточно общими, чтобы обеспечить непрерывное повторение.

Таким образом, мы можем напечатать 0курсор, чтобы перевести курсор в начало строки, а затем fspaceпереместить курсор в первый пробел. Это позволяет нам затем печатать renter, что приводит к:

1 a
2 b c d e f
~

Удар qсейчас - хорошая идея, так как наш повторно используемый макрос готов к повторению. Несколько условно отметим, что осталось 4 пробела для замены на новые строки. Таким образом, нажимая, 4@qмы повторяем qмакрос 4 раза, в результате чего:

1 a
2 b
3 c
4 d
5 e
6 f
~

Обратите внимание, что из-за того, как мы настроили макрос, было бы безопасно повторить команду более 9000 раз, так как это повлияет только на текущую строку, и, поскольку не было пробелов справа от последнего ввода данных, fspaceбудет «красиво» терпит неудачу, предотвращая замену данных на новые строки.

Итак, повторить с самого начала:

qq0fspacerenterq9001@q

обеспечивает наш результат.

HAL 9001
источник
1
Мне нравится, что у вас есть 9001клавиша на клавиатуре для быстрого ввода вашего имени пользователя.
Богатый
4

Самый простой способ разделить строки в Vim - это команда нормального режима gq(быстро набрать обе буквы в обычном или визуальном режиме).

В визуальном режиме он будет разделять все, что выбрано, в обычном режиме вы будете следовать gqдвижению.

Например, gqlразделит одну строку на текущую заданную ширину. Для того, чтобы установить ширину расщепленных линий будет отличаться от текущей настройки, вы можете использовать :set textwidth=n, где nэто количество символов , которые вы хотите в строке, например, 10и изменение назад к нормальной ширины , когда вы закончите.

Получил эту информацию из видео на Youtube от Kholidfu, которое показывает, как соединять и разбивать линии в обычном режиме с помощью движения.

vdicarlo
источник