ความแตกต่างระหว่างการปล่อยและการตั้งค่าคืออะไร?


29

ฉันไม่รู้ทฤษฎีเบื้องหลัง Vim มากนัก ดูเหมือนว่าเราsetมีตัวแปรและletตัวแปรอื่น ๆ ความแตกต่างคืออะไรและเมื่อใดที่หนึ่งต้องการมากกว่าอีกอันหนึ่ง?

นอกจากนี้ solarchim vim colours พูดกับlet g:blabla...ความสำคัญของg:ในกรณีนี้คืออะไร?

คำตอบ:


35

letกำหนดค่าให้กับตัวแปรและsetกำหนดค่าให้กับหนึ่งในตัวเลือกภายในของ Vim

ตัวอย่างเช่นคุณจะใช้

:let mystring='Hello!'

เพื่อประกาศตัวแปรใหม่ แต่คุณจะใช้

:set tabstop=4

หรือ

:set expandtab

เพื่อตั้งค่าหนึ่งในตัวเลือกของ Vim

ดูเพิ่มเติม: :help let, :help set.

g:เพียงแค่บ่งบอกถึงตัวแปรทั่วโลก มีหลาย "ตัวแปรเนมสเปซ" - จาก: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.

8
โปรดทราบว่าคุณสามารถตั้งค่าตัวเลือกภายในของกลุ่มโดยใช้letโดยทำlet &{option name}=value
EvergreenTree

11

:setใช้สำหรับตัวเลือกภายในและจัดการกับชนิดของตัวเลือก มันช่วยให้สิ่งต่าง ๆ เช่นการผกผันของตัวเลือกบูลีน (เช่น:set invpaste) การเพิ่มและลบการตั้งค่าจากรายการ (เช่น:set dictionary-=/tmp/myfile)

:letในทางกลับกันอนุญาตให้เข้าถึงสิ่งที่เปลี่ยนแปลงได้มากมายในกลุ่มรวมถึงตัวแปรปกติตัวเลือกการลงทะเบียน ฯลฯ และค่าที่ตั้งไว้เป็นผลลัพธ์ของการประเมินค่านิพจน์แทนที่จะเป็นค่าอย่างง่ายเช่น:setซึ่งหมายความว่า:letให้คุณเข้าถึงคณิตศาสตร์การจัดการสตริงและฟังก์ชั่น

ตัวอย่างเช่นคุณสามารถ:let &dictionary=/tmp/myfileตั้งค่าตัวเลือก'dictionary'เป็น/tmp/myfile(เช่นการแก้ไขตัวเลือกเดียวกันที่แสดงด้านบนใน:setตัวอย่าง)

:let g:myvar=42คุณสามารถตั้งค่าตัวแปรระดับโลกที่มี คำนำหน้าคุณถามเกี่ยวกับขอบเขตให้ คำตอบของ Doorknob นั้นครอบคลุมการกำหนดขอบเขตอย่างดี

คุณสามารถ:let @a="Some text"เปลี่ยนเนื้อหาของ register a to contain Some textซึ่งคุณสามารถวางในภายหลัง"apได้

คุณสามารถ:let $PATH = $PATH . ":/home/me/bin"ผนวกไดเร็กทอรี bin ของคุณเองเข้ากับPATHตัวแปรสภาพแวดล้อมซึ่งส่งผ่านไปยังคำสั่งภายนอกที่เรียกใช้โดย Vim (สิ่งนี้ใช้ได้กับตัวแปรสภาพแวดล้อมใด ๆ )

แม้ว่าจะletมีความสามารถที่ทรงพลังบางอย่าง (เช่น:let $MYFILE = @%ตั้งค่าตัวแปรสภาพแวดล้อมเป็นชื่อไฟล์ของบัฟเฟอร์ปัจจุบัน) แต่ก็ไม่ทราบว่าการตั้งค่าเป็นบูลีนดังนั้นจึงไม่มีการเข้าถึงที่ดีหรือการตรวจสอบข้อผิดพลาดเช่น:setนั้น

ในที่สุดมันเกี่ยวกับการใช้เครื่องมือที่ดีที่สุดสำหรับงาน หากคุณต้องการแก้ไขตัวเลือกเพียงอย่างเดียว:setเป็นเครื่องมือของคุณ หากคุณต้องการย้ายข้อมูลไปมาระหว่างรีจิสเตอร์ตัวเลือกตัวแปรหรือฐานค่าของคุณตามผลลัพธ์ของนิพจน์แสดงว่า:letเป็นเครื่องมือของคุณ

แม้ว่าคุณจะถามเกี่ยวกับ Vim อย่างชัดเจน แต่สิ่งอื่นที่ควรทราบก็:setคือพบได้ทั่วไปในตระกูล vi / Vim ซึ่ง:letเป็นเรื่องธรรมดาน้อยกว่า (ตัวอย่างเช่น nvi ไม่มีletคำสั่งและ viemu ไม่ได้ให้การลงทะเบียนผ่านทางlet) .

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.