Practical Vim中文版 -《Vim实用技巧》已出版

车文隆与我合译的《Vim实用技巧》一书已由人民邮电出版社出版,本书的英文书名是 Practical Vim,原书作者是Drew Neil。这本书在Amazon网站上的评分是五颗星,是关于Vim的一本很好的书。

这本书在2014年5月已经正式出版了,但由于种种原因,我直到上周末才收到样书。拿到样书之后,第一时间翻阅了一下,书的纸质和印刷都相当不错,是我喜欢的类型。至于内容和版式,我早已熟悉的不能再熟了,不过看纸质版的感觉与看电子版很是不同,多了一份厚重感和书香气。

车文隆与我的分工如下:

  1. 车文隆负责:序、第10章到第21章、附录A
  2. Easwy负责:读者对本书的评论、自序、致谢、写作体例说明、第1章到第9章

作为本书的译者之一,我既逐字逐句翻译了部分内容,也曾多次对本书的内容及排版进行过审阅,因此我有充分的信心向读者推荐本书。对Vim用户而言,无论是刚接触 Vim 的初学者还是对 Vim 有了一定了解的中级用户,阅读本书都是学习 Vim 思维方式的很好途径。

因为我曾经对本书的内容和排版进行过多次细致的审阅,所以自信不会像某些书籍那样错误连篇,不过任何软件都有bug,任何书也都会有错误,如果读者发现书中的错误,请在《Vim实用技巧》勘误表中留言,我会一一记录下来,在本书再版时改正。

感谢本书的责任编辑陈冀康!也感谢另外一位译者车文隆,我们一起为这本书度过了不知多少个的日日夜夜!

感谢大家的支持!Happy Viming!

PS,本书在下列网站有售:

翻看了上述网站上的读者评论,大部分读者的反映都很好,也有几个读者吐槽书的纸质和价格,不过幸好没读者抱怨翻译质量,这就是对我们最好的评价了。 :-)

2015/04/28更新: 本书随书的源文件可以在这里下载,大家可以参照原书中的例子自己操作一下,以加深理解。

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/practical-vim-chinese-version/

文章的脚注信息由WordPress的wp-posturl插件自动生成

Easwy的vim配置共享:包括.vimrc及整个.vim目录

刚才有网友来信询问我的vim配置,我在很久以前已经把我的所有vim配置上传到github了,有兴趣的朋友可以在Easwy的Github共享找到我最新的.vimrc和整个的.vim目录。

你可以点此下载Easwy的vimrc,如果你了解git,你也可以使用git命令下载整个版本历史:

git clone https://github.com/easwy/share.git

用这种方式,你可以随时跟踪我的最新修改,或者把你对vimrc的改变通知我。

Happy Vimming!

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/easwy-vimrc-and-vim-settings/

文章的脚注信息由WordPress的wp-posturl插件自动生成

在Ubuntu上编译vim 7.3

在Thinkpad T400上安装完Ubuntu 10.04 LTS后,就开始搭建Android开发环境,第一步当然是编译vim。

目前最新的vim版本是7.3,因为从vim 7.3开始已经换用Mercurial做为版本管理工具,我们在下载vim 7.3源代码前,先要安装Mercurial:

sudo aptitude install mercurial
cd ~
hg clone https://vim.googlecode.com/hg/ vim73

执行完上面的命令后,我们就取得了vim 7.3的最新代码,放在目录~/vim73中,接下来准备编译。在编译前,需要安装编译时需要的包,在Ubuntu上用如下命令:

sudo aptitude install xorg-dev libx11-dev libgtk2.0-dev libncurses5-dev 

上面是Easwy在编译前所安装的依赖文件。后来在一篇帖子中看到另一种方法安装依赖文件,可能更方便(未测试):

sudo aptitude install build-essential
sudo aptitude build-dep vim-gtk 

