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

145

Quelle est la différence entre letet setdans l'éditeur vim?

Je me suis toujours demandé pourquoi les deux existent?

De plus, je serais intéressé d'entendre son contexte historique.

Dave Halter
la source
15
Avez - vous essayé :help setet :help letet lire le manuel?
hochl
5
oui je l'ai fait, mais je ne comprends toujours pas pourquoi set doit exister, parce que faisons les mêmes choses.
Dave Halter
1
@DavidHalter: letne fait pas les mêmes choses. Il y a des choses que vous ne pouvez pas réaliser avec setqui sont possibles let, voyez ma réponse.
René Nyffenegger
4
Personne ne les a setlocalencore mentionnés ... ils sont équivalents à des &l:*variables.
Chris Morgan
1
@VictorZamanian: pour les paramètres booléens, il est sans doute plus facile de simplement set noicou set ic. Autant que je sache, setest également compatible avec vice qui let, comme je suppose , ne l'est pas.
René Nyffenegger

Réponses:

144

:setsert à définir des options , :letà attribuer une valeur à un variable .

Il arrive que la valeur d'une option soit liée au nom de l'option précédé d'un &(la &option-nameconstruction se comporte alors très similaire aux variables "ordinaires"). Ainsi, les éléments suivants sont équivalents:

:set  tw=40
:let &tw=40

Mais, par exemple, l'attribution de 50 à la variable globale foo ( :let g:foo=50) ne peut pas être réalisée avec une :setcommande (car g: foo est une variable et non une option).

Certaines options sont booléennes. Lors de leur définition, aucune valeur n'est nécessaire (comme dans :set noicet inversement :set ic).

René Nyffenegger
la source
22

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

Fonctionnera comme un raccourci pour set textwidth=40

:set wrap&

Définira la valeur par défaut de l'optionwrap

:set nowrap

Annulera l'option

:set wrap!

Va basculer l'option

Plus important encore,

:setTab # pour terminer l'onglet!

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

sehe
la source
re :set nowrap:, options.txt (: help set-option) dit:: se [t] {option} Basculer l'option: définir, l'activer. Option numérique: afficher la valeur. Option de chaîne: afficher la valeur. Cela ne correspond pas à ce que vous avez ici, lorsque vous dites «définira la valeur par défaut pour l'option wrap». ??
Vue elliptique le
@Ellipticalview Je suis un peu confus. Vous citez des parties de la documentation. Si vous lisez le tout, vous constaterez qu'il est d'accord avec tous mes cas. [Remarque: les nooptions -prefixed peuvent prêter à confusion. Note également option&a une fuite &que vous avez manqué].
sehe
12

:setne fonctionne qu'avec des options, et la réponse de sehe présente quelques bons exemples d'utilisation.

:letd'autre part peut faire presque tout ce qui :setpeut faire, et plus encore. Il peut attribuer une valeur à

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

Une autre différence majeure est que le côté droit de :letest une expression , ce qui signifie que vous pouvez faire des choses comme la concaténation de chaînes (comme vu dans mon exemple de registre ci-dessus) et des opérations arithmétiques (par exemple let &tw = 40 + 60). Cela signifie également que vous devez citer la valeur s'il s'agit d'une chaîne. :setd'autre part, lit la valeur textuellement.

Il est plus facile à utiliser :setavec les options même s'il :letpeut également faire la plupart d'entre eux, voici une comparaison utilisant les exemples de sehe ("n / a" signifie qu'il n'y a aucun moyen de le faire avec :let)

  • :verbose set vs n / a (ne pensez pas qu'il existe une autre façon de lister toutes les options)
  • :set tw=40vs :let &tw = 40(oui, vous pouvez également utiliser le même raccourci let)
  • :set wrap& vs n / a
  • :set nowrapvs :let &wrap = 0(pour les options booléennes, 0 est faux et 1 est vrai)
  • :set wrap! contre :let &wrap = !&wrap

Quelques exemples supplémentaires

  • affiche la valeur d'une option: :set formatoptions?vs :echo &formatoptions( letn'imprime pas les valeurs, contrairement à set)
  • attribution à 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 etvslet &g:et = 1

  • définir l'option locale: setlocal etvslet &l:et = 1

Voir :h :setet :h :letpour plus de détails


tl; dr

:setne fonctionne qu'avec des options mais la syntaxe est beaucoup plus simple. :letfonctionne non seulement avec des options, mais également avec des variables, des registres et des variables d'environnement. Contrairement à :set, le côté droit de :letest une expression.

doubleDown
la source
10

En développant ce sur quoi les gens ont écrit :let, j'ai remarqué qu'il peut être utilisé pour attribuer une valeur dans une variable à une option, quelque chose :setne peut pas faire. Par exemple, cette fonction utilise letpour affecter la valeur de la variable globale orig_twà l' textwidthoption:

" 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>
Will Fiveash
la source
Résumé: let permet d'affecter une variable à une option: let &textwidth = g:orig_twet vice versa.
Serge Stroobandt
2

C'est très simple.
Comme les gens l'ont dit, setc'est pour les options et fonctionne mieux en raison de la limitation. Est également setla commande historique que toutes les versions viutilisent pour définir leurs options. La plupart (toutes?) Des autres versions de vine l'ont pas let.

Mais peut-être le plus important est que cela setfonctionne sur toutes les versions de vim, la letcommande peut être omise lors de la compilation vim. Le standard tinyet les smallversions le font.

S'il manque, letvous obtenez l'erreur:
E319: Sorry, the command is not available in this version

Remarque: ifet endifne sont pas implémentés non plus dans vim.tinymais dans ce cas les commandes ne donnent pas d'erreur, à la place tout entre les deux commandes est ignoré INCLUDING else.

user3710044
la source