VimScript学习笔记(9):Excute和Normal

Execute

execute可以把一个字符串当做Vim的命令来执行。

这个命令的强大之处在于,可以通过字符串来构造不同需要的命令,然后进一步执行。

实验:创建file.txt并使用Vim打开,然后在Vim中执行 :edit foo.txt ,当前buffer会被foo.txt覆盖。最后执行下面的命令:

你会发现,窗口被分割成两个, 右边的窗口重新打开了file.txt

这个过程是:首先"rightbelow vsplit "字符串先和bufname("#")(这个命令的作用是,返回上一个buffer的路径)的结果进行连接。得到的字符串被执行。

Vim的Execute命令危险吗?

通常来说,一个语言的类似eval的命令都是比较危险的。因为这可能执行用户输入的代码,从而带来安全隐患。但是Vim不存在这个问题,原因有二:

第一,一般来说Vim只会接受一个人的输入,就是它的用户。如果用户想要输入一些危险的代码,也不是不可以,毕竟电脑是他们自己的。所以不存在什么安全隐患。

第二,VimScript有一些很奇怪的语法。这是execute可能是最简单的方式。况且,Vim可以在一行中写很多代码。

Normal

有一些命令是在Normal模式下有用的,比如说跳到最后一行的G。但是,通过normal命令,我们可以模拟这个键是在normal模式下按下的。

有时候,一些键映射到了别的功能。比如

我们使用normal!,将会忽略定义的映射。在vimrc文件中,就像我们应该永远使用noremap一样,我们也应该永远使用normal!

normal不会处理特殊字符。比如:normal! /foo<cr>,乍一看是搜索foo然后回车。但实际上,它会搜索foo左尖括号cr右尖括号的字符串,而没有按下回车。

要解决这个问题,就结合execute命令。

Execute Normal!

由于execute命令可以根据字符串执行命令,利用这个我们就可以使用Vim的字符串转义输入一些不可打印的字符。从而解决这个问题。

例子,下面的这个命令,可以在代码末尾添加一个分号,然后回到之前的位置。如果你看不懂,参考这里

 

 

VimScript学习笔记(8):函数

Vim的函数

Vim中使用function ... endfunction定义函数。

需要注意的是,Vim中的函数如果没有标明作用域(前缀s:),那么函数必须以大写字母开头。事实上,Vimer约定所有的函数都用大写字母开头,无论有没有作用域。

使用function!可以避免重复载入时候的冲突。

下面是定义一个简单的函数。

调用方法是:call Meow()

也可以使用返回值。

可以将返回值打印出来。

返回值

如果函数没有提供返回值,会返回数字0(即假)。

下面的这个判断宽度是不是太大的函数,在调用的时候就可以直接使用。

函数参数

Vim的函数当然也可以接受参数。下面的函数声明和调用展示了Vim的函数参数用法。

注意,变量的a:前缀是标志作用域。如果删去,Vim就找不到这个变量了。

在VimScript中,如果要函数接受变量,那么任何时候使用这个变量都要带上a:前缀,来告诉Vim他们在函数参数作用域中(argument scope)。

可变长度的参数

和Python,JavaScript一样,VimScript可以接受不确定数量的参数。见以下代码。

其中:

  • ... 表示这个函数可以接受任意数量的参数,和Python的*args一样
  • a:0表示这个函数的可变长度的参数的个数,我们传给Varg两个参数,那么a:0就是2
  • a:1 a:2 等等就是调用第n个参数
  • a:000 是所有可变长度参数组成的列表(数组),这里会打印出["a", "b"]

可变长度的参数可以和普通的参数一起用,和Python一样。

参数不能重新赋值

下面的代码,会抛出一个错误,因为Vim不允许对函数传进来的参数重新赋值。

为此,我们一般不直接使用传进来的参数,函数的开始一般会将进来的参数复制给新的变量,在函数中使用新的变量。

 

 

VimScript学习笔记(7):条件判断、比较和循环

编程语言必须要有条件判断功能。Vim中的语法是if...endif