接下来修改~/vim73/src/Makefile,打开自己所需要的功能,Easwy打开了下面这些特性:

  • CONF_OPT_CSCOPE = –enable-cscope
  • CONF_OPT_MULTIBYTE = –enable-multibyte
  • CONF_OPT_INPUT = –enable-xim
  • CONF_OPT_OUTPUT = –enable-fontset
  • CONF_OPT_FEAT = –with-features=big
  • CONF_OPT_COMPBY = “–with-compiledby=Easwy Yang <easwy.mail@gmail.com>”

接下来编译安装:

cd ~/vim73/src
make && make install 

执行完后编译好的vim以及gvim就安装在/usr/local/bin目录中了。将此目录加入PATH即可。

Easwy在编译后,每次运行gvim都会提示:

Warning: Missing charsets in String to FontSet conversion
Warning: Unable to load any usable fontset
Warning: Missing charsets in String to FontSet conversion
Warning: Unable to load any usable fontset
Error: Aborting: no fontset found 

后来在网上查了一下,是因为没有安装libgtk2.0-dev包造成后,安装此包再重新编译后问题解决。

如果你在编译gvim时遇到了问题,可以参考我以前写的一篇文章:vi/vim使用进阶: vim编译中遇到的问题及解决方法

最后,把我们编译的vim 7.3做为Ubuntu中的缺省编辑器,执行如下命令:

sudo update-alternatives --install /usr/bin/editor editor /usr/local/bin/vim 50 --slave /usr/share/man/man1/editor.1.gz editor.1.gz /usr/local/man/man1/vim.1.gz
sudo update-alternatives --install /usr/bin/vi vi /usr/local/bin/vim 50 --slave /usr/share/man/man1/vi.1.gz vi.1.gz /usr/local/man/man1/vim.1.gz 

Happy viming!

更多内容,请阅读易水博客上的其它文章。

[ 参考文档 ]

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/compile-vim73-on-ubuntu/

文章的脚注信息由WordPress的wp-posturl插件自动生成

[Vim] 批量替换程序中的字符串

今天代码中有两个宏的名字改了,这两个宏在程序中使用范围比较广,使用频率也很高,一个个手工替换显然不现实。
Source Insight提供了一个改名的功能,可以很方便的完成改名。

不过Easwy在这里要介绍是在Linux下使用Vi来完成改名,实际上也非常容易。Easwy使用的命令如下:

vim `egrep -rl 'AAA|CCC' * |grep -v .svn`
:argdo %s/AAA/BBB/ge | %s/CCC/DDD/ge | w

第一条命令是一个Shell命令,这条命令使用Vi打开当前目录下所有包含AAA或CCC宏的文件。其中egrep查找所有包含AAA和CCC的文件,然后使用带”-v“参数的grep把位于版本控制目录中的文件过滤掉。最后,egrep所找到的文件做为Vim的命令行参数传入。

第二条命令是Vi命令,这条命令把上述文件中所有的AAA替换为BBB,把CCC替换为DDD,并保存文件。想读懂这条Vi命令,请阅读手册”:help argdo

当然,在要修改的文件数目非常多时,最好使用sed之类的流编辑器,此时使用Vim效率会比较低。

更多关于Vim的内容,请关注易水博客上的其它文章。

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/replace-string-in-multiple-files/

文章的脚注信息由WordPress的wp-posturl插件自动生成

在Windows上安装配置Apache FOP

使用Apache FOP将Docbook文档转换成PDF一文中,Easwy介绍了在Debian Linux上使用Apache FOP将Docbook文档转换成PDF文件。本来在那篇文章之后,Easwy想写一篇如何在Windows上配置Apache FOP的文章,不过一直没抽出时间。今天刚好有网友问这个问题,于是教她一步步做下来,把步骤列在下面。

