Vim: удалить пустые строки вокруг курсора
Предположим, что я редактирую следующий документ (* = курсор):
Lions
Tigers
Kittens
Puppies
*
Humans
Какую последовательность можно использовать для удаления окружающего пробела, чтобы я остался с:
Lions
Tigers
Kittens
Puppies
*
Humans
Примечание. Я ищу ответ, который обрабатывает любое количество пустых строк, а не только этот точный случай.
РЕДАКТИРОВАТЬ 1: Номера строк неизвестны, и я хочу использовать только диапазон, в котором находится мой курсор.
РЕДАКТИРОВАТЬ 2: Отредактированный пример, чтобы показать Мне нужно сохранить ведущие пробелы по краям
Спасибо
Ответы
Ответ 1
Легко. В нормальном режиме dipO<Esc>
должен это сделать.
Пояснение:
-
dip
на пустой строке удаляет его и все смежные пустые строки.
-
O<Esc>
открывает новую пустую строку, затем возвращается в нормальный режим.
Еще более кратким, cip<Esc>
перевернул эти два шага в один, как было предложено @Lorkenpeist.
Ответ 2
Возможным решением является использование команды :join
с диапазоном:
:?.?+1,/./-1join!
Пояснение:
-
[range]join!
объединят a [range]
строк. !
означает, что вы не вставляете лишнее пространство.
- Отправной точкой является поиск назад к первому символу, а затем по 1 строке,
?.?+1
- В качестве
1
в +1
можно предположить, что это может быть сокращено ?.?+
- Конечная точка - это поиск вперед до следующего символа, затем вверх по 1 строке,
/./-1
- То же, что и до
1
, можно предположить, что /./-
- Поскольку мы используем один и тот же шаблон, только поиск вперед, шаблон может быть опущен.
//-
- Команда
:join
может быть закорочена только на :j
Окончательная сокращенная команда:
:?.?+,//-j!
Вот некоторые связанные команды, которые могут быть удобными:
1), чтобы удалить все пустые строки:
2) Сожмите все пустые строки только в одну пустую строку:
Для получения дополнительной справки см.:
:h :j
:h [range]
:h :g
:h :v
Ответ 3
Короткий ответ: ()V)kc<esc>
В обычном режиме, если вы наберете ()
, ваш курсор переместится на первую пустую строку. (
перемещает курсор в начало предыдущего блока непустых строк, а )
перемещает курсор до конца (в частности, к первой пустой строке после указанного блока). Затем простой d)
удалит весь текст до начала следующей непустой строки. Таким образом, полная последовательность ()d)
.
EDIT: вы правы, что удаляет пробелы в начале следующей непустой строки. Вместо d)
попробуйте V)kd
. V
помещает вас в режим визуальной линии, )
переходит к первой непустой строке (пропуская пробел в начале строки), k
перемещает курсор вверх на одну строку. На этом этапе вы выбрали все пустые строки, поэтому d
удаляет выделение.
Наконец, введите O
(capital O), за которым следует escape, чтобы создать новую пустую строку, чтобы заменить те, которые вы удалили. Альтернативно, замена dO<Escape>
на c<Escape>
делает то же самое с одним меньшим нажатием клавиши, поэтому вся последовательность будет ()V)kc<esc>
.
Ответ 4
Эти ответы неактуальны после обновленного вопроса:
Это не может быть ответ, который вы хотите услышать, но я бы использовал диапазоны. Взгляните на номер строки для первой пустой строки (например, 55), а вторая - на пустую строку (возможно, 67). Затем просто :55,67d
.
Или, возможно, вы хотите, чтобы во всей вашей папке всегда была одна пустая строка. В этом случае вы можете сопоставить любое появление одной или нескольких пустых строк и заменить их на одну пустую строку.
:%s/\(^$\n\)\+/\r/
Этот ответ работает:
Если вы просто хотите использовать обычный режим, вы можете найти последнюю строку с чем-то на ней. Например,
/.<Enter>kkVNjd
Ответ 5
Я не очень много тестировал, но он должен работать на ваших примерах. Там могут быть более элегантные решения.
function! DelWrapLines()
while match(getline('.'),'^\s*$')>=0
exe 'normal kJ'
endwhile
exe 'silent +|+,/./-1d|noh'
exe 'normal k'
endfunction
отправьте его и попробуйте :call DelWrapLines()
Ответ 6
Я знаю, что этот вопрос уже разрешен, но я нашел отличное решение в "sed и awk, 2nd Ed". (O'Reilly), который, как я думал, стоило делиться. Он вообще не использует vim, но вместо этого использует sed. Этот script заменит все экземпляры одной или нескольких пустых строк (при условии, что в этих строках нет пробелов) с единственной пустой строкой. В командной строке:
sed '/ˆ$/{
N
/ˆ\n$/D
}' myfile
Имейте в виду, что sed фактически не редактирует файл, а вместо этого выводит отредактированные строки на стандартный вывод. Вы можете перенаправить этот вход в файл:
sed '/ˆ$/{
N
/ˆ\n$/D
}' myfile > tempfile
Будьте осторожны, если вы попытаетесь записать его непосредственно на myfile
, он просто удалит все содержимое файла, что явно не то, что вы хотите! После того, как вы напишите вывод на tempfile
, вы можете просто mv tempfile myfile
и tada! Все экземпляры нескольких пустых строк заменяются одной пустой строкой.
Еще лучше:
cat -s myfile > temp
mv temp myfile
Кошка потрясающая, да?
Bestest:
Если вы хотите сделать это внутри vim, вы можете заменить все экземпляры нескольких пустых строк на одну пустую строку, используя виртуальную функцию vim для выполнения команд оболочки в диапазоне строк внутри vim.
:%!cat -s
Это все, что требуется, и весь файл полностью переформатирован!