2008-12-10 2 views
173

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

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

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

+3

это само по себе не относятся питон – hop 2008-12-11 09:47:52

+2

Используйте мой [DeleteTrailingWhitespace] (http://www.vim.org/scripts/script.php? script_id = 3967). – 2012-06-22 07:21:13

+0

Связанный: [Что является самым простым способом разделить конечные пробелы со всех строк в файле?] (Http://vi.stackexchange.com/q/454/467) на Vim SE – kenorb 2015-02-19 13:07:35

ответ

187

Я нашел ответ here.

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

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

Интересно! Трейлинг белого пространства - битва на работе. Я ненавижу его, другие не понимают, почему. Мы используем столько же vi, сколько vim (я использую vim, они не потому, что им придется его устанавливать).У меня есть программа, которую я называю stb для разделительных пробелов и использую это как фильтр; работает и в vi. Это лучше. – 2009-01-15 14:06:10

+11

Это изменяет положение курсора при каждом сохранении. Можно ли это избежать? – stepancheg 2009-10-24 15:59:18

+0

ОК, я нашел, ответ ниже. – stepancheg 2009-10-24 16:11:11

61

Я также, как правило, имеют:

match Todo /\s\+$/ 

в моем .vimrc файле, так что конец строки пробельных подсвечиваются.

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

5

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

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

Составление выше плюс сохранение позиции курсора:

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

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

Вот способ фильтрации более чем одного FILETYPE.

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

I и выделить существующие конечные пробелы, а также полосы завершающие пробельные.

настроить мой редактор (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() 

и I «авто-стрип», это из файлов при сохранении их в моем случае * .RB для рубина файлов, снова в моей ~ /.vimrc

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

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

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

В этом случае, с мерзавцем, вы можете можете использовать скрипт так:

#!/bin/sh 

set -e # bail on errors 

git stash save commit-cleanup 
git stash show -p | sed '/^\+/s/ *$//' | git apply 
git stash drop 

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

1

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

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

Для людей, которые хотят, чтобы запустить его для определенных типов файлов (Типы файлов не всегда надежны):

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 
0

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

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

Кредит этой идеи идет в жемчужину комментарий: 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 
2

Я видел это решение в комментарии на VIM Wikia - Remove unwanted spaces

Я действительно понравилось. Добавляет . на нежелательные пробелы.

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() 
Смежные вопросы