Как я могу обрезать пустые строки в конце файла в Vim? - PullRequest
26 голосов
/ 21 сентября 2011

Иногда я оставляю пустые строки внизу файла.
Как я могу обрезать их при сохранении?

UPDATE

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

function TrimEndLines()
    let save_cursor = getpos(".")
    :silent! %s#\($\n\s*\)\+\%$##
    call setpos('.', save_cursor)
endfunction

au BufWritePre *.py call TrimEndLines()

Ответы [ 5 ]

30 голосов
/ 21 сентября 2011

Эта команда замены должна сделать это:

:%s#\($\n\s*\)\+\%$##

Обратите внимание, что при этом удаляются все завершающие строки, содержащие только пробелы.Чтобы удалить только действительно «пустые» строки, удалите \s* из вышеуказанной команды.

EDIT

Объяснение:

  • \( ..... Начало группы совпадений
  • $\n ... Сопоставление новой строки (символ конца строки, за которым следует возврат каретки).
  • \s*... Разрешить любое количество пробелов в этой новой строке
  • \) ..... Завершить группу совпадений
  • \+ ..... Разрешить любое количество вхожденийэта группа (одна или несколько).
  • \%$ ... Соответствует концу файла

Таким образом, регулярное выражение соответствует любому количеству смежных строк, содержащих только пробелы, только с прекращениемв конце файла.Затем команда замены заменяет совпадение пустой строкой.

13 голосов
/ 21 сентября 2011

Элегантное решение может быть основано на команде :vglobal (или, которая является то же самое, на :global с ! модификатором),

:v/\_s*\S/d

Эта команда выполняет :delete в каждой строке, которая не имеет непробельные символы в нем и после него в оставшемся тексте до конца буфера. Таким образом, команда удаляет хвостовые пустые строки.

Удалить пустые строки (в строгом смысле, в отличие от пустых). содержащий только пробел) в конце буфера, измените шаблон в этом :vglobal команда следующим образом.

:v/\n*./d

На огромных разреженных файлах, содержащих большие блоки последовательных пробелов символы (начиная с сотен килобайт пробелов) выше Команды могут иметь неприемлемую производительность. Если это так, то же самое Изящная идея может быть использована для преобразования этих :vglobal команд в много более быстрые команды удаления диапазона.

Для пустых строк:

:0;/^\%(\_s*\S\)\@!/,$d

Для пустых строк:

:0;/^\%(\n*.\)\@!/,$d

Суть обеих команд одинакова, то есть удаление строк принадлежность к диапазону, указанному для :delete. Диапазоны определены в соответствии с этими тремя шагами:

  1. Переместите курсор на первую строку буфера перед интерпретацией остальная часть диапазона (0;, см. :help :;). Разница между 0 и 1 номера строк означают, что первый допускает совпадение при первом строка, когда в данном диапазоне используется шаблон поиска.

  2. Поиск строки, где шаблон, описывающий нехвостую заготовку строка (\_s*\S или \n*.) не совпадает (отрицание связано с \@! атом). Установите начальную линию диапазона на эту линию.

  3. Установить конечную строку диапазона на последнюю строку буфера.

Чтобы выполнить одну из вышеперечисленных команд при сохранении, запустите ее с помощью автоматической команды на BufWrite событие (или его синоним BufWritePre).

8 голосов
/ 21 сентября 2011

Вы можете поместить это в свой vimrc

au BufWritePre *.txt $put _ | $;?\(^\s*$\)\@!?+1,$d

(замените *.txt тем шаблоном, который вы хотите)

Деталь:

  • BufWritePre - это событие перед записью буфера в файл.
  • $put _ добавляет пустую строку в конце файла (из всегда пустого регистра)
  • | цепочки команд Ex
  • $;?\(^\s*$\)\@!? идет в конец файла ($), затем (;) смотрит назад (?…?) на первую строку, которая не является полностью пустой (\(^\s*$\)\@!), также см. :help /\@! для отрицательных утверждений в поисках vim.
  • ×××+1,$ формирует диапазон от строки × × × + 1 до последней строки
  • d удаляет диапазон строк.
1 голос
/ 18 декабря 2014

Вдохновленный решением от @Prince Goulash, добавьте следующее к своему ~/.vimrc, чтобы удалить завершающие пустые строки при каждом сохранении для файлов Ruby и Python:

autocmd FileType ruby,python autocmd BufWritePre <buffer> :%s/\($\n\s*\)\+\%$//e
0 голосов
/ 26 июля 2017

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

" Strip trailing empty newlines
function TrimTrailingLines()
  let lastLine = line('$')
  let lastNonblankLine = prevnonblank(lastLine)
  if lastLine > 0 && lastNonblankLine != lastLine
    silent! execute lastNonblankLine + 1 . ',$delete _'
  endif
endfunction

autocmd BufWritePre <buffer> call TrimTrailingLines()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...