Как вы можете автоматически удалить конечные пробелы в vim
Я получаю "конечные пробелы" ошибки, пытаясь зафиксировать некоторые файлы в git.
Я хочу удалить эти конечные пробелы автоматически прямо перед сохранением файлов python.
можете ли вы настроить vim для этого? Если да, то как?
13 ответов:
Я нашел ответ!--2-->здесь.
добавить следующее к моим .файл 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 - это синтаксис hilighting группы-имя который используется для высмеивания ключевых слов, таких как
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\+$/
вот как я это делаю. Я не могу вспомнить, где я украл его из 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, чтобы удалить их конечные пробелы, когда мы повторно применяем изменение к рабочему каталогу. Если этот командный канал успешен, мы отбрасываем тайник.
Я видел это решение в комментарий в 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()
другие подходы здесь как-то не работали для меня в MacVim при использовании в . Итак, вот тот, который делает и выделяет конечные пробелы:
set encoding=utf-8 set listchars=trail:· set list
для людей, которые хотят запустить его для определенных типов файлов (типы файлов не всегда надежных):
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