Vim: ¿Cuál es la diferencia entre let y set?

145

¿Cuál es la diferencia entre lety seten el editor vim?

Siempre me he preguntado por qué existen ambos.

Además, me interesaría escuchar sus antecedentes históricos.

Dave Halter
fuente
15
¿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).

René Nyffenegger
fuente
22

Set es una interfaz más fácil de usar especializada en opciones

P.ej

:verbose set

para mostrar todas las opciones vigentes.

:set tw=40

Trabajará como una taquigrafía para set textwidth=40

:set wrap&

Establecerá el valor predeterminado para la opciónwrap

:set nowrap

Desarmará la opción

:set wrap!

Se alternar la opción

Más importante,

:setTab # para completar la pestaña!

Pocos de los anteriores se pueden lograr (fácilmente) con let.

sehe
fuente
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)
  • asignando a múltiples opciones al mismo tiempo:

    :set et sw=4 sts=4 
    

    vs

    :let [&et, &sw, &sts] = [0, 4, 4]
    
  • establecer opción global: setglobal etvslet &g:et = 1

  • 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.

doblar
fuente
10

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>
Will Fiveash
fuente
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.

usuario3710044
fuente