Видалити новий рядок у Vim


271

Чи є спосіб видалити новий рядок в кінці рядка у Vim, щоб наступний рядок був доданий до поточного рядка?

Наприклад:

Evaluator<T>():
    _bestPos(){
}

Я хотів би поставити все це в один рядок, не копіюючи рядки та вставляючи їх у попередній. Здається, я повинен мати можливість помістити курсор до кінця кожного рядка, натиснути клавішу та перейти до наступного рядка на той самий, на якому знаходиться курсор.

Кінцевий результат:

Evaluator<T>(): _bestPos(){ }

Чи можливо це у Вімі?


Del в кінці рядка в режимі вставки vim, який працював на мене. Хоча не у кожному терміналі.
Віктор Сергієнко

Відповіді:


584

Якщо ви перебуваєте на першому рядку, натискання (верхній регістр) Jприєднається до цього рядка та наступного разом, видаливши новий рядок. Ви також можете поєднати це з підрахунком, тому натискання 3Jоб'єднає всі 3 лінії разом.


29
Як зазначається в іншій відповіді, gJви не зможете додавати пробіли, які Vim може вибрати для додавання J.
Майкл Міор

5
Ви також можете вибрати всі лінії, до яких потрібно приєднатись V(режим візуального рядка), а потім натиснути JабоgJ
Sbu

Якщо ви хочете зберегти позицію курсору, використовуйте, :joinі :join!це з'єднає рядки, зберігаючи положення курсору, і не залишайте місця в точці приєднання. Ви також можете відобразити його як: nnoremap <Leader>j :joing<cr>і nnoremap <Leader>gj :join!<cr>.
SergioAraujo

82

Звичайно. Vim розпізнає \ n символ як новий рядок, тому ви можете просто шукати та замінювати. У командному режимі:

:%s/\n/

1
Дякую, але я не хочу глобального пошуку та заміни.
derekerdmann

16
видалення% бере на себе це. Тоді це станеться лише на тій лінії, на якій знаходиться курсор. Крім того, ви можете вказати діапазон, такий як: 11,15s / \ n / (рядки 11-15) або:, + 7s / \ n / (цей рядок і наступні сім) або: -3, s / \ n / (попередні три рядки і цей) ... ви отримуєте ідею
Трістан

1
Або ви можете вибрати V-обічний блок і замінити його.
Віктор Сергієнко

51

Перебуваючи у верхньому рядку у звичайному режимі, натисніть Shift+ j.

Ви можете також додати кількість рахунків, щоб 3Jу верхньому рядку були об'єднані всі ці рядки разом.


34

Як згадуються інші відповіді, (верхній регістр) Jта пошук + заміна \nможна використовувати, як правило, для викреслення символів нового рядка та об'єднання ліній.

Але для того, щоб позбутися від останнього символу нового рядка в останньому рядку , вам потрібно зробити це у Vim:

:set noendofline binary
:w

1
Питання полягає у об'єднанні двох рядків у середині файлу - ця відповідь видаляє новий рядок у кінці файлу, про що я не запитував.
derekerdmann

3
Це працювало для мене. Я намагався позбутися нового рядка в кінці файлу одного рядка з vim.
Локан

Чому :set noendoflineне працює без binary?
Darw

32

Jвидаляє додаткові провідні інтервали (якщо такі є), з'єднуючи лінії з єдиним пробілом. (За деякими винятками: після цього /[.!?]$/можуть бути вставлені два пробіли; раніше /^\s*)/не вставляються пробіли.)

Якщо ви не хочете такої поведінки, gJпросто видаляйте новий рядок і взагалі не робите нічого розумного з пробілами.


10

Усі перелічені нижче припускають, що ваш курсор знаходиться в першому рядку:

Використання звичайних відображень:

3Shift+J

Використання команд Ex:

:,+2j

Що є абревіатурою

:.,.+2 join

До якого також можна ввести наступний ярлик:

3:j

Ще коротша команда Ex:

:j3

2
Без пробілів між ними:j!3
SergioAraujo

10
set backspace=indent,eol,start

в вашому .vimrc дозволить використовувати backspaceі deleteна \n(символ нового рядка) в режимі вставки.

set whichwrap+=<,>,h,l,[,]

дозволить видалити попередній НЧ у звичайному режимі за допомогою X(коли в колонці 1).


2

Це, мабуть, залежить від ваших налаштувань, але я зазвичай роблю це A<delete>

Де Aдодається в кінці рядка. Можливо, потрібен nocompatibleрежим :)


3
"Я зазвичай роблю це з A <delete>" Так, тому я прийшов сюди; знайти кращий спосіб;). Вся справа vim - це не рухати руками від домашнього ряду.
Люк

2
<CURSOR>Evaluator<T>():
    _bestPos(){
}

курсор у першому рядку

ЗАРАЗ, у НОРМАЛЬНОМУ РЕЖИМІ зробіть

shift+v
2j
shift+j

або

V2jJ

: нормальний V2jJ


1

Я просто натискаю кнопку A (додає до кінця рядка, переводить вас у режим вставки) на рядку, де ви хочете видалити новий рядок, а потім натисніть видалити.


На жаль, це, здається, не працює для мене; це може бути налаштування PuTTY, яке я пропустив.
derekerdmann

2
ймовірно, варіант backspace::help 'backspace'
glenn jackman

1

якщо ви не заперечуєте проти використання інших інструментів оболонки,

tr -d "\n" < file >t && mv -f t file

sed -i.bak -e :a -e 'N;s/\n//;ba' file

awk '{printf "%s",$0 }' file >t && mv -f t file

7
Це щось надмірне, ви не думаєте?
derekerdmann

ні це не так. чому ти вважаєш її надмірною? Робити це всередині Vim - це вручну. Це залежить від того, чи хочете ви робити це вручну кожен раз вручну, або просто виконати ці одні вкладиші, щоб це було швидко. Vim - редактор. І будь-які інструменти, які можуть обробляти файли, в основному є "редакторами" у масках.
ghostdog74

5
Ще простіше просто відкрити файл у vim та використовувати ggVGJ.
занадто багато php

звичайно, якщо вам простіше робити це вручну кожного разу, коли вам потрібні дані, змінені таким чином. Іди вперед. Також спробуйте це зробити у великому файлі.
ghostdog74

Я не обробляю купу файлів; Я просто працюю зі згущенням декількох рядків коду.
дерекердманн

1

Проблема полягає в тому, що множинні знаки 0A (\ n), які є невидимими, можуть накопичуватися. Припустимо, ви хочете прибрати з рядка 100 до кінця:

Введення ESC і: (командир терміналу)

:110,$s/^\n//

У сценарії vim:

execute '110,$s/^\n//'

Пояснення: від 110 до кінця шукайте рядки, які починаються з нового рядка (порожні) та видаляйте їх

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.