Как вы можете автоматически удалить конечные пробелы в vim


Я получаю "конечные пробелы" ошибки, пытаясь зафиксировать некоторые файлы в git.

Я хочу удалить эти конечные пробелы автоматически прямо перед сохранением файлов python.

можете ли вы настроить vim для этого? Если да, то как?

13 183

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), чтобы показать пробел в конце, например

enter image description here

при этом в нижней части моего .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-удалить ненужные пробелы

мне очень понравилось. Добавляет . на нежелательные пробелы.

enter image description here

положите это в свой .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 * :%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