Как вы можете автоматически удалить завершающий пробел в vim

StackOverflow https://stackoverflow.com/questions/356126

Вопрос

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

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

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

Это было полезно?

Решение

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

Добавление следующего в мой файл .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 - это веселый синтаксис название группы это используется для выделения ключевых слов, таких как 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\+$/

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

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

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

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top