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), чтобы удалить все пустые строки:

  • :g/^$/d
  • :v/./d

2) Сожмите все пустые строки только в одну пустую строку:

  • :v/./,//-j

Для получения дополнительной справки см.:

: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

Это все, что требуется, и весь файл полностью переформатирован!