星期四, 四月 19, 2018

耳光乐队:满世荒唐言

一个巴掌拍不响 左右开弓打耳光

IMG_0503

耳光乐队,一个自称唱了20年还没出名的乐队;一个自称远离主流的乐队。当然,也是一个自觉不与主流合流的民俗摇滚乐队,一个用“三俗”来毁“三观”的批判者,一个用后现代主义来解构现实的观察者。

面对现实,千人千面,各有各的应对,大多数的大部分人,自然而然地带上面具,熟门熟路地避免感知,拒绝思考,也幸免于随之而来的困惑与迷茫。另外的人,则需要各种鸡零狗碎的心灵鸡汤,让自己听着别人的号子铿锵上路,直到那些伟大的思想变成上吊的绳

仙人指lu为马

IMG_0535

中国人,可以把所有喜剧、悲剧、闹剧都变成段子,变成自怨自艾的无可奈何,变成呲牙咧嘴的机灵乖巧。耳光乐队,则是常规中的异类,段子手中的世外高人。

耳光乐队的音乐,就是耳光乐队的段子,是更有批判价值的段子。

郭德纲说过:“相声要是不搞笑,那就太搞笑了”;赵哥也说过:“摇滚乐要是不批判,那这事就太批判了。”

忠于现实的精妙指摘,豁达张狂的指桑骂槐,没羞没臊的微言大义。没有刻意地表演深刻,也没有曲迎地歌功颂德。借由传统民俗的叙事结构,精心排布的工整对仗,排比重复的文字堆叠。这些刻意为之的结构与节奏,不但增强了表达的重量感,更还原出现实的荒谬感。在同一专辑或同一系列之中,这样一致甚至刻板的结构,更汇聚出愈加强烈的表达效果。

相对而言,另一民俗风格的摇滚乐队--二手玫瑰,则使用更丰富的音乐元素和节奏变换,来更直接更戏剧化地进行表达。

耳光乐队的朴实工整,二手玫瑰的花枝招展,在不同维度,用不同的姿势,进行各自的戏虐、调侃和解构。

耳光乐队用长篇叙事铺陈背景埋下包袱,然后立在原地袖手旁观,等着听者回过神来,自行补全故意留白的话外之音,然后漠然相视,然后哑然一笑。

二手玫瑰,则在第一时间把你拉到同一视角,手把手地点出笑点和痛点。

同样以地方俚语为主要载体的耳光乐队和二手玫瑰,以各自的玩法进行各自的表达,扒开生活的遮羞布,直视皮囊之下无趣的鲜活。

生活就像一盘黑暗料理

IMG_0534

相对于民俗基底的文字,耳光的音乐却是西洋把式的。Funk、说唱、复古迪斯科,甚至有小镇法廊里流行音乐的拼盘。

本土的瓤,外来的皮,这是一重内容与形式的反差。

而另一重反差,则是形制固化的专辑与痛快淋漓的现场的反差。

耳光乐队的现场冲击力是远远超越纸面音乐的。舞台上的耳光,以收放自如的掌控力释放出更巨大的表达能量。乐队的投入程度是极为惊人的,让人感觉乐手比乐迷更需要这样的演出宣泄。指挥场下观众的主唱,撩人的吉他手,性感的键盘。乐器的分贝好像放大了若干倍,乐曲的节奏也好像提速里了干倍。赵哥一定是个资深的球迷,站定了,举手投足就是球员进球后的雕塑般的庆祝动作。

耳光会很实在地从不冷场地唱足2个小时。赵哥会招呼灯光师聚焦在主唱身上,以便让他能看清扇面上还没来及背下来的歌词;赵哥会一边拿着手帕擦汗,一边冲着台下的观众喊话“不用麻烦你们了,我们自己返场”。然后,台下像台上一样嚣张地回应“耳光牛逼,牛逼”!随着赵哥掏出一把又一把折扇,现场也在多重高潮中进入另一次高潮。

艺术男儿裆自强

Enlight13

