Як ви можете автоматично видалити пробіл пробілів у vim


197

Я отримую помилки у пробілі, намагаючись зробити деякі файли в git.

Я хочу видалити ці символи пробілів пробілу автоматично перед збереженням файлів python.

Чи можете ви налаштувати vim для цього? Якщо так, то як?


3
це не стосується лише python

2
Використовуйте мій плагін DeleteTrailingWhitespace .
Інго Каркат

Відповіді:


208

Я знайшов відповідь тут .

Додавши до мого .vimrc-файлу наступне:

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

1
Цікаво! Попереду білий простір - це бій на роботі. Я ненавиджу це, інші не розуміють, чому. Ми використовуємо стільки ж, скільки і vim (я використовую vim; вони цього не роблять, тому що їм доведеться його встановлювати). У мене є програма, яку я викликаю stb до Strip Trailing Blanks, і я використовую її як фільтр; працює і у vi. Це краще.
Джонатан Леффлер

16
Це змінює положення курсору на кожному збереженні. Чи можна цього уникнути?
stepancheg

3
Оскільки це фактичний відповідь на це питання, можливо, його слід оновити, щоб зберегти позицію курсору.
Еду Феліпе

2
Це також видалить пробіли у багаторядкових рядках, що може не бути бажаним у деяких випадках. Але я думаю, що немає простого способу цього уникнути?
луатор

3
Можливо, ви могли б пояснити, що eв кінці означає, що якщо ми не знайшли шаблон, vi не вважає команду-замінник невдалою
LLenain

169

Компіляція вище плюс збереження позиції курсору:

fun! <SID>StripTrailingWhitespaces()
    let l = line(".")
    let c = col(".")
    keepp %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()

9
Ви можете покращити свою функцію, також збереживши останній пошук і відновивши його. нехай _s = @ / let @ / = _ s
xApple

3
Я вилучив autocmd FileType c,cpp,java,php,ruby,python частину, щоб застосувати її до всіх файлів.
swt83

8
@xApple: Всередині функцій збереження та відновлення останнього пошуку не є необхідним - це вирішить, якщо залишити контекст функції.
Тобіас

3
@ Swt83 вам необхідно також замінити <buffer>з , *якщо ви хочете , щоб працювати з усіма файлами
cadlac

3
Якщо ви будете префіксувати заміну команди w / keepp, це не змінить історію пошуку, тобтоkeepp %s/\s\+$//e
jeberle

68

У мене також зазвичай є:

match Todo /\s\+$/

в моєму .vimrcфайлі, так що пробіли в кінці рядка є прихованими.

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


7
Або ви можете встановити список і встановити listchars + = trail :.
Олі

Відмінно - це ідеальний середина між автоматичним видаленням пробілу білого простору (навіть коли я про це не знаю, або коли це чийсь код, з яким я просто працюю в тому ж файлі), щоб нічого не робити з цим . Дякую.
Данило Гершкович

2
на жаль, моя улюблена колірна гамма дзенбурн не виділяється
Пітер Лонг

@PeterLong, також не працює в темі railscasts. Перевірте це :hi Todo. Тож я ознайомився :hi <Tab>і :help hi. Я розглядав Cursorі Error, але думаю, що спробую match VisualNOS /\s\+$/ . Я можу поєднати це з деякими autocmdз інших відповідей тут.
Брейді Тренер

51

Я обидва підкреслюю існуючу пробільну пробіл, а також знімаю пробіли.

Я налаштовую свій редактор (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 для файлів з рубінами, знову в моєму ~ / .vimrc

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

13

Ось спосіб фільтрації за більш ніж одним FileType.

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

Кожен файл: autocmd FileType * autocmd BufWritePre <buffer>:% s / \ s \ + $ // e
JREAM

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\+$/

1
Здається, посилання на блог загинула.
Тобіас

Це ж рішення знайдено за цим посиланням у розділі "Використання команди команди".
ryanjdillon

6

Це рішення я побачив у коментарі на 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()

5

Ось як я це роблю. Я не можу пригадати, звідки я його вкрав у ТБГ.

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

2
Гум, це дуже небезпечно робити це на "*", якщо ви зрештою відкриєте двійкові файли, вони можуть виявитися в дуже поганій формі.
мат

Так, мабуть, не найрозумніший, тоді я знову також не використовую vim для шестигранного редактора. Це не виконається, якщо ви не збережете.
gregf

Я думаю, що це більше, ніж альтернатива переліку всіх типів файлів, над якими ви можете працювати, ні? Я працюю над rb, php, cs, html, sass, css, js, кавою, xml, xslt, pl і т. Д. І т. Д. І т. Д ... Чи є щасливий засіб?
Дерек до

4
Якщо ви не пишете у бінарні файли vim, це, ймовірно, ніколи не буде проблемою.
gregf

Він з'являється в першому, %sглобальний прапор (g) такий же марний, як і простір у EOL :-)
Jens

3

Рішення, яке просто позбавляє пробілу білого простору з файлу, неприйнятне за будь-яких обставин. Він працюватиме над проектом, який проводив цю політику з самого початку, і тому немає таких пробілів, які б ви не просто додали себе у майбутньому зобов'язанні.

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

У такому випадку за допомогою git ви можете використовувати такий сценарій:

#!/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

Виконавчий set listchars=trail:·кажучи: E474: Invalid argument: listchars=trail:·. Чи можете ви підтвердити свій приклад?
kenorb



0

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

Якщо обрізати пробіли, слід робити це лише у файлах, які вже є чистими. "Коли в Римі ...". Це хороший етикет під час роботи над базами кодів, де помилкові зміни не бажані.

Ця функція розпізнає пробіли пробілу та вмикає обрізку лише в тому випадку, якщо вона вже була чистою.

Заслуга цієї ідеї притаманна дорогоцінному коментарю тут: https://github.com/atom/whitespace/isissue/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

Ви також можете зберегти реєстр пошуку let _s=@/та відновити його наприкінці `let @ / = _ s`. У цьому випадку ми використовуємо регістр чорної діри
SergioAraujo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.