最后更新于 .

之前在www.vim.org上逛,很惊讶于一个刚发布的插件居然就能获得100多的评分,很是吃惊,看了介绍才知道居然是一个类taglist的插件,并且弥补了一些taglist未曾解决的缺陷。 链接如下: Tagbar

我们以C++的头文件和实现文件为例,用图片来直观的比较一下与taglist.vim的区别。

首先是头文件,代码如下:

class CTestTagBar
{
public:
    CTestTagBar();
    virtual ~CTestTagBar();

protected:
    int GetName(bool bOpen);

private:
    int _init(int timeout);

private:
    int m_ret;
};

截图如下,其中左边的是taglist,右边的是tagbar。

1

然后是cpp文件,代码如下:

#include "test_tagbar.h"
CTestTagBar::CTestTagBar()
{}
CTestTagBar::~CTestTagBar()
{}
int CTestTagBar::GetName(bool bOpen)
{}
int CTestTagBar ...

最后更新于 .

上一篇文章《更简洁的C++数据库访问框架-soci》介绍了soci,但也同时提到了一个缺点---insert/update/delete操作的时候,没有返回影响了多少行。 另外还有一个隐性的原因,soci的代码大量使用了异常,而项目中要求底层代码是严禁抛出异常的(其实google也是有这个要求的)。 基于以上两个原因,所以最终没有把soci用在生产环境。 但是又不想每次都重复去调用那些繁琐的MySQL API,所以这次又重新对MySQL API做了一层C++的封装。 其实相信每个和mysql打过交道的程序员都应该会尝试去封装一套mysql的接口,这一次的封装已经记不清是我第几次了,但是每一次我希望都能做的比上次更好,更容易使用。 先来说一下这次的封装,遵守了几个原则,其中部分思想是从python借鉴过来的:

  • 1.简单
  • 简单,意味着不为了微小的效率提升,而去把接口搞的复杂。因为本身数据库存储效率的瓶颈并不是那一两次内存copy,代码中随处可以看到以这个为依据的设计。
  • 2.低学习成本
  • 使用一套新库通常意味着投入学习成本,而这次的封装并没有像django那样实现一套完整的模型系统,也没有做soci那样的语法分析器,我选择最简单易懂的方式:做sql语句拼接器,所以对习惯了使用原生mysql api的朋友,学习成本很低
  • 3.模块化
  • 代码实际包括了两个模块,一个是mysql client端的封装,一个是sql的拼接器,这两个模块是完全独立的,调用者可以任意组合或者独立使用。
  • 4.尽量使用STL以及模板,简化代码编写
  • 最大的特点就是大量使用了stringstream进行类型转化 ...

最后更新于 .

一直以来,笔者都在不停寻找一种更人性化的数据库访问方式(并不是说默认的方式不好,而是有时候的确在模块化设计中不太方便)。 后来有幸在php中找到codeigniter的ActiveReord,详细参考这篇文章: 抽离CodeIgniter的数据库访问类! 然而c++却始终用着最原始的方式,昨天趁着项目要用的机会,在网上搜索了好久,总算让我找到两套c++的数据库访问框架:

两套代码我都拿下来看了一下,litesql实现了一套完整的代码自动生成,功能强大,但是也很重;soci相对要轻量,但是同样也实现了数据结构到数据库表的映射。本人还是比较喜欢轻量的东西,所以最终选择了soci。经过这两天的试用,感觉非常不错。 官方的文档也很详细,所以这里就用我写的单元测试代码来做一下简单的讲解:

首先创建库表:

create database soci;
CREATE TABLE `tb_test` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(32) default "",
  `sex` int(11) default 0,
  PRIMARY KEY  (`id`),
  UNIQUE ...

最后更新于 .

其实很早就想写这篇文章了,虽然晚上介绍vim的文章很多,本博也已经就vim的使用写了70多篇博文,但是由于历史的原因,还有很多人对vim能做什么存在误解,包括:

  • vim对中文支持不好
  • vim适合临时编辑文本,对IDE的支持不好
  • vim的内嵌脚本语言不够强大,不像emacs的lisp那样无所不能

我不知道提出这些论断的人是因为不了不了解vim的现状,还是是对vim心存偏见。

