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).
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.
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>
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.
:help set
dan:help let
dan membaca manual?let
tidak melakukan hal yang sama. Ada hal-hal yang tidak dapat Anda capai denganset
yang mungkin dilakukanlet
, lihat jawaban saya.setlocal
... mereka setara dengan&l:*
variabel.set noic
atauset ic
. Sejauh yang saya tahu,set
juga kompatibel denganvi
yanglet
, seperti yang saya asumsikan , tidak.Jawaban:
:set
adalah untuk opsi pengaturan ,:let
untuk menetapkan nilai ke variabel .Kebetulan nilai untuk opsi terkait dengan nama opsi yang diawali dengan a
&
(&option-name
konstruk kemudian berperilaku sangat mirip dengan variabel "biasa"). Jadi, yang berikut ini setara:Tetapi, misalnya, menugaskan 50 ke variabel global foo (
:let g:foo=50
) tidak dapat dicapai dengan:set
perintah (karena g: foo adalah variabel dan bukan opsi).Beberapa opsi seperti boolean. Saat mengatur ini, tidak ada nilai yang diperlukan (seperti di dalam
:set noic
dan sebaliknya:set ic
).sumber
Set adalah antarmuka yang lebih ramah pengguna yang dikhususkan untuk opsi
Misalnya
untuk menampilkan semua opsi yang berlaku.
Akan bekerja sebagai singkatan untuk
set textwidth=40
Akan menetapkan nilai default untuk opsi
wrap
Akan membatalkan pilihan
Akan beralih opsi
Yang paling penting,
Beberapa hal di atas dapat (dengan mudah) dicapai dengan
let
.sumber
: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'. ??no
opsi -prefixed bisa membingungkan. Note jugaoption&
memiliki trailing&
yang mungkin Anda lewatkan.]:set
hanya berfungsi dengan opsi, dan jawabannya menunjukkan beberapa contoh penggunaan yang baik.:let
di sisi lain dapat melakukan hampir semua yang:set
dapat dilakukan, ditambah lagi. Itu dapat menetapkan nilailet vi = 'vim'
let &tw = 40
let @a = $HOME . '/vimfiles'
let $NOTHING = 'NOTHING'
Perbedaan utama lainnya adalah bahwa sisi kanan
:let
adalah ekspresi , yang berarti Anda dapat melakukan hal-hal seperti penggabungan string (seperti yang terlihat dalam contoh register saya di atas) dan operasi aritmatika (misalnyalet &tw = 40 + 60
). Ini juga berarti bahwa Anda harus mengutip nilai jika itu adalah string.:set
di sisi lain membaca nilai kata demi kata.Lebih mudah digunakan
:set
dengan opsi walaupun:let
bisa 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=40
vs:let &tw = 40
(ya, Anda juga bisa menggunakan steno yang samalet
):set wrap&
vs n / a:set nowrap
vs:let &wrap = 0
(untuk opsi boolean, 0 salah dan 1 benar):set wrap!
vs.:let &wrap = !&wrap
Beberapa contoh lagi
:set formatoptions?
vs:echo &formatoptions
(let
tidak mencetak nilai, tidak sepertiset
)menugaskan ke beberapa opsi secara bersamaan:
vs.
atur opsi global:
setglobal et
vslet &g:et = 1
setlocal et
vs.let &l:et = 1
Lihat
:h :set
dan:h :let
untuk lebih jelasnyatl; dr
:set
hanya bekerja dengan opsi tetapi sintaksnya jauh lebih sederhana.:let
bekerja dengan tidak hanya opsi tetapi juga variabel, register, dan variabel lingkungan. Berbeda dengan:set
, sisi kanan:let
adalah ekspresi.sumber
Memperluas apa yang telah ditulis orang
:let
, saya perhatikan bahwa itu dapat digunakan untuk menetapkan nilai dalam variabel ke opsi, sesuatu yang:set
tidak bisa dilakukan. Misalnya, fungsi ini digunakanlet
untuk menetapkan nilai dalam variabel globalorig_tw
ketextwidth
opsi:sumber
let
memungkinkan untuk menetapkan variabel ke opsi:let &textwidth = g:orig_tw
dan sebaliknya.Ini sangat sederhana.
Seperti yang dikatakan orang
set
adalah opsi dan bekerja lebih baik karena keterbatasan. Jugaset
adalah perintah historis yang digunakan semua versivi
untuk mengatur opsi mereka. Sebagian besar (semua?) Versi lain darivi
tidak punyalet
.Tetapi mungkin yang paling penting adalah yang
set
berfungsi pada semua versivim
,let
perintah dapat dihilangkan ketika Anda kompilasivim
. Standartiny
dansmall
build melakukan ini.Jika tidak ada
let
memberi Anda kesalahan:E319: Sorry, the command is not available in this version
Catatan:
if
danendif
tidak diimplementasikan dalamvim.tiny
tetapi dalam kasus ini perintah tidak memberikan kesalahan, sebaliknya semua antara dua perintah dilewati TERMASUKelse
.sumber