星期三, 五月 24, 2017

VIM学习笔记 脚本-变量和表达式 (Script-Variables and Expressions)

使用脚本语言,可以更灵活地定制编辑器以完成复杂的任务。

定义变量

使用以下命令,可以为变量赋值:

:let {variable}={expression}

Vim中的变量名可以包含字符、数字和下划线,但必须以字符或是下划线开头。

例如使用以下命令,定义变量line_size:

:let line_size=30

使用:echo命令,可以查看变量的内容:

:echo "line_size is"line_size

命令执行以后,Vim将会在屏幕底部显示如下内容:

line_size is 30

变量类型

Vim使用特殊的前缀来指明不同的变量类型:

变量名用途
大写字母,数字,下划线 可以存放在viminfo文件中的变量(如果viminfo选项中含有!标记)
大写字母开头变量可以由:makesession命令保存
小写字母,数字,下划线不会存在任何保存文件中的变量
$environment环境变量
@register文本寄存器
&option选项名字
b:name当前缓冲区的变量
w:name当前窗口的变量
g:name全局变量(用于函数内部表明全局变量)
a:name函数参数
v:nameVim预定义内部变量
l:name当前函数的变量
s:name使用:source载入的脚本
t:name当前标签页的变量

使用以下命令,可以定义环境变量$PAGER,用于指明查看的命令:

:let $PAGER="/usr/local/bin/less"

使用以下命令,可以显示上一次查找的模式:

:echo "Last search was"@/

使用以下任一命令,都可以设置缩进选项:

:let &autoindent=1

:set autoindent

使用以下命令,可以指定当前缓冲区的语法高亮显示:

:let b:current_syntax=c

Vim使用以下内部变量(v:name)存储相关信息:

变量用途
v:count上一次常规模式命令所指定的数量
v:count1与v:count相类似,所不同的是如果没有指定数量则默认值为1
v:errmsg上一次的错误信息
v:warningmsg上一次的警告信息
v:statusmsg上一次的状态信息
v:shell_error上一次Shell命令的结果。如果为0,则命令正常执行;若为非0,则命令失败
v:this_session上一次装入或是保存的文件的命名
v:versionVim编辑器的版本号

以下为不同类型变量的实例:

删除变量

如果要删除一个变量,那么可以使用以下命令:

:unlet[!] {name}

如果试图删除一个不存在的变量,那么Vim就会报错;而如果使用!标记,则不会显示错误信息。

定义常量

数字常量有以下三种:

  • 八进制(Octal Integer):0123
  • 十进制(Simple Integer):123
  • 十六进制(Hexadecimal):0xAC

Vim可以处理多种格式数字的计算:

:echo 10 + 0x0A + 012

字符常量有以下两种:

  • 简单字符串(Simple String):"string"
  • 精确字符串(Literal String):'string'

在双引号包围的字符串内,可以使用反斜线进行转义;而被单引号包围的字符串,则会被原样输出:

命令输出
:echo "\100"@
:echo '\100'\100

算术运算

Vim可以使用以下算术运算符,进行表达式计算:

int+int 
int-int
int*int
int/int
int%int取余
-int取负

逻辑判断

逻辑运算符可以作用于字符串和整数,Vim将自动在这两种数据类型之间进行转换。如果比较成功则返回1,否则返回0。

var == var 等于
var != var不等
var < var小于
var > var大于
var < var小于等于
var >= var大于等于

比较运算符可以进行字符串正则表达式的比较。例如将字符串"word"和表过式"\w*"比较,如果匹配则返回1。

"word"=~"\w*"

字符串的特殊比较包括:

string =~ regexp 匹配的正则表达式
string !~ regexp不匹配的正则表达式
string ==? string字符串相等,忽略大小写
string ==# string字符串相等,大小写敏感
string !=? string字符串不相等,忽略大小写
string !=# string字符串不相等,大小写敏感
string <? string小于,忽略大小写
string <# string小于,大小写必须敏感
string <=? string小于等于,忽略大小写
string <=# string小于等于,大小写敏感
string >? string大于,忽略大小写
string ># string大于,大小写敏感
string >=? string大于等于,忽略大小写
string >=# string大于等于,大小写敏感

