Vim: let ve set arasındaki fark nedir?


145

Arasındaki fark nedir letve setvim editörü?

İkisinin de neden var olduğunu hep merak ettim.

Ayrıca, tarihsel geçmişini duymak isterim.


15
Kılavuzu denediniz :help setve :help letokudunuz mu?
hochl

5
evet bunu yaptım, ama hala neden var olması gerektiğini anlamıyorum, çünkü aynı şeyleri yapalım.
Dave Halter

1
@DavidHalter: letaynı şeyleri yapmaz. Orada ile sen ulaşamayacağını şeylerdir setile mümkün olduğunu let, benim cevaba bakınız.
René Nyffenegger

4
Kimse setlocalhenüz bahsetmedi ... &l:*değişkenlere eşdeğerdir .
Chris Morgan

1
@VictorZamanian: boolean ayarları için, set noicya da sadece tartışılması daha kolaydır set ic. Gibi bildiğim kadarıyla, setayrıca uyumlu violan let, sanıyorum olarak , değil.
René Nyffenegger

Yanıtlar:


144

:setseçenekleri ayarlamak , :letbir değişkene değer atamak içindir .

Bir seçeneğin değerinin a'nın başındaki seçeneğin adıyla bağlantılı olduğu görülür &( &option-nameyapı daha sonra "sıradan" değişkenlere çok benzer davranır). Yani, aşağıdakiler eşdeğerdir:

:set  tw=40
:let &tw=40

Ancak, örneğin, global değişken foo ( :let g:foo=50) öğesine 50 atamak bir :setkomutla gerçekleştirilemez (çünkü g: foo bir seçenek değil, bir değişkendir).

Bazı seçenekler boole gibidir. Bunları ayarlarken hiçbir değere gerek yoktur ( :set noiciçeri ve tersi gibi :set ic).


22

Set, seçenekler için uzmanlaşmış daha kullanıcı dostu bir arayüzdür

Örneğin

:verbose set

geçerli tüm seçenekleri görüntülemek için.

:set tw=40

Kısayol olarak çalışacak set textwidth=40

:set wrap&

Seçenek için varsayılan değeri ayarlarwrap

:set nowrap

Seçeneği kaldıracak

:set wrap!

Will geçiş seçeneği

En önemlisi,

:setTab # sekme tamamlama almak için!

Yukarıdakilerin azıyla (kolayca) elde edilebilir let.


re:, :set nowrapoptions.txt (: help set-option) diyor ki:: se [t] {option} Toggle option: set, open. Sayı seçeneği: değeri göster. Dize seçeneği: değeri göster. Bu, 'seçenek sarma için varsayılan değeri ayarlayacak' dediğinde, buradakilerle uyuşmuyor. ??
Eliptik görünüm

@Ellipticalview Biraz kafam karıştı. Belgelerin bölümlerinden alıntı yapıyorsunuz. Eğer her şeyi okursanız, tüm davalarım ile uyumlu olduğunu göreceksiniz. [Not: no-prefixed seçenekler kafa karıştırıcı olabilir. Ayrıca not kaçırmış olabilirsiniz option&bir iz &vardır.]
sehe

12

:setsadece seçeneklerle çalışır ve sehe'nin cevabı bazı iyi kullanım örneklerini gösterir.

:letÖte yandan, neredeyse her şeyi :setve daha fazlasını yapabilir. İçin bir değer atayabilir

  • bir değişken, ör. let vi = 'vim'
  • bir seçenek, ör. let &tw = 40
  • bir kayıt, ör. let @a = $HOME . '/vimfiles'
  • bir ortam değişkeni, ör. let $NOTHING = 'NOTHING'

Bir diğer önemli fark, sağ tarafının :letbir ifade olmasıdır , yani dize birleştirme (yukarıdaki kayıt örneğimde görüldüğü gibi) ve aritmetik işlemler (örn. let &tw = 40 + 60) Yapabilirsiniz . Bu aynı zamanda bir dize ise değeri alıntılamanız gerektiği anlamına gelir. :setdiğer yandan kelimesi kelimesine değeri okur.

Bu :setseçeneklerin :letçoğunu da yapabilmesine rağmen daha kolay , Sehe'nin örneklerini kullanan bazı karşılaştırmalar ("n / a" bunu yapmanın bir yolu olmadığı anlamına gelir :let)

  • :verbose set vs yok (tüm seçenekleri listelemenin başka bir yolu olduğunu düşünmeyin)
  • :set tw=40vs :let &tw = 40(evet, aynı stenoyu da kullanabilirsiniz let)
  • :set wrap& vs yok
  • :set nowrapvs :let &wrap = 0(boole seçenekleri için, 0 yanlış ve 1 doğrudur)
  • :set wrap! vs :let &wrap = !&wrap

Birkaç örnek daha

  • bir seçeneğin değerini yazdır: :set formatoptions?vs :echo &formatoptions( letdeğerleri yazdırmaz, aksine set)
  • aynı anda birden fazla seçeneğe atama:

    :set et sw=4 sts=4 
    

    vs

    :let [&et, &sw, &sts] = [0, 4, 4]
    
  • global seçeneği ayarla: setglobal etvslet &g:et = 1

  • yerel seçeneği ayarla: setlocal etvslet &l:et = 1

Daha fazla ayrıntı için :h :setve bölümüne bakın:h :let


tl; Dr.

:setyalnızca seçeneklerle çalışır, ancak sözdizimi çok daha basittir. :letyalnızca seçeneklerle değil, değişkenlerle, yazmaçlarla ve ortam değişkenleriyle de çalışır. Aksine :set, sağ tarafı :letbir ifadedir.


10

İnsanların ne hakkında yazdıklarını genişleterek, :letbir seçeneğe bir değişkene değer atamak için kullanılabileceğini fark ettim, bir şey :setyapamaz. Örneğin, bu fonksiyon kullanır letgenel değişken değeri atamak için orig_twiçin textwidthseçenek:

" Toggle Autowrap
" Default of 72 but can be overridden by tw settings in other vimrc files
let g:orig_tw = 72
function Toggle_autowrap_mode()
    if &textwidth == 0
        " Must use let instead of set here in order for g:orig_tw to be
        " evaluated properly
        let &textwidth = g:orig_tw
        echo "Autowrap mode on tw=" . &textwidth
    else
        let g:orig_tw = &textwidth
        set textwidth=0
        echo "Autowrap mode off tw=" . &textwidth
    endif
endfunction

noremap _A :call Toggle_autowrap_mode()<CR>

Özet: let : bir seçenek bir değişken atamak için de sağlar let &textwidth = g:orig_twve tersi.
Serge Stroobandt

2

Çok basit.
İnsanların söylediği gibi setseçenekler içindir ve sınırlama nedeniyle daha iyi çalışır. Ayrıca set, tüm komut sürümlerinin viseçeneklerini ayarlamak için kullandığı geçmiş komuttur . Çoğu (tümü?) Diğer sürümleri viyok let.

Ama belki de en önemlisi olmasıdır settüm sürümlerinde çalışır vim, letkomut atlanabilir sen derlerken vim. Standart tinyve smallyapılar bunu yapar.

Bu parametre eksik olursa letsize hata veriyor:
E319: Sorry, the command is not available in this version

Not: ifve endifher ikisinde de uygulanmaz, vim.tinyancak bu durumda komutlar hata vermez, bunun yerine iki komut arasındaki her şey DAHİL olarak atlanır else.

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.