你可以在这里下载到文章中Easwy用到的所有文件:点此下载

  1. 安装Docbook样式表和xsltproc程序

    按照文章一个简单的Docbook 5.0例子,安装Docbook样式表和xsltproc转换程序,并能够成功将Docbook文件转换成html格式。

  2. 安装Apache FOP和Java虚拟机

    Apache Download Mirrors下载Apache FOP,Easwy下载的是FOP 1.0。下载后,将下载的文件解压,Easwy把它解压到C:\docbook\fop-1.0。

    接下来,还要安装Java虚拟机,因为Apache FOP需要Java虚拟机才能运行。到Java网站下载安装即可。

  3. 设置Apache FOP

    我们需要配置Apache FOP进行PDF转换时所用到的字体信息。首先,用下面的命令把字体信息从Windows自带的系统字体中提取出来:

    cd C:\docbook\fop-1.0
    mkdir fonts
    java -cp build\fop.jar;lib\avalon-framework-4.2.0.jar;lib\commons-logging-1.0.4.jar;lib\commons-io-1.3.1.jar;lib\xmlgraphics-commons-1.4.jar org.apache.fop.fonts.apps.TTFReader -ttcname SimSun c:\windows\fonts\simsun.ttc fonts\simsun.xml
    java -cp build\fop.jar;lib\avalon-framework-4.2.0.jar;lib\commons-logging-1.0.4.jar;lib\commons-io-1.3.1.jar;lib\xmlgraphics-commons-1.4.jar org.apache.fop.fonts.apps.TTFReader -ttcname SimHei c:\windows\fonts\simhei.ttf fonts\simhei.xml 

    上面的命令,把C:\Windows\fonts\目录下的宋体和黑体这两种字体信息提取到fonts\simsun.xmlfonts\simhei.xml文件中。

    接下来配置C:\docbook\fop-1.0\conf\fop.xconf,使Apache FOP能够找到这两种字体。首先在文件中找到<renderer mime=”application/pdf”>这一行,然后在此标签中加入关于字体的配置。

            
    <fonts>
      <font metrics-url="fonts/simsun.xml" kerning="yes" embed-url="file:///c:/windows/fonts/simsun.ttc">
        <font-triplet name="SimSun" style="normal" weight="normal"/>
        <font-triplet name="SimSun" style="normal" weight="bold"/>
        <font-triplet name="SimSun" style="italic" weight="normal"/>
        <font-triplet name="SimSun" style="italic" weight="bold"/>
      </font>
    
      <font metrics-url="fonts/simhei.xml" kerning="yes" embed-url="file:///c:/windows/fonts/simhei.ttf">
        <font-triplet name="SimHei" style="normal" weight="normal"/>
        <font-triplet name="SimHei" style="normal" weight="bold"/>
        <font-triplet name="SimHei" style="italic" weight="normal"/>
        <font-triplet name="SimHei" style="italic" weight="bold"/>
      </font>
    
      <directory recursive="true">file:///c:/windows/fonts/</directory>
    
      <auto-detect/>
    </fonts>
             
  4. 配置XLT转换样式表

    接下来,我们要配置XSL转换样式表,让xsltproc在转换Docbook文档时,使用我们指定的中文字体。在下面我给出了一个简单的样式表,假设存为docbook_fo.xsl:

     
    <?xml version='1.0'?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:exsl="http://exslt.org/common"
      xmlns:fo="http://www.w3.org/1999/XSL/Format"
      xmlns:ng="http://docbook.org/docbook-ng"
      xmlns:db="http://docbook.org/ns/docbook"
      exclude-result-prefixes="db ng exsl"
      version='1.0'>
    
      <xsl:import href="C:/docbook/docbook-xsl-1.74.3/fo/docbook.xsl"/>
      <xsl:param name="body.font.family">SimSun</xsl:param>
    
      <xsl:param name="monospace.font.family">SimSun</xsl:param>
      <xsl:param name="title.font.family">SimHei</xsl:param>
    </xsl:stylesheet>
             

    在这个转换样式表里,首先导入了Docbook的FO样式表,然后重新设置了其中的字体参数,改成我们所要的字体名称。需要注意的是,这里的字体名字需要和fop.xconf中设置的font-triplet中的名字完全一致。

  5. 输出PDF文件

    完成上述配置后,就可以进行PDF文件的转换了。把下面的文件保存为example.xml

            
    <?xml version='1.0' encoding="utf-8"?>
    
    <article xmlns="http://docbook.org/ns/docbook" version="5.0" xml:lang="zh-CN"
      xmlns:xlink='http://www.w3.org/1999/xlink'>
      <articleinfo>
        <title>我的第一篇Docbook 5.0文档</title>
        <author>
          <firstname>Easwy</firstname>
    
          <surname>Yang</surname>
        </author>
      </articleinfo> 
    
      <section>
        <title>文档介绍</title>
    
        <para>
          这是我的第一篇Docbook 5.0文档,欢迎你来到<link xlink:href='http://easwy.com/blog/'>Easwy的博客</link>。
        </para>
      </section>
    </article> 
             

    然后输入下面的命令将其转换成PDF:

    xsltproc -o example.fo c:\docbook\fop-1.0\conf\docbook_fo.xsl example.xml
    fop -c c:\docbook\fop-1.0\conf\fop.xconf example.fo -pdf example.pdf 

