Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Я нашел ответ здесь.

Добавление следующего в мой .vimrc файл делало трюк.

autocmd BufWritePre *.py :%s/\s\+$//e

Ответ 2

Компиляция выше плюс сохранение позиции курсора:

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()

Ответ 3

У меня также обычно есть:

match Todo /\s\+$/

в моем .vimrc файле, так что длина строки строки hightighted.

Todo - синтаксис hilighting group-name, который используется для ключевых слов для hilighting, таких как TODO, FIXME или XXX. У этого есть досадно уродливый желтоватый цвет фона, и я нахожу его лучшим для hilight вещей, которые вы не хотите в своем коде: -)

Ответ 4

Я выделяю существующие пробелы, а также пробелы в пробелах.

Я настраиваю свой редактор (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 для рубиновых файлов, снова в моем ~/.vimrc

function! TrimWhiteSpace()
    %s/\s\+$//e
endfunction
autocmd BufWritePre     *.rb :call TrimWhiteSpace()

Ответ 5

Здесь можно фильтровать более чем один FileType.

autocmd FileType c,cpp,python,ruby,java autocmd BufWritePre <buffer> :%s/\s\+$//e

Ответ 6

Скопировано и вставлено из 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\+$/

Ответ 7

Вот как я это делаю. Я не могу вспомнить, где я украл его с tbh.

autocmd BufWritePre * :call <SID>StripWhite()
fun! <SID>StripWhite()
    %s/[ \t]\+$//ge
    %s!^\( \+\)\t!\=StrRepeat("\t", 1 + strlen(submatch(1)) / 8)!ge
endfun

Ответ 8

Я видел это решение в комментарии на 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()

Ответ 9

Решение, которое просто удаляет конечные пробелы из файла, неприемлемо при любых обстоятельствах. Он будет работать в проекте, у которого была эта политика с самого начала, и поэтому нет таких пробелов, что вы не просто добавили себя в предстоящую фиксацию.

Предположим, вы хотите просто не добавлять новые экземпляры конечных пробелов, не затрагивая существующие пробелы в строках, которые вы не редактировали, чтобы ваша фиксация не имела изменений, которые не имеют отношения к вашей работе.

В этом случае с 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, чтобы удалить их конечный пробел, когда мы повторно применяем это изменение к рабочему каталогу. Если этот командный канал успешный, мы бросаем трюк.

Ответ 10

Другие подходы здесь как-то не работали для меня в MacVim при использовании в файле .vimrc. Итак, вот что делает и выделяет конечные пробелы:

set encoding=utf-8
set listchars=trail:·
set list

Ответ 11

autocmd BufWritePre * :%s/\s\+$//<CR>:let @/=''<CR>

Ответ 12

Для тех, кто хочет запустить его для определенных типов файлов (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

Ответ 13

Если вы обрезаете пробелы, вы должны делать это только в уже очищенных файлах. "Когда в Риме...". Это хороший этикет при работе над кодовыми базами, где нежелательные изменения нежелательны.

Эта функция обнаруживает конечные пробелы и включает обрезку, только если она уже была чистой.

Кредит для этой идеи относится к жемчужине комментария здесь: 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