Я получаю ошибки "trailing whitespace", пытаясь зафиксировать некоторые файлы в git.
Я хочу удалить эти конечные символы пробелов автоматически до того, как я сохраню файлы python.
Можете ли вы настроить vim для этого? Если да, то как?
Я получаю ошибки "trailing whitespace", пытаясь зафиксировать некоторые файлы в 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
файле, так что длина строки строки hightighted.
Todo - синтаксис hilighting group-name, который используется для ключевых слов для hilighting, таких как TODO
, FIXME
или XXX
. У этого есть досадно уродливый желтоватый цвет фона, и я нахожу его лучшим для hilight вещей, которые вы не хотите в своем коде: -)
Я выделяю существующие пробелы, а также пробелы в пробелах.
Я настраиваю свой редактор (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 для рубиновых файлов, снова в моем ~/.vimrc
function! TrimWhiteSpace()
%s/\s\+$//e
endfunction
autocmd BufWritePre *.rb :call TrimWhiteSpace()
Здесь можно фильтровать более чем один FileType.
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\+$/
Вот как я это делаю. Я не могу вспомнить, где я украл его с tbh.
autocmd BufWritePre * :call <SID>StripWhite()
fun! <SID>StripWhite()
%s/[ \t]\+$//ge
%s!^\( \+\)\t!\=StrRepeat("\t", 1 + strlen(submatch(1)) / 8)!ge
endfun
Я видел это решение в комментарии на 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()
Решение, которое просто удаляет конечные пробелы из файла, неприемлемо при любых обстоятельствах. Он будет работать в проекте, у которого была эта политика с самого начала, и поэтому нет таких пробелов, что вы не просто добавили себя в предстоящую фиксацию.
Предположим, вы хотите просто не добавлять новые экземпляры конечных пробелов, не затрагивая существующие пробелы в строках, которые вы не редактировали, чтобы ваша фиксация не имела изменений, которые не имеют отношения к вашей работе.
В этом случае с git вы можете использовать script следующим образом:
#!/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>
Для тех, кто хочет запустить его для определенных типов файлов (FileTypes не всегда надежны):
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