耳光乐队,既不是径直冲向风车的堂吉柯德,更不是趋炎附势避重就轻的投机者,而是举重若轻消解空洞意义的旁观者和解读者。是大喇叭或者风语者,提醒我们重新回望已然习惯麻木、无从下手、无法言表的荒诞现实。只是,这回望之后的无力感,又要去哪里安放?难道就像狈老板的菊花虽苦,蛋蛋有滋味......

一切的评价都是多余的,就像顶楼马戏团所说:“主唱赵荒唐的扇子,犹如利刃般扎入社会阴暗的私处,以四两拨千斤的功夫,调笑世间百态。民俗但不恶俗。让你笑,然后苦笑。”

星期三, 四月 18, 2018

Finance for Non-Financial Managers

一本定位和结构都非常清晰的财务书。利用简明易懂的平实语言,铺陈了基本和关键的财务知识体系。从经营和运作的角度,深入浅出地讲解了至关重要的财务知识;而不是从专业财务人员记账的操作角度,过于艰深和机械地坠入细节之中。

本书首先强调了财务信息对于企业配置资源和评价业绩的重要性;然后介绍了总账、科目和权责发生制等关键概念;接下来即是此书的核心部分,围绕三大财务报表(资产负债表、利润表和现金流量表),讲解各报表的编制和分析方法。此书后半部分,介绍了成本归集概念,经营策略和年度预算的编制过程,以及各种内部和外部融资的选项。

Finance for Non-Financial Managers TOC

本书利用很大篇幅,详细介绍了三大财务报表(资产负债表、利润表和现金流量表)的各个报表项以及编制方法。报表项也从财务科目的维度,映射到经营业务的角度,以便读者更直观地理解报表项的含义和计算逻辑。

Finance for Non-Financial Managers BS

Finance for Non-Financial Managers PL

其中,现金流量表的间接编制法,是稍显抽象的部分,而且需要考虑现金流量表与资产负债表和损益表之间的联系。

Finance for Non-Financial Managers CF

在Critical Performance Factors (CPF) 部分,也就是我们经常提及的Key Performance Indicators (KPI),此书提炼了若干关键业务指标。这些指标并不完全拘泥于财务角度,也包括了销售相关的绩效指标。针对每个指标,除了说明纸面上的计算逻辑,也解释了其背后的业务意义。本书也提醒读者,除了关注静态的业务指标,也需要从时间的维度上关注指标的变化趋势,并预计未来的发展方向。

Finance for Non-Financial Managers CPM

最后,此书归纳了融资和吸引外部投资的选项,对于初创公司有很大的参考作用。

Finance for Non-Financial Managers Financing

纵观此书,语言简洁,体系清晰,作者成功地将财物与业务融会贯通,非常适合非财务人员通读并理解财务管理的基本概念和核心理念。

请下载此读书笔记完整的MindMpa

星期三, 四月 11, 2018

Photo Post


via Instagram https://ift.tt/2EAko2V

星期五, 四月 06, 2018

星期一, 四月 02, 2018

听他们说爱国主义这回事

民族主义是我们这个时代的乱伦形式,偶像崇拜和精神病症。爱国主义正是它的崇拜对象。显然,我这里所讲的爱国主义,是一种把自己民族凌驾于人性、真理和正义原则之上的态度……对自己民族国家的爱,如果不包括对人类的爱,就不是爱而是偶像崇拜。

--弗洛姆

爱国主义就是让你确信这个国家比所有其他的国家都要出色,只因为你生在这里。

--乔治•肖伯纳

爱国主义是超越于原则之上的对于不动产的一种专横的崇拜。

--乔治•简•纳森

爱国主义是无赖最后的避难所。

——塞缪尔•约翰逊(Samuel Johnson )

除非你把爱国主义从人类中驱逐出去,否则你将永远不会拥有一个宁静的世界。爱国主义是一种有害的、精神错乱的白痴形式。爱国主义就是让你确信这个国家比所有其他的国家都要出色,只因为你生在这里。

——乔治•肖伯纳

爱国主义:一堆随时可以被任何野心家所点燃,去照亮他的名字的易燃垃圾。

——安卜罗斯•皮尔斯

爱国者的责任就是保护国家不受政府侵犯。

——托马斯•潘恩