基本的条件判断

下面的代码中,Vim会输出ONE而不会输出ZERO

没什么难的,前文中我们已经提到Vim的真值是1,假是0.

再尝试下面的代码。

Vim不会输出“INDEED”,但是会输出“WHAT”。这是为什么呢?请再测试下面的代码。

结果分别是10,20,10. 这是因为,Vim会在必要的时候进行类型转换,string转换成int,想必规则可以从上面的代码猜出来了。我就不说了:)

Vim也支持elseif(注意没有空格)else,像Python一样/不过不要忘记最后的endif。

结果是"finally"

比较

比较很简单,和Python没有什么不同。

string的比较要格外注意。==是依赖于用户设置的。

这里走的是elseif,因为不忽略大小写。

因此,我们永远不能依赖用户设置。这里推荐的做法和npremap vs map一样,建议不用使用==,而使用==?(忽略大小写)和==#代替(大小写敏感)。

循环

循环在VimScript中并不常用,因为使用normal!几乎可以满足我们所有的需求。为了万一在以后会用到,这里也提一下。

VimScript支持for循环和while循环。

for循环是for-each风格的循环。

While循环和别的编程语言几乎是一样的。

 

 

WordPress通过SMTP发送邮件通知

我的空间服务商禁用了php的mail函数,称如果不禁用,可能造成大面积的ip因为垃圾评论被拉黑。那么wordpress就不能发送邮件了,通过邮件找回密码,通过邮件发送评论通知等等都不能用了。但是我们还有另外一种方法,可以通过SMTP服务使用第三方的服务商发送邮件。

首先,去一家免费电邮服务商那里注册一个帐号。例如网易或新浪。一开始我用的网易的,但是那边老是出553垃圾邮件错误,就换成了新浪的。这里需要注意的是,一定要配置一下邮件服务商的SMTP服务。有的是默认关闭的,需要开启。像网易更特殊一些,需要设置一个安全码,WordPress的密码需要用安全码设置,不能使用邮箱密码。

然后将下面的代码,拷贝到主题的functions.php里面。

这样,就把WordPress原来的邮件mail函数替换成了smtp的发送邮件。这下WordPress所有的邮件功能都可以用了,包括评论邮件通知,邮件找回密码等等。

附赠的Comment Reply Notification邮件模板

安装好Comment Reply Notification这个插件,在设置里面,把下面两段分别复制到标题和内容,HTML邮件就美化好了!

效果如下:

 

Ps:通过Comment Reply Notification插件发送评论通知的话,这个过程是阻塞的。就是说,用户发送评论的时候速度会很慢。知道邮件发出去,用户才得到响应。

Pss:还需要注意的是,邮件服务商要求比较严格,发件人和用户名必须是一个。需要把你WordPress的帐号换成你邮箱的用户名字。

Psv:注意安全问题。很可能这个邮箱被攻陷,这样你所有的邮件都泄露了,推荐注册一个新邮箱。

 

近况

最近博客更新比较频繁了,但事实上我过的一点都不闲。之前很多时候需要了解一个东西,搜了半天,知道了答案,过了一段时间,又忘了。所以索性还是记到博客上来。但我是鄙视复制粘贴的博客的,这里发出来的东西,都是我自己整理的。即使我整理的不好呢,下面还提供了参考性很强的链接。这些都是我弄明白问题真正参考的链接,所以还是有价值的。

现在博客的样子也比较满意,该有的都有了。很长时间都不用再改了吧(但愿也不需要维护)。

过完年之后就回到上海上班,实在是忙。回来半个月了,守望先锋玩的时间加起来都不到俩小时。有点后悔没有在年假的时候把买的《最后的守护者》打完了,现在根本没时间去玩。假期里也比较浮躁,过年那段时间,天天都有人来,烦的很。我自己房间也没有电视,这盘游戏也不是很吸引人,是解密类的,在十天的假期里,我就完成了1/3左右。

