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


271

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

Например:

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

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

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

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

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


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

83

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

:%s/\n/

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просто удалите новую строку и не сделайте ничего умного с пробелами вообще.


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).


2

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

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


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

7
Это своего рода излишество, тебе не кажется?
— Дерекердманн

нет, это не так. почему вы считаете это излишним? Делать это внутри Vim - это руководство. Это зависит от того, хотите ли вы делать это вручную каждый раз вручную или просто выполнить эти строки, чтобы сделать это в один миг. Вим - редактор. И любые инструменты, которые могут обрабатывать файлы, являются в основном скрытыми «редакторами».
— ghostdog74

5
Еще проще просто открыть файл в vim и использовать ggVGJ.
— слишком много php

конечно, если вам легче будет делать это вручную каждый раз, когда вам нужны данные, измененные таким образом. Преуспевать. Кроме того, попробуйте сделать это на большом файле.
— ghostdog74

Я не обрабатываю кучу файлов; Я просто работаю с сокращением нескольких строк кода.
— derekerdmann

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.