VIM Dosya Sonunda Otomatik Yeni Satırı Devre Dışı Bırak


251

Bu yüzden bir PHP dükkanında çalışıyorum ve hepimiz farklı editörler kullanıyoruz ve hepimiz pencerelerde çalışmak zorundayız. Vim kullanıyorum ve dükkandaki herkes bir dosyayı düzenlediğimde altta bir satırsonu bulunduğundan şikayet ediyor. Etrafımda araştırdım ve bunun vi & vim'in belgelenmiş bir davranışı olduğunu buldum ... ancak bu özelliği devre dışı bırakmanın bir yolu olup olmadığını merak ediyordum. (Belirli dosya uzantıları için devre dışı bırakabilseydim en iyisi olurdu).

Eğer kimse bunu biliyorsa, bu harika olurdu!


23
onlara aptal olduklarını söylemelisin - aslında vim'in bunu yapmasının iyi bir nedeni var: stackoverflow.com/questions/729692/… . Sanırım bu sadece unix benzeri sunuculara dağıtıyorsanız önemlidir.
hdgarrood

5
PHP'nin tavsiye ettiği resmi uygulama ?>, sadece bu nedenle son kapanış etiketini atlamaktır .
Sebastián Grignoli

bu soru muhtemelen süper kullanıcıdan önce ... ama orada olmalı.
gcb

20
Sorusu gerçekten olmalıdır: Biz dükkanda insanlar Dosyanın son satırı sağlamak için kullandığınız diğer editörler tüm anlatmak nasıl yapar bir EOL ile sona. ;-)
TJ Crowder

Yanıtlar:


361

Ve vim7.4+ için kullanabilirsiniz (tercihen .vimrc'nizde) (son haber biti için thanks sayesinde!):

:set nofixendofline

Şimdi eski sürümleriyle ilgili vim.

Dosya zaten sonunda yeni satırlarla kaydedilmiş olsa bile:

vim -b file ve bir kez vim:

:set noeol
:wq

yapılır.

alternatif olarak vim ile dosyaları :e ++bin file

Yine başka bir alternatif:

:set binary
:set noeol
:wq

6
Ayrıca ekleyebilir set binaryve set noeoliçine .vimrc
dryobs

17
Dikkat : binarygeçersiz kılmalar expandtab, bu da kaynağınızda gerçek sekmeler elde etmenizi sağlayacaktır.
Ciro Santilli 法轮功 10: 病 六四 事件 法轮功

4
@CiroSantilli teşekkür ederim! Sonsuza kadar ikili yan etkileri arıyordum ve neden varsayılan olmadığını merak ediyorum! sekmelerimi sevdiğim için, bu ek avantajı düşüneceğimi düşünüyorum :)
gcb

11
Şimdi set nofixendoflinesorunu Vim 7.4+
38'de

1
@TrevorBoydSmith evet, çünkü tarihsel olarak POSIX (gerçek standartta yanlış olabilirim) bir satırın sonunda, bir metin dosyasında yeni bir satır bekler. Bu yüzden çoğu çözümün bir ikili olarak işlem görmesi gerekiyordu. Muhtemelen o zaman çok elverişliydi ve Bugün geri döndü, bu yüzden şimdi uygun ayar var. Sadece vimrc'nize ekleyin. Yine de diğer editörlerde daha kötü sorunlar var :)
gcb

23

Satır sonu seçeneğini kapatmak için .vimrc'nize aşağıdaki komutu ekleyin:

autocmd FileType php setlocal noeol binary fileformat=dos

Bununla birlikte , PHP'nin kendisi son satır sonu yoksayacaktır - bu bir sorun olmamalıdır. Sizin durumunuzda son satırsonu karakterini ekleyen başka bir şey olduğundan ya da muhtemelen windows / unix satır sonlandırma türleriyle ( \nya da \r\nvb.) Bir karışıklık olduğundan neredeyse eminim .

Güncelleme:

Alternatif bir çözüm, bu satırı yalnızca .vimrc'nize eklemek olabilir:

set fileformats+=dos

Php yanlış ayrıştırma olmadığını biliyorum ... Bunu arkadaşlarıma gösterdim, ama winmerge onları farklı olarak görüyor ... Bunu deneyeceğim ve nasıl ortaya çıktığını size bildireceğim.
Boushley

Bunu yapmak, son satırın istenen etkisine sahip değildir, ancak aynı zamanda dosyayı unix satır sonlarına dönüştürür ... (hatta bir pencere kutusunda) ... Bu yüzden daha önce ikili moda geçerek yaptım ... ama sonra satır sonları not defterinde yazmayı göstermez ... her şey sadece bir satırdır.
Boushley

Ne yazık ki bu önerilerin hiçbiri işe yaramıyor. Autocmd dosyasına fileformat = dos eklemenin bir etkisi yoktur ve filetype + = dos
parametresini

Üzgünüm, yanlış anladım, 'set filetypes + = dos' kullanın, 'setformformets set' değil
çok fazla php

17

