Как соединить строки без пробела?

73

Стандартная Jкоманда для объединения строк заменяет символы новой строки пробелом. Это полезно при редактировании «литературы», но может быть проблематично, если я, скажем, отредактирую шестнадцатеричный дамп вручную, если забуду удалить лишнее пространство.

Есть ли быстрый и простой способ соединить две строки без пробела между ними?

Научная фантастика
источник

Ответы:

87

gJСочетание делает это; от :help gJ:

Соедините [количество] строк, как минимум, из двух строк. Не вставляйте и не удаляйте пробелы.

Вы можете привязать его к J, если хотите сохранить нажатие клавиши:

:nnoremap J gJ

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

Так:

Hello
    world

становится:

Hello    world

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

Соедините выделенные строки, как минимум, двумя строками. Удалить отступ и вставить до двух пробелов

[...]

Эти команды, за исключением "gJ", вставляют один пробел вместо конечного пробела или следующая строка начинается с ')'.

Так что в некоторых случаях вставляется более одного пробела или нет пробела. Насколько я понимаю, нет простого способа изменить это поведение; Я создал функцию для изменения, gJчтобы всегда соединяться без пробелов:

" Like gJ, but always remove spaces
fun! JoinSpaceless()
    execute 'normal gJ'

    " Character under cursor is whitespace?
    if matchstr(getline('.'), '\%' . col('.') . 'c.') =~ '\s'
        " When remove it!
        execute 'normal dw'
    endif
endfun

" Map it to a key
nnoremap <Leader>J :call JoinSpaceless()<CR>

Смотрите также: :help J,:help 'joinspaces'

Мартин Турной
источник
Можно ли использовать какую-либо функцию «Сохранить», чтобы сохранить положение курсора при использовании этой функции, или как мне получить этот результат?
SergioAraujo
8

Еще один трюк, который вы можете попробовать, - это заменить. Иногда это может быть полезно.

%s/$\n//g

Сценарий: удалить последний символ и присоединиться к следующей строке:

%s/=$\n\(.\)/\1/g

Например,

xxxx=
123

будет выглядеть так:

xxxx123
insidepower
источник
3

Создайте макрос и используйте его повторно:

qaJxq

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

@@Повторим предыдущий макрос. Таким образом, вы можете просто удерживать, @чтобы объединить несколько строк.

pellucide
источник
1
Зачем печатать, @aкогда можно печатать Jx? Одинаковое количество нажатий клавиш и SHIFT!
Шахбаз
2
@ Shahbaz Может быть из-за последней строки: «Вы можете просто держать @»
Муру
1
@ Муру, это правда!
Шахбаз
4
Это также делает эту команду повторяемой, так что вы можете использовать 3@aдля объединения 3 строк, тогда как выполнение 3Jxобъединит 3 строки с пробелами, а затем удалит пробел между второй и третьей строками, оставляя пробелы между другими строками.
Хагин
1

Чтобы всегда объединяться с одним пробелом:

nmap J gJi <ESC>ciW <ESC>

Чтобы присоединиться без пробела вообще (удаляет завершающий + ведущий пробел):

nmap <C-J> gJi <ESC>diW
Фил
источник
1
Добро пожаловать на этот сайт! Ваши отображения выглядят немного чрезмерно сложными для меня, было бы полезно, если бы вы могли добавить немного больше объяснений о том, как они работают.
statox
1

Выберите строки, которые вы хотите объединить, введите команду Ex , набрав двоеточие :в обычном режиме. Затем введите эту команду:

s/$\n\s*//gc

Вся команда должна выглядеть аналогично:

:'<,'>s/$\n\s*//gc

На самом деле это измененная версия команды @ insidepower, которая заменяет символы пробела и символы новой строки.

Объяснение:

  • '<,'> означает, что мы изменяем только строки, выбранные в визуальном режиме.

  • /$\n\s*является регулярным выражением шаблона. Мы ищем совпадение, которое заканчивается $символом новой строки \nи имеет неопределенное количество пробелов *после этого.

  • s/pattern//gcявляется командой замены, чтобы найти каждый шаблон и заменить его пустым символом при подтверждении.

Чтобы узнать больше о флагах и метасимволах для регулярных выражений в Vim, взгляните на эту главу Vim Reference.

Ubique
источник
2
Привет Ubique, добро пожаловать к Ви и Вим ! У вас есть довольно хорошо написанный ответ; слава за это. Мой единственный недостаток - регулярные выражения vim = / = регулярные выражения python, а иногда это сбивает с толку пользователей. Может быть, вместо ссылки на справочный документ для Vim Regex?
Д. Бен Кнобл
2
Второй гад: ответ, на который вы ссылаетесь, был написан @ insidepower и отредактирован Питером.
Д. Бен Кнобл