Qual é a diferença entre let e set?

29

Não conheço muito a teoria por trás do Vim. Parece que temos setalgumas variáveis ​​e letoutras variáveis. Qual é a diferença e quando é necessário um sobre o outro?

Além disso, o esquema de cores do vim solarizado diz para let g:blabla...qual é o significado g:nesse caso?

Anthony
fonte

Respostas:

35

letatribui um valor a uma variável e setatribui um valor a uma das opções internas do Vim.

Por exemplo, você usaria

:let mystring='Hello!'

para declarar uma nova variável, mas você usaria

:set tabstop=4

ou

:set expandtab

para definir uma das opções do Vim.

Veja também: :help let, :help set.

g:simplesmente significa uma variável global. Existem vários desses "namespaces variáveis" - de :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.
Maçaneta
fonte
8
Note que você pode definir opções internas do Vim usando letfazendolet &{option name}=value
EvergreenTree
11

:seté usado para opções internas e lida com os tipos da opção. Permite coisas como a inversão de opções booleanas (por exemplo, :set invpasteadicionar e remover configurações de uma lista (por exemplo :set dictionary-=/tmp/myfile)).

:let, Por outro lado, permite o acesso a uma infinidade de coisas mutáveis no vim, incluindo variáveis regulares, opções, registos, etc. e o valor a ser definido é o resultado da avaliação de uma expressão, em vez de um valor simples, como com :set, o que significa :letdá acesso a matemática, manipulação de strings e funções.

Por exemplo, você pode :let &dictionary=/tmp/myfiledefinir a opção 'dictionary'para /tmp/myfile(modificando a mesma opção mostrada acima no :setexemplo)

Você pode definir uma variável global com :let g:myvar=42. O prefixo que você perguntou fornece escopo. A resposta da maçaneta da porta cobre muito bem o escopo.

Você pode :let @a="Some text"alterar o conteúdo do registro a para conter Some text, que poderá ser colado posteriormente, "appor exemplo.

Você pode :let $PATH = $PATH . ":/home/me/bin"anexar seu próprio diretório bin à PATHvariável de ambiente, que é passada para qualquer comando externo executado pelo Vim (isso funciona para qualquer variável de ambiente).

Embora lettenha algumas habilidades bastante poderosas (como :let $MYFILE = @%definir uma variável de ambiente como o nome do arquivo do buffer atual), ele não sabe que uma configuração é booleana, por isso não oferece bons acessos ou verificação de erros como o :setfaz.

No final, trata-se de usar a melhor ferramenta para o trabalho. Se você deseja simplesmente modificar uma opção, :seté sua ferramenta. Se você deseja mover informações entre registradores, opções, variáveis ​​ou basear seu valor no resultado de uma expressão, então :leté sua ferramenta.

Embora você tenha perguntado explicitamente sobre o Vim, outra coisa a ser observada é que :seté mais comum nas famílias vi / Vim, onde :leté menos comum (por exemplo, o nvi não possui um letcomando e o viemu não fornece acesso aos registros via let) .

John O'M.
fonte