Как я могу обрезать пустые строки в конце файла в Vim?
Иногда я оставляю пустые строки в нижней части файла.
Как я могу обрезать их при сохранении?
UPDATE
Спасибо, ребята, все решения, похоже, работают.
К сожалению, они все reset текущая позиция курсора, поэтому я написал эту функцию
function TrimEndLines()
let save_cursor = getpos(".")
:silent! %s#\($\n\s*\)\+\%$##
call setpos('.', save_cursor)
endfunction
au BufWritePre *.py call TrimEndLines()
Ответы
Ответ 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()