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).
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)
: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.
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>
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.
:help set
et:help let
et lire le manuel?let
ne fait pas les mêmes choses. Il y a des choses que vous ne pouvez pas réaliser avecset
qui sont possibleslet
, voyez ma réponse.setlocal
encore mentionnés ... ils sont équivalents à des&l:*
variables.set noic
ouset ic
. Autant que je sache,set
est également compatible avecvi
ce quilet
, comme je suppose , ne l'est pas.Réponses:
:set
sert à 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-name
construction se comporte alors très similaire aux variables "ordinaires"). Ainsi, les éléments suivants sont équivalents:Mais, par exemple, l'attribution de 50 à la variable globale foo (
:let g:foo=50
) ne peut pas être réalisée avec une:set
commande (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 noic
et inversement:set ic
).la source
Set est une interface plus conviviale spécialisée pour les options
Par exemple
pour afficher toutes les options en vigueur.
Fonctionnera comme un raccourci pour
set textwidth=40
Définira la valeur par défaut de l'option
wrap
Annulera l'option
Va basculer l'option
Plus important encore,
Peu de ce qui précède peut (facilement) être réalisé avec
let
.la source
: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». ??no
options -prefixed peuvent prêter à confusion. Note égalementoption&
a une fuite&
que vous avez manqué].:set
ne fonctionne qu'avec des options, et la réponse de sehe présente quelques bons exemples d'utilisation.:let
d'autre part peut faire presque tout ce qui:set
peut faire, et plus encore. Il peut attribuer une valeur àlet vi = 'vim'
let &tw = 40
let @a = $HOME . '/vimfiles'
let $NOTHING = 'NOTHING'
Une autre différence majeure est que le côté droit de
:let
est 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 exemplelet &tw = 40 + 60
). Cela signifie également que vous devez citer la valeur s'il s'agit d'une chaîne.:set
d'autre part, lit la valeur textuellement.Il est plus facile à utiliser
:set
avec les options même s'il:let
peut é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=40
vs:let &tw = 40
(oui, vous pouvez également utiliser le même raccourcilet
):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!
contre:let &wrap = !&wrap
Quelques exemples supplémentaires
:set formatoptions?
vs:echo &formatoptions
(let
n'imprime pas les valeurs, contrairement àset
)attribution à plusieurs options en même temps:
contre
définir l'option globale:
setglobal et
vslet &g:et = 1
setlocal et
vslet &l:et = 1
Voir
:h :set
et:h :let
pour plus de détailstl; dr
:set
ne fonctionne qu'avec des options mais la syntaxe est beaucoup plus simple.:let
fonctionne non seulement avec des options, mais également avec des variables, des registres et des variables d'environnement. Contrairement à:set
, le côté droit de:let
est une expression.la source
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:set
ne peut pas faire. Par exemple, cette fonction utiliselet
pour affecter la valeur de la variable globaleorig_tw
à l'textwidth
option:la source
let
permet d'affecter une variable à une option:let &textwidth = g:orig_tw
et vice versa.C'est très simple.
Comme les gens l'ont dit,
set
c'est pour les options et fonctionne mieux en raison de la limitation. Est égalementset
la commande historique que toutes les versionsvi
utilisent pour définir leurs options. La plupart (toutes?) Des autres versions devi
ne l'ont paslet
.Mais peut-être le plus important est que cela
set
fonctionne sur toutes les versions devim
, lalet
commande peut être omise lors de la compilationvim
. Le standardtiny
et lessmall
versions le font.S'il manque,
let
vous obtenez l'erreur:E319: Sorry, the command is not available in this version
Remarque:
if
etendif
ne sont pas implémentés non plus dansvim.tiny
mais dans ce cas les commandes ne donnent pas d'erreur, à la place tout entre les deux commandes est ignoré INCLUDINGelse
.la source