Git'i kaynak kontrolü için kullanıyorsanız buna yaklaşmanın başka bir yolu daha vardır. Buradaki bir yanıttan esinlenerek , bir gitattributes dosyasında kullanmak için kendi filtremi yazdım .

Bu filtreyi yüklemek için, filtreyi bulunduğunuz noeol_filteryerde saklayın $PATH, yürütülebilir yapın ve aşağıdaki komutları çalıştırın:

git config --global filter.noeol.clean noeol_filter
git config --global filter.noeol.smudge cat

Kendiniz için sadece filtreyi kullanmaya başlamak için, aşağıdaki satırı koymak $GIT_DIR/info/attributes:

*.php filter=noeol

Bu, .phpVim ne yaparsa yapsın, bir dosyada yeni satır sonlandırmamanızı sağlayacaktır .

Ve şimdi, komut dosyasının kendisi:

#!/usr/bin/python

# a filter that strips newline from last line of its stdin
# if the last line is empty, leave it as-is, to make the operation idempotent
# inspired by: /programming/1654021/how-can-i-delete-a-newline-if-it-is-the-last-character-in-a-file/1663283#1663283

import sys

if __name__ == '__main__':
    try:
        pline = sys.stdin.next()
    except StopIteration:
        # no input, nothing to do
        sys.exit(0)

    # spit out all but the last line
    for line in sys.stdin:
        sys.stdout.write(pline)
        pline = line

    # strip newline from last line before spitting it out
    if len(pline) > 2 and pline.endswith("\r\n"):
        sys.stdout.write(pline[:-2])
    elif len(pline) > 1 and pline.endswith("\n"):
        sys.stdout.write(pline[:-1])
    else:
        sys.stdout.write(pline)

Bu harika bir çözüm ... ne yazık ki git kullanmıyordum. Benzer bir yaklaşımın alınabileceğinden şüphelenmeme rağmen svn kullanıyordum. Her neyse, bu pozisyondan devam ettim ve bunun için endişelenmenize gerek yok :)
Boushley

12

Bu seçeneği denemedim, ancak vim yardım sisteminde (yani yardım eol) aşağıdaki bilgiler verilir:

'endofline' 'eol'   boolean (default on)
            local to buffer
            {not in Vi}

When writing a file and this option is off and the 'binary' option
is on, no <EOL> will be written for the last line in the file.  This
option is automatically set when starting to edit a new file, unless
the file does not have an <EOL> for the last line in the file, in
which case it is reset.  

Normalde bu seçeneği ayarlamanız veya sıfırlamanız gerekmez. 'İkili' kapalı olduğunda değer, dosya yazılırken kullanılmaz. 'İkili' açık olduğunda, dosyadaki son satırın bir varlığını hatırlamak için kullanılır, böylece dosyayı yazdığınızda orijinal dosyadaki durum korunabilir. Ama isterseniz değiştirebilirsiniz.

Önceki bir sorunun yanıtıyla da ilgilenebilirsiniz: " Dosyalar neden bir satırsonu ile bitmeli? "


Ben de eol ayarına rastlamıştım ... ama bu görevi yerine getirmiyor. Dosyanın sonuna yerleştirilip yerleştirilmediğini belirleyen bir değişkendir. Ayrıca, metin dosyaları üzerinde hiçbir etkisi yoktur, sadece ikili dosyalar üzerinde etkisi vardır.
Boushley

3
Vim yardımı ayrıca "İkili" kapalı olduğunda değer, dosya yazılırken kullanılmaz. " eol hakkında
Boushley

1
VonC'nin "newline" ve EOL'nin sınırlandırıldığını vurgulayan bu soruya verdiği cevap için +1. Alt editörler EOL nedeniyle yanlış ekstra bir satırsonu görüntüler , vim "satırsonu" eklemiyor!
Ches

9

Vim wiki'ye benzer (farklı olsa da) bir sorun için bir ipucu ekledim:

http://vim.wikia.com/wiki/Do_not_auto-add_a_newline_at_EOF


5
“Vim 7.4.785 fixeol, dosyanın sonunda eksik olan EOL'leri otomatik olarak korumak için devre dışı bırakılabilecek bir seçenek ekliyor . Bu komut dosyası Vim 7.4.785 ve sonraki sürümleri için gereksiz hale gelir. ” (Kaynak: aynı wiki sayfası.) Teşekkürler, yeni seçeneğin farkında değildim.
Amir

1
İkisini de ayarlamak noeolve nofixeolistenen sonucu elde etmek zorunda kaldım .
selurvedu

8

Tamam, Windows'da olmak işleri karmaşıklaştırıyor;)

'İkili' seçeneği 'dosya biçimi' seçeneğini sıfırladığı için (ve 'ikili' setiyle yazmak her zaman unix satır sonlarıyla yazılır), büyük çekici çıkaralım ve harici olarak yapalım!

