Подтвердить что ты не робот

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

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

UPDATE

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

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

au BufWritePre *.py call TrimEndLines()
4b9b3361

Ответ 1

Эта команда подстановки должна сделать это:

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

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

ИЗМЕНИТЬ

Пояснение:

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

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

Ответ 2

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

:v/\_s*\S/d

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

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

:v/\n*./d

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

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

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

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

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

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

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

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

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

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

Ответ 3

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

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

(замените *.txt на любой желаемый шаблон)

Подробнее:

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

Ответ 4

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

autocmd FileType ruby,python autocmd BufWritePre <buffer> :%s/\($\n\s*\)\+\%$//e

Ответ 5

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

" 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()