打磨程序员的专属利器——文本

打磨程序员的专属利器分三个专题展示--

1. 命令行&文件

2. 快捷键

3. 文本 (本文)

 

1. 记笔记

好记性不如烂笔头,对于程序员更是如此。学习某种新语言或者某个库,若事先不记点笔记,几年后再拣起来会非常地慢。

之前自己一直用“为知笔记”,但慢慢发现了几个问题。

a. 这个软件喜欢升级,而每次升级都将界面改得面目全非(其实现在绝大多数软件都喜欢没事升级)。我只是想一个简洁的软件界面,只想专注于笔记,而为知的每一次更新后都得花精力在熟悉界面上。

b. 为知的笔记不是文本,这样笔记内容几乎只能用为知才能打开。如果想在ubuntu或者Mac上看,只有期待它出对应的客户端或者用网页查看(但如果没网时也不能查看本地数据了)。不过现在我打开wiz的网页版笔记,只能另我大失所望,本人只是想要一个左边是树形控件展示笔记的结构,右边可以显示笔记内容的界面,而wiz网站的在线笔记做得太复杂了。

c. 有时不知是服务器还是网络问题,同步居然出现问题。在家里电脑写的东西,来到公司后发现居然没有同步过来,fuck!!!!

忍无可忍后,就动了自己实现个笔记软件的想法。最开始是用c#写,笔记保存成.mht格式,用IE控件进行预览,用word进行编辑(这是从wiz中得到的启发)。不过后来也发现不是文本的笔记根本不能跨平台。于是又重写了一遍,用c++实现,下面是软件的界面,很简洁,但完全够自己用了。

打磨程序员的专属利器——文本_第1张图片

这个程序从底层反锯齿的2d图形库,到界面库,到Markdown的解析,都是自己重新造轮子实现(虽说在软件界不鼓励重新造轮子,但通过造轮子可以将图形库、界面库理解得更透彻)。由于太过简陋就不发布出来,等过段时间有空了用QT再重写一个相对漂亮点的界面再公布源码和程序。

2. Markdown

上面的笔记中提到了Markdown。《程序员修炼之道》中提到笔记得到文本来记录。最开始本人一直认为“文本”就是“纯文本”,直到在开源软件中发现有.md文件,于是知道了有Markdown这种东东,然后忽然识别到文本也可以做得很漂亮(html,css就是文本)。

Markdown是html的一个子集。可以用少量的标示符就可以构造出漂亮的文本排版。下面简单介绍下Markdown的标示符:

a. 行首的#可以指明段落,一个表示第一级,二个表示第二级,以此类推

