Quelle est la différence entre let et set?

29

Je ne connais pas beaucoup la théorie derrière Vim. Il semble que nous ayons setquelques variables et d' letautres variables. Quelle est la différence, et quand l'un est-il nécessaire par rapport à l'autre?

En outre, le schéma de couleurs de Vim solarisé indique let g:blabla...quelle est la signification de g:dans ce cas?

Anthony
la source

Réponses:

35

letattribue une valeur à une variable et setattribue une valeur à l'une des options internes de Vim.

Par exemple, vous utiliseriez

:let mystring='Hello!'

pour déclarer une nouvelle variable, mais vous utiliseriez

:set tabstop=4

ou

:set expandtab

pour définir l'une des options de Vim.

Voir aussi: :help let, :help set.

g:signifie simplement une variable globale. Il existe plusieurs de ces "espaces de noms variables" :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.
Poignée de porte
la source
8
Notez que vous pouvez définir les options internes de vim en utilisant leten faisantlet &{option name}=value
EvergreenTree
11

:setest utilisé pour les options internes et gère les types d'options. Il permet des choses comme l'inversion des options booléennes (par exemple :set invpaste) en ajoutant et en supprimant des paramètres d'une liste (par exemple :set dictionary-=/tmp/myfile).

:let, d'autre part, permet d'accéder à une pléthore de choses modifiables dans vim, y compris les variables régulières, les options, les registres, etc. et la valeur définie est le résultat de l'évaluation d'une expression, au lieu d'une simple valeur comme avec :set, ce qui signifie :letvous donne accès aux mathématiques, à la manipulation de chaînes et aux fonctions.

Par exemple, vous pouvez :let &dictionary=/tmp/myfiledéfinir l'option 'dictionary'sur /tmp/myfile(modifiant ainsi la même option indiquée ci-dessus dans l' :setexemple)

Vous pouvez définir une variable globale avec :let g:myvar=42. Le préfixe sur lequel vous vous êtes renseigné fournit une portée. La réponse de la poignée de porte couvre très bien la portée.

Vous pouvez :let @a="Some text"changer le contenu du registre a à contenir Some text, que vous pourrez ensuite coller avec "appar exemple.

Vous pouvez :let $PATH = $PATH . ":/home/me/bin"ajouter votre propre répertoire bin à la PATHvariable d'environnement, qui est passée à toutes les commandes externes exécutées par Vim (cela fonctionne pour n'importe quelle variable d'environnement).

Bien qu'il letpossède des capacités assez puissantes (comme :let $MYFILE = @%définir une variable d'environnement sur le nom de fichier du tampon actuel), il ne sait pas qu'un paramètre est un booléen, donc il n'offre pas de bons accès ou de vérification d'erreur comme le :setfait le fait.

En fin de compte, il s'agit d'utiliser le meilleur outil pour le travail. Si vous souhaitez simplement modifier une option, :setc'est votre outil. Si vous souhaitez déplacer des informations entre les registres, les options, les variables ou baser votre valeur sur le résultat d'une expression, :letc'est votre outil.

Bien que vous ayez explicitement posé des questions sur Vim, une autre chose à noter est que :setc'est plus courant dans les familles vi / Vim, où :letc'est moins courant (par exemple, nvi n'a pas de letcommande, et viemu ne donne pas accès aux registres via let) .

John O'M.
la source