Vim: Apa perbedaan antara membiarkan dan mengatur?

144

Apa perbedaan antara letdan seteditor vim?

Saya selalu bertanya-tanya mengapa keduanya ada?

Saya juga tertarik mendengar latar belakang sejarahnya.

Dave Halter
sumber
15
Apakah Anda mencoba :help setdan :help letdan membaca manual?
hochl
5
ya saya melakukan itu, tetapi saya masih belum mengerti mengapa set harus ada, karena biarkan melakukan hal yang sama.
Dave Halter
1
@ Davidvidal: lettidak melakukan hal yang sama. Ada hal-hal yang tidak dapat Anda capai dengan setyang mungkin dilakukan let, lihat jawaban saya.
René Nyffenegger
4
Belum ada yang menyebutkan setlocal... mereka setara dengan &l:*variabel.
Chris Morgan
1
@ Viktoramanian: untuk pengaturan boolean, bisa dibilang lebih mudah untuk hanya set noicatau set ic. Sejauh yang saya tahu, setjuga kompatibel dengan viyang let, seperti yang saya asumsikan , tidak.
René Nyffenegger

Jawaban:

143

:setadalah untuk opsi pengaturan , :letuntuk menetapkan nilai ke variabel .

Kebetulan nilai untuk opsi terkait dengan nama opsi yang diawali dengan a &( &option-namekonstruk kemudian berperilaku sangat mirip dengan variabel "biasa"). Jadi, yang berikut ini setara:

:set  tw=40
:let &tw=40

Tetapi, misalnya, menugaskan 50 ke variabel global foo ( :let g:foo=50) tidak dapat dicapai dengan :setperintah (karena g: foo adalah variabel dan bukan opsi).

Beberapa opsi seperti boolean. Saat mengatur ini, tidak ada nilai yang diperlukan (seperti di dalam :set noicdan sebaliknya :set ic).

René Nyffenegger
sumber
22

Set adalah antarmuka yang lebih ramah pengguna yang dikhususkan untuk opsi

Misalnya

:verbose set

untuk menampilkan semua opsi yang berlaku.

:set tw=40

Akan bekerja sebagai singkatan untuk set textwidth=40

:set wrap&

Akan menetapkan nilai default untuk opsiwrap

:set nowrap

Akan membatalkan pilihan

:set wrap!

Akan beralih opsi

Yang paling penting,

:setTab # untuk mendapatkan penyelesaian tab!

Beberapa hal di atas dapat (dengan mudah) dicapai dengan let.

lihat
sumber
re :set nowrap:, options.txt (: help set-option) mengatakan:: se [t] {option} Opsi beralih: set, aktifkan. Opsi angka: menunjukkan nilai. Opsi string: tampilkan nilai. Ini tidak setuju dengan apa yang Anda miliki di sini, ketika Anda mengatakan 'akan menetapkan nilai default untuk bungkus opsi'. ??
Tampilan elips
@ Elipticalview Saya agak bingung. Anda mengutip bagian dari dokumentasi. Jika Anda membaca semuanya Anda akan setuju dengan semua kasus saya. [Catatan: noopsi -prefixed bisa membingungkan. Note juga option&memiliki trailing &yang mungkin Anda lewatkan.]
sehe
12

:sethanya berfungsi dengan opsi, dan jawabannya menunjukkan beberapa contoh penggunaan yang baik.

:letdi sisi lain dapat melakukan hampir semua yang :setdapat dilakukan, ditambah lagi. Itu dapat menetapkan nilai

  • sebuah variabel, mis let vi = 'vim'
  • opsi, mis let &tw = 40
  • sebuah register, mis let @a = $HOME . '/vimfiles'
  • variabel lingkungan, mis let $NOTHING = 'NOTHING'

Perbedaan utama lainnya adalah bahwa sisi kanan :letadalah ekspresi , yang berarti Anda dapat melakukan hal-hal seperti penggabungan string (seperti yang terlihat dalam contoh register saya di atas) dan operasi aritmatika (misalnya let &tw = 40 + 60). Ini juga berarti bahwa Anda harus mengutip nilai jika itu adalah string. :setdi sisi lain membaca nilai kata demi kata.

Lebih mudah digunakan :setdengan opsi walaupun :letbisa juga melakukan sebagian besar, Berikut adalah beberapa perbandingan menggunakan contoh-contoh sehe ("n / a" berarti tidak ada cara untuk melakukannya dengan :let)

  • :verbose set vs n / a (jangan berpikir ada cara lain untuk mendaftar semua opsi)
  • :set tw=40vs :let &tw = 40(ya, Anda juga bisa menggunakan steno yang sama let)
  • :set wrap& vs n / a
  • :set nowrapvs :let &wrap = 0(untuk opsi boolean, 0 salah dan 1 benar)
  • :set wrap! vs. :let &wrap = !&wrap

Beberapa contoh lagi

  • cetak nilai opsi: :set formatoptions?vs :echo &formatoptions( lettidak mencetak nilai, tidak seperti set)
  • menugaskan ke beberapa opsi secara bersamaan:

    :set et sw=4 sts=4 
    

    vs.

    :let [&et, &sw, &sts] = [0, 4, 4]
    
  • atur opsi global: setglobal etvslet &g:et = 1

  • atur opsi lokal: setlocal etvs.let &l:et = 1

Lihat :h :setdan :h :letuntuk lebih jelasnya


tl; dr

:sethanya bekerja dengan opsi tetapi sintaksnya jauh lebih sederhana. :letbekerja dengan tidak hanya opsi tetapi juga variabel, register, dan variabel lingkungan. Berbeda dengan :set, sisi kanan :letadalah ekspresi.

doubleDown
sumber
10

Memperluas apa yang telah ditulis orang :let, saya perhatikan bahwa itu dapat digunakan untuk menetapkan nilai dalam variabel ke opsi, sesuatu yang :settidak bisa dilakukan. Misalnya, fungsi ini digunakan letuntuk menetapkan nilai dalam variabel global orig_twke textwidthopsi:

" 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>
Will Fiveash
sumber
Ringkasan: let memungkinkan untuk menetapkan variabel ke opsi: let &textwidth = g:orig_twdan sebaliknya.
Serge Stroobandt
2

Ini sangat sederhana.
Seperti yang dikatakan orang setadalah opsi dan bekerja lebih baik karena keterbatasan. Juga setadalah perintah historis yang digunakan semua versi viuntuk mengatur opsi mereka. Sebagian besar (semua?) Versi lain dari vitidak punya let.

Tetapi mungkin yang paling penting adalah yang setberfungsi pada semua versi vim, letperintah dapat dihilangkan ketika Anda kompilasi vim. Standar tinydan smallbuild melakukan ini.

Jika tidak ada letmemberi Anda kesalahan:
E319: Sorry, the command is not available in this version

Catatan: ifdan endiftidak diimplementasikan dalam vim.tinytetapi dalam kasus ini perintah tidak memberikan kesalahan, sebaliknya semua antara dua perintah dilewati TERMASUK else.

pengguna3710044
sumber