Bagaimana Anda dapat secara otomatis menghapus spasi spasi di vim

197

Saya mendapatkan kesalahan 'trailing whitespace' mencoba melakukan beberapa file di git.

Saya ingin menghapus karakter spasi spasi tambahan ini secara otomatis tepat sebelum saya menyimpan file python.

Bisakah Anda mengkonfigurasi vim untuk melakukan ini? Jika ya, bagaimana caranya?

Paul D. Eden
sumber
3
ini tidak hanya menyangkut python
2
Gunakan plugin DeleteTrailingWhitespace saya .
Ingo Karkat

Jawaban:

208

Saya menemukan jawabannya di sini .

Menambahkan berikut ke file .vimrc saya berhasil.

autocmd BufWritePre *.py :%s/\s\+$//e
Paul D. Eden
sumber
1
Menarik! Mengejar ruang putih adalah pertempuran di tempat kerja. Saya benci itu, yang lain tidak mengerti mengapa. Kami menggunakan vim sebanyak (saya menggunakan vim; mereka tidak melakukannya karena mereka harus menginstalnya). Saya punya program yang saya sebut stb ke Strip Trailing Blanks dan saya menggunakannya sebagai filter; bekerja di vi juga. Ini lebih baik.
Jonathan Leffler
16
Ini mengubah posisi kursor pada setiap penyimpanan. Apakah mungkin untuk menghindarinya?
stepancheg
3
Karena ini adalah jawaban de facto untuk pertanyaan ini, mungkin ini harus diperbarui untuk mempertahankan posisi kursor.
Edu Felipe
2
Ini juga akan menghapus spasi tambahan dalam string multi-baris, yang mungkin tidak diinginkan dalam beberapa kasus. Tapi saya kira tidak ada cara mudah untuk menghindari ini?
luator
3
Mungkin Anda bisa secara eksplisit mengatakan bahwa epada akhirnya berarti, jika kami tidak menemukan polanya, vi tidak menganggap perintah pengganti gagal
LLenain
169

Kompilasi posisi kursor di atas ditambah hemat:

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()

Jika Anda ingin menerapkan ini pada simpan ke file apa pun, tinggalkan yang kedua autocmddan gunakan wildcard *:

autocmd BufWritePre * :call <SID>StripTrailingWhitespaces()
stepancheg
sumber
9
Anda dapat memperbaiki fungsi Anda dengan menyimpan pencarian terakhir dan mengembalikannya. biarkan _s = @ / let @ / = _ s
xApple
3
Saya menghapus autocmd FileType c,cpp,java,php,ruby,python bagian untuk membuatnya berlaku untuk semua file.
swt83
8
@xApple: Fungsi dalam, menyimpan dan mengembalikan pencarian terakhir tidak diperlukan - meninggalkan konteks fungsi akan menanganinya.
Tobias
3
@ swt83 Anda juga harus mengganti <buffer>dengan *jika Anda ingin bekerja pada semua file
cadlac
3
Jika Anda keeppkeepp %s/\s\+$//e
mengawali
68

Saya juga biasanya punya:

match Todo /\s\+$/

di .vimrcfile saya , sehingga spasi baris akhir adalah hilighted.

Todo menjadi nama-grup sintaks hilighting yang digunakan untuk kata kunci hilighting suka TODO, FIXMEatau XXX. Ini memiliki warna latar belakang kekuningan jelek yang menjengkelkan, dan saya menemukan itu yang terbaik untuk menunjukkan hal-hal yang tidak Anda inginkan dalam kode Anda :-)

tikar
sumber
7
Atau Anda dapat mengatur daftar dan mengatur daftar lagu + = jejak :.
Oli
Luar biasa - ini adalah jalan tengah yang sempurna antara menghapus spasi trailing secara otomatis (bahkan ketika saya mungkin tidak menyadarinya, atau ketika itu kode orang lain yang kebetulan saya gunakan di file yang sama), untuk tidak melakukan apa-apa . Terima kasih.
Daniel Hershcovich
2
sayangnya, skema warna favorit saya zenburn doens't highlight
Peter Long
@ Peter Long, tidak bekerja di tema railscasts baik. Periksa dengan :hi Todo. Jadi saya membaca dengan teliti :hi <Tab>dan :help hi. Saya mempertimbangkan Cursordan Error, tetapi saya pikir saya akan mencoba match VisualNOS /\s\+$/ . Saya mungkin menggabungkan ini dengan beberapa dari autocmdjawaban lain di sini.
Brady Trainor
51

Saya sama-sama menyoroti spasi spasi yang ada dan juga menghapus spasi spasi.

Saya mengkonfigurasi editor saya (vim) untuk menunjukkan ruang putih di akhir, misalnya

masukkan deskripsi gambar di sini

dengan ini di bagian bawah .vimrc saya:

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()

dan saya 'strip otomatis' dari file saat menyimpannya, dalam kasus saya * .rb untuk file ruby, lagi di ~ / .vimrc saya

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

Inilah cara untuk memfilter lebih dari satu FileType.

autocmd FileType c,cpp,python,ruby,java autocmd BufWritePre <buffer> :%s/\s\+$//e
syvex
sumber
Setiap File: autocmd FileType * autocmd BufWritePre <buffer>:% s / \ s \ + $ // e
JREAM
7