争你自己的自由就是争国家的自由,争你自己的权利就是争国家的权利。因为自由平等的国家不是一群奴才建造得起来的!

——胡适

星期五, 三月 30, 2018

什么是自由精神

自由的精神就是对自己是否正确不是很有把握的精神。

——哈耶克

星期一, 三月 19, 2018

曼森的心灵鸡汤(高度的)

俯视我,你看到的是一个傻子;仰视我,你看到的是一个神;平视我,你看到了你自己。

很久以前,成为疯子是有意义的。 现在,人人都是疯子。

曼森家族中的许多人都是被家庭抛弃的他们流浪在街头,他们不想去少年管教所我尽我所能,把他们带到我的垃圾场,我告诉他们,这里有爱,没有对错。

在乎究竟他妈的是什么意思?

只要我想,我可以是世界上最危险的男人,但我只想做我自己,从来不想成为别的。

死亡是爱的最好表达。疼痛能教会人很多事情。

查尔斯·曼森(Charles Manson)是20世纪最臭名昭著的杀人犯和邪教首领之一。他和他的追随者们在1969年至1971年之间犯下多宗杀人案,其中包括残忍地捅死当时已怀孕7个月的女演员、导演波兰斯基的妻子莎郎·蒂。1971年,曼森被判处终身监禁。2017年11月19日,曼森在加利福尼亚州的监狱里去世,终年83岁。曼森被称为操纵大师,他有虔诚的追随者和死心塌地的女粉丝,影响力甚至蔓延到音乐和影视等文化领域。哥特摇滚乐队玛丽莲·曼森(Marilyn Manson)其名也取自于他(其名的前半部分,则取自于美女玛丽莲梦露)。

曼森是历史上收到最多信件的因犯。每年,他都能收到至少6万封信。 曼森说自己在戴尔·卡耐基的畅销书《如何赢取友谊与影响他人》中学习了如何操纵别人。 他诱导有感情创伤的女孩,让她们觉得自己是美丽而完美的,一切错误都在她们的父母身上,她们应该放下一切跟随他。

星期三, 六月 14, 2017

VIM学习笔记 脚本-自定义命令 (Script-User Defined Command)

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

自定义命令

Vim编辑器允许定义自己的命令,我们可以像执行内置命令一样来执行我们自己定义的命令。

使用以下:command命令自定义命令:

:command Delete_first :1delete

注意自定义命令的名称,必须以大写字母开头,而且不能包含下划线;如果我们执行:Delete_first自定义命令,那么Vim就会执行:1delete命令,从而删除第一行。

可以使用!来强制重新定义同名的自定义命令:

:command! -nargs=+ Say :echo <args>

用户定义的命令可以指定一系列的参数,参数的个数由-nargs选项在命令行中指定。例如定义Delete_one命令没有参数:

:command Delete_one -nargs=0 1delete

默认情况下-nargs=0,所以可以省略。其他-nargs选项值如下:

-nargs=0没有参数
-nargs=11个参数
-nargs=*任何个数的参数
-nargs=?零个或是一个参数
-nargs=+一个或是更多个参数

在命令定义中,参数是由关键字<args>指定的:

:command -nargs=+ Say :echo "<args>"

输入以下自定义命令:

:Say Hello World

命令的执行结果显示:

Hello World

使用-range选项,可以指定一个范围作为自定义命令的参数。-range选项值如下:

-range允许范围,默认为当前行
-range=%允许范围,默认为当前文件(while file)
-range=count允许范围,单一的数字

当指定范围之后,就可以用关键字<line1>和<line2>得到这个范围的第一行和最后一行。

例如以下定义了SaveIt命令,用于将指定范围的文件写入文件save_file:

:command -range=% SaveIt :<line1>,<line2>write! save_file

关键字<f-args>含有与关键字<args>相同的信息,所不同的是它用于调用函数。例如以下自定义命令:

:command -nargs=* DoIt :call AFunction(<f-args>)

执行自定义命令:

:DoIt a b c

将会传递参数给调用的函数:

:call AFunction("a","b","c")

其他选项和关键字包括:

