星期三, 四月 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:firstlinea: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,来定义图形窗口下语法元素的显示属性。选项guifgguibg,用来定义了前景色和背景色。推荐使用的颜色包括: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<上一篇 | 目录 下一篇>

星期四, 一月 12, 2017

我不喜欢八面玲珑、世故圆滑的人。喜欢略显笨拙、非常努力的人。
--山本耀司

星期三, 一月 11, 2017

世上只有两类悲剧:一种是求而不得;一种是得偿所求。
In this world there are only two tragedies. One is not getting what one wants and the other is getting it.
--Oscar Wilde

星期一, 十二月 19, 2016

VIM学习笔记 大小写转换(Tilde)

转换字符大小写

命令~可以改变字母的大小写。如果当前光标下的字母为小写,那么点击~可以将该字母转换为大写。同理如果当前光标下的字母为大写,那么点击~则可以将该字母转换为小写。

tildeop选项可以控制命令~的行为。默认设置下,只会对单个字符进行大小转换。

:set notildeop

如果设置了tildeop选项,那么命令就会变为~motion的模式:

:set tildeop

例如,在下面的句子中:

this is a test

我们将光标放在第一个t上并执行~ft命令,则结果为:

THIS IS A Test

命令使得当前光标以后第一个t和光标间的字符全部转换为大写,如果这个句子中还有小写字符,那么这个命令还可以执行第二次,直到句子中的字符全部为大写为止。

可以指定转换字符的个数和方向。例如命令3~l是从当前字符开始向右3个字符进行大小写的转换。

命令g~3w可以转换当前光标开始之后的3个单词;而命令g~iw则可以转换当前inner word;而命令g~$则可以转换从当前位置到行尾的所有字符。

命令g~g~g~~可以转换整行的大小写。而且并不依赖于tildeop选项的设置。

在可视化模式下,可以使用u命令,将选中的字母转换为小写;也可以使用U命令,将选中的字母转换为大写。

gUUgUgU命令,都可以将整行字符转换为大写。如果指定了数字参数,例如3gUU则可对指定行数进行转换。

相对应的guugugu命令,则是用于将整行字符转化为小写。

首字母大写

选中文本,然后进入命令行模式并使用以下命令,可以将选中的文本转换为首字母大写(title case / initial capitals)。

:s/\<\(\w\)\(\w*\)\>/\u\1\L\2/g

Title_Case

命令小结
~转换字符大小写
u将选中的字母转换为小写
U将选中的字母转换为大写
:set notildeop设置大小写转换命令的行为仅针对单个字符
:set tildeop设置大小写转换命令的行为类似于操作符

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

星期四, 十二月 15, 2016

VIM学习笔记 文本对象(Text Objects)

在Vim中,相比针对单个字符进行操作,对于单词、句子和段落等更大范围的文本对象(text-objects )执行命令则更有效率。Vim的命令结构示例如下:

[number]<command>[text object or motion]

其中:number是指命令作用在几个文本对象之上。比如3个单词;command是指执行的具体命令。比如删除或复制;text object or motion是指具体的文本对象。比如单词、句子或段落。

文本对象的类型

  • iw …inner word
  • aw …a word
  • iW …inner WORD
  • aW …a WORD
  • is …inner sentence
  • as …a sentence
  • ip …inner paragraph
  • ap …a paragraph
  • it …inner tag
  • at …a tag
  • i( or i) …inner block
  • a( or a) …a block
  • i< or i> …inner block
  • a< or a> …a block
  • i{ or i} …inner block
  • a{ or a} …a block
  • i[ or i] …inner block
  • a[ or a] …a block
  • i" …inner block
  • a" …a block
  • i` …inner block
  • a` …a block

文本对象的作用范围

iw表示inner word。如果键入viw命令,那么首先v将进入选择模式,然后iw将选中当前单词。

aw表示a word,它不但会选中当前单词,还会包含当前单词之后的空格。

