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


29

Tôi không biết nhiều về lý thuyết đằng sau Vim. Có vẻ như chúng ta setmột số biến, và letcác biến khác. Sự khác biệt là gì, và khi nào thì cần một cái khác?

Ngoài ra, vim colorscheme mặt trời nói lên let g:blabla...tầm quan trọng của g:trường hợp này là gì?

Câu trả lời:


35

letgán giá trị cho một biến và setgán giá trị cho một trong các tùy chọn nội bộ của Vim.

Ví dụ: bạn sẽ sử dụng

:let mystring='Hello!'

để khai báo một biến mới, nhưng bạn sẽ sử dụng

:set tabstop=4

hoặc là

:set expandtab

để đặt một trong các tùy chọn của Vim.

Xem thêm: :help let, :help set.

g:chỉ đơn giản là biểu thị một biến toàn cục. Có một vài trong số các "không gian tên biến" này :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
Xin lưu ý rằng bạn có thể thiết lập các tùy chọn nội bộ của vim bằng letcách thực hiệnlet &{option name}=value
EvergreenTree

11

:setđược sử dụng cho các tùy chọn nội bộ và xử lý các loại tùy chọn. Nó cho phép những thứ như đảo ngược các tùy chọn boolean (ví dụ :set invpaste) thêm và xóa cài đặt khỏi danh sách (ví dụ :set dictionary-=/tmp/myfile).

:letmặt khác, cho phép truy cập vào rất nhiều thứ có thể thay đổi trong vim, bao gồm các biến thông thường, tùy chọn, thanh ghi, v.v. và giá trị được đặt là kết quả của việc đánh giá một biểu thức, thay vì một giá trị đơn giản như với :set, có nghĩa là :letcung cấp cho bạn quyền truy cập vào toán học, thao tác chuỗi và các hàm.

Ví dụ: bạn có thể :let &dictionary=/tmp/myfileđặt tùy chọn 'dictionary'thành /tmp/myfile(do đó sửa đổi cùng tùy chọn được hiển thị ở trên trong :setví dụ)

Bạn có thể đặt một biến toàn cục với :let g:myvar=42. Tiền tố bạn hỏi về cung cấp phạm vi. Câu trả lời của Doorknob bao trùm phạm vi rất tốt.

Bạn có thể :let @a="Some text"thay đổi nội dung đăng ký a để chứa Some text, "apví dụ sau này bạn có thể dán .

Bạn có thể :let $PATH = $PATH . ":/home/me/bin"nối thêm thư mục bin của riêng bạn vào PATHbiến môi trường, được chuyển đến bất kỳ lệnh bên ngoài nào được thực hiện bởi Vim (điều này hoạt động cho bất kỳ biến môi trường nào).

Mặc dù letcó một số khả năng khá mạnh mẽ (như :let $MYFILE = @%đặt biến môi trường thành tên tệp của bộ đệm hiện tại), nhưng không biết rằng cài đặt là boolean, vì vậy nó không cung cấp quyền truy cập hay kiểm tra lỗi như thế :setnào.

Cuối cùng, đó là về việc sử dụng công cụ tốt nhất cho công việc. Nếu bạn chỉ muốn sửa đổi một tùy chọn, :setlà công cụ của bạn. Nếu bạn muốn di chuyển thông tin giữa các thanh ghi, tùy chọn, biến hoặc dựa trên giá trị của kết quả của một biểu thức, thì đó :letlà công cụ của bạn.

Mặc dù bạn đã hỏi rõ ràng về Vim, một điều khác cần lưu ý là :setphổ biến hơn trong các họ vi / Vim, nơi :letít phổ biến hơn (ví dụ: nvi không có letlệnh và viemu không cung cấp quyền truy cập vào các thanh ghi thông qua let) .

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.