-count=number指定数量保存在关键字<count>中
-bang指定!修饰符存放在关键字<bang>中
-register指定寄存器,默认为未命名寄存器,寄存器的定义保存在关键字<register>中
-bar其他命令可以用|跟随在此命令之后
-buffer命令仅对当前缓冲区有效

使用以下命令,首先分别创建一个用户自定义命令,然后再将两个命令组合起来。

列示自定义命令

使用以下命令,可以列出用户定义的命令:

:command

command

删除自定义命令

使用以下:delcommand命令,可以删除用户定义的命令:

:delcommand Delete_one

使用以下命令,清除所有的用户定义的命令:

:comclear

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

星期一, 六月 12, 2017

VIM学习笔记 脚本-自定义函数 (Script-User Defined Function)

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

定义函数

Vim编辑器允许用户自定义函数,语法如下:

Name,函数名称必须以大写字母开始,并且只可以包含字母、数字和下划线。

arg1-argN,调用函数时需要为命名参数(Named Parameters)赋值。如果不需要任何参数,那么可以将括号()部分置空。最多可以定义20个参数。

keyword,range关键字定义一个范围函数(:function Count_words() range)会针对范围内的每一行重复执行操作;abort关键字指示函数(:function Do_It() abort)会在第一个错误时退出。

下面我们来定义一个函数,用来返回两个数中较小的一个:

函数内部的变量(例如smaller)均为局部变量,除非使用了g:作为前缀。例如在函数外我们定义了变量var,那么在函数内部可以使用g:var来调用。前缀a:的变量均为函数参数。

return 语句用于返回结果并结束函数。return语句之后的所有代码都不会被执行。

如果尝试定义一个已经存在的函数,那么将会收到报错信息。可以使用!来强制重定义同名函数。

:function! Max(num1, num2, num3)

Vim允许在函数中使用“...”来标识个数不定的可变参数(Variadic Parameters)。例如以下代码定义函数至少有2个参数,最多有20个参数:

argnum 计数器,用于记录num1和num2之后的参数个数;

a:num1 变量,用于访问指定的参数;

a:0 变量,用于记录参数总个数;

a:{argnum} 变量,用于访问每一个参数的值,例如a:1或a:2;

以下范围函数实例,将在指定范围行内执行替换操作:

当函数被以下命令调用时,变量a:firstline和a:lastline就会被赋值为这个范围内的第一行和最后一行,然后更新范围内的每一行。你可以使用:help cmdline-ranges命令,查看关于范围操作的更多信息。

:1,$call DeAmperfyAll()

调用函数

可以在表达式中调用函数:

:let tiny = Min(10,20)

还可以使用:call命令来调用函数:

:[range]call {function}([parameters])

列示函数

使用以下命令,可以列出所有用户定义的函数:

:function

使用以下命令,可以查看指定函数的代码:

:function {name}

使用以下命令,可以查看Vim内置函数的使用说明:

:help functions

删除函数

使用以下命令,可以删除指定的函数:

:delfunction {name}

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

星期二, 六月 06, 2017

VIM学习笔记 脚本-语句 (Script-Statements)

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

:echo命令

:echo可以显示命令中的参数。

:echo "Hello world"

Hello world

:echo还可以显示变量的值。

:let flag=1
:echo flag

1

使用|可以分隔同一行中的两个命令。

:echo "aa" | echo "bb"

aa
bb

:echon也只显示命令中的参数,但不会输出新行。

:echon "aa" | echon "bb"

aabb

可以通过:echohl命令,使用指定高亮颜色组输出信息。

:echohl ErrorMsg
:echo "A mistake has been make"

A mistake has been make

为了不影响后续:echo命令的显示效果,建议使用以下命令重设高亮显示为None:

:echohl None

使用以下命令,可以查看高亮显示组的颜色定义:

:highlight

在:echo命令中,可以使用以下转义符:

  • \n Newline
  • \r Carriage return
  • \t Tab
  • \123 八进制数字
  • \x123 十六进制数字
  • \u01fc34 Unicode
  • \f Form feed
  • \e Esc
  • \b Backspace
  • \\ 反斜线

判断

if语句的一般形式如下:

只有条件(condition)为真时,if语句块内的语句才会被执行。

if语句还可以包含else子句:

