เป็นกลุ่ม: อะไรคือความแตกต่างระหว่างการให้และการตั้งค่า?


145

ความแตกต่างระหว่างletและsetในโปรแกรมแก้ไขเสียงเรียกเข้าคืออะไร?

ฉันสงสัยอยู่เสมอว่าทำไมทั้งคู่ถึงมีอยู่?

นอกจากนี้ฉันสนใจที่จะรับฟังประวัติความเป็นมา


15
คุณลอง:help setและ:help letและอ่านคู่มือการใช้งาน?
hochl

5
ใช่ฉันทำอย่างนั้น แต่ฉันก็ยังไม่เข้าใจว่าทำไมต้องมีอยู่จริงเพราะปล่อยให้ทำสิ่งเดียวกัน
Dave Halter

1
@DavidHalter: letไม่ทำสิ่งเดียวกัน มีสิ่งที่คุณไม่สามารถทำได้ด้วยsetที่เป็นไปได้ด้วยletดูคำตอบของฉัน
René Nyffenegger

4
ยังไม่มีใครพูดถึงsetlocal... พวกมันเทียบเท่ากับ&l:*ตัวแปร
Chris Morgan

1
@VictorZamanian: สำหรับการตั้งค่าบูลีนมันเป็นเนื้อหาที่ง่ายขึ้นเพียงแค่หรือset noic set icเท่าที่ผมรู้ว่าsetนอกจากนี้ยังเข้ากันได้กับviที่let, เป็นผมถือว่าไม่ได้
René Nyffenegger

คำตอบ:


144

:setสำหรับการตั้งค่าตัวเลือก , :letสำหรับการกำหนดค่าให้กับตัวแปร

มันเกิดขึ้นว่าค่าสำหรับตัวเลือกที่เชื่อมโยงกับชื่อของตัวเลือกที่เตรียมโดย&( &option-nameโครงสร้างนั้นจะทำงานคล้ายกับตัวแปร "ธรรมดา") ดังนั้นสิ่งต่อไปนี้เทียบเท่า:

:set  tw=40
:let &tw=40

ตัวอย่างเช่นการกำหนด 50 ให้กับตัวแปรโกลบอล foo ( :let g:foo=50) ไม่สามารถทำได้ด้วย:setคำสั่ง (เนื่องจาก g: foo เป็นตัวแปรและไม่ใช่ตัวเลือก)

บางตัวเลือกเป็นแบบบูล เมื่อตั้งค่าเหล่านี้ไม่จำเป็นต้องมีค่าใด ๆ (เหมือนใน:set noicและตรงกันข้าม:set ic)


22

Set เป็นอินเทอร์เฟซที่ใช้งานง่ายมากขึ้นโดยเฉพาะสำหรับตัวเลือก

เช่น

:verbose set

เพื่อแสดงตัวเลือกทั้งหมดที่มีผล

:set tw=40

จะทำงานเป็นชวเลข set textwidth=40

:set wrap&

จะตั้งค่าเริ่มต้นสำหรับตัวเลือกwrap

:set nowrap

จะยกเลิกการตั้งค่าตัวเลือก

:set wrap!

จะสลับตัวเลือก

ที่สำคัญที่สุดคือ,

:setTab # เพื่อให้แท็บสมบูรณ์!

ไม่กี่กระป๋องดังกล่าวข้างต้น (ง่าย) letทำได้ด้วย


Re :set nowrap:, options.txt (: help set-option) พูดว่า:: se [t] {ตัวเลือก} ตัวเลือกสลับ: ตั้งค่า, เปิดใช้งาน ตัวเลือกตัวเลข: แสดงค่า ตัวเลือกสตริง: แสดงค่า สิ่งนี้ไม่เห็นด้วยกับสิ่งที่คุณมีที่นี่เมื่อคุณพูดว่า 'จะตั้งค่าเริ่มต้นสำหรับการห่อตัวเลือก' ??
มุมมองรูปไข่

@ Ellipticalview ฉันสับสนเล็กน้อย คุณกำลังอ้างถึงบางส่วนของเอกสาร หากคุณอ่านทุกสิ่งคุณจะพบว่ามันเห็นด้วยกับทุกกรณีของฉัน [หมายเหตุ: noตัวเลือกที่แก้ไขแล้วอาจทำให้เกิดความสับสน นอกจากนี้ยังทราบoption&มีต่อท้าย&ที่คุณอาจจะพลาด].
sehe

12

:setใช้ได้กับตัวเลือกเท่านั้นและคำตอบของ sehe จะแสดงตัวอย่างการใช้งานที่ดี