以下实例中的红色 [ ] 表示作用范围:

iwThis is a [test] sentence.
awThis is a [test ]sentence.
iWThis is a […test…] sentence.
aWThis is a […test… ]sentence.
is…sentence. [This is a sentence.] This…
as…sentence. [This is a sentence. ]This…
ipEnd of previous paragraph.

[This is a paragraph. It has two sentences.]

The next.
apEnd of previous paragraph.

[This is a paragraph. It has two sentences.

]The next.
i( or i)1 * ([2 + 3])
a( or a)1 * [(2 + 3)]
i< or i>The <[tag]>
a< or i>The [<tag>]
i{ or i}some {[ code block ]}
a{ or a}some [{ code block }]
i[ or i]some [[ code block ]]
a[ or a]some [[ code block ]]
i"The "[best]"
a"The[ “best”]
i`The `[best]`
a`The[ `best`]

文本对象的应用实例

使用ci)命令,可以删除括号内的所有内容,但保留括号本身。而ca)命令,则可以删除括号内的所有内容,以及括号本身。

ci(

在某个开括号上,点击%键,光标将可以自动移动到相对应的闭括号上。通过与编辑命令组合,c%可以实现与ca)相同的功能。使用%命令,必须将光标放在括号之上;而使用a)命令,则光标可以在括号之上或括号内的任何位置。而且%命令,也是无法实现用i)命令效果的。

ca

使用cit命令,你甚至不用将光标移动到Tag之内,就可以快速修改其中的内容。

cit

使用ci"命令,可以快速修改当前行内第一个双引号其中的内容。

cidq

使用ci'命令,可以快速修改当前行内第一个单引号其中的内容。

cisq

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

星期一, 十月 10, 2016

VIM学习笔记 运行外部命令(shell)

执行单个命令

使用:!命令,可以运行一个外部系统命令。例如,以下命令将打开终端窗口,并在其中显示当前日期:

:!date

使用:!!命令,可以重新执行最近一次运行过的命令。

使用!!命令,可以运行外部命令并将输出结果做为当前行的内容。例如,输入!!date命令,将会把date命令的输出结果插入到文件中,当前行中的原有内容将会被覆盖。

执行多个命令

使用:shell命令,不需要退出Vim,就可以进入命令终端执行一个或多个Shell命令。在终端中使用exit命令,则可以退回到Vim。

命令小结
:!运行外部命令
:!!重新执行最近一次运行过的命令
!!运行外部命令并将输出结果做为当前行的内容
:shell打开shell终端

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

星期一, 七月 25, 2016

星期四, 七月 07, 2016

虫数据在线中文识别 chongdata ocr

网站的界面非常简洁,只需上传图片,然后点击“提交”按钮,随即开始在网站后台识别内容,很快就会自动显示识别结果。

如下图所示,即使混合了简体中文、繁体中文以及英语的内容,也能够很好地进行识别。

星期日, 二月 28, 2016

WEAK/STRONG

People cry, not because they’re weak, It’s because they’ve been strong for too long.
--Johnny Depp

星期六, 八月 08, 2015

星期六, 二月 07, 2015

星期日, 十月 26, 2014

什么是好生活?

在全球化的消费主义世界里,好生活似乎不再与任何宇宙、宗教或者空想主义的原则有关,而只与权力意志相连——更确切地说,只与最大限度地强化个体自我的生存有关。在没有任何外在于个人或高于个人的参照物时,‘好生活’就意味着竭尽全力地活着,意味着个人不仅‘自由自主’,而且全身心地投入到自我选择的任何行为当中。

--吕克·费里

星期日, 九月 21, 2014

游戏就是

拒绝接受这个世界的现状,想象它的可能性,并与此同时打破既有的观点和墨守成规的刻板印象。游戏就是纵情于幽默与机智的政治不正确,狡黠的挑衅,以及讽刺和挖苦。

— 卡特琳娜·格雷戈斯(Katerina Gregos)