Apa perbedaan antara membiarkan dan mengatur?

29

Saya tidak tahu banyak tentang teori di balik Vim. Sepertinya kita setbeberapa variabel, dan letvariabel lainnya. Apa bedanya, dan kapan yang satu lebih dibutuhkan?

Juga, vich colorscheme solarized mengatakan untuk let g:blabla...apa pentingnya g:dalam hal ini?

Anthony
sumber

Jawaban:

35

letmemberikan nilai ke variabel, dan setmemberikan nilai ke salah satu opsi internal Vim.

Misalnya, Anda akan menggunakan

:let mystring='Hello!'

untuk mendeklarasikan variabel baru, tetapi Anda akan menggunakan

:set tabstop=4

atau

:set expandtab

untuk mengatur salah satu opsi Vim.

Lihat juga: :help let, :help set.

g:hanya menandakan variabel global. Ada beberapa "ruang nama variabel" ini —dari :help internal-variables:

        (nothing) In a function: local to a function; otherwise: global
|buffer-variable|    b:   Local to the current buffer.
|window-variable|    w:   Local to the current window.
|tabpage-variable|   t:   Local to the current tab page.
|global-variable|    g:   Global.
|local-variable|     l:   Local to a function.
|script-variable|    s:   Local to a |:source|'ed Vim script.
|function-argument|  a:   Function argument (only inside a function).
|vim-variable|       v:   Global, predefined by Vim.
Gagang pintu
sumber
8
Perhatikan bahwa Anda dapat mengatur opsi internal vim menggunakan letdengan melakukanlet &{option name}=value
EvergreenTree
11

:setdigunakan untuk opsi internal dan menangani jenis opsi. Ini memungkinkan hal-hal seperti inversi opsi boolean (misalnya :set invpaste) menambah dan menghapus pengaturan dari daftar (misalnya :set dictionary-=/tmp/myfile).

:let, di sisi lain, memungkinkan akses ke banyak hal yang dapat diubah dalam vim, termasuk variabel reguler, opsi, register, dll. dan nilai yang ditetapkan adalah hasil dari mengevaluasi ekspresi, bukan nilai sederhana seperti dengan :set, yang berarti :letmemberi Anda akses ke matematika, manipulasi string, dan fungsi.

Misalnya, Anda dapat :let &dictionary=/tmp/myfilemengatur opsi 'dictionary'ke /tmp/myfile(sehingga memodifikasi opsi yang sama seperti yang ditunjukkan di atas dalam :setcontoh)

Anda dapat mengatur variabel global dengan :let g:myvar=42. Awalan yang Anda tanyakan tentang menyediakan cakupan. Jawaban Doorknob mencakup pelingkupan dengan sangat baik.

Anda dapat :let @a="Some text"mengubah konten register menjadi mengandung Some text, yang nantinya bisa Anda tempel dengan "ap.

Anda bisa :let $PATH = $PATH . ":/home/me/bin"menambahkan direktori bin Anda sendiri ke PATHvariabel lingkungan, yang diteruskan ke perintah eksternal yang dijalankan oleh Vim (ini berfungsi untuk variabel lingkungan apa pun).

Meskipun letmemiliki beberapa kemampuan yang sangat kuat (seperti :let $MYFILE = @%untuk mengatur variabel lingkungan ke nama file buffer saat ini), ia tidak tahu bahwa pengaturan adalah boolean, sehingga tidak menawarkan akses yang bagus atau pengecekan kesalahan seperti :sethalnya.

Pada akhirnya, ini tentang menggunakan alat terbaik untuk pekerjaan itu. Jika Anda hanya ingin memodifikasi opsi, :setadalah alat Anda. Jika Anda ingin memindahkan informasi antara register, opsi, variabel, atau mendasarkan nilai Anda pada hasil ekspresi, maka itu :letadalah alat Anda.

Meskipun Anda secara eksplisit bertanya tentang Vim, hal lain yang perlu diperhatikan adalah yang :setlebih umum di keluarga vi / Vim, di mana :letkurang umum (misalnya, nvi tidak memiliki letperintah, dan viemu tidak menyediakan akses ke register melalui let) .

John O'M.
sumber