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

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

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

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

10.12.2008 14:02:31
это не касается только Python
user3850 11.12.2008 09:47:52
Используйте мой плагин DeleteTrailingWhitespace .
Ingo Karkat 22.06.2012 07:21:13
13 ОТВЕТОВ
РЕШЕНИЕ

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

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

autocmd BufWritePre *.py :%s/\s\+$//e
206
11.01.2013 14:16:37
Интересно! Конечный пробел - битва на работе. Я ненавижу это, другие не понимают почему. Мы используем столько же vi, сколько vim (я использую vim; они не используют, потому что им придется его устанавливать). У меня есть программа, которую я называю stb для Strip Trailing Blanks, и я использую ее в качестве фильтра; работает в ви тоже. Это лучше.
Jonathan Leffler 15.01.2009 14:06:10
Это меняет положение курсора при каждом сохранении. Можно ли этого избежать?
stepancheg 24.10.2009 15:59:18
Поскольку это де-факто ответ на этот вопрос, возможно, его следует обновить, чтобы сохранить положение курсора.
Edu Felipe 4.05.2011 14:26:56
Это также удалит завершающие пробелы в многострочных строках, что может быть нежелательно в некоторых случаях. Но я думаю, что нет простого способа избежать этого?
luator 11.08.2015 08:58:24
Возможно, вы могли бы указать, что eв конце означает, что если мы не нашли шаблон, vi не считает заменяющую команду неудачной
LLenain 1.12.2016 12:46:02

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

match Todo /\s\+$/

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

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

68
11.01.2013 14:25:09
Или вы можете установить список и установить listchars + = trail :.
Oli 11.12.2008 07:17:15
Отлично - это идеальное промежуточное звено между автоматическим удалением конечных пробелов (даже когда я могу не знать об этом или когда это чей-то код, с которым я просто работаю в одном и том же файле), чтобы ничего не делать с этим , Спасибо.
Daniel Hershcovich 22.06.2011 07:13:41
к сожалению, моя любимая цветовая схема Zenburn не выделяется
Peter Long 22.07.2011 08:14:53
@PeterLong, также не работает в теме Railscasts. Проверьте это с :hi Todo. Так что я просмотрел :hi <Tab>и :help hi. Я считал Cursorи Error, но, думаю, попробую match VisualNOS /\s\+$/ . Я мог бы объединить это с некоторыми autocmdиз других ответов здесь.
Brady Trainor 26.07.2014 22:16:51

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

autocmd BufWritePre * :call <SID>StripWhite()
fun! <SID>StripWhite()
    %s/[ \t]\+$//ge
    %s!^\( \+\)\t!\=StrRepeat("\t", 1 + strlen(submatch(1)) / 8)!ge
endfun
5
11.01.2013 14:25:34
Хм, это довольно опасно делать на «*», если вы в конечном итоге откроете бинарные файлы, они могут оказаться в довольно плохой форме.
mat 18.12.2008 20:45:09
Да, наверное, не самый умный, но опять же я не использую vim для шестнадцатеричного редактора. Это не будет выполняться, если вы не сохраните.
gregf 1.04.2009 20:43:19
Я думаю, что это лучше, чем перечислять все типы файлов, над которыми вы можете работать, не так ли? Я работаю над rb, php, cs, html, sass, css, js, coffee, xml, xslt, pl и т. Д. И т. Д. И т. Д. И т. Д.
Derek Prior 18.06.2011 01:27:09
Если вы не пишете в двоичные файлы в vim, это, вероятно, никогда не будет проблемой.
gregf 20.06.2011 21:47:49
Вначале кажется, что %sглобальный (g) флаг так же бесполезен, как пробел в EOL :-)
Jens 6.02.2013 15:41:35

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

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()
167
16.01.2019 07:57:42
Вы могли бы улучшить свою функцию, также сохранив последний поиск и восстановив его. let _s = @ / let @ / = _ s
xApple 21.06.2011 14:58:25
Я удалил autocmd FileType c,cpp,java,php,ruby,python часть, чтобы применить ее ко всем файлам.
swt83 29.08.2013 18:50:16
@xApple: внутри функций сохранение и восстановление последнего поиска не требуется - выход из контекста функции позаботится об этом.
Tobias 25.02.2014 13:16:17
@ swt83 вам необходимо также заменить <buffer>с , *если вы хотите , чтобы работать со всеми файлами
cadlac 19.05.2014 01:32:15
Если вы keeppkeepp %s/\s\+$//e
jeberle 23.07.2016 04:55:53

Скопировано и вставлено с 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
16.08.2016 11:19:23
Ссылка на блог, кажется, умерла.
Tobias 25.02.2014 13:18:41
Такое же решение можно найти по этой ссылке в разделе «Использование команды match».
ryanjdillon 2.08.2019 09:07:08

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

autocmd FileType c,cpp,python,ruby,java autocmd BufWritePre <buffer> :%s/\s\+$//e
13
11.01.2013 14:25:44
Каждый файл: autocmd FileType * autocmd BufWritePre <буфер>:% s / \ s \ + $ // e
JREAM 9.03.2017 23:19:05

Я выделил существующий конечный пробел и также удалил конечный пробел.

Я настраиваю свой редактор (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()
51
11.01.2013 14:26:03

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

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

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

3
16.03.2014 17:30:17

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

set encoding=utf-8
set listchars=trail:·
set list
1
16.02.2015 14:45:15
Исполнительный set listchars=trail:·говоря: E474: Invalid argument: listchars=trail:·. Можете ли вы подтвердить свой пример?
kenorb 16.02.2015 14:16:10
mb21 16.02.2015 14:35:52

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

0
1.06.2015 16:37:44

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

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

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

Суть этой идеи в том, чтобы оставить комментарий здесь: 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
0
29.09.2016 20:50:57
Вы также можете сохранить регистр поиска let _s=@/и восстановить его в конце `let @ / = _ s`. В этом случае мы используем регистр черной дыры
SergioAraujo 23.11.2016 13:02:44

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