Удалить новую строку в Vim

271

Есть ли способ удалить символ новой строки в конце строки в Vim, чтобы следующая строка добавлялась к текущей строке?

Например:

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

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

Конечный результат:

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

Возможно ли это в Vim?

derekerdmann
источник
Del в конце строки в режиме вставки vim, который работал для меня. Хотя не в каждом терминале.
Виктор Сергиенко

Ответы:

584

Если вы находитесь на первой строке, нажатие (верхний регистр) Jсоединит эту строку и следующую строку вместе, удалив новую строку. Вы также можете объединить это с подсчетом, поэтому нажатие 3Jобъединит все 3 строки вместе.

Xhantar
источник
29
Как отмечено в другом ответе, gJизбегайте добавления пробелов, которые Vim может добавить при использовании J.
Майкл Миор
5
Вы также можете выбрать все линии, которые хотите соединить, используя V(Режим визуальной линии), затем нажмите JилиgJ
Sbu
Если вы хотите сохранить положение курсора, используйте его, :joinи :join!это соединит линии, сохраняя положение курсора, и не оставляйте пробелов в точке соединения. Вы также можете отобразить это как: nnoremap <Leader>j :joing<cr>и nnoremap <Leader>gj :join!<cr>.
SergioAraujo
83

Безусловно. Vim распознает символ \ n как новую строку, поэтому вы можете просто искать и заменять. В командном режиме введите:

:%s/\n/
TinkerTank
источник
1
Спасибо, но я не хочу глобального поиска и замены.
Дерекердманн
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?
Дар
32

Jудаляет лишний начальный интервал (если есть), соединяя строки одним пробелом. (За некоторыми исключениями: после /[.!?]$/, два пробела могут быть вставлены; до /^\s*)/этого пробелы не вставляются.)

Если вы не хотите такого поведения, gJпросто удалите новую строку и не сделайте ничего умного с пробелами вообще.

ephemient
источник
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,[,]

позволит вам удалить предыдущий LF в обычном режиме с помощью X(когда в столбце 1).

laktak
источник
2

Это, вероятно, зависит от ваших настроек, но я обычно делаю это с A<delete>

Где Aдобавить в конце строки. Вероятно, требуется nocompatibleрежим :)

Wolph
источник
3
"Я обычно делаю это с A <delete>" Да, именно поэтому я пришел сюда; найти лучший путь;). Весь смысл vim не в том, чтобы убирать руки с домашнего ряда.
Люк
2
<CURSOR>Evaluator<T>():
    _bestPos(){
}

курсор в первой строке

СЕЙЧАС в НОРМАЛЬНОМ РЕЖИМЕ

shift+v
2j
shift+j

или

V2jJ

: обычный V2jJ

Иван Лопес
источник
1

Я бы просто нажал A (добавить в конец строки, переводит вас в режим вставки) в строке, где вы хотите удалить новую строку, а затем нажмите удалить.

Дэвид Уотсон
источник
К сожалению, это не работает для меня; это может быть установка PuTTY, которую я пропустил.
Дерекердманн
2
вероятно вариант :help 'backspace'
возврата на задний план
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
ghostdog74
источник
7
Это своего рода излишество, тебе не кажется?
Дерекердманн
нет, это не так. почему вы считаете это излишним? Делать это внутри Vim - это руководство. Это зависит от того, хотите ли вы делать это вручную каждый раз вручную или просто выполнить эти строки, чтобы сделать это в один миг. Вим - редактор. И любые инструменты, которые могут обрабатывать файлы, являются в основном скрытыми «редакторами».
ghostdog74
5
Еще проще просто открыть файл в vim и использовать ggVGJ.
слишком много php
конечно, если вам легче будет делать это вручную каждый раз, когда вам нужны данные, измененные таким образом. Преуспевать. Кроме того, попробуйте сделать это на большом файле.
ghostdog74
Я не обрабатываю кучу файлов; Я просто работаю с сокращением нескольких строк кода.
derekerdmann
1

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

Набрав ESC и: (командир терминала)

:110,$s/^\n//

В скрипте vim:

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

Пояснение: с 110 до конца ищите строки, которые начинаются с новой строки (не заполнены) и удаляйте их

Серхио Абреу
источник