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 à
let vi = 'vim'
let &tw = 40
let @a = $HOME . '/vimfiles'
let @a = $HOME . '/vimfiles'
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
: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
setlocal et
vs let &l:et = 1
Voir :h :set
et :h :let
pour plus de détails
: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é.