更多内容,请阅读易水博客上的其它文章。

参考文档

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/install-apache-fop-on-windows/

文章的脚注信息由WordPress的wp-posturl插件自动生成

Bram将vim 7.3列入开发计划

Bram Moolenaar在邮件列表里表示准备开发vim 7.3,预计在5月底发布第一个beta版本。

vim 7.3的功能需求还没有最后确定,Bram会根据自己能投入的时间和用户对vim新功能的投票结果来做最终决定。另外,Bram也在收集来自用户的patch和runtime文件。

Bram已经表示会增强Windows的安装程序,去掉lang和extra包。版本管理会采用Mercurial (在网上搜了一下,是一个基于Python的版本管理系统)。

vim注册用户赶快为自己期望的新功能去投票吧。未注册的vim用户需要交纳至少10欧元的注册费,然后到vim.org上激活自己的帐号。如果你在vim.org还没有帐号,可以在这里注册一个:http://www.vim.org/account/register.php

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/bram-plan-to-develop-vim-7-3/

文章的脚注信息由WordPress的wp-posturl插件自动生成

Windows下cscope -q选项出错的解决

以前曾有网友留言,在windows下使用cscope时,使用-q选项出现如下提示:

D:\Temp> cscope -Rbkq
Input file specified two times.

cscope: cannot create inverted index; ignoring -q option
cscope: removed files ncscope.in.out and ncscope.po.out 

当时Easwy以为是windows版本的cscope不支持-q选项。

不过网友Liang Feng昨天留言说:

Windows版本的cscope是支持-q选项的,出现以上错误是因为没找到合适的sort命令。所以只要cscope进程的工作目录下有GNU版本的sort就可以了。注意是进程的工作目录,不是可执行程序的目录。具体原因看一下cscope的代码片段。

build.c

#ifdef WIN32
snprintf(sortcommand, sizeof(sortcommand), “set LC_ALL=C && sort -T %s %s”, tmpdir, temp1);
#else
snprintf(sortcommand, sizeof(sortcommand), “env LC_ALL=C sort -T %s %s”, tmpdir, temp1);
#endif 

于是重新做了一下试验。在安装了Cygwin后,在cygwin的shell界面中使用cscope,没有出现上面的错误提示。但如果打开windows的命令行窗口cmd.exe,在里面执行cscope,则会出现上面的错误。

在仔细比较了cygwin和cmd.exe的环境后发现,原来是Windows自带的sort.exe搞的鬼。