:letในทางกลับกันสามารถทำเกือบทุกอย่างที่:setทำได้รวมทั้งอีก มันสามารถกำหนดค่าให้กับ

  • ตัวแปรเช่น let vi = 'vim'
  • ตัวเลือกเช่น let &tw = 40
  • การลงทะเบียนเช่น let @a = $HOME . '/vimfiles'
  • ตัวแปรสภาพแวดล้อมเช่น let $NOTHING = 'NOTHING'

อีกความแตกต่างที่สำคัญคือทางด้านขวามือของ:letเป็นแสดงออกซึ่งหมายความว่าคุณสามารถทำสิ่งต่างๆเช่นสตริง (เท่าที่เห็นในตัวอย่างของฉันลงทะเบียนด้านบน) และดำเนินการทางคณิตศาสตร์ (เช่นlet &tw = 40 + 60) นอกจากนี้ยังหมายความว่าคุณจะต้องอ้างอิงราคาถ้ามันเป็นสตริง :setในขณะที่อ่านค่าคำต่อคำ

มันใช้งานง่ายขึ้น:setด้วยตัวเลือกแม้ว่าจะ:letสามารถทำได้เกือบทั้งหมดนี่คือการเปรียบเทียบโดยใช้ตัวอย่างของ sehe ("n / a" หมายถึงไม่มีวิธีทำ:let)

  • :verbose set vs n / a (อย่าคิดว่าจะมีวิธีอื่นในรายการตัวเลือกทั้งหมด)
  • :set tw=40vs :let &tw = 40(ใช่คุณสามารถใช้ชวเลขเดียวกันได้letด้วย)
  • :set wrap& vs n / a
  • :set nowrapvs :let &wrap = 0(สำหรับตัวเลือกบูลีน 0 เป็นเท็จและ 1 เป็นจริง)
  • :set wrap! VS :let &wrap = !&wrap

อีกไม่กี่ตัวอย่าง

  • พิมพ์ค่าของตัวเลือก: :set formatoptions?vs :echo &formatoptions( letไม่พิมพ์ค่าเหมือนset)
  • กำหนดให้กับหลายตัวเลือกในเวลาเดียวกัน:

    :set et sw=4 sts=4 
    

    VS

    :let [&et, &sw, &sts] = [0, 4, 4]
    
  • ตั้งค่าตัวเลือกทั่วโลก: setglobal etvslet &g:et = 1

  • ตั้งค่าตัวเลือกในท้องถิ่น: setlocal etvslet &l:et = 1

ดู:h :setและ:h :letสำหรับรายละเอียดเพิ่มเติม


TL; DR

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


10

เมื่อเพิ่มสิ่งที่ผู้คนเขียน:letผมสังเกตเห็นว่ามันสามารถใช้เพื่อกำหนดค่าในตัวแปรให้กับตัวเลือกสิ่งที่:setไม่สามารถทำได้ ตัวอย่างเช่นฟังก์ชันนี้ใช้letเพื่อกำหนดค่าในตัวแปรโกลบอลorig_twให้กับtextwidthตัวเลือก:

" 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>

สรุป: letอนุญาตให้กำหนดตัวแปรให้กับตัวเลือก: let &textwidth = g:orig_twและในทางกลับกัน
Serge Stroobandt

2

มันง่ายมาก
อย่างที่ผู้คนพูดกันว่าsetเป็นทางเลือกและใช้งานได้ดีกว่าเพราะมีข้อ จำกัด นอกจากนี้ยังsetเป็นคำสั่งทางประวัติศาสตร์ที่ทุกรุ่นviใช้เพื่อตั้งค่าตัวเลือกของพวกเขา มากที่สุด (ทั้งหมด?) รุ่นอื่น ๆ ของไม่ได้vilet

แต่อาจจะเป็นสิ่งที่สำคัญที่สุดคือการที่setผลงานในทุกรุ่นของvimการคำสั่งสามารถละเว้นเมื่อคุณรวบรวมlet vimมาตรฐานtinyและงานsmallสร้างทำได้

หากไม่มีletข้อผิดพลาดจะทำให้คุณมีข้อผิดพลาด:
E319: Sorry, the command is not available in this version

หมายเหตุ: ifและendifไม่ได้ดำเนินการอย่างใดอย่างหนึ่งในแต่ในกรณีนี้คำสั่งไม่ให้เกิดข้อผิดพลาดแทนทุกอย่างระหว่างสองคำสั่งจะข้ามรวมถึงvim.tinyelse

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