b. 两行```之间的内容可以被解析为code格式,就像上图中有灰色背景的区域,这种可以方便放代码。

c. 行首的 * 可以被解析成html的

  • d. 用[name](http://www.test.com "test") 这种格式可以指定超链接

    e. 用下面的格式可以构造出如下的表格

    name | age
    ---|---
    man1 | 45
    man2 |2

    .... 

    更多Markdown语法可以参数其官网。反正都挺好学,也比较易用,可以在记笔记时不因格式问题而花太多的精力,让我们专注于内容

    3. 备份、同步

    有了上面DIY的笔记软件后,对于多地办公、多台电脑办公就得考虑如何同步笔记了。

    开始本人是使用金山网盘,但也是因为同步问题,有时真是金山的服务器挂了,导致无法同步。还一个严重的问题,网盘没有像svn,git那样明确的update,commit,pull,push操作,这样在同步时真就会出现问题。然后本人试了几乎所有的网盘,发现在某些情况下100%的情况会出现同步失败的问题。

    ************************

    在写这篇博文时为了再次证实下,于是本人又装了次金山快盘。

    新建一个文件夹,在这个文件夹下再新建两个文本文档,往其中一个文本文档中随便写点东西,这时去网页版的金山快盘上,就发现真就没有把刚才的东西同步上来。比吃了蟑螂还恶心!!!

    qq云盘和360网盘以前还可以在Explorer中查看本地数据,但现在只有用它自己的程序来操作本地数据了。

    百度云盘同样也有这样问题,没有本地路径。

    ************************

    同样是忍无可忍

    开始使用 http://svn.jundie.net/,但由于本人小气,不想花钱买私有项目,只有把自己的笔记弄成开源项目,虽说没什么重要东西,但总感觉不靠谱。

    于是找到git.oschina.net,并且发现基于git有非常多的服务器,并且都可以免费申请私有项目。于是爱上了git,为了保险,将自己所有的代码都放到git上,当然是私有项目(遥想当年,由于本人折腾电脑、折腾分盘,将大一下刚学程序半年写的vb6俄罗斯方块程序源码弄丢了,多么地心疼啊)~~

    于是妈妈再也不用担心代码弄丢了

    为了方便在Explorer中访问笔记,可以使用前文介绍的subst命令,将笔记路径映射成一个虚拟磁盘以便访问。 

    4. 学习一门文本语言

    《程序员修炼之道》中说程序员应该每一年学习一门新语言,我们打个折扣1~2年学习一门新语言。并且非常有必要学习一门文本操作语言,比如Python,Ruby或者是Perl。虽然用C#,java,甚至是c/c++都可以进行文本操作,但编写代码的速度肯定不及脚本语言。

    本人最开始学习的是Perl语言。这门语言咋一看觉得不好学——充满了各种奇奇怪怪的符号。不过如果沉下心来将《Perl语言入门》、《Perl语言编程》两本书看完,然后再动手自己写几个实用的小程序,Perl的学习之路基本上就算是毕业了。

    下面展示几个本人所写的perl程序。也是比较简陋(本人侧重于实用):

    a. ls程序

    linux下的ls命令可以将当前路径下的文件、文件夹都显示出来。windows下没有这样的程序,于是本人实现了一个。

     View Code

    将上面的代码保存为ls.pl,放在系统路径中。然后在命令行中就可以用 perl ls.pl 来执行它。如果嫌这个命令太复杂,就想用ls来执行它,可以这样,在系统路径中建立一个ls.bat文件,内容为

    @echo off
    perl e:\Tools\ls.pl %*

    这样输入ls时,先执行ls.bat文件,然后在这个文件中再真正执行perl代码(这里指定ls.pl的路径得用绝对路径)。其中%*是将 ls后面所有的命令行选项传递给ls.pl。

    ls所支持的命令行选项有:

    • ls  -f 只显示文件
    • ls -d 只显示文件夹
    • ls -s 显示文件或文件夹的大小
    • ls -S 按文件大小排序后再显示

     

    b. grep程序

    当我们阅读某个开源项目时往往想找一个类名、或者一个变量名在哪些地方使用过,如果这时没有将项目组织用IDE组织起来,想要查找就比较麻烦。在linux下有个grep可以对文本进行搜索,然后本人就用perl写了一个类似grep的程序,可以在文本文件中查找字符串,并且可以指定在特定的文件上查找。

     grep

    同样为了方便,建立一个grep2.bat文件,其内容为(这里只所有取名为grep2,是因为本人在widnows中装了linux的一些软件后有grep程序了,为了不引起冲突而取名grep2)

    @echo off
    perl e:\Tools\grep.pl %*

    grep2 ClassName 查找所有文本文件中的ClassName

    grep2 -f file  只查找文件名(不查找内容)

    grep2 -f \.cpp$ -t ClassName 在以.cpp结尾的文件中查找ClassName

     

    c. 从开源代码构建vs项目

    分析linux下的开源项目时往往没有IDE的支持,这里想要定位到变量的定义处,或者想查找在哪些地方有使用这个变量就很不方便。于是可以建立一个不能编译的vs项目,将所有源码添加到vs后,仅仅用来浏览代码。但基本上开源项目的结构都非常复杂,子文件夹中包括子文件夹,而vs也只支持批量添加同一个文件夹中的所有文件。如果一个个文件夹手动去添加代码文件,是个非常重复的工作。——于是程序的天性,消除重复劳动在此得到体现

    如果是建立c/c++项目,其项目拓展名是.vcproj,可以发现它就是一个xml文件。

    其包括文件的关键节点如下:

    
    
    
    
    
    

    知道了这个结构后,就可以用程序自动生成了~~

    文本操作,本人依然用Perl !!

     create.pl

     vs_pre.txt

    将create.pl vs_pre.txt复制到需要构建项目的地方,然后执行perl create.pl,这样就会生成一个temp.vcproj的项目,其中就包括了这个目录下所有的.h, .hpp, .cpp文件,在create.pl 的73行可以指定添加文件的类型。

     之前本人分析gimp和ffmpeg的源码就是用这种方法建立了vs项目,于是极大地提高了分析代码的效率

    如果以后有心情了,分析linux系统源码时也会用这种方式来构建项目。

     d. git项目的批量pull, push

    自从爱上了git.oschina.net后,将所有代码都放到git的私有项目中。c++代码都放在本地的 e:\cpp_app\ 文件夹下

    打磨程序员的专属利器——文本_第2张图片

    如图所示,左下角有小绿圆圈的标志都是有提交git的项目。

    这么多项目,如果一个个手动地进入文件夹然后pull,push,非常繁琐。

    于是先建立下面的git_syn.pl文件

    复制代码

     1 my $one = $ARGV[0];
     2 my $path = "e:\\cpp_app\\";
     3 opendir(DIR, $path);
     4 my @files = readdir(DIR);
     5 
     6 foreach (@files) {
     7     next if $_ eq '.' or $_ eq '..';
     8         
     9     my $str = $path . $_ . "\\" . ".git";
    10     if (-d $str) {
    11         my $s = $path . $_;
    12 
    13         say "\n\n=============== now directory : $s";
    14         chdir $s;
    15 
    16         if ($one == 0) {
    17             system "git add .";
    18             system "git commit -a";
    19             system "git push";
    20         } elsif ($one == 1) {
    21             system "git pull";
    22         }
    23     }
    24 }

    复制代码

     

    建立pull.bat文件

    1 echo off
    2 perl git_syn.pl 1
    3 pause

     

    建立push.bat文件

    1 echo off
    2 perl git_syn.pl 0
    3 pause

     git_syn.pl遍历e:\cpp_app文件夹下的所有文件夹,如果发现有.git子文件夹,则根据传入参数判断是push还是pull操作。

    有了pull.bat, push.bat后,妈妈再也不会担心有代码没更新了。使用svn的项目也这样弄,只要将git 改成svn,pull,push换成update,commit即可。参见《命令行&界面》

    5. 正则表达式

    个人认为程序员应该将正则表达式融入自己的血液

    如果不沉下心来学习,或者学了后不用,都会出现想使用正则表达式而很茫然的情况。

    本人借着学习Perl的机会,将正则表达式重新好好学了一遍,并且在日常的工作中有意识地强迫自己去使用,几个月下来后基本上可以称得上熟练掌握了正则表达式。

    下面就介绍几个在vs中用正则表达式进行查找/替换的例子(vs的正则和标准的正则有所不同,不过思想是一样的,只是在表示符号上不所不同):

    用如下图所示的方法打开vs的正则表达式查找、替换功能:

    打磨程序员的专属利器——文本_第3张图片

    • 查找被注释掉的代码   .*//.*GetTickCount
    • 将for,if, while后面的 { 放在与其同一行。查找部分为 ^{:b*[for|if|while].*[^\{]}\n:b*\{  替换为 \1{
    • 给所有逗号后面都加上一个空格。查找部分为,{[^ ]},替换为, \1

     其中{}表示分组(相当于标准正则中的()),[]表示一类字符集(相当于标准正则中的{})

    关于正则表达式的具体使用情况还有很多,结合上面介绍的grep2,可以用\.cpp$来查找所有后缀是cpp的文件。

    总之,学习正则表达式的回报会随着时间的累积越来越多,随着对其掌握的熟练程序而越来越多。

  • 你可能感兴趣的:(效率)