满足条件(condition)时,if语句块内的语句将会被执行;而不满足条件(condition)时,则else语句块内的语句将会被执行。

if-else结构还可以进行多重判断

循环

while命令开始一个循环,并由endwhile命令结束。在条件为真是,循环中的代码将被重复执行。

continue命令回到程序的顶部开始执行下一次循环;而break命令则立刻退出循环。

:execute命令

:execute将执行参数中指定的命令:

:let command = " echo 'Hello world!'"
:execute command

Hello world

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

星期三, 五月 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<上一篇 | 目录 | 下一篇>

星期一, 四月 24, 2017

VIM学习笔记 magic选项

magic选项

默认情况下,magic选项是打开的。如果关闭了此选项,那么正则表达式中的许多的特殊字符就失去了他们神奇的魔力,而变成了普通的字符。

我们使用以下只有一行的文件来测试magic选项。先用:%print命令将整个文件打印出来:

Test aaa* aa* a*

然后设置magic选项并且执行替换命令。其中,p标记打印出所改变的行:

:set magic

:1 substitute /a*/b/p

命令的执行结果如下:

bTest aaa* aa* a*

命令只是改变了一行开始的部分。为什么会将Test变为b*Test呢?这是因为*可以匹配0次或是多次,而Test正是以0个a开始的。为什么只是替换了一次呢?这是因为:substitute命令中是改变第一个出现的地方,如果我们使用g标记就可以替换全部的匹配项了。如果希望g标记成为默认设置,那么可以使用:set gdefault命令。

我们撤销刚才的命令并再次执行替换命令:

:undo

:1 substitute /a*/b/pg

命令的执行结果如下:

bTest b*b b*b b*

如果在关闭magic选项的情况下再次执行命令:

:undo

:set nomagic

:1 substitute /a*/b/pg

命令的执行结果如下:

Test aab ab b

smgic命令

:smagic命令,可以在执行替换命令时强制转换*等特殊字符的意义。例如我们执行以下命令:

:smagic /a*/b/pg

命令的执行结果如下:

bTest b*b b*b b*

:snomagic命令,强行关掉magic选项:

:snomagic /a*/b/pg

命令的执行结果如下:

Test aab ab b


命令小结
:set magic打开magic选项
:set nomagic关闭magic选项
:smagic强制使用magic选项
:snomagic强制禁用magic选项

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

星期三, 四月 19, 2017

VIM学习笔记 正则表达式-基础(Regular Expression Basic)

Vim使用正则表达式(regular expressions)来进行逻辑查找。正则达式是神秘和简洁的,然而这种强大的功能也必须要以大量的学习才能够习惯和掌握。

一个正则表达式是由一些元素组成的,一个元素可以是一个字符或者是一个特殊字符。

以下表格列示了常用的简单元素:

x字符x
^一行的开始处
$ 一行的结尾处
.任意单个字符
<开始标记
>结尾标记

行首与行尾

^acme,将匹配以acme开始的行。注意:除非出现在模式的开头,否则音调符号^就不是一个代表行开头的通配符,而会代表其他的含义。2^4,将匹配包含"2^4"的所有行。如果要查找以“^”开头的行,则需要使用^^模式。其中第一个^是通配符用于指示一行的开头,而第二个^则是实际的音调符号。如果要指明前导^是一个实际的音调符号而不是表示一行开头的通配符,那么就需要在其前面加一个转义的反斜杠“\”来组成\^acme模式。

RegularExpression_BeginOfLine

acme$,将匹配以acme结尾的行。^acme$,将匹配只包含acme一个单词的行。而^$,则会匹配所有空行。

RegularExpression_EndOfLine

dog.bone,将匹配dog-bone,dog bone,dog/bone,但不会匹配dogbone,因为dog和bone之间并没有分隔符。

RegularExpression_AnySingleChr

要指示任何字符出现的次数,可以同时使用句点和星号(.*),例如dog.*bone将匹配以下字符串(但不会匹配dog在一行而bone在另一行的情况):

dogbone
dog-bone
doggy bone
My dog has a bone

词首与词尾

