Vim: Quelle est la différence entre let et set?

Quelle est la différence entre let et set dans l’éditeur vim?

Je me suis toujours demandé pourquoi les deux existent?

Je serais également intéressé d’entendre son contexte historique.

:set est pour les options de réglage ,: :let pour affecter une valeur à une variable .

Il arrive que la valeur d’une option soit liée au nom de l’option précédée par un & (la construction de nom de l’option & se comporte alors comme des variables “ordinaires”). Donc, les éléments suivants sont équivalents:

 :set tw=40 :let &tw=40 

Mais, par exemple, l’assignation de 50 à la variable globale foo ( :let g:foo=50 ) ne peut pas être obtenue avec une commande :set (car g: foo est une variable et non une option).

Certaines options sont booléennes. Lors de la définition de celles-ci, aucune valeur n’est requirejse (comme dans :set noic et le contraire :set ic ).

Set est une interface plus conviviale spécialisée pour les options

Par exemple

 :verbose set 

pour afficher toutes les options en vigueur.

 :set tw=40 

Travaillera comme un raccourci pour set textwidth=40

 :set wrap& 

Définira la valeur par défaut pour l’option wrap

 :set nowrap 

Désactiver l’option

 :set wrap! 

Va basculer l’option

Plus important encore,

:set onglet # pour obtenir l’achèvement de l’onglet!

Peu de ce qui précède peut (facilement) être réalisé avec let .

Étendre sur ce que les gens ont écrit :let , j’ai remarqué qu’il peut être utilisé pour assigner une valeur dans une variable à une option, quelque chose :set ne peut pas faire. Par exemple, cette fonction utilise let pour affecter la valeur de la variable globale orig_tw à l’option 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() 

:set ne fonctionne qu’avec des options, et la réponse de sehe présente quelques exemples d’utilisation judicieuse.

:let autre part, on peut faire presque tout ce que :set peut faire, plus plus. Il peut assigner une valeur à

  • une variable, par exemple let vi = 'vim'
  • une option, par exemple let &tw = 40
  • un registre, par exemple let @a = $HOME . '/vimfiles' let @a = $HOME . '/vimfiles'
  • une variable d’environnement, par exemple let $NOTHING = 'NOTHING'

Une autre différence majeure est que le membre de droite de :let est une expression , ce qui signifie que vous pouvez faire des choses comme la concaténation de chaînes (comme dans l’exemple de registre ci-dessus) et les opérations arithmétiques (par exemple, let &tw = 40 + 60 ). Cela signifie également que vous devez citer la valeur si c’est une chaîne. :set d’autre part lit la valeur verbatim.

Il est plus facile à utiliser :set avec des options même si :let peut également en faire la majeure partie. Voici quelques comparaisons à l’aide des exemples de sehe (“n / a” ne signifie pas comment le faire :let )

  • :verbose set vs n / a (ne pense pas qu’il existe un autre moyen de lister toutes les options)
  • :set tw=40 vs :let &tw = 40 (oui, vous pouvez aussi utiliser le même raccourci dans let )
  • :set wrap& vs n / a
  • :set nowrap vs :let &wrap = 0 (pour les options booléennes, 0 est faux et 1 est vrai)
  • :set wrap! vs :let &wrap = !&wrap

Quelques autres exemples

  • imprimer la valeur d’une option :set formatoptions? vs :echo &formatoptions ( let permet pas d’imprimer des valeurs, contrairement à set )
  • atsortingbuer à plusieurs options en même temps:

     :set et sw=4 sts=4 

    contre

     :let [&et, &sw, &sts] = [0, 4, 4] 
  • définir l’option globale: setglobal et vs let &g:et = 1

  • set local option: setlocal et vs let &l:et = 1

Voir :h :set et :h :let pour plus de détails


tl; dr

:set ne fonctionne qu’avec les options mais la syntaxe est beaucoup plus simple. :let fonctionner non seulement les options mais aussi les variables, les registres et les variables d’environnement. Contrairement à :set , le côté droit de :let est une expression.

C’est très simple.
Comme les gens l’ont dit, set est pour les options et fonctionne mieux en raison de la limitation. La commande historique utilisée par toutes les versions de vi pour définir leurs options est également définie. La plupart des autres versions de vi n’ont pas let .

Mais peut-être le plus important est que set fonctionne sur toutes les versions de vim , la commande let peut être omise lorsque vous comstackz vim . Les tiny et small versions standard le font.

S’il manque, let vous l’erreur:
E319: Sorry, the command is not available in this version

Note: if et if endif ne sont pas implémentés non plus dans vim.tiny mais dans ce cas les commandes ne donnent pas d’erreur, à la place tout entre les deux commandes est ignoré.