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

195

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

Например:

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

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

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

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

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

  • 0
    Del в конце строки в режиме вставки vim, который работал для меня. Хотя не в каждом терминале.
Теги:
vim
ssh
vi

12 ответов

448
Лучший ответ

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

  • 23
    Как отмечено в другом ответе, gJ будет избегать добавления пробелов, которые Vim может добавить при использовании J
  • 4
    Вы также можете выбрать все линии, которые хотите соединить, используя V (режим визуальной линии), затем нажмите J или gJ
Показать ещё 1 комментарий
63

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

:%s/\n/
  • 1
    Спасибо, но я не хочу глобального поиска и замены.
  • 15
    удаление% позаботится об этом. Тогда это произойдет только в строке, в которой находится курсор. Кроме того, вы можете указать диапазон, например: 11,15s / \ n / (строки 11-15) или:, + 7s / \ n / (эта строка и следующие семь) или: -3, s / \ n / (предыдущие три строки и эта) ... вы поняли идею
Показать ещё 1 комментарий
47

В верхней строке в нормальном режиме нажмите Shift + j.

Вы также можете добавить счетчик, поэтому 3J в верхней строке будет соединяться со всеми этими строками.

27

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

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

  • 1
    +1 за ГДж, именно то, что я искал
7

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

Используя нормальные отображения:

3 Shift + J

Использование команд Ex:

:,+2j

Это сокращение от

:.,.+2 join

Коды также можно ввести следующим ярлыком:

3 : J

Еще более короткая команда Ex:

:j3
  • 2
    Без пробелов между ними :j!3
6

В vim:

:set noendofline binary
:w
  • 1
    Вопрос в том, чтобы объединить две строки в середине файла - этот ответ удаляет новую строку в конце файла, о чем я не спрашивал.
  • 2
    Это сработало для меня. Я пытался избавиться от новой строки в конце однострочного файла с помощью vim.
2
set backspace=indent,eol,start

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

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

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

  • 0
    @QiLuo см обновленный ответ
2
<CURSOR>Evaluator<T>():
    _bestPos(){
}

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

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

shift+v
2j
shift+j

или

V2jJ

: normal V2jJ

2

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

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

  • 3
    "Я обычно делаю это с A <delete>" Да, именно поэтому я пришел сюда; найти лучший путь;). Весь смысл vim не в том, чтобы убирать руки с домашнего ряда.
1

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

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

:110,$s/^\n//

В vim script:

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

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

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
    Это своего рода излишество, тебе не кажется?
  • 0
    нет, это не так. почему вы считаете это излишним? Делать это внутри Vim - это руководство. Это зависит от того, хотите ли вы делать это вручную каждый раз вручную или просто выполнить эти один вкладыш, чтобы сделать это в один миг. Вим - редактор. И любые инструменты, которые могут обрабатывать файлы, являются в основном скрытыми «редакторами».
Показать ещё 4 комментария
1

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

  • 0
    К сожалению, это не работает для меня; это может быть установка замазки, которую я пропустил.
  • 2
    Вероятно, опция Vi Backspace :help 'backspace'

Ещё вопросы

Сообщество Overcoder
Наверх
Меню