一年一年,真的是越来越讨厌过年了。亲戚们问的问题越来越烦。想法也不一样。他们会问你大学四年花了多少钱,然后问问你毕业之后一个月能赚多少钱,给你算算,上大学划算不。真是无法沟通啊。明天不想回家过年了,找个地方旅行算了。

回来之后,感觉像是回到了文明的世界一样。

但是工作实在是很忙。虽然我不像年前一样996给自己加班了,时间还是不够用。

工作里面学到的东西挺多的,比如Django的框架吧,之前就以为自己很了解了。后来发现很多地方自己都没接触到,像是打开了大门一样。现在感觉要学的东西实在是太多了。工作其实挺开心的,每天都能学到新的东西。比如近期就搞明白了session和cookie,了解了Django的signal。对这份工作算是中等满意吧,其实不喜欢加班,上班的时候工作效率高一些,也可以不加。加班实在是太反人类了。

最近买了很多书,一共在亚马逊下了三单,分享一下:

  1. 剑指Offer:名企面试官精讲典型编程题(纪念版)
  2. 若为自由故 自由软件之父理查德 斯托曼传
  3. Redis实战
  4. RESTful Web APIs中文版
  5. 图灵程序设计丛书:图解HTTP
  6. 几何原本:建立空间秩序最久远最权威的逻辑推演语系(全译插图本)(全新修订版)
  7. 大问题:简明哲学导论(第9版)
  8. 乌合之众

图解HTTP这本书一般般,太浅显了,讲的和网络上的博客一样。不如阮一峰老师写的。

Redis,REST,剑指Offer这几本都是好书,学到不少东西。剑指Offer和几何原本这两本书,我买来主要是不想每天接触Web有关的东西,迷失在与用户交互里面。这两本书作为自己思考着玩,锻炼思维来说,非常不错。欧几里得真是厉害啊,这说明智商和历史是没有关系的。在发达的文明,还是有笨蛋。说不定越发达笨蛋越多。

若为自由故这本书不太推荐,49定价太贵。纸质很差。而且并不是自传。我觉得传记只有自传才值得一读。别人的视角来看另一个人,没意思。你看本人写的东西,就像和这个人对话一样,能了解到他真实的性格。

大问题这本书鼎力推荐。亚马逊哲学类销量第一,我看的津津有味。之前看过苏菲的世界,听说是哲学入门的书,但是对我来说还是太枯燥了。半读而废了。呵呵。

乌合之众这本书也很好。我觉得这本书可能有些偏激。对群体写的太弱智了,但也可能事实就是这样。书中有很多常人难以理解的观点,比如群体的智商是低于常人的,群体表现的低级进化型态的生命,主要以女性,野蛮的原始人以及儿童为主。但是写的也很有道理,旁征博引,话粗理不粗,算得上严肃读物。

猛兽总是独行,牛羊才成群结对。 ——鲁迅《鲁迅杂文精选》

最近有一个新的体会:学习知识最大的动力是因为我想知道。那些原理性的知识更加值得去钻研。挺好理解的,万变不离其宗。以前觉得看设计模式太浮夸了,我什么时候能用得到这些花哨的编程模式啊。其实模式就在身边,Django的信号吧,我估计就是个观察者模式。最近感觉debug的能力上升了一个档次。以前就会“怎么用”,程序出个Exception就看不懂了,要是知道它“是怎么运行的”,还怕什么异常看不懂呢。

女朋友给买了俩笔记本,这太好了。之前ps4放在电视下面,放不下,得用两本书把电视机垫起来,两本书还得找差不多厚的。现在好了,正好用这两本笔记本垫电视。于是把这两本书抽出来,一本书Python核心编程,这本太老了,而且看完了,不会再看了。另一本是曼昆的微观经济学原理。这是本好书啊,得重新读一读。

下面这段时间,给自己列一个list吧:

  1. 搞懂localstorage
  2. 写一个简单的web服务器,实现get post方法等
  3. 弄明白HTTP 1/1.1/2的区别

本来都下班了,唉,这么忙还唠叨这么多。下班。