<用于匹配一个单词的开始。>用于匹配一个单词的结束。也就是说,只要将想要查找的字符串包围其中,就可以实现精确查找。例如在文件中有单词Californian和Unfortunately。如果使用命令/for来查找,那么也会找到这两个单词。

RegularExpression_Partial

如果使用表达式/\<for\>来进行查找,则只会精确的查找到for,而不会出现其他的匹配。

RegularExpression_Exact

匹配次数

星号(*)通配符,作用于其之前的一个元素,表示可以匹配0次或是多次。表达式的贪婪(greedy)特性,将尝试查找尽可能多的匹配项。te*将会匹配te,tee,teee等等。甚至还会匹配t,因为在这里e可以出现0次。

RegularExpression_Asterisk

加号(+)通配符,表示一个字符可以匹配一次或是多次。所以表达式te\+可以匹配te,tee,teee等等。但是不会再匹配t,因为这里e最少要出现一次。

RegularExpression_Plus

等号(=)通配符,表示一个字符匹配0次或是一次。所以表达te\=可以匹配t和te,但是不会匹配tee,因为这个表达式只能匹配不多于两个字符。

RegularExpression_Equal

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

星期二, 三月 28, 2017

VIM学习笔记 重复命令(Dot Command)

.(Dot)命令,可以重复上次的修改。而上次的修改,可以是针对单个字符、整行,甚至是整个文件。所以Dot命令,是一个作用范围极广的强大命令。

重复单个命令

假设我们有以下文本:
Line one
Line two
Line three
Line four

如下图所示:.命令重复执行了x命令,用于删除当前光标下的字符:

DotCommand_SingleCommand

以下图例则展示了,.命令如何重复作用于整行之上的删除操作:

DotCommand_dd

重复多个命令组合

假设我们有以下代码:
var foo = 1
var bar = 'a'
var foobar = foo + bar

如下图所示:首先,我们使用A命令进入插入模式并在当前行的末尾增加分号;然后,退回到常规模式;之后,移动到一下行并利用.命令重复插入分号的操作。

DotCommand_A

重复命令与其他命令的组合

假设我们有以下代码:
var foo = "method("+argument1+","+argument2+")";

在以下实例中:我们希望在每个加号前后分别插入空格,以提高代码的可读性。首先,我们使用f命令查找加号;然后,使用s命令将加号替换为“ + ”;随后,退回到常规模式;之后,就可以利用;.命令查找下一个加号并重复执行替换操作。

DotCommand_f

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

星期五, 二月 24, 2017

VIM学习笔记 字体(Font)

在Mac系统中,可以在Font Book中查看字体列表;在Linux系统中,可以用命令xlsfonts列出所有可用的字体;在Windows系统中,可以在控制面板中检查字体列表。

更改字体

可以使用:set guifont=*命令,来打开字体选择对话框。

Font_Dialog

可以使用:set guifont=fontname命令,来更改当前使用的字体。

以下为 Linux 风格的字体设置语法。其中:字体名称和尺寸是以空格(Space)分隔的。如果字体名称中含有空格,则需要在空格前面加上一个反斜杠进行转义。

:set guifont=Andale\ Mono\ 11

以下为 Mac 风格的字体设置语法。其中:字体名称和尺寸是以冒号(:)分隔的。字体尺寸以字母h为前缀。如果字体名称中含有空格或逗号,则需要在特殊字符前面加上一个反斜杠进行转义。

:set guifont=Monaco:h11

以下为 Windows 风格的字体设置语法。其中:字体名称和尺寸是以冒号(:)分隔的。字体尺寸以字母h为前缀。如果字体名称中含有空格,则可以用下划线(_)来代替。

:set guifont=Andale_Mono:h11

为了提高字体设置的适用范围,可以在命令中用逗号分隔多个字体,如果Vim没有在系统中找到第一个字体,则会自动寻找字体列表中的后续字体。

:set guifont=Droid\ Sans\ Mono:h10,Consolas:h11:cANSI

字体设置实例

你可以将以下代码添加到vimrc配置文件之中,并设置为自己喜欢的字体:

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

星期五, 二月 17, 2017

VIM学习笔记 语法高亮 (Syntax Highlight)

