Як з'єднати лінії, не створюючи пробілу?


72

Стандартна Jкоманда для з'єднання ліній замінює символи (символи) нового рядка пробілом. Це корисно під час редагування «літератури», але може бути проблематичним, якщо я, скажімо, відредагувати шестигранний дамп вручну, якщо я забуду видалити зайвий пробіл.

Чи існує швидкий та простий метод з'єднати дві лінії, не створюючи пробілу між ними?

Відповіді:


86

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

3

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

qaJxq

Тепер відтворіть макрос, aвикористовуючи те, @aде ви хочете приєднатись до двох рядків без місця.

@@повторить попередній макрос. Таким чином, ви можете просто утримувати, @щоб приєднатися до декількох рядків.


1
Навіщо вводити текст, @aколи можна вводити текст Jx? Однакова кількість натискань на клавіші та натискання клавіш SHIFT!
Шахбаз

2
@Shahbaz Можливо через останній рядок: "можна просто затримати @"
muru

1
@muru, це правда!
Шахбаз

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.


2
Привіт ubique, ласкаво просимо до Vi та Vim ! Ви отримали досить добре написану відповідь; кудо за це. Мій один nitpick - це те, що vim регулярні вирази = / = python регулярні вирази, а іноді це бентежить користувачів. Можливо, замість цього посилання на довідковий документ для Vim regex?
D. Ben Knoble

2
Друга нитка: відповідь, на яку ви посилаєтесь, написала @ insidepower та редагувала Пітер.
D. Ben Knoble
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.