在cygwin的shell窗口中,PATH环境变量的设置会使其先找到GNU版的sort.exe,所以上述cscope命令执行可以成功。但在cmd.exe窗口中,PATH环境变量会使其先找到windows自带的sort.exe而不是GNU sort.exe,所以会出现上面的错误提示。

知道了问题的原因,解决方法就很简单了,我们可以写一个批处理程序,在此程序中重设PATH环境变量,使cscope使用GNU版的sort.exe。示例程序如下:

D:\Temp> type cs.bat
@echo off
set path=c:\cygwin\bin;
cscope -Rbkq 

在这个批处理里,首先把path环境变量指向c:\cygwin\bin;,我的cscope.exe和GNU版的sort.exe都在此目录中。接下来现执行cscope命令,现在它使用的就是GNU版的sort.exe了。

在此感谢网友Liang Feng,谢谢他的提醒。

更多内容,请阅读易水博客上的其它文章。

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/cscope_sort_option_on_windows/

文章的脚注信息由WordPress的wp-posturl插件自动生成

解决安装Eclim后Vim Taglist插件工作不正常的问题

今天启动vi后,发现Taglist窗口不能正常显示文件中的标签。于是赶紧按照Taglist FAQ中列出的步骤检查了一遍(使用命令:help taglist-faq查看Taglist的FAQ)。

当执行下面的命令时,输出如下:


:echo system(Tlist_Ctags_Cmd . ' --version')
connect: Connection refused 

正常情况下,这条命令应该会输出Taglist插件的版本号,但现在显示的却是connect: Connection refused。于是查看了一下Tlist_Ctags_Cmd变量的值:

:echo Tlist_Ctags_Cmd
"/usr/share/eclipse/eclim" -command taglist -c "/usr/bin/ctags" 

这才想起,Easwy前些天安装了Eclim,用来在vim中使用Eclipse的功能。Eclim的作者对ctags和Taglist进行了加强,并且把Tlist_Ctags_Cmd替换成了他自己的版本。所以如果不启动eclimd的话,就会出现上面的错误。

知道了问题的原因,解决起来就简单了。使用/usr/share/eclipse/eclimd启动了eclimd后,Taglist窗口就能够正常显示了。不过Easwy暂时不想使用eclim提供的Taglist功能,所以在~/.vimrc中增加了下面的配置:

let g:EclimTaglistEnabled=0 

这样设置后,再启动vim,使用又是官方版本的Taglist了。

更多内容,请阅读Easwy的博客上的其它文章。

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/vim-taglist-plugin-not-work-after-installing-eclim/

文章的脚注信息由WordPress的wp-posturl插件自动生成

vi在启动时没有响应问题的解决

最近Easwy在某台服务器上启动vi时,总出现vi没有响应的情况。 现象是输入vi命令后,vi窗口显示不出来,并且此时终端也没有响应,不能输入任何命令。只能用ssh再登录一个终端,在新登录终端上使用kill命令杀死此vi进程,此时运行vi的终端中显示如下信息:

*** info [lib/liblow.c(329)]:
/dev/gpmctl: Interrupted system call
*** err [lib/liblow.c(336)]:
/dev/gpmctl: No such device or address
Vim: Caught deadly signal TERM
Vim: Finished.
Terminated 

在偶然中发现,使用putty登录这台服务器时,运行vi命令没有问题。因此怀疑和TERM环境变量的设置有关。检查putty中此环境变量:

$ echo $TERM
xterm 

而在vi没响应的终端里,TERM环境变量的值为:

$ echo $TERM
linux 

如果把TERM环境变量的值也改成xterm,那么vi可以正常启动。看来的确是TERM环境变量引起的这个问题。后来又发现,如果在linux screen中启动vim的话(此时TERM环境变量的值为screen),vim也不能正常启动。

那么为什么TERM环境变量的取值会影响vim的启动呢?经过认真排查,终于把问题定位到vimrc中的一个设置上:

set mouse=a 