本博在写vim相关文章的时候,一直坚持只谈技术的原则,不会涉及到与其他编辑器尤其是emacs的任何比较,然而最近在看了某些博文之后,觉得为了不让某些已经过时的观点给初学者选择编辑器时造成困扰,写下这篇文章十分必要。

OK,我们正式开始,在文章的末尾,相信大家都会明白上面的几个观点是否正确。

一.普通人的编辑利器

之所以第一点就提到这个,是因为"文字处理"当然是一个编辑器最基本的功能,而能把编辑的体验发挥到极致的也恐怕只有vim而已了。

这一节,也会参考善用佳软对vim的使用心得,相信用户的感受是最好的证明。

  1. 免费
    用户再也不用去网上辛苦的下载D版了!
  2. 提高输入速度
    这个相信也没有什么好争论的,纯键盘操作的速度是鼠标无法比拟的,虽然会带来一定的学习成本,但是相信还是值得的。
  3. 完美支持中文,并支持多种文件编码
    很多编辑器会有处理多字节编码的问题,而vim完美解决了这一点。(如果你的vim没解决,请参考linux下vim的编译以及终端乱码的最终解决方案
  4. 文本笔记管理
    这要归功于vim的一款插件:voom,详情可以参考善用佳软的这篇博文--VOoM(原VOOF):vim实现带折叠双栏树状文本管理

二 ...

最后更新于 .

很久之前就在视频网站上看到过各种版本的BadApple,包括魔兽版的,js版的,还有各种语言版的,当然也特意搜过有没有vim版的,答案是有,但是没有代码。 今天在vim.org上逛,居然被我看到了BadApple这几个字,试了一下很不错,兴奋之余果断决定大半夜发这篇博文。 下载地址: BadApple 按照说明,将zip解压,然后用vim打开badapple.vim,执行:

:so %

就可以看到流畅的字符动画啦,哈哈。 截图如下:

1

不过还是要说一下,用这种方式来启动其实不是很好,就像插件主页上说的,如果解压到plugin目录就会有问题。其实个人感觉最好还是将插件加载和启动分开,用单独的命令来启动,类似Matrix.vim

另外,也在网上找了一下制作这种字符视频的方法,由于没有时间尝试,所以就记在这里,大家有兴趣可以试一下: 【字符向】BadApple字符版,windows版制作教程

最后简单贴几个BadApple的不同版本的视频,大家有兴趣也可以看一下。如果还想看更多的版本,就直接去视频网站搜索一下就行,一大把。

vim版: https://v.youku.com/v_show/id_XMjM5MTA3MzI0.html

魔兽版:https ...

最后更新于 .

一.string中find_first_of的误用

STL中提供的string可以说极大方便了对字符串的操作,但是很多函数由于样子上很相似,所以导致很容易理解错误,find_first_of和find就是一个很好的例子。 我们先来看一下string提供的查找相关的函数列表:

find_first_of() 查找第一个与value中的某值相等的字符
find_first_not_of() 查找第一个与value中的所有值都不相等的字符
find_last_of() 查找最后一个与value中的某值相等的字符
find_last_not_of() 查找最后一个与value中的所有值都不相等的字符
rfind() 查找最后一个与value相等的字符(逆向查找)

如此简洁的说明,其实完全没有把他们最重要的区别描述出来,请务必记住: 对于find和rfind:

  • 匹配的是整个被查找串

对于find_first_of,find_first_not_of,find_last_of,find_last_not_of:

  • 匹配的是被查找串中的任意字符

我们来测试一下:

#include <iostream>
#include <memory>
#include <string>
#include <vector>
#include <set>
#include <map>
using namespace std;
int main(int argc, const char *argv[])
{
    string src = "vimer.cn ...

最后更新于 .

相信不少朋友像我一样,无论在linux还是windows下都用vim来办公,但是毕竟vim原生于linux,windows下的某些支持还是做的不太好。 这个系列的文章,我们就一起探讨一下。 一.鸡肋的文件查找 在linux下,查找包含一段文字的文件列表是很方便的:

grep "txt" *

要遍历所有所有的子文件夹也很容易:

grep "txt" * -r

但是到了windows下,用那个鸡肋的文件查找功能基本上查不到任何想要的东西,怎么办呢? 非常幸运的,vim考虑到了这一点,在内部实现了 vimgrep 这样一个命令,之前有在文章中介绍过,这次我们详细介绍一下. 虽然名字看起来和grep很像,但是用法还是不一样的,先来看一下普通的查找:

:vimgrep /an error/ *.c

而如果需要循环遍历所有子目录的话,语法如下:

:vimgrep /an error/ **/*

搜索到的文件列表会加入到quickfix中去,执行:

:copen

即可看到所有的文件列表。 OK,这样windows下内容查找的问题就解决啦~ 二.没有类似软链接功能 有些没用过linux的朋友可能不明白什么叫软链接,简单来说即一个文件或者文件夹指向了另一个文件或者文件夹,在外面的使用者看起来,没有任何区别。但是为什么在windows下使用vim会遇到这个问题呢? 这里要先介绍一下vimwiki这个插件,这个插件可以用vim来打造个人wiki ...

最后更新于 .

python逐渐成为笔者最常用的语言之一,因此vim对python有些配置的不合理也渐渐显现出来,这次我们先来解决python的缩进问题。 我们来通过例子来说明,来看一下默认配置下python的缩进情况:

1.dict的语法缩进

val1 = {
        1:"1",
        2:"2"
        }

2.list的语法缩进

val2 = [
        1,
        2,
        3
        ]

3.tuple的语法缩进

val3 = (
        1,
        2,
        3
        )

4.函数多行参数的缩进

def fun(
        a,
        b
        ):
    print a,b

5.复杂dict中存在):的情况

val4 = {
        (
            1,
            2
            ):1
        }

很遗憾的发现,这几种常用的写法,默认python缩进都没有完美实现,那么是否有办法优化呢? 答案是有的,vim.org上提供了一款更好的python缩进插件: http://www.vim.org/scripts/script.php?script_id ...

最后更新于 .

接着上一篇文章: 有限状态机的C++实现(1)-epoll状态机,我们今天来介绍更复杂和深入的部分。 为什么会在标题中提到bayonet这个开源项目呢?笔者本人一直想要写一套架构优美、功能完善的异步server框架,也看过很多朋友、同事实现的版本,虽然功能上基本能满足需求,但是架构上我却始终觉得是有瑕疵的,直到后来和同事讨论,发现可以让一个客户端请求的到来作为一个session,而之后的每一次与其他server的交互都可以看作是一次状态转化,才感觉架构比较合理了。 简单来说即,一个session从开始到介绍会经历两种状态机的变化:

  • 1.业务逻辑层面的状态变化,例如先验证登录态,再验证权限,再获取用户资料
  • 2.每一个与其他server交互的socket自身的状态变化,如recv、send、等,而socket的状态变化会触发逻辑层的状态变化。

按照这种思路,目前的代码开发已经完成了70%,即可以正常的进行一个session的开始和结束,主要还缺一些细节的代码,比如超时的检测及超时之后的处理,健全的统计之类。好了,我们来用vs看一下代码的整体类图(图压缩比较严重,请单击后查看):

1

每个类的用处已经在途中简单说明了,这里就不再赘述,我们重点来看一下用这个框架来实现一个逻辑server时需要做哪些事情。 svr2目录下的main.cpp即实现了一个最简单的server,我们按部分来看其实现:

1.逻辑层状态的定义

class CAppFsmLogic1 : public CAppFsmBase ...

最后更新于 .

新年回来一直忙于工作,今天忙里偷闲赶紧更新一篇,也给大家拜个晚年~~OK,废话不多说,直接进入正题~ 老博友应该知道本博曾经写过一款自动添加作者信息的插件,链接如下:Vim在源代码中自动添加作者信息 这次对这款插件做了更新,并放到http://www.vim.org上提供下载: AuthorInfo : http://www.vim.org/scripts/script.php?script_id=2902 目前AuthorInfo是支持c,cpp,java,php,python,bash,makefile等等多种语言,基本上只要NERD Commenter支持的类型,AuthorInfo都默认支持~这里展示几个例子,先给大家show一下:

c:

/*=============================================================================
#  Author:          dantezhu - https://www.vimer.cn
#  Email:           zny2008@gmail.com
#  FileName:        test2.cpp
#  Description:     
#  Version:         0 ...