Vim: sự khác biệt giữa let và set là gì?


144

Sự khác biệt giữa letsettrong trình soạn thảo vim là gì?

Tôi đã luôn tự hỏi tại sao cả hai tồn tại?

Ngoài ra, tôi rất muốn nghe bối cảnh lịch sử của nó.


15
Bạn đã thử :help set:help letvà đọc hướng dẫn?
hochl

5
vâng tôi đã làm điều đó, nhưng tôi vẫn không hiểu tại sao tập hợp phải tồn tại, bởi vì hãy làm những điều tương tự.
Dave Halter

1
@DavidHalter: letkhông làm những điều tương tự. Có những điều bạn không thể đạt được với setđiều đó là có thể với let, xem câu trả lời của tôi.
René Nyffalanger

4
Không ai đã đề cập đến setlocal... chúng tương đương với &l:*các biến.
Chris Morgan

1
@VictorZamanian: đối với cài đặt boolean, có thể dễ dàng hơn để chỉ set noichoặc set ic. Theo như tôi biết, setcũng tương thích với viđó let, như tôi giả sử , không phải là.
René Nyffalanger 16/2/2017

Câu trả lời:


143

:setlà để thiết lập các tùy chọn , :letđể gán giá trị cho một biến .

Nó xảy ra rằng giá trị cho một tùy chọn được liên kết với tên của tùy chọn được đặt trước bởi một &( &option-namecấu trúc sau đó hoạt động rất giống với các biến "thông thường"). Vì vậy, sau đây là tương đương:

:set  tw=40
:let &tw=40

Nhưng, ví dụ, việc gán 50 cho biến toàn cục foo ( :let g:foo=50) không thể đạt được bằng một :setlệnh (vì g: foo là một biến và không phải là một tùy chọn).

Một số tùy chọn là boolean như. Khi thiết lập những thứ này, không cần giá trị (như trong :set noicvà ngược lại :set ic).


22

Set là giao diện thân thiện hơn dành riêng cho các tùy chọn

Ví dụ

:verbose set

để hiển thị tất cả các tùy chọn có hiệu lực.

:set tw=40

Sẽ làm việc như một tốc ký cho set textwidth=40

:set wrap&

Sẽ đặt giá trị mặc định cho tùy chọnwrap

:set nowrap

Sẽ bỏ đặt tùy chọn

:set wrap!

Sẽ chuyển đổi tùy chọn

Quan trọng nhất,

:setTab # để hoàn thành tab!

Rất ít trong số trên có thể (dễ dàng) đạt được với let.


re : :set nowrap, Options.txt (: help set-option) cho biết :: se [t] {tùy chọn} Toggle tùy chọn: đặt, bật nó lên. Tùy chọn số: hiển thị giá trị. Tùy chọn chuỗi: hiển thị giá trị. Điều này không đồng ý với những gì bạn có ở đây, khi bạn nói 'sẽ đặt giá trị mặc định cho gói tùy chọn'. ??
Chế độ xem hình elip

@Ellipticalview Tôi hơi bối rối. Bạn đang trích dẫn các phần của tài liệu. Nếu bạn đọc toàn bộ điều bạn sẽ thấy nó đồng ý với tất cả các trường hợp của tôi. [Lưu ý: các notùy chọn -prefixed có thể gây nhầm lẫn. Cũng lưu ý option&có một dấu vết &mà bạn có thể đã bỏ lỡ.]
sehe

12

:setchỉ hoạt động với các tùy chọn và câu trả lời của sehe giới thiệu một số ví dụ sử dụng tốt.

:letmặt khác có thể làm hầu hết mọi thứ :setcó thể làm, cộng với nhiều hơn nữa. Nó có thể gán giá trị cho

  • một biến, vd let vi = 'vim'
  • một lựa chọn, vd let &tw = 40
  • một đăng ký, ví dụ let @a = $HOME . '/vimfiles'
  • một biến môi trường, vd let $NOTHING = 'NOTHING'

Một sự khác biệt lớn nữa là phía bên phải :letlà một biểu thức , nghĩa là bạn có thể thực hiện những việc như nối chuỗi (như đã thấy trong ví dụ đăng ký của tôi ở trên) và các phép toán số học (ví dụ let &tw = 40 + 60). Điều này cũng có nghĩa là bạn phải trích dẫn giá trị nếu đó là một chuỗi. :setmặt khác đọc nguyên văn giá trị.

Nó dễ sử dụng hơn :setvới các tùy chọn mặc dù :letcũng có thể thực hiện hầu hết các tùy chọn , Dưới đây là một số so sánh sử dụng các ví dụ của sehe ("n / a" có nghĩa là không có cách nào để làm điều đó :let)

  • :verbose set vs n / a (đừng nghĩ có một cách khác để liệt kê tất cả các tùy chọn)
  • :set tw=40vs :let &tw = 40(vâng, bạn cũng có thể sử dụng cùng tốc ký let)
  • :set wrap& so với không
  • :set nowrapvs :let &wrap = 0(đối với các tùy chọn boolean, 0 là sai và 1 là đúng)
  • :set wrap! đấu với :let &wrap = !&wrap

Một vài ví dụ nữa

  • in giá trị của một tùy chọn: :set formatoptions?vs :echo &formatoptions( letkhông in giá trị, không giống như set)
  • gán cho nhiều tùy chọn cùng một lúc:

    :set et sw=4 sts=4 
    

    đấu với

    :let [&et, &sw, &sts] = [0, 4, 4]
    
  • đặt tùy chọn toàn cầu: setglobal etvs.let &g:et = 1

  • đặt tùy chọn cục bộ: setlocal etvs.let &l:et = 1

Xem :h :set:h :letđể biết thêm chi tiết


tl; dr

:setchỉ hoạt động với các tùy chọn nhưng cú pháp đơn giản hơn nhiều. :letlàm việc với không chỉ các tùy chọn mà còn cả các biến, thanh ghi và biến môi trường. Không giống như :set, phía bên tay phải :letlà một biểu thức.


10

Mở rộng về những gì mọi người đã viết :let, tôi nhận thấy rằng nó có thể được sử dụng để gán giá trị trong một biến cho một tùy chọn, điều gì đó :setkhông thể làm được. Ví dụ, hàm này sử dụng letđể gán giá trị trong biến toàn cục orig_twcho textwidthtùy chọn:

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

Tóm tắt: let cho phép gán một biến cho một tùy chọn: let &textwidth = g:orig_twvà ngược lại.
Serge Stroobandt

2

Nó rất đơn giản.
Như mọi người đã nói setlà cho các lựa chọn và hoạt động tốt hơn vì những hạn chế. Cũng setlà lệnh lịch sử mà tất cả các phiên bản visử dụng để đặt tùy chọn của chúng. Hầu hết (tất cả?) Các phiên bản khác của vikhông có let.

Nhưng có lẽ quan trọng nhất là sethoạt động trên tất cả các phiên bản của vim, letlệnh có thể được bỏ qua khi bạn biên dịch vim. Các tiêu chuẩn tinysmallxây dựng làm điều này.

Nếu nó thiếu letsẽ cung cấp cho bạn lỗi:
E319: Sorry, the command is not available in this version

Lưu ý: ifendifkhông được triển khai trong vim.tinynhưng trong trường hợp này, các lệnh không gây ra lỗi, thay vào đó, mọi thứ giữa hai lệnh được bỏ qua BAO GỒM else.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.