¿Usted intentó :help sety :help lety leer el manual?
hochl
55
Sí, lo hice, pero todavía no entiendo por qué tiene que existir el set, porque hagamos lo mismo.
Dave Halter
1
@DavidHalter: letno hace lo mismo. Hay cosas con las que no puedes lograr setque son posibles let, mira mi respuesta.
René Nyffenegger
44
Nadie ha mencionado setlocalaún ... son equivalentes a las &l:*variables.
Chris Morgan
1
@VictorZamanian: para configuraciones booleanas, es posiblemente más fácil simplemente set noico set ic. Por lo que sé, settambién es compatible con lo vique let, como supongo , no lo es.
René Nyffenegger
Respuestas:
144
:setes para configurar opciones , :letpara asignar un valor a una variable .
Sucede que el valor de una opción está vinculado al nombre de la opción precedido por a &(la &option-nameconstrucción se comporta muy similar a las variables "ordinarias"). Entonces, los siguientes son equivalentes:
:set tw=40
:let &tw=40
Pero, por ejemplo, no se puede asignar 50 a la variable global foo ( :let g:foo=50) con un :setcomando (porque g: foo es una variable y no una opción).
Algunas opciones son booleanas. Al configurar estos, no se necesita ningún valor (como en :set noicy lo contrario :set ic).
re:, :set nowrapoptions.txt (: help set-option) dice:: se [t] {option} Alternar opción: establecer, encenderlo. Opción de número: mostrar valor. Opción de cadena: mostrar valor. Esto no está de acuerdo con lo que tiene aquí, cuando dice 'establecerá el valor predeterminado para la opción wrap'. ??
Vista elíptica
@Ellipticalview Estoy un poco confundido. Está citando partes de la documentación. Si lees todo esto, encontrarás que está de acuerdo con todos mis casos. [Nota: las noopciones prefijadas pueden ser confusas. También nota option&al final tiene una &que puede haber perdido].
sehe
12
:setsolo funciona con opciones, y la respuesta de sehe muestra algunos buenos ejemplos de uso.
:letPor otro lado, puede hacer casi todo lo que :setpuede hacer, y más. Puede asignar un valor a
una variable, por ejemplo let vi = 'vim'
una opción, por ejemplo let &tw = 40
un registro, por ejemplo let @a = $HOME . '/vimfiles'
una variable de entorno, p. ej. let $NOTHING = 'NOTHING'
Otra diferencia importante es que el lado derecho de :letes una expresión , lo que significa que puede hacer cosas como la concatenación de cadenas (como se ve en mi ejemplo de registro anterior) y operaciones aritméticas (por ejemplo let &tw = 40 + 60). Esto también significa que debe citar el valor si es una cadena. :setpor otro lado lee el valor literalmente.
Es más fácil de usar :setcon las opciones, aunque :lettambién puede hacer la mayor parte, aquí hay algunas comparaciones usando los ejemplos de sehe ("n / a" significa que no hay forma de hacerlo :let)
:verbose set vs n / a (no creo que haya otra forma de enumerar todas las opciones)
:set tw=40vs :let &tw = 40(sí, puedes usar la misma taquigrafía lettambién)
:set wrap& vs n / a
:set nowrapvs :let &wrap = 0(para opciones booleanas, 0 es falso y 1 es verdadero)
:set wrap! vs :let &wrap = !&wrap
Algunos ejemplos más
imprime el valor de una opción: :set formatoptions?vs :echo &formatoptions( letno imprime valores, a diferencia set)
establecer la opción local: setlocal etvslet &l:et = 1
Ver :h :sety :h :letpara más detalles
tl; dr
:setsolo funciona con opciones, pero la sintaxis es mucho más simple. :letfunciona no solo con opciones, sino también con variables, registros y variables de entorno. A diferencia :set, el lado derecho de :letes una expresión.
Ampliando lo que la gente ha escrito :let, he notado que se puede usar para asignar un valor en una variable a una opción, algo :setno puede hacer. Por ejemplo, esta función utiliza letpara asignar el valor en la variable global orig_twa la textwidthopción:
" 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>
Resumen:let permite asignar una variable a una opción: let &textwidth = g:orig_twy viceversa.
Serge Stroobandt
2
Es muy simple.
Como la gente ha dicho setes por opciones y funciona mejor debido a la limitación. También setes el comando histórico que todas las versiones viusan para configurar sus opciones. La mayoría (¿todas?) Otras versiones de vino tienen let.
Pero posiblemente lo más importante es que setfunciona en todas las versiones de vim, el letcomando se puede omitir cuando compila vim. El estándar tinyy las smallcompilaciones hacen esto.
Si falta, lette da el error: E319: Sorry, the command is not available in this version
Nota: ify endiftampoco se implementan, vim.tinypero en este caso los comandos no dan un error, sino que todo lo que está entre los dos comandos se omite INCLUYENDO else.
:help set
y:help let
y leer el manual?let
no hace lo mismo. Hay cosas con las que no puedes lograrset
que son posibleslet
, mira mi respuesta.setlocal
aún ... son equivalentes a las&l:*
variables.set noic
oset ic
. Por lo que sé,set
también es compatible con lovi
quelet
, como supongo , no lo es.Respuestas:
:set
es para configurar opciones ,:let
para asignar un valor a una variable .Sucede que el valor de una opción está vinculado al nombre de la opción precedido por a
&
(la&option-name
construcción se comporta muy similar a las variables "ordinarias"). Entonces, los siguientes son equivalentes:Pero, por ejemplo, no se puede asignar 50 a la variable global foo (
:let g:foo=50
) con un:set
comando (porque g: foo es una variable y no una opción).Algunas opciones son booleanas. Al configurar estos, no se necesita ningún valor (como en
:set noic
y lo contrario:set ic
).fuente
Set es una interfaz más fácil de usar especializada en opciones
P.ej
para mostrar todas las opciones vigentes.
Trabajará como una taquigrafía para
set textwidth=40
Establecerá el valor predeterminado para la opción
wrap
Desarmará la opción
Se alternar la opción
Más importante,
Pocos de los anteriores se pueden lograr (fácilmente) con
let
.fuente
:set nowrap
options.txt (: help set-option) dice:: se [t] {option} Alternar opción: establecer, encenderlo. Opción de número: mostrar valor. Opción de cadena: mostrar valor. Esto no está de acuerdo con lo que tiene aquí, cuando dice 'establecerá el valor predeterminado para la opción wrap'. ??no
opciones prefijadas pueden ser confusas. También notaoption&
al final tiene una&
que puede haber perdido].:set
solo funciona con opciones, y la respuesta de sehe muestra algunos buenos ejemplos de uso.:let
Por otro lado, puede hacer casi todo lo que:set
puede hacer, y más. Puede asignar un valor alet vi = 'vim'
let &tw = 40
let @a = $HOME . '/vimfiles'
let $NOTHING = 'NOTHING'
Otra diferencia importante es que el lado derecho de
:let
es una expresión , lo que significa que puede hacer cosas como la concatenación de cadenas (como se ve en mi ejemplo de registro anterior) y operaciones aritméticas (por ejemplolet &tw = 40 + 60
). Esto también significa que debe citar el valor si es una cadena.:set
por otro lado lee el valor literalmente.Es más fácil de usar
:set
con las opciones, aunque:let
también puede hacer la mayor parte, aquí hay algunas comparaciones usando los ejemplos de sehe ("n / a" significa que no hay forma de hacerlo:let
):verbose set
vs n / a (no creo que haya otra forma de enumerar todas las opciones):set tw=40
vs:let &tw = 40
(sí, puedes usar la misma taquigrafíalet
también):set wrap&
vs n / a:set nowrap
vs:let &wrap = 0
(para opciones booleanas, 0 es falso y 1 es verdadero):set wrap!
vs:let &wrap = !&wrap
Algunos ejemplos más
:set formatoptions?
vs:echo &formatoptions
(let
no imprime valores, a diferenciaset
)asignando a múltiples opciones al mismo tiempo:
vs
establecer opción global:
setglobal et
vslet &g:et = 1
setlocal et
vslet &l:et = 1
Ver
:h :set
y:h :let
para más detallestl; dr
:set
solo funciona con opciones, pero la sintaxis es mucho más simple.:let
funciona no solo con opciones, sino también con variables, registros y variables de entorno. A diferencia:set
, el lado derecho de:let
es una expresión.fuente
Ampliando lo que la gente ha escrito
:let
, he notado que se puede usar para asignar un valor en una variable a una opción, algo:set
no puede hacer. Por ejemplo, esta función utilizalet
para asignar el valor en la variable globalorig_tw
a latextwidth
opción:fuente
let
permite asignar una variable a una opción:let &textwidth = g:orig_tw
y viceversa.Es muy simple.
Como la gente ha dicho
set
es por opciones y funciona mejor debido a la limitación. Tambiénset
es el comando histórico que todas las versionesvi
usan para configurar sus opciones. La mayoría (¿todas?) Otras versiones devi
no tienenlet
.Pero posiblemente lo más importante es que
set
funciona en todas las versiones devim
, ellet
comando se puede omitir cuando compilavim
. El estándartiny
y lassmall
compilaciones hacen esto.Si falta,
let
te da el error:E319: Sorry, the command is not available in this version
Nota:
if
yendif
tampoco se implementan,vim.tiny
pero en este caso los comandos no dan un error, sino que todo lo que está entre los dos comandos se omite INCLUYENDOelse
.fuente