Disalin dan ditempel dari http://blog.kamil.dworakowski.name/2009/09/unobtrusive-highlighting-of-trailing.html (tautan tidak lagi berfungsi, tetapi bit yang Anda butuhkan ada di bawah)

"Ini memiliki keuntungan tidak menyoroti setiap ruang yang Anda ketik di akhir baris, hanya ketika Anda membuka file atau meninggalkan mode penyisipan. Sangat rapi."

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\+$/
lazysoundsystem
sumber
1
Tautan blog sepertinya sudah mati.
Tobias
Solusi yang sama ditemukan di tautan ini di bawah "Menggunakan perintah kecocokan".
ryanjdillon
6

Saya melihat solusi ini dalam komentar di VIM Wikia - Hapus spasi yang tidak diinginkan

Saya sangat menyukainya. Menambahkan .spasi putih yang tidak diinginkan.

masukkan deskripsi gambar di sini

Letakkan ini di .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()
Diego Juliao
sumber
5

Beginilah cara saya melakukannya. Saya tidak ingat di mana saya mencurinya dari tbh.

autocmd BufWritePre * :call <SID>StripWhite()
fun! <SID>StripWhite()
    %s/[ \t]\+$//ge
    %s!^\( \+\)\t!\=StrRepeat("\t", 1 + strlen(submatch(1)) / 8)!ge
endfun
gregf
sumber
2
Hum, itu cukup berbahaya untuk dilakukan di "*" jika Anda akhirnya membuka file biner, mereka mungkin berakhir dalam bentuk yang sangat buruk.
mat
Ya mungkin bukan yang paling cerdas, sekali lagi saya tidak menggunakan vim untuk hex editor. Itu tidak akan berjalan kecuali Anda menabung.
gregf
Saya pikir ini mengalahkan alternatif daftar setiap jenis file tunggal yang mungkin Anda kerjakan, bukan? Saya bekerja di rb, php, cs, html, sass, css, js, kopi, xml, xslt, pl, dll, dll, dll ... Apakah ada media yang bahagia?
Derek Sebelum
4
Kecuali Anda menulis ke file biner di vim, ini mungkin tidak akan menjadi masalah.
gregf
Muncul di %sbendera global (g) pertama tidak berguna seperti ruang di EOL :-)
Jens
3

Solusi yang hanya menghapus spasi spasi dari file tidak dapat diterima dalam semua keadaan. Ini akan bekerja dalam proyek yang telah memiliki kebijakan ini sejak awal, dan karenanya tidak ada ruang kosong sehingga Anda tidak hanya menambahkan diri Anda dalam komitmen yang akan datang.

Misalkan Anda hanya ingin tidak menambahkan contoh baru dari spasi putih, tanpa mempengaruhi spasi putih yang ada di baris yang tidak Anda edit, untuk menjaga komit Anda bebas dari perubahan yang tidak relevan dengan pekerjaan Anda.

Dalam hal ini, dengan git, Anda dapat menggunakan skrip seperti ini:

#!/bin/sh

set -e # bail on errors

git stash save commit-cleanup
git stash show -p | sed '/^\+/s/ *$//' | git apply
git stash drop

Dengan kata lain, kami menyimpan perubahan, dan kemudian memfilter semua +baris di diff untuk menghapus spasi kosong saat kami menerapkan kembali perubahan ke direktori yang berfungsi. Jika pipa perintah ini berhasil, kita menjatuhkan simpanan.

Kaz
sumber
1

Pendekatan lain di sini entah bagaimana tidak bekerja untuk saya di MacVim ketika digunakan dalam .vimrcfile. Jadi, inilah yang bisa dan menyoroti spasi tambahan:

set encoding=utf-8
set listchars=trail:·
set list
mb21
sumber
Pelaksana set listchars=trail:·mengatakan: E474: Invalid argument: listchars=trail:·. Bisakah Anda memvalidasi contoh Anda?
kenorb
0

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

aemonge
sumber
0

Untuk orang yang ingin menjalankannya untuk tipe file tertentu (Tipe File tidak selalu dapat diandalkan):

autocmd BufWritePre *.c,*.cpp,*.cc,*.h,*.hpp,*.py,*.m,*.mm :%s/\s\+$//e

Atau dengan vim7:

autocmd BufWritePre *.{c,cpp,cc,h,hpp,py,m,mm} :%s/\s\+$//e
Mr_Pouet
sumber
0

Jika Anda memangkas spasi, Anda hanya harus melakukannya pada file yang sudah bersih. "Ketika di Roma...". Ini adalah etika yang baik ketika mengerjakan basis kode di mana perubahan palsu tidak diterima.

Fungsi ini mendeteksi spasi spasi tambahan dan nyalakan pemangkasan hanya jika sudah bersih.

Penghargaan untuk ide ini berasal dari komentar di sini: https://github.com/atom/whitespace/issues/10 (aliran komentar bug tiket terpanjang yang pernah ada)

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
Karl Pickett
sumber
Anda juga dapat menyimpan register pencarian let _s=@/dan mengembalikannya di akhir `let @ / = _ s`. Dalam hal ini kami menggunakan register black hole
SergioAraujo