语法高亮,将使用不同的颜色来显示不同的语法元素,可以体现文档的结构,帮助发现排布错误,以提高文本编辑和代码开发的效率。

查看语法高亮设定

我们可以使用:highlight命令,查看当前的语法高亮设定。

highlight

修改语法高亮设定

可以使用以下命令修改语法高亮显示:

:highlight group definition

其中group是指语法元素,例如:

  • Cursor,光标下的字符
  • Directory,目录名称
  • ErrorMsg,在最底行显示的错误信息
  • IncSearch,增量(Incremental)查找的匹配结果
  • ModeMsg,在左下角显示的模式名称
  • MoreMsg,显示更多信息时的提示
  • Visual,在可视化模式下被选中的文本

使用以下命令,可以查看关于group的帮助信息:

:help group-name

而definition是指具体定义。例如以下命令,将定义黄底黑字的终端:

:highlight Normal ctermfg=black ctermbg=yellow

在命令中没有指定的参数,将保持其原有的定义。例如以下命令,将背景定义为白色,而前景颜色不变:

:highlight Normal\ ctermbg=white

Vim识别三种不同的终端:term,黑白终端;cterm,彩色终端;gui,Gvim窗口。

term,可以定义其字体显示为:bold、underline、reverse、italic或standout。例如以下命令,用逗号来组合使用这些属性:

:highlight Keyword term=reverse,bold

cterm,可以用ctermfg设置前景色;用ctermbg设置背景色。例如以下命令,定义蓝底红字并使用下划线来显示注释:

:highlight Comment cterm=underline ctermfg=red ctermbg=blue

gui,可以使用选项gui=attribute,来定义图形窗口下语法元素的显示属性。选项guifg和guibg,用来定义了前景色和背景色。推荐使用的颜色包括:black, brown, grey, blue, green, cyan, magenta, yellow, white。

为了保持各平台下的一致性,我们应该使用十六进制颜色代码来指定颜色。例如使用以下命令,一次定义几种终端下的配色:

:highlight Error term=reverse cterm=blod ctermfg=#00afff ctermbg=#a8a8a8

使用以下命令,可以查看关于highlight的帮助信息:

:help highlight

查看配色

利用Colorizer插件可以直观的显示#rgb, #rgba, #rrggbb, #rrgbbaa, rgb(...), rgba(...)等等形式的配色。

plugin_Colorizer

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

星期一, 一月 23, 2017

星期三, 一月 18, 2017

VIM学习笔记 行号(Line Number)

绝对行号

可以用以下命令显示绝对行号(Absolute Line Number):

:set number

LineNumber_AbsoluteNumber

可以用以下命令隐藏绝对行号:

:set nonumber

相对行号

可以用以下命令显示相对行号(Relative Line Number):

:set relativenumber

LineNumber_RelativeNumber

可以用以下命令隐藏相对行号:

:set norelativenumber

如果我们使用以下命令,同时显示绝对行号和相对行号,那么Vim将显示当前行的绝对行号,而其他行则显示相对行号:

:set number

:set relativenumber

LineNumber_BothNumber

在Vim中,很多命令都可以使用数字前缀。例如,命令10j既是向下移动10行;命令>2j则可以缩进当前行以及其下2行。通过显示相对行号,你就可以清楚地看到命令所覆盖的范围。如果仅仅显示绝对行号,那么就需要你手动计算行之间的距离。

行号显示效果

行号默认右对齐显示在每行的左侧,占据4个空格的空间:其中3个空间用于显示行号,另1个空格作为于文本的间隔。当行数超过999时,行号显示区域将自动进行扩展。可以通过以下命令,改变行号所占用的空间(其中n为空间大小):

:set numberwidth=n

使用以下命令,可以定制行号(LineNr)的显示效果:

:highlight LineNr guibg=#1874cd ctermbg=#1874cd

使用以下命令,则可以定制当前行号(CursorLineNr)的显示效果:

:highlight CursorLineNr guifg=#050505

命令小结
:set number显示绝对行号
:set nonumber隐藏绝对行号
:set relativenumber显示相对行号
:set norelativenumber隐藏相对行号
:set numberwidth=n设置行号显示宽度

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