Vim 中的变量赋值、引用与作用域

使用 let 进行变量赋值,echo 打印变量的值, unlet 销毁变量。
对于 Vim 选项还可用 set 来更方便地操作,比如 set {option}, set no{option}, set {option}?
普通变量可以直接引用,环境变量要加前缀 $、寄存器变量要加前缀 @、Vim 选项要加前缀 &
变量默认作用域取决于定义的位置,函数内则为函数作用域,外部则为全局变量。
赋值和引用变量时可以使用 b:,g:,l:,t: 等前缀来指定要操作哪个作用域的变量。

和其他编程语言一样,Vim 脚本也可以定义和使用变量。
变量操作通常发生在命令模式(commandline mode)、Ex模式(Ex-mode)和 Vim 脚本中。
进入和退出这些模式的方法如下:

  • 在正常模式键入 : 即可进入命令模式,输入一些命令后按下回车便可执行,
    命令执行后 Vim 会自动回到正常模式。
  • 在正常模式键入 Q (大写)即可进入 Ex 模式,该模式与命令模式相似,但 Vim 不会回到正常模式因此可以连续输入很多命令。
  • Vim 脚本中也可以写任何 Vim 命令(.vimrc就是一个 Vim 脚本),可以通过 :source /path/to/script.vim 来执行一个外部脚本。

上述“正常模式”(normal mode)就是进入 Vim 后默认所处的模式,除非你设置了 easy 模式。
下面是一个例子,首先在正常模式按下 Q 进入 Ex 模式,然后键入以下命令:

:let str = "Hello World!"
:echo str

可以看到变量打印输出 "Hello World"。这就是一个简单的赋值+打印,这是一个普通的变量。
下面介绍一些特殊变量,以及分析普通变量的作用域问题。

环境变量

在 Vim 可以操作环境变量,引用环境变量时需要添加 $ 前缀。
在下面的例子中,打印出 Vim 所处 Shell 的 PATH 环境变量,并新增一个 PATH 目录:

:echo $PATH
:let $PATH .= ':/foo:/bar'
:echo $PATH

.= 运算符在 Vim 中用来做字符串拼接并赋值。

使用选项变量

Vim 选项是控制着 Vim 编辑器行为的一些变量,比如是否显示行号,使用哪种剪切板。
引用选项变量时需要添加 & 前缀。例如:

" 显示行号
:let &number = 1
" 不显示行号
:let &number = 1

Vim 提供了 set 命令来更方便地操作选项变量,对于布尔选项:

  1. set {option} 把布尔选项设为 1。例如 set number 设置显示行号。
  2. set no{option} 把布尔选项设为 0。例如 set nonumber 设置不显示行号。
  3. set {option}? 显示布尔选项的当前值。例如 set number? 输出 number 为显示行号,输出 nonumber 为不显示行号。

对于其他选项

  1. set {option}=<value> 设置选项值。例如 set shiftwidth=4 设置缩进为 4 空格。
  2. set {option}? 查看选项值。
  3. set {option} 查看选项值。

上述命令通常会写在 ~/.vimrc 中,但你也可以进入命令模式后直接输入。
更多 :set 的用法请参考 :help set

使用寄存器变量

Vim 共有 10 类 48 个寄存器,使用 Vim 寄存器 文中有详细的介绍。
如果能使用这些寄存器作为变量来操作,可以编写极具动态特性的脚本。
寄存器变量的前缀是 @

" 打印当前文件名
echo @%
" 把刚才拷贝的内容放到 a 寄存器中
let @a = @"

变量作用域

每种编程语言都定义有自己的变量作用域,比如 JavaScript 的函数作用域、C 语言的块作用域。
Vim 作为文本编辑器,有缓冲区作用域、窗口作用域、标签页作用域等,
引用时可以通过变量前缀来区分。

当你在命令模式随便敲一些命令式大可不去理会这些作用域,但如果你的编写 Vim 脚本或者插件,就要注意其中区别了。
举个例子,使用 b: 前缀来定义当前 Buffer 内有效的变量,该变量在其他 Buffer 中是未定义的。下面的命令可以拿去试试:

:let b:foo = 'foo'
:echo b:foo

b: 变量虽然对其他 Buffer 不可见,但对其他窗口或标签页中的同一 Buffer 仍然可见,哇!
不指定前缀时(比如本文刚开始的例子),变量默认作用域取决于定义的位置,函数内则为函数作用域,外部则为全局变量。
下面是所有的作用域前缀:

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

可查阅 :help internal-variables 获取更多变量作用域的使用方式。

转载自 Harttle.Land

本文采用 知识共享署名 4.0 国际许可协议(CC-BY 4.0)进行许可。转载请注明来源: https://snowfrs.com/2017/01/30/variables-in-vim.html 欢迎对文中引用进行考证,欢迎指出任何不准确和模糊之处。

?

snowfrs

个人博客

上一篇:给新手的 Arch Linux 桌面安装指南
下一篇:在 Vim 中执行 Shell 命令

原文:大专栏  Vim 中的变量赋值、引用与作用域