如果在.vimrc中设置了set mouse=a,那么在TERM环境变量为linux或screen的终端上,vi启动时就会没有反应;如果去掉这个设置,不管TERM环境变量的取值是什么,vi都能正常启动。

阅读了vim的帮助手册,手册中说,这个选项只在一些特定类型的终端上支持,比如xterm、使能了gpm的linux终端等。看来问题是出在gpm上,从上面vim被kill后的打印中也可以看出,是/dev/gpmctl设备无法访问导致vi失去反应的。

后来在vimrc中把set mouse=a一句去掉,vi终于正常了。如果有其它朋友也遇到类似的问题,不妨试一下上述解决方案。

更多关于vim的内容,请阅读Easwy的博客上的其它文章。

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/vim_no_response_when_term_type_is_linux/

文章的脚注信息由WordPress的wp-posturl插件自动生成

vi/vim使用进阶: vimgdb调试时的常见问题及解决

<< 返回vim使用进阶: 目录

在文章在vim中使用gdb调试 – vimgdb中我介绍了如何使用vimgdb补丁在vim/gvim中调试程序。后来陆续有一些读者反馈了他们在使用中遇到的问题。在本文中总结一下。

[ 问题一: 运行GDB命令时提示”unable to read from GDB pseudo tty”? ]

有读者在试图执行GDB命令时,出现上面的提示。

出现这个问题是由于没有正确设置gdbprg变量。使用下面的命令设置一下GDB程序的位置即可解决此问题:

:set gdbprg=/path/to/gdb 

请把上面的/path/to/gdb替换成你计算机中GDB程序所在的路径。你可以把这句话加到你的vimrc中,这样每次启动vi时会自动设置此变量。

[ 问题二: 提示”GDB busy: command discarded, please try again”? ]

当你的程序需要用scanf()或者getchar()这类函数读取用户输入时,你可能会看到过这样的提示:

GDB busy: command discarded, please try again

出现这个提示,说明你的GDB正在等待用户输入,所以无法响应你所输入的其它GDB命令。

在使用vimgdb时,如果你的程序需要读取用户输入,你必须通过GDB的tty命令或run来重定向程序的标准输入。

首先,你打开一个终端(可以是xterm/rxvt/urxvt/putty/…),在此终端内输入命令tty


$ tty
/dev/pts/17 

这条命令用来显示此终端所使用的设备文件名。获得了这个设备文件名后,你就可以重定向程序的标准输入输出到这个终端,在GDB中输入下面的命令:

tty /dev/pts/17 

执行完这条命令后,程序的标准输入/输出就被重定向到/dev/pts/17了,这样,当执行到scanf()getchar()函数时,切换到那个终端输入指定参数,然后回车,程序就会继续向下执行。

[ 问题三: vimgdb可以在windows下使用吗? ]

vimgdb不能在windows下使用。不过你可以用作者提供的Clewn或Pyclewn。这两个程序可以在Windows的Vim/Gvim中使用。

这里有我写的一篇关于pyclewn的教程:在VIM中使用GDB调试 – pyclewn,clewn的用法与之类似。

[ 问题四: 按空格后vimgdb的命令窗口没有弹出来? ]

首先确保vimgdb的按键定义文件存在。执行下面的命令:

:set runtimepath?  

检查这条命令所列出的所有目录,如果任一目录中包含macros/gdb_mappings.vim文件,说明你的按键映射文件已经存在。如果你没有找到该文件,到vimgdb目录中找到这个命令,拷贝到上述任意一个目录中。

接下来用下面的命令加载vimgdb的键绑定:

:run macros/gdb_mappings.vim 

现在,你应该可以使用vimgdb所定义的快捷键了。

[参考文档]

<< 返回vim使用进阶: 目录

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/advanced-vim-skills-vim-gdb-vimgdb-faq/

文章的脚注信息由WordPress的wp-posturl插件自动生成