WedX - журнал о программировании и компьютерных науках

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

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

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

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



Ответы:


1

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

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

autocmd BufWritePre *.py :%s/\s\+$//e
10.12.2008
  • Интересно! Конечное белое пространство - это настоящая битва. Я ненавижу это, другие не понимают почему. Мы используем столько же vi, сколько и vim (я использую vim; они этого не делают, потому что им придется его установить). У меня есть программа, которую я называю stb для удаления конечных пробелов, и я использую ее как фильтр; работает и в vi. Это лучше. 15.01.2009
  • Это изменяет положение курсора при каждом сохранении. Можно ли этого избежать? 24.10.2009
  • Хорошо, я нашел, ответ ниже. 24.10.2009
  • Поскольку это фактический ответ на этот вопрос, возможно, его следует обновить, чтобы сохранить позицию курсора. 04.05.2011
  • тоже вижу keepjumps: h keepjumps 01.09.2011
  • Вы можете проголосовать за лучший ответ, пока он не станет лучшим из представленных. 08.12.2011
  • Это изменяет позицию курсора при каждом сохранении, однако простой gi вернет вас в предыдущую позицию курсора. 10.05.2013
  • Использование :%!sed -r 's/\s+$//' в качестве команды кажется другим способом (помимо keepjumps) предотвратить перемещение курсора. См. :h filter. 29.05.2013
  • gi переходит на последнюю позицию, в которую был вставлен текст (не всегда на позицию курсора перед командой :%s), а :%!sed -r 's/\s+$//' переходит к началу файла. Я не понимаю, как keepjumps предполагается использовать, :keepjumps :%s/\s+$//e, похоже, не делает ничего другого. Я использую :%s/\s\+$//e|normal '', и, похоже, он работает так, как я ожидал (переходит в позицию курсора перед использованием команды :%s). 20.07.2014
  • Исправление к моему предыдущему комментарию: :%s/\s\+$//e|normal '' переместится в неправильную позицию, если не было найдено конечных пробелов. 20.07.2014
  • Это также удалит конечные пробелы в многострочных строках, что в некоторых случаях может быть нежелательно. Но я думаю, нет простого способа избежать этого? 11.08.2015
  • Возможно, вы могли бы указать, что e в конце означает, что если мы не нашли шаблон, vi не считает заменяющую команду неудачной. 01.12.2016

  • 2

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

    function! <SID>StripTrailingWhitespaces()
      if !&binary && &filetype != 'diff'
        let l:save = winsaveview()
        keeppatterns %s/\s\+$//e
        call winrestview(l:save)
      endif
    endfun
    
    autocmd FileType c,cpp,java,php,ruby,python autocmd BufWritePre <buffer> :call <SID>StripTrailingWhitespaces()
    

    Если вы хотите применить это при сохранении к любому файлу, оставьте второй autocmd и используйте подстановочный знак *:

    autocmd BufWritePre,FileWritePre,FileAppendPre,FilterWritePre *
      \ :call <SID>StripTrailingWhitespaces()
    
    24.10.2009
  • Вы можете улучшить свою функцию, также сохранив последний поиск и восстановив его. let _s = @ / let @ / = _ s 21.06.2011
  • Для других новичков, таких как я, вы ограничиваете количество файлов, для которых вызывается функция: 18.05.2012
  • Чисто офигенно. Я использую vim, но мне лень обычно искать такие вещи. Это дало мне возможность автоматизировать применение моего арсенала регулярных выражений при сохранении. На данный момент я застрял на Ruby, поэтому мне не нужно вырезать и вставлять мое регулярное выражение, убивающее ракеты. 10.06.2013
  • Я удалил часть autocmd FileType c,cpp,java,php,ruby,python , чтобы применить ее ко всем файлам. 29.08.2013
  • Я не могу понять, почему col (.) Всегда возвращает мне 1. 01.11.2013
  • Пришлось добавить *. перед каждым расширением файла. 03.12.2013
  • @xApple: внутри функций сохранение и восстановление последнего поиска не требуется - об этом позаботится выход из контекста функции. 25.02.2014
  • @ swt83 вам также необходимо заменить <buffer> на *, если вы хотите, чтобы он работал со всеми файлами 19.05.2014
  • Есть ли веская причина ограничить это только определенными типами файлов? 20.01.2015
  • Если вы поставите префикс заменяющей команды w / keepp, это не изменит вашу историю поиска, т. Е. keepp %s/\s\+$//e 23.07.2016
  • Добавьте undojoin, чтобы это не загрязняло вашу историю отмен: autocmd BufWritePre * undojoin | :call <SID>StripTrailingWhitespaces() 27.04.2020
  • Добавьте \m к шаблону, чтобы он не зависел от параметра magic. Сохраняйте позицию лучше с let l:save = winsaveview() и call winrestview(l:save). Добавьте if !&binary && &filetype != 'diff', чтобы игнорировать двоичные файлы и файлы различий (например, файл патча для удаления пробелов). 06.01.2021

  • 3

    Еще у меня обычно есть:

    match Todo /\s\+$/
    

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

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

    10.12.2008
  • Или вы можете установить список и установить listchars + = trail :. 11.12.2008
  • Отлично - это идеальная золотая середина между автоматическим удалением конечных пробелов (даже если я не знаю об этом или когда это чей-то код, с которым я просто работаю в одном файле) и ничего не делать с этим. . Спасибо. 22.06.2011
  • к сожалению, моя любимая цветовая схема zenburn не выделяется 22.07.2011
  • @PeterLong, тоже не работает в теме railscasts. Проверьте это с помощью :hi Todo. Я внимательно просмотрел :hi <Tab> и :help hi. Я рассматривал Cursor и Error, но думаю, что попробую match VisualNOS /\s\+$/ . Я мог бы объединить это с некоторыми autocmd из других ответов здесь. 27.07.2014

  • 4

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

    Я настраиваю свой редактор (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()
    
    10.12.2012
  • Большой! Спасибо !, функция особенно нравится. 15.09.2020

  • 5

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

    autocmd FileType c,cpp,python,ruby,java autocmd BufWritePre <buffer> :%s/\s\+$//e
    
    13.01.2012
  • Каждый файл: autocmd FileType * autocmd BufWritePre ‹buffer›:% s / \ s \ + $ // e 10.03.2017

  • 6

    Скопировано и вставлено из https://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\+$/
    
    31.08.2011
  • Ссылка на блог вроде умерла. 25.02.2014
  • Такое же решение можно найти по этой ссылке в разделе Использование команды соответствия. 02.08.2019

  • 7

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

    8

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

    autocmd BufWritePre * :call <SID>StripWhite()
    fun! <SID>StripWhite()
        %s/[ \t]\+$//ge
        %s!^\( \+\)\t!\=StrRepeat("\t", 1 + strlen(submatch(1)) / 8)!ge
    endfun
    
    11.12.2008
  • Хм, это довольно опасно делать это на *, если вы в конечном итоге откроете двоичные файлы, они могут оказаться в довольно плохом состоянии. 18.12.2008
  • Да, наверное, не самый умный, с другой стороны, я тоже не использую vim для шестнадцатеричного редактора. Это не будет выполнено, если вы не сохраните. 02.04.2009
  • Я думаю, что это лучше, чем перечисление каждого отдельного типа файла, с которым вы могли бы работать, не так ли? Я работаю над rb, php, cs, html, sass, css, js, coffee, xml, xslt, pl и т. Д. И т. Д. И т. Д. Есть ли золотая середина? 18.06.2011
  • Если вы не пишете двоичные файлы в vim, это, вероятно, никогда не будет проблемой. 21.06.2011
  • Похоже, что в первом %s флаг global (g) так же бесполезен, как пробел в EOL :-) 06.02.2013

  • 9

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

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

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

    16.03.2014

    10

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

    set encoding=utf-8
    set listchars=trail:·
    set list
    
    10.10.2014
  • Выполнение set listchars=trail:· высказывания: E474: Invalid argument: listchars=trail:·. Можете ли вы подтвердить свой пример? 16.02.2015
  • @kenorb см. stackoverflow .com / questions / 18321538 /. 16.02.2015

  • 11

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

    12

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

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

    Заслуга в этой идее - жемчужина комментария здесь: 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
    
    29.09.2016
  • Вы также можете сохранить регистр поиска let _s=@/ и восстановить его в конце `let @ / = _ s`. В этом случае мы используем регистр черной дыры 23.11.2016
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

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

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]