原文地址:https://www.cnblogs.com/petewell/p/11601737.html

时间: 2024-09-28 00:20:04

Vim 中的变量赋值、引用与作用域的相关文章

哪个变量可以引用全局作用域中可用的全部变量

w http://php.net/manual/en/language.variables.superglobals.php http://php.net/manual/zh/language.variables.superglobals.php http://php.net/manual/zh/reserved.variables.globals.php http://php.net/manual/en/reserved.variables.globals.php Superglobals S

JavaScript中的变量、参数、作用域和作用域链

基本类型和引用类型 在JavaScript中有两种数据类型值.基本类型值和引用类型值.基本类型值指的是简单的数据段,而引用类型值指的是可能由多个值构成的对象.在JavaScript中有5种基本数据类型,分别是:Undefined.Null.Boolean.Number.String(这个和其他编程语言不一样,需要注意).基本数据类型是按值进行访问的,一般都存储在栈中.而引用类型的值都保存在内存堆上面,在内存栈上保存一个对它的引用(这个和C#,Java等编程语言存储对象的方式类似).在JavaSc

在ajax的success中给变量赋值为空问题解决办法

<script type="text/javascript"> var global; function ajax_assign(){ $.ajax( url:xxx, data:{'xx.xx':xx}, type:'post', dataType:'json', async : false, success:function(data){ global = data; } ); alert(global); } </script>

shell编程中的变量

变量就是其值可以变化的量;从实质来说,变量名是指向一片用于存储数据的内存空间;变量有本地变量.环境变量之分;shell变量是一种弱类型的变量,在声明变量时并不需要指定其变量类型,默认均为字符型;也不需要遵循C语言中"先声明再使用"的规定,任何时候想用就用; 本地变量:    是指只在某个shell中生效的变量,对其他shell无效,而且会随着当前shell的结束而消失;    本地变量的作用域被限定在声明它们的shell中;    为了让子shell继承当前shell的变量,可以使用e

idea如何提取变量(拆分变量赋值和声明)

需求描述: 我们时常遇到某个在某个局部作用域声明的变量,想要用在另一个地方,此时就需要在作用域外部声明变量,在作用域中给变量赋值. 在eclipse中这个功能和提取变量在一起,我们可以方便的拆分变量的赋值和声明. 但是idea中的提取变量功能却不同,不能实现变量赋值和声明的拆分. 比如想将下面的变量jedis声明在try的外部,方法的内部通过提取变量是做不到的. 解决方法: 将光标移到欲拆分变量所在行的任意位置,然后按alt+enter(快速修复功能),出现:Split into declara

shell 的特性:命令行展开,变量赋值,以及文件层次标准(history)

bash默认会保存以前执行过的命令列表 当前shell的进程保存在缓冲区中 缓冲区中的命令会在shell退出后保存在文件中    .bash history 使用上下箭头可以翻看此前执行过的命令 history: !数字  :  执行history中第数字条命令 !!   :  上一条命令 !-数字:表示执行命令列表中的倒数第数字条命令 ESC .  : 执行上个命令的最后参数 ! string:执行命令列表中最后一个以string开头的命令 - d :删除第数字条记录 -c:清空history

关于Java的构造器和直接为成员变量赋值的区别

首先,看一下为什么要用构造器? 1.Java类的成员变量在被修饰为public.protected和包访问权限时,可以在不同层次上直接给成员变量赋值. 但是,赋值的前提是:必须存在持有成员变量的对象.而对象的初始化必须调用构造函数,所以构造函数是必不可缺的. 至于使用构造函数还是直接声明时给成员变量赋值,那就要看情况而定. 如果创建的这个对象是不可变的,那么就必须使用构造函数初始化成员变量,反之,就无所谓. 另外,直接给成员变量赋值,Java是不推荐的,因为这样会破坏它的封装性.所以,建议在构造

python 中的变量

1 变量的定义 变量即variable Python 中的变量赋值不需要类型声明. 每个变量在内存中创建,都包括变量的标识,名称和数据这些信息. 每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 等号(=)用来给变量赋值. 等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值.例如: 注意:变量名必须是字母,数字或下划线组成,但是不能以数字开头. 2 变量名的约束 使用一个变量前一定要先定义! 注意:y直接回车,就是一种使用,即打印y的值. 3标准数据类型 在内存中

认识变量,赋值运算符号

什么是变量呢? 如果想知道什么是变量还需要知道什么是内存,内存就是计算机临时存储的记忆 相当于人类的大脑 但是 是临时记忆 为什么说他是临时记忆呢 因为你的电脑关闭或者断电 记忆就会消失,这就是内存 既然我们知道了什么是内存那么下面我们来看一个例子 试想一下我们去宾馆开房的过程 首先是和前台说我们需要什么类型的房间 比如 单人间 双人间 等等 然后我们根据自己的需求选择合适的房间类型进行入住,如果宾馆的前台或者是宾馆服务人员需要找到具体的每位客人的话就会根据房间编号进行查找 什么是房间编号?比如