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

29

No sé mucho de la teoría detrás de Vim. Parece que tenemos setalgunas variables y letotras variables. ¿Cuál es la diferencia, y cuándo se requiere uno sobre el otro?

Además, el esquema de colores vim solarizado dice let g:blabla...¿cuál es el significado de g:en este caso?

Antonio
fuente

Respuestas:

35

letasigna un valor a una variable y setasigna un valor a una de las opciones internas de Vim.

Por ejemplo, usarías

:let mystring='Hello!'

para declarar una nueva variable, pero usarías

:set tabstop=4

o

:set expandtab

para configurar una de las opciones de Vim.

Ver también: :help let, :help set.

g:simplemente significa una variable global. Existen varios de estos "espacios de nombres variables", desde :help internal-variables:

        (nothing) In a function: local to a function; otherwise: global
|buffer-variable|    b:   Local to the current buffer.
|window-variable|    w:   Local to the current window.
|tabpage-variable|   t:   Local to the current tab page.
|global-variable|    g:   Global.
|local-variable|     l:   Local to a function.
|script-variable|    s:   Local to a |:source|'ed Vim script.
|function-argument|  a:   Function argument (only inside a function).
|vim-variable|       v:   Global, predefined by Vim.
Perilla de la puerta
fuente
8
Ten en cuenta que puede configurar las opciones internas de vim utilizando lethaciendolet &{option name}=value
EvergreenTree
11

:setse usa para opciones internas y maneja los tipos de la opción. Permite cosas como la inversión de opciones booleanas (p :set invpaste. Ej. ) Agregar y eliminar configuraciones de una lista (p :set dictionary-=/tmp/myfile. Ej .).

:let, por otro lado, permite el acceso a una gran cantidad de cosas cambiables en vim, incluidas variables regulares, opciones, registros, etc. y el valor que se establece es el resultado de evaluar una expresión, en lugar de un valor simple como with :set, lo que significa :letle da acceso a matemáticas, manipulación de cadenas y funciones.

Por ejemplo, puede :let &dictionary=/tmp/myfileestablecer la opción 'dictionary'en /tmp/myfile(modificando así la misma opción que se muestra arriba en el :setejemplo)

Puede establecer una variable global con :let g:myvar=42. El prefijo que solicitó proporciona alcance. La respuesta de Doorknob cubre muy bien el alcance.

Puede :let @a="Some text"cambiar el contenido del registro a para contener Some text, que luego podría pegar con, "appor ejemplo.

Puede :let $PATH = $PATH . ":/home/me/bin"agregar su propio directorio bin a la PATHvariable de entorno, que se pasa a cualquier comando externo ejecutado por Vim (esto funciona para cualquier variable de entorno).

Aunque lettiene algunas capacidades bastante poderosas (como :let $MYFILE = @%establecer una variable de entorno para el nombre de archivo del búfer actual), no sabe que una configuración es booleana, por lo que no ofrece buenos accesos o verificación de errores como lo :sethace.

Al final, se trata de usar la mejor herramienta para el trabajo. Si desea simplemente modificar una opción, :setes su herramienta. Si desea mover información entre registros, opciones, variables o basar su valor en el resultado de una expresión, entonces :letes su herramienta.

Aunque usted preguntó explícitamente sobre Vim, otra cosa a tener en cuenta es que :setes más común en las familias vi / Vim, donde :letes menos común (por ejemplo, nvi no tiene un letcomando y viemu no proporciona acceso a los registros a través de let) .

John O'M.
fuente