由此可见,每一个运算符有三种形式。基本形式(==)对应ignorecase选项;(==?)对应忽略大小写;(==#)则对应大小写敏感。

文件名

当我们输入文件名时,可以使用以下特殊符号:

%当前文件名
#交换文件名(Alternate filename)
<cword>光标下的word
<cWORD>光标下的WORD
<cfile>光标下的文件名
<afile>当执行相关的自动命令(autocommand)正读入或是写入的文件名
<abuf>在一个自动命令中的当前缓冲区标号
<amatch>与<abuf>类似,但是在FileType或Syntax事件中并不是指代文件名,而是文件类型或语法名
<sfile>当前正用于:sourced的文件名

我们可以使用以下修饰符来扩展以上特殊符号的意义。例如:p可以将文件名转换为包括路径的全名。例如光标下的文件名为test.c><cfile>test.c,那么<cfile:p>就是/home/oualline/examples/test.c

修饰符主要包括:

:p将文件名变成全路径文件名。如果使用多个修饰符,那么必须将此修饰符放置在最前面。
:~将绝对路径路径名如/home/oualline/examples/test.c 转变为 用~标记的短文件名如~oualline/examples/test.c
:.转变为现对路径名
:h文件名的头。例如../path/test.c 将转变为 ../path
:t文件名的尾。例如../path/test.c 将转变为 test.c
:r无扩展名的文件名。例如../path/test 将转变为 test
:e扩展名
:s?from?to?将第一次出现的from字符串改变为to字符串
:gs?from?to?将所有的字符串from改变为to字符串

使用以下命令,可以利用:p修饰符显示完整的当前文件名。你可以将命令中的:p换成其他需要测试的修饰符。

:echo expand("%:p")

Ver: 1.0<上一篇 | 目录 下一篇>

星期四, 五月 04, 2017

VIM学习笔记 正则表达式-进阶(Regular Expression Advanced)

范围(Character Ranges)

[]通配符,表示只可以匹配方括号内列表的字符。例如t[aeiou]n将匹配一个小写元音字符,可以找到tan,ten,tin,ton,tun。

在方括号内,可以通过短横线来指明包括字符或数字的范围。例如[0-9]可以匹配0到9中的任一数字。我们还可以组合其他字符,例如[0-9aeiou]可以匹配任意一个数字或是小写的元音字符。

如果需要匹配"-"本身,那么需要使用反斜杠进行转义。例如表达式one[\-]way可以匹配one-way,但不会匹配one way。

范围通配符:
[abc]匹配a,b或是c
[^abc]匹配除abc以处的字符
[a-z]匹配从a到z的所有小写字符
[a-zA-Z]匹配所有大小写字符

排除(Excluding)

^通配符,可以排除指定的字符。

acme[^0-9]匹配所有包含acme,后跟一个非数字字符的行。但不会匹配以acme结尾的行,因为模式中的acme之后必须有一个字符。

^[^a-zA-Z]匹配以非字母开头的行,但不会匹配空行,因为行中必须有一个非字母字符存在。

如果需要匹配"^"本身,那么需要使用反斜杠进行转义。例如表达式2[\^*]4可以匹配2^4和2*4。

重复次数(Repeat Modifiers)

{minimum,maximum}表达式指出一个字符重复的次数。例如表达式a\{3,5}可以匹配3到5个a(aaa,aaaa,aaaaa)。Vim默认是会尽可能多地进行匹配(Matching as much as possible)。在表达式中,最小次数是可以省略的,即默认最小次数为0,所以表达式a\{,5}可以匹配0到5个a。最大次数也是可以省略的,即默认匹配无穷大,所以表达式a\{3,}最少可以匹配3个a,最多个数没有限制。

{number}表达式只指定一个数字,Vim就会精确的匹配相应的次数。例如a\{5}只会精确的匹配5次。

{-minimum,maximum}在数字前增加一个负号(-),那么Vim在查找时就会尽可能少地进行匹配(Matching as little as possible)。例如ab\{-1,3}将只匹配 "abbb"中的"ab"。表达式a\{-3,}可以匹配三个或是更多个a,但尽可能少地进行匹配。而表达式a\{-,5}可以匹配0到5个字符。

RegularExpression_Matching as little as possible

表达式a\{-5}将会精确的匹配5个字符。

重复通配符:
*匹配0次或是多次,尽可能多的匹配
\+匹配1次或是多次,尽可能多的匹配
\=匹配0次或是1次
\{}匹配0次或是多次
\{n}精确匹配n次
\{-n}匹配n次
\{n,m}匹配n次到m次
\{n,}匹配n次到多次
\{,m}匹配0次到m次
\{-n,m}匹配n次到m次,尽可能少的进行匹配
\{-n,}至少匹配n次,尽可能少的进行匹配
\{-,m}匹配到m次,尽可能少的进行匹配
{-}匹配0次到多次,尽可能少的进行匹配

捕获组(Groups)

()用于保证需要组合出现的字符。表达式a\(XY\)*b将会匹配ab, aXYb, aXYXYb, aXYXYXYb。

或操作(Alternation Operator)

|用于查找两个或是多个可能的匹配。例如表达式foo\|bar可以找到foo或是bar。我们可以连接使用多个或运算符,例如表达式Larry\|Moe\|Curly将找到Larry、Moe和Curly。而表达式end\(if\|while\|for\)则可以匹配"endif", "endwhile" 和 "endfor"几个不同的元素组合。

如果希望匹配多次,那么可以组合使用加号和括号运算符。例如表达式/\(foo\|bar\)\+可以匹配 "foo", "foobar", "foofoo", "barfoobar"等等。

特殊字符元素(Special Character Atoms)

\a大小写字母字符 [a-zA-Z]
\A除了a-zA-Z以外的字母字符
\b<BS>
\d数字字符 [0-9]
\D非数字字符 [^0-9]
\e<ESC>
\f由isfname选项定义的文件名字符
\F文件名字符,但是不包含数字
\h单词的头字符(A-Za-z)
\H不是单词的头字符(A-Za-z)
\i由isdent选项定义的字符
\I定义的字符,但是不包括数字
\k由iskeyword选项定义的关键字字符
\K关键字字符,但是不包括数字
\l小字字符 [a-z]
\L非小写字符 [^a-z]
\o八进制数字
\O非八进制数字
\p由isprint选项定义的可打印字符
\P可打印字符,但是不包括数字
\r<CR>
\s空白符<Space>和<Tab> [ ]
\S非空白符 [^ ]
\t<Tab>
\u大写字母字符 [A-Z]
\U非大写字母字符 [^A-Z]
\w单词字符(0-9A-Za-z)
\W非单词字符
\x十六进制数字 [0-9a-fA-F]
\X非十六进制数字 [^0-9a-fA-F]
\~匹配最后指定的字符串

表达式\a匹配任意字符,而表达式\a\a\a则可以匹配任意三个字符。而\a\a\a_则可以匹配任意后带一个下划线的三个字符。

RegularExpression_3CharU

操作符\d可以匹配任意数字;\d\d\d\d则可以匹配任意四个数字(即使其为更长数字串中的一部分)。

RegularExpression_4DigitNumber

如果希望精确匹配四位数字,那么可以使用以下任一命令:

/\<\d\d\d\d\>

/\<\d\{4}\>

RegularExpression_4DigitNumberExact

\u可以匹配任意大写字符;\U则可以匹配任意非大写字符。使用以下命令,可以将整篇文本替换为大写字母:

:%s/.*/\U&/

如果需要找出包含空格的空行,那么可以使用^\s.*$表达式;如果需要找到没有空格的空行,则可以使用\S

\s\+$可以匹配尾部的空格; \+\ze\t则可以匹配Tab制表符之前的空格。(请注意,此表达式开头为空格)

请注意,以上预定义字符是不能内嵌在[]中使用的。例如,表达式[\d\l]是错误的,应使用\(\d\|\l\)表达式匹配数字或小写字符。

预定义字符类(Character Classes)

如果我们想要查找所有大写字符,可以使用表达式[A-Z],或者使用预定义的字符类[:upper:]。使用/[[:upper:]]命令可以匹配所有大写字母;而使用/[[:upper:][:lower:]]命令则可以匹配包括大写和小写字母在内的所有字母。

预定义字符类:
[:alnum:]匹配所有的字符和数字
[:alpha:]匹配所有的字符
[:ascii:]匹配所有的ASCII字符
[:backspace:]匹配退格符<bs>
[:blank:]匹配空格和Tab
[:cntrl:]匹配所有的控制字符
[:digit:]匹配所有的数字
[:escape:]匹配Esc
[:graph:]匹配所打印的字符,不包括空格
[:lower:]匹配所有的小写字符
[:print:]匹配所有的要打印字符,包括空格
[:return:]匹配所有的行末符号(包括<Enter>,<CR>,<NL>)
[:punct:]匹配所有的功能符号
[:space:]匹配所有的空白符
[:tab:]匹配Tab
[:upper:]匹配所有的大写字符
[:xdigit:]匹配十六进制数字

转义符(Escaped Characters )

如果需要查找某些特殊符号(比如美元符号),那么可以使用反斜杠backslash(\)进行转义。例如:表达式\$可以匹配美元符号($),而表达式\^则可以匹配脱字符(^)。需要注意的是,反斜杠backslash(\)本身也是特殊符号,所以需要用两个反斜杠\\来匹配。

帮助信息(Help)

可以使用以下命令,查看关于查找模式的更多帮助信息:

:help pattern

Ver: 1.0<上一篇 | 目录 下一篇>