BufWritePost olayı için bir otomatik komut (: autocommand yardım) tanımlamaya ne dersiniz? Bu otomatik komut, tam bir arabellek her yazışınızda yürütülür. Bu otomatik komutta, yeni yazılmış dosyanın son satırsonu olan küçük bir harici aracı (php, perl veya herhangi bir komut dosyası) çağırın.

Yani bu şuna benzer ve .vimrc dosyanıza gider:

autocmd!   "Remove all autocmds (for current group), see below"
autocmd BufWritePost *.php !your-script <afile>

Otokomutlarla ilk kez ilgileniyorsanız, otokomutlarla ilgili tüm vim belgelerini okuduğunuzdan emin olun. Bazı uyarılar vardır, örneğin .vimrc'nizin birden çok kez kaynaklanması durumunda .vimrc'nizdeki tüm autocmds'ları kaldırmanız önerilir.


Şey ... Bundan daha iyi bir çözüm olmasını umuyordum ... ama bu kesinlikle işe yarıyor!
Boushley

3
Harika çalışıyor! Yaşasın! Ancak bir sorum var ... bunu yapmanın bir yolu var, bu yüzden her kayıttan sonra iki kez enter tuşuna basmam gerekmiyor. Vim bana komut dosyası başarılı bir şekilde geri döndüğünü söylüyor çünkü patladı cmd penceresine girmek ve daha sonra tekrar vurmak zorunda ... Sadece hepsini ortadan kaldırmak için herhangi bir yolu var mı?
Boushley

2
<Enter'a basın> komut istemlerini önlemek için komutun önüne önek koyun silent. Örn silent !your-script <afile>.
dash-tom-bang

6

Blixtor'un önerilerini Perl ve Python post-processing ile uyguladım, ya Vim'de (bu dil desteği ile derlenmişse) veya harici bir Perl betiği ile çalıştım. Sanki kullanılabilir PreserveNoEOL eklentisi vim.org üzerinde.


Ben tamamen test etmedim, ama bu daha iyi bir çözüm gibi görünüyor.
Boushley

İşlerin Eklentisi ama kurulumdan sonra ben koymak zorunda let g:PreserveNoEOL = 1benim içine .vimrcdosyanın! Eklenti açıklamasından anlamaya vimscript öğrenmek zorunda kaldım! : D
DarthVanger

1
@DarthVanger: :help PreserveNoEOL-usagesize de söylerdim. RTFM :-)
Ingo Karkat

@IngoKarkat Oh, üzgünüm. Bu under arıyordu INSTALLATIONve CONFIGURATION. Hatta USAGEkurulumun üst kısmında, çünkü açıklama bölümü fark etmedi :)
DarthVanger

3

Belki neden şikayet ettiklerine bakabilirsiniz. Eğer bir php dosyası bittikten sonra yeni satır içeriyorsa? Dosya eklendikten sonra üstbilgiler göndermeye çalışmadığınız sürece bu sorun olmaz.

Ancak, bir php dosyasının sonundaki?> İsteğe bağlıdır. Bitiş yok mu?>, Dosyanın sonundaki yeni satırla ilgili sorun yok.


2
Haklısın, ama bir dükkan olarak sonun daha iyi görüneceğine karar verdik?> Bunu kullanmayı bırakabileceğimizi biliyorum ... ama editörümü kodlama tarzımı diğer tarafa göre ayarlamayı tercih ederim.
Boushley

1
Ayrıca, php'nin bitiş etiketinizi?> Veya?> \ N olarak otomatik olarak ayrıştıracağını biliyorsunuz (çünkü linux'da tüm geçerli dosyalar \ n ile bitmelidir) ... Yani kodum bu sorunlara neden olmaz ... sadece görünüşü sevmiyorlar.
Boushley

2

.Vimrc ekliyorum

set binary

ve yardımcı oluyor, dene


2

Bence kabul edilen cevaptan daha iyi bir çözüm buldum. Alternatif çözümler benim için işe yaramıyordu ve ben her zaman ikili modda çalışmak istemedim. Neyse ki bu iş bitmiş gibi görünüyor ve henüz herhangi bir kötü yan etkileri ile karşılaşmadım: metin dosyalarının sonunda satır sonu eksik korumak . Her şeyi ~ / .vimrc'ye ekledim.


1

Bu dosyaları kaydetmek için özel bir komut kullanmanız mümkün müdür?

Eğer şunu yaparsanız: binary,: w ve: nobinary komutlarını başlatacaksanız yeni satır olmadan yazılır.

Bu komut dizisi elbette kullanıcı tanımlı bir komuta veya bir haritalamaya konabilir.


Ne yazık ki windows ile çalıştığım için, ikili modda kaydedersem, kaydetmeyi unix modunda olmaya zorlar. Yaptığımda bile: set binary: set fileformat = dos: w: set nobinary Çıktıktan sonra dosyayı unix formatında kaydetti ... Bunu kapatmak için bir yol olmadığına inanamıyorum.
Boushley


0

Bu vimscript eklentisinin bu durum için yararlı olduğunu buldum.

Plugin 'vim-scripts/PreserveNoEOL'

Veya github'da daha fazlasını okuyun

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.