Как вы можете автоматически удалить конечные пробелы в Vim - PullRequest
193 голосов
/ 10 декабря 2008

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

Я хочу автоматически удалить эти завершающие пробельные символы непосредственно перед сохранением файлов Python.

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

Ответы [ 13 ]

201 голосов
/ 10 декабря 2008

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

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

autocmd BufWritePre *.py :%s/\s\+$//e
163 голосов
/ 24 октября 2009

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

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()
66 голосов
/ 10 декабря 2008

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

match Todo /\s\+$/

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

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

51 голосов
/ 10 декабря 2012

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

Я настраиваю свой редактор (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()
13 голосов
/ 14 января 2012

Вот способ фильтрации по нескольким типам файлов.

autocmd FileType c,cpp,python,ruby,java autocmd BufWritePre <buffer> :%s/\s\+$//e
7 голосов
/ 31 августа 2011

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

Я видел это решение в комментарии на 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()
5 голосов
/ 12 декабря 2008

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

autocmd BufWritePre * :call <SID>StripWhite()
fun! <SID>StripWhite()
    %s/[ \t]\+$//ge
    %s!^\( \+\)\t!\=StrRepeat("\t", 1 + strlen(submatch(1)) / 8)!ge
endfun
3 голосов
/ 16 марта 2014

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

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

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

1 голос
/ 10 октября 2014

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

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