Как вы можете автоматически удалить завершающий пробел в vim
-
21-08-2019 - |
Вопрос
Я получаю ошибки 'завершающего пробела' при попытке зафиксировать некоторые файлы в git.
Я хочу автоматически удалить эти завершающие пробелы непосредственно перед сохранением файлов python.
Можете ли вы настроить vim для этого?Если да, то каким образом?
Решение
Я нашел ответ здесь.
Добавление следующего в мой файл .vimrc сделало свое дело.
autocmd BufWritePre *.py :%s/\s\+$//e
Другие советы
Компиляция вышеизложенного плюс сохранение положения курсора:
fun! <SID>StripTrailingWhitespaces()
let l = line(".")
let c = col(".")
%s/\s\+$//e
call cursor(l, c)
endfun
autocmd FileType c,cpp,java,php,ruby,python autocmd BufWritePre <buffer> :call <SID>StripTrailingWhitespaces()
Если вы хотите применить это при сохранении к любому файлу, опустите второй autocmd
и используйте подстановочный знак *
:
autocmd BufWritePre * :call <SID>StripTrailingWhitespaces()
У меня также обычно есть :
match Todo /\s\+$/
в моем .vimrc
файл, чтобы пробелы в конце строки были выделены.
Todo - это веселый синтаксис название группы это используется для выделения ключевых слов, таких как TODO
, FIXME
или XXX
.У него раздражающе уродливый желтоватый цвет фона, и я нахожу, что это лучшее, чтобы осветить то, что вы не надо хочу в вашем коде :-)
Я как выделяю существующие конечные пробелы, так и удаляю конечные пробелы.
Я настраиваю свой редактор (vim) так, чтобы в конце отображался пробел, например
с этим в нижней части моего .vimrc:
highlight ExtraWhitespace ctermbg=red guibg=red
match ExtraWhitespace /\s\+$/
autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
autocmd InsertLeave * match ExtraWhitespace /\s\+$/
autocmd BufWinLeave * call clearmatches()
и я "автоматически удаляю" его из файлов при их сохранении, в моем случае *.rb для файлов ruby, снова в моем ~ /.vimrc
function! TrimWhiteSpace()
%s/\s\+$//e
endfunction
autocmd BufWritePre *.rb :call TrimWhiteSpace()
Вот способ фильтрации по нескольким типам файлов.
autocmd FileType c,cpp,python,ruby,java autocmd BufWritePre <buffer> :%s/\s\+$//e
Скопировано и вставлено с http://blog.kamil.dworakowski.name/2009/09/unobtrusive-highlighting-of-trailing.html (ссылка больше не работает, но необходимая вам информация приведена ниже)
"Преимущество этого заключается в том, что не выделяется каждый пробел, который вы вводите в конце строки, только когда вы открываете файл или выходите из режима вставки.Очень аккуратно."
highlight ExtraWhitespace ctermbg=red guibg=red
au ColorScheme * highlight ExtraWhitespace guibg=red
au BufEnter * match ExtraWhitespace /\s\+$/
au InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
au InsertLeave * match ExtraWhiteSpace /\s\+$/
Я видел это решение в комментарии на VIM Wikia - Удалить ненужные пробелы
Мне это действительно понравилось.Добавляет .
на нежелательных пробелах.
Положи это в свой .vimrc
" Removes trailing spaces
function TrimWhiteSpace()
%s/\s*$//
''
endfunction
set list listchars=trail:.,extends:>
autocmd FileWritePre * call TrimWhiteSpace()
autocmd FileAppendPre * call TrimWhiteSpace()
autocmd FilterWritePre * call TrimWhiteSpace()
autocmd BufWritePre * call TrimWhiteSpace()
Вот как я это делаю.Я не могу вспомнить, где я украл его у tbh.
autocmd BufWritePre * :call <SID>StripWhite()
fun! <SID>StripWhite()
%s/[ \t]\+$//ge
%s!^\( \+\)\t!\=StrRepeat("\t", 1 + strlen(submatch(1)) / 8)!ge
endfun
Решение, которое просто удаляет конечные пробелы из файла, неприемлемо при любых обстоятельствах.Это будет работать в проекте, в котором с самого начала применялась эта политика, и поэтому в нем нет таких пробелов, которые вы просто не добавили бы сами в своем предстоящем коммите.
Предположим, вы просто хотите не добавлять новые экземпляры завершающих пробелов, не затрагивая существующие пробелы в строках, которые вы не редактировали, чтобы сохранить ваш коммит свободным от изменений, которые не имеют отношения к вашей работе.
В этом случае, с помощью git, вы можете использовать скрипт, подобный этому:
#!/bin/sh
set -e # bail on errors
git stash save commit-cleanup
git stash show -p | sed '/^\+/s/ *$//' | git apply
git stash drop
То есть мы сохраняем изменения, а затем фильтруем все +
строки в diff, чтобы удалить их завершающие пробелы, когда мы повторно применим изменение к рабочему каталогу.Если этот командный канал прошел успешно, мы удаляем тайник.
Другие подходы здесь почему-то не сработали для меня в MacVim при использовании в .vimrc
файл.Итак, вот тот, который делает и выделяет конечные пробелы:
set encoding=utf-8
set listchars=trail:·
set list
autocmd BufWritePre * :%s/\s\+$//<CR>:let @/=''<CR>
Для людей, которые хотят запустить его для определенных типов файлов (типы файлов не всегда надежны):
autocmd BufWritePre *.c,*.cpp,*.cc,*.h,*.hpp,*.py,*.m,*.mm :%s/\s\+$//e
Или с помощью vim7:
autocmd BufWritePre *.{c,cpp,cc,h,hpp,py,m,mm} :%s/\s\+$//e
Если вы урежете пробелы, вы должны Только сделайте это с файлами, которые уже являются чистыми."Когда в Риме...".Это хороший этикет при работе с кодовыми базами, где ложные изменения нежелательны.
Эта функция обнаруживает завершающий пробел и включает обрезку только в том случае, если он уже был очищен.
Заслуга в этой идее принадлежит жемчужине комментария здесь: https://github.com/atom/whitespace/issues/10 (самый длинный поток комментариев к билетам об ошибках за всю историю)
autocmd BufNewFile,BufRead *.test call KarlDetectWhitespace()
fun! KarlDetectWhitespace()
python << endpython
import vim
nr_unclean = 0
for line in vim.current.buffer:
if line.rstrip() != line:
nr_unclean += 1
print "Unclean Lines: %d" % nr_unclean
print "Name: %s" % vim.current.buffer.name
cmd = "autocmd BufWritePre <buffer> call KarlStripTrailingWhitespace()"
if nr_unclean == 0:
print "Enabling Whitespace Trimming on Save"
vim.command(cmd)
else:
print "Whitespace Trimming Disabled"
endpython
endfun
fun! KarlStripTrailingWhitespace()
let l = line(".")
let c = col(".")
%s/\s\+$//e
call cursor(l, c)
endfun