﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Calvin's Tech Space-随笔分类-VIM</title><link>http://www.blogjava.net/lihao336/category/48278.html</link><description>成于坚忍，毁于浮躁</description><language>zh-cn</language><lastBuildDate>Fri, 10 Jun 2011 03:06:09 GMT</lastBuildDate><pubDate>Fri, 10 Jun 2011 03:06:09 GMT</pubDate><ttl>60</ttl><item><title>vim宏的录制</title><link>http://www.blogjava.net/lihao336/archive/2011/06/09/351996.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Thu, 09 Jun 2011 08:33:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2011/06/09/351996.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/351996.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2011/06/09/351996.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/351996.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/351996.html</trackback:ping><description><![CDATA[
		<p>接下来， 我们要将文本的偶数行修改为： 
<code>This is another test</code>。 
由于所有的偶数行都要进行同样的操作， 
因此我们把这个操作录制下来， 
然后重复播放若干遍， 就能很快地完成这项工作了。</p>
		<p>首先， 按几下 ESC 确认处在 Normal 模式下， 再按下 
<code>gg</code> 跳到第一行， 准备开始操作。 
我们首先按下 <code>q</code> 键， 
然后再按一个其它字母， 
将这个宏录制到该字母对应的寄存器下。 
例如我们这里使用 <code>m</code> 寄存器， 则按 
<code>qm</code>。 此时 VIM 状态栏出现“recording”字样， 
表明已经进入了录制状态。</p>
		<p>然后， 我们把第二行的 <code>a</code> 修改为 
<code>another</code>。 首先按 <code>j</code> 进入第二行， 
然后按 <code>$</code> 跳到行末， 再按两下 <code>b</code> 
往前跳两个单词， 此时光标停在字母 <code>a</code> 上。 
然后我们按下 <code>caw</code> 键删除 <code>a</code> 
并进入插入状态， 然后输入 <code>another </code>， 按 
ESC 回到 Normal 状态， 按 j 进入下一行， 
整个操作步骤就完成了。 最后， 我们再按一下 
<code>q</code>， 结束该宏的录制。</p>
		<p>接下来我们播放这个宏， 完成整个操作步骤。 
在键盘上输入 <code>1000@m</code>， 表示将 m 
寄存器里的宏播放 1000 次， 马上可以看到， 
文章中所有偶数行的 <code>a</code> 都变成了 
<code>another</code>。</p>
		<div class="code">
*This is a test<br />
*This is another test<br />
*This is a test<br />
*This is another test<br />
*This is a test<br />
*This is another test<br />
*This is a test<br />
*This is another test<br />
*This is a test<br />
*This is another test<br />
*This is a test<br />
*This is another test<br />
*This is a test<br /></div>
		<p>解说： 虽然我们指定播放 1000 次， 但事实上， 
执行到第 6 次的时候， 光标挪到了屏幕最下方， 
于是执行过程就自动停止了。 因此， 
在批量操作的时候， 我们可以指定足够大的数字， 
而不用担心出现问题。</p>
		<p>另外， 修改 <code>a</code> 的时候， 
我们跳到行末后再使用 <code>b</code> 
命令以单词为单位跳转， 而没使用 <code>h</code> 
一个字母一个字母往回挪， 我们使用 <code>caw</code> 
修改整个单词， 而不使用 <code>s</code> 
命令删除单个字母并进入 Insert 模式。 
这些细节可以保证录制得到的宏更具有一般性。</p>
		<p>转自http://edyfox.codecarver.org/html/vim_edit_tips.html</p>
		<p>
				<a href="http://easwy.com/blog/archives/vi-tip-of-using-recording/">如何保存宏？</a>
				<br />
		</p>
<img src ="http://www.blogjava.net/lihao336/aggbug/351996.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2011-06-09 16:33 <a href="http://www.blogjava.net/lihao336/archive/2011/06/09/351996.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Add keyboard shortcut for Gvim</title><link>http://www.blogjava.net/lihao336/archive/2011/06/09/351979.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Thu, 09 Jun 2011 06:11:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2011/06/09/351979.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/351979.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2011/06/09/351979.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/351979.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/351979.html</trackback:ping><description><![CDATA[由于经常使用gvim，故产生了使用快捷键打开gvim的想法，如下：<br />System--&gt;Preference--&gt;Keyboard Shortcuts<br />在Custom shortcuts下添加：<br />Name：Gvim<br />Command：<b>/usr/bin/gvim</b> -c "call Maximize_Window()"（这里一定要用全路径名！）<br />添加上快捷键即可。<br /><br />另外，System--&gt;Main menu下，将gvim的Command设置为<br />gvim -c "call Maximize_Window()"<br />可保证每次打开gvim都是最大化。<br /><img src ="http://www.blogjava.net/lihao336/aggbug/351979.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2011-06-09 14:11 <a href="http://www.blogjava.net/lihao336/archive/2011/06/09/351979.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VIM下heredoc格式化问题</title><link>http://www.blogjava.net/lihao336/archive/2011/05/26/351122.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Thu, 26 May 2011 10:23:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2011/05/26/351122.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/351122.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2011/05/26/351122.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/351122.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/351122.html</trackback:ping><description><![CDATA[在VIM下使用gg=G格式化shell代码时，如果代码中有heredoc，经过格式化后会造成代码运行失败。如下：<br /><font face="verdana,sans-serif">do<br />    echo "Deploying..."<br />    ssh $USER@$HOST &lt;&lt;-EOF<br /><b>cd clat<br />mv client client-bak-`date +%Y%m%d`<br />tar zxf `basename $TARGET_DEPLOY_ZIP` -C .<br />
exit<br />EOF</b><br />    echo ""</font><br /><br />格式化后会成这样：<br /><font face="verdana,sans-serif">do<br />    echo "Deploying..."<br />    ssh $USER@$HOST &lt;&lt;-EOF<br /><b>     cd clat<br />     mv client client-bak-`date +%Y%m%d`<br />     tar zxf `basename $TARGET_DEPLOY_ZIP` -C .<br />
     exit</b><br />    EOF<br />    echo ""<br />done</font><br /><br /><font face="verdana,sans-serif">vim对heredoc的代码进行了缩进（四个空格），这样</font><font face="verdana,sans-serif">会导<wbr>致</wbr></font><font face="verdana,sans-serif">执行出错。</font><br /><br />解决：修改vim格式化shell脚本的规则，格式化时忽略heredoc。<br /><br />将如下脚本保存到.vim/indent/sh.vim:<br />（来源：http://vim.1045645.n5.nabble.com/bash-heredoc-in-a-for-loop-indented-incorrectly-td1177006.html）<br /><font face="verdana,sans-serif"></font>" Vim indent file<br />" Language:    Shell Script<br />" Maintainer:       Nikolai Weibull &lt;[hidden email]&gt;<br />" Latest Revision:  2006-04-19<br /><br />if exists("b:did_indent")<br />  finish<br />endif<br />let b:did_indent = 1<br /><br />setlocal indentexpr=GetShIndent()<br />setlocal indentkeys+==then,=do,=else,=elif,=esac,=fi,=fin,=fil,=done,=EOF,=END<br />setlocal indentkeys-=:,0#<br /><br />if exists("*GetShIndent")<br />  finish<br />endif<br /><br />let s:cpo_save = &amp;cpo<br />set cpo&amp;vim<br /><br />function GetShIndent()<br />  let lnum = prevnonblank(v:lnum - 1)<br />  if lnum == 0<br />    return 0<br />  endif<br /><br />  " Add a 'shiftwidth' after if, while, else, case, until, for, function()<br />  " Skip if the line also contains the closure for the above<br />  let ind = indent(lnum)<br />  let line = getline(lnum)<br />  if line =~ '^\s*\(if\|then\|do\|else\|elif\|case\|while\|until\|for\)\&gt;'<br />        \ || line =~ '^\s*\&lt;\k\+\&gt;\s*()\s*{'<br />        \ || line =~ '^\s*{'<br />    if line !~ '\(esac\|fi\|done\)\&gt;\s*$' &amp;&amp; line !~ '}\s*$'<br />      let ind = ind + &amp;sw<br />    endif<br />  endif<br /><br />  if line =~ '^.*&lt;&lt;.*\(EOF\|END\)'<br />    let ind = 0<br />  endif<br />  if line =~ '^"\?\(EOF\|END\)"\?$'<br />    let ind = indent(search('&gt;.*EOF', 'b'))<br />  endif<br />  " Subtract a 'shiftwidth' on a then, do, else, esac, fi, done<br />  " Retain the indentation level if line matches fin (for find)<br />  let line = getline(v:lnum)<br />  if (line =~ '^\s*\(then\|do\|else\|elif\|esac\|fi\|done\)\&gt;' || line =~ '^\s*}')<br />        \ &amp;&amp; line !~ '^\s*fi[ln]\&gt;'<br />    let ind = ind - &amp;sw<br />  endif<br /><br />  return ind<br />endfunction<br /><br />let &amp;cpo = s:cpo_save<br />unlet s:cpo_save <br /><br />不过delimiter只能是EOF或者END。<br /><br /><img src ="http://www.blogjava.net/lihao336/aggbug/351122.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2011-05-26 18:23 <a href="http://www.blogjava.net/lihao336/archive/2011/05/26/351122.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高效率编辑器 VIM</title><link>http://www.blogjava.net/lihao336/archive/2011/05/02/349396.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Mon, 02 May 2011 12:33:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2011/05/02/349396.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/349396.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2011/05/02/349396.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/349396.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/349396.html</trackback:ping><description><![CDATA[高效率编辑器 VIM<br />
虽然从很久前就开始用 VIM 了，但一直都是半调吊子，翻来覆去只用自己会的命令。最近为了提高书写代码的效率，还有 coding 时候的乐趣，又重新钻研了一下 VIM，发现了一篇很好的 VIM 入门的文章，原文是英文版的，我觉得非常适合 VIM 使用入门，所以翻译了过来。这里是简单的介绍了 VIM 的操作方式，并没有说为什么要用 VIM，如果你想知道答案可以去 Google，VIM 被誉为编辑器之神。<br />
<br />
这篇教程写了在不同工作模式下使用 VIM 的一些基本技巧——即插入模式（insert mode）， 命令模式（command mode）， 存取文件等。目的是帮助刚刚接触 VIM 的新手更加有效率的使用这个出色的编辑器。<br />
<br />
说明：在这篇文章里面，<c-x> 代表 Ctrl + X——就是按住 Ctrl 键然后再按 X。而且你可以在很多情况下使用 :help command 来获得大部分命令的帮助，这个是 VIM 的内部帮助文件命令。<br />
<br />
高效率移动<br />
<br />
在插入模式之外<br />
<br />
基本上来说，你应该尽可能少的呆在插入模式里面，因为在插入模式里面 VIM 就像一个&#8220;哑巴&#8221;编辑器一样。很多新手都会一直呆在插入模式里面，因为这样易于使用。但 VIM 的强大之处在于他的命令行模式！你会发现，在你越来越了解 VIM 之后，你就会花越来越少的时间使用插入模式了。<br />
<br />
使用 h、j、k、l<br />
<br />
使用 VIM 高效率编辑的第一步，就是放弃使用箭头键。使用 VIM，你就不用频繁的在箭头键和字母键之间移来移去了，这会节省你很多时间。当你在命令模式时，你可以用 h、j、k、l 来分别实现左、下、上、右箭头的功能。一开始可能需要适应一下，但一旦习惯这种方式，你就会发现这样操作的高效之处了。<br />
<br />
在你编辑你的电子邮件或者其他有段落的文本时，你可能会发现使用方向键和你预期的效果不一样，有时候可能会一次跳过了很多行。这是因为你的段落在 VIM 看来是一个大的长长的行。这时你可以在按 h、j、k 或者 l 之前键入一个 g，这样 VIM 就会按屏幕上面的行如你所愿的移动了。<br />
<br />
在当前行里面有效的移动光标<br />
<br />
很多编辑器只提供了简单的命令来控制光标的移动（比如左、上、右、下、到行首/尾等）。VIM 则提供了很多强大的命令来满足你控制光标的欲望。当光标从一点移动到另外一点，在这两点之间的文本（包括这两个点）称作被&#8220;跨过&#8221;，这里的命令也被称作是 motion。（简单说明一下，后面会用到这个重要的概念）<br />
<br />
这里是常用到的一些命令（motion）：<br />
<br />
fx：移动光标到当前行的下一个 x 处。很明显，x 可以是任意一个字母，而且你可以使用 ; 来重复你的上一个 f 命令。<br />
tx：和上面的命令类似，但是是移动到 x 的左边一个位置。（这真的很有用）<br />
Fx：和 fx 类似，不过是往回找。<br />
w：光标往前移动一个词。<br />
b：光标往后移动一个词。<br />
0：移动光标到当前行首。<br />
^：移动光标到当前行的第一个字母位置。<br />
$：移动光标到行尾。<br />
)：移动光标到下一个句子。<br />
( ：移动光标到上一个句子。<br />
在整个文件里面有效移动光标<br />
<br />
VIM 有很多命令，可以用来到达文件里面你想到达的地方。下面是一些在文件里面移动的命令：<br />
<br />
<c-f>：向下移动一屏。<br />
<c-b>：向上移动一屏。<br />
G：到文件尾<br />
numG：移动光标到指定的行（num）。（比如 10G 就是到第 10 行）<br />
gg：到文件首<br />
H：移动光标到屏幕上面<br />
M：移动光标到屏幕中间<br />
L：移动光标到屏幕下面<br />
*：读取光标处的字符串，并且移动光标到它再次出现的地方。<br />
#：和上面的类似，但是是往反方向寻找。<br />
/text：从当前光标处开始搜索字符串 text，并且到达 text 出现的地方。必须使用回车来开始这个搜索命令。如果想重复上次的搜索的话，按 n。<br />
？text：和上面类似，但是是反方向。<br />
ma：在当前光标的位置标记一个书签，名字为 a。书签名只能是小写字母。你看不见书签的存在，但它确实已经在那里了。<br />
`a：到书签 a 处。注意这个不是单引号，它一般位于大部分键盘的 1 的左边。<br />
`.：到你上次编辑文件的地方。这个命令很有用，而且你不用自己去标记它。<br />
高效的输入<br />
<br />
使用关键词自动完成<br />
<br />
VIM 有一个非常漂亮的关键词自动完成系统。这表示，你可以输入一个长词的一部分，然后按一下某个键，然后 VIM 就替你完成了这个长词的输入了。举个例子：你有一个变量名为 iAmALongAndAwkwardVarName 在你写的代码的某个地方。也许你不想每回都自己一个一个字母的去输入它。<br />
<br />
使用关键词自动完成功能，你只需要输入开始几个字母（比如 iAmAL），然后按 <c-n>（按住 Ctrl，再按 N）或者 <c-p>。如果 VIM 没有给出你想要的词，继续按，直到你满意为止，VIM 会一直循环它找到的匹配的字符串。<br />
<br />
聪明的进入插入模式<br />
<br />
很多新手进入插入模式都只是用 i。这样当然可以进入插入模式，但通常不是那么合适，因为 VIM 提供了很多进入插入模式的命令。下面是最常用的一些：<br />
<br />
i：在当前字符的左边插入<br />
I：在当前行首插入<br />
a：在当前字符的右边插入<br />
A：在当前行尾插入<br />
o：在当前行下面插入一个新行<br />
O：在当前行上面插入一个新行<br />
c{motion}：删除 motion 命令跨过的字符，并且进入插入模式。比如：c$，这将会删除从光标位置到行尾的字符并且进入插入模式。ct！，这会删除从光标位置到下一个叹号（但不包括），然后进入插入模式。被删除的字符被存在了剪贴板里面，并且可以再粘贴出来。<br />
d{motion}：和上面差不多，但是不进入插入模式。<br />
有效的移动大段的文本<br />
<br />
使用可视选择（visual selections）和合适的选择模式<br />
<br />
不像最初的 VI，VIM 允许你高亮（选择）一些文本，并且进行操作。这里有三种可视选择模式：<br />
<br />
v：按字符选择。经常使用的模式，所以亲自尝试一下它。<br />
V：按行选择。这在你想拷贝或者移动很多行的文本的时候特别有用。<br />
<c-v>：按块选择。非常强大，只在很少的编辑器中才有这样的功能。你可以选择一个矩形块，并且在这个矩形里面的文本会被高亮。<br />
在选择模式的时候使用上面所述的方向键和命令（motion）。比如，vwww，会高亮光标前面的三个词。Vjj 将会高亮当前行以及下面两行。<br />
<br />
在可视选择模式下剪切和拷贝<br />
<br />
一旦你高亮了选区，你或许想进行一些操作：<br />
<br />
d：剪贴选择的内容到剪贴板。<br />
y：拷贝选择的内容到剪贴板。<br />
c：剪贴选择的内容到剪贴板并且进入插入模式。<br />
在非可视选择模式下剪切和拷贝<br />
<br />
如果你很清楚的知道你想拷贝或者剪切什么，那你根本就不需要进入可视选择模式。这样也会节省时间：<br />
<br />
d{motion}：剪切 motion 命令跨过的字符到剪贴板。比如，dw 会剪切一个词而 dfS 会将从当前光标到下一个 S 之间的字符剪切至剪贴板。<br />
y{motion}：和上面类似，不过是拷贝。<br />
c{motion}：和 d{motion} 类似，不过最后进入插入模式。<br />
dd：剪切当前行。<br />
yy：拷贝当前行。<br />
cc：剪切当前行并且进入插入模式。<br />
D：剪切从光标位置到行尾到剪贴板。<br />
Y：拷贝当前行。<br />
C：和 D 类似，最后进入插入模式。<br />
x：剪切当前字符到剪贴板。<br />
s：和x类似，不过最后进入插入模式。<br />
粘贴<br />
<br />
粘贴很简单，按 p。<br />
<br />
使用多重剪贴板<br />
<br />
很多编辑器都只提供了一个剪贴板。VIM 有很多。剪贴板在 VIM 里面被称为寄存器（Registers）。你可以列出当前定义的所有寄存器名和它们的内容，命令为&#8220;:reg&#8221;。最好使用小写字母来作为寄存器的名称，因为大写的有些被 VIM 占用了。<br />
<br />
使用寄存器的命令为双引号 "。<br />
<br />
比如：我们要拷贝当前行到寄存器 k。你应该按 "kyy。（你也可以使用 V"ky。为什么这样也可以呢？）现在当前行应该已经存在了寄存器 k 里面直到你又拷贝了一些东西进入寄存器 k。现在你可以使用命令 "kp 来粘贴寄存器 k 里面的内容到你想要的位置。<br />
<br />
避免重复<br />
<br />
令人惊奇的 . 命令<br />
<br />
在 VI 里面，输入 . (小数点符号），将会重复你输入的上一个命令。比如，你上个命令为&#8220;dw&#8221;（删除一个词），VI 将会接着再删除一个词。<br />
<br />
使用数字<br />
<br />
使用数字也是 VIM 强大的而且很节省时间的重要特性之一。在很多 VIM 的命令之前都可以使用一个数字，这个数字将会告诉 VIM 这个命令需要执行几次。比如：<br />
<br />
3j 将会把光标向下移动三行。<br />
10dd 将会删除十行。<br />
y3" 将会拷贝从当前光标到第三个出现的引号之间的内容到剪贴板。<br />
数字是扩展 motion 命令作用域非常有效的方法。<br />
<br />
记录宏<br />
<br />
有时候，你会发现你自己在文章的每段或者每行都重复相同的一系列动作。VIM 允许你记录一个宏来完成你的特殊需要。<br />
<br />
qregister：记录宏到寄存器 register，这里 register 是任意的你的寄存器的名字。比如 qa，将会记录并且把宏存在寄存器 a 里面。<br />
q：结束宏的记录。<br />
@register：使用存在寄存器 register 的宏。比如 @a，将会使用存在寄存器 a 里面的宏。<br />
必须要记住的是，宏只记录了你的系列按键并且重复执行它们。它们不是魔法。因为在 VIM 里面完成目的的方法有很多，所以有时候你要小心选择命令来记录你的宏。因为它们会在所有你要执行它的地方执行。<br />
<br />
用 VIM 写代码<br />
<br />
VIM 是一个用来写代码的绝好编辑器，因为它有一些特性是专门为程序员而设计的。这里是一些常用的：<br />
<br />
]p：和 p 的功能差不多，但是它会自动调整被粘贴的文本的缩进去适应当前代码的位置。试一下！<br />
%：匹配花括号、方括号、括号等。在一个括号的上面，然后按 %，鼠标就会出现在匹配的另外一半括号处。<br />
&gt;&gt;：缩进所有选择的代码<br />
&lt;&lt;：和上面类似，但是反缩进<br />
gd：到达光标所在处函数或者变量的定义处。<br />
K：在 Man 里面查找光标当前所在处的词。<br />
<br />
http://linuxtoy.org/archives/efficient-editing-with-vim.html<br />
</c-v></c-p></c-n></c-b></c-f></c-x>
<img src ="http://www.blogjava.net/lihao336/aggbug/349396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2011-05-02 20:33 <a href="http://www.blogjava.net/lihao336/archive/2011/05/02/349396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VIM+Xdebug调试php</title><link>http://www.blogjava.net/lihao336/archive/2011/04/18/348518.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Mon, 18 Apr 2011 12:56:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2011/04/18/348518.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/348518.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2011/04/18/348518.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/348518.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/348518.html</trackback:ping><description><![CDATA[1.安装Xdebug<br />
sudo apt-get install php5-xdebug<br />
<br />
2.配置Xdebug<br />
编辑/etc/php5/apache2/conf.d/xdebug.ini，加入<br />
xdebug.remote_enable = 1<br />
xdebug.remote_port = 9000<br />
xdebug.remote_host = localhost<br />
<br />
3.安装vim插件DBGp<br />
下载页面： http://www.vim.org/scripts/script.php?script_id=1929<br />
下载后放入plugins目录中即可。<br />
<br />
4.在浏览器中打开要调试的php页面,在URL后加上?XDEBUG_SESSION_START=1参数<br />
用vim打开此文件，用:Bp 设置断点，然后安 F5 键，vi会提示 waiting for a new connection on port 9000 for 5 seconds&#8230; ，此时在5秒内刷新刚才那个页面，即可在vim中看到调试界面。<br />
<br />
如果出现 <type exceptions. attributeerror="">, AttributeError("DbgProtocol instance has no attribute 'stop'", 则说明没有配置成功，要么是 xdebug.remote_* 没有配置好，要么是url尾部上没有加入 ?XDEBUG_SESSION_START=1 ，要么是你没有在5秒内刷新页面 .<br />
<br />
5.在获取变量内容时，如果变量为 array ，那么默认只会显出 (array) ，而不会显示数组内的各元素，如果无法显示数组元素内容，那么调试会遇到很多问题，因此可以根据 debugger.vim 中的注释，自行在 .vimrc 中加上如下一行：<br />
<br />
let g:debuggerMaxDepth = 5<br />
更多的配置，可以依次类推，都在debugger.vim中有所说明。<br />
<br />
转自http://lds2008.blogbus.com/logs/115127244.html</type><span class="Apple-style-span" style="border-collapse: separate; color: #000000; font-family: 'WenQuanYi Micro Hei'; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"></span>
<img src ="http://www.blogjava.net/lihao336/aggbug/348518.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2011-04-18 20:56 <a href="http://www.blogjava.net/lihao336/archive/2011/04/18/348518.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VI下删除文本中的^M</title><link>http://www.blogjava.net/lihao336/archive/2011/04/11/348040.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Mon, 11 Apr 2011 02:32:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2011/04/11/348040.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/348040.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2011/04/11/348040.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/348040.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/348040.html</trackback:ping><description><![CDATA[关于回车与换行<br />
很久以前，老式的电传打字机使用两个字符来另起新行。一个字符把滑动架移回首位 (称为回车<cr>,ASCII码为0D)，另一个字符把纸上移一行 (称为换行<lf>,ASCII码为0A)。当计算机问世以后，存储器曾经非常昂贵。有些人就认定没必要用两个字符来表示行尾。UNIX 开发者决定他们可以用<lf>一个字符来表示行尾，Linux沿袭Unix，也是<lf>。Apple 开发者规定了用<cr>.开发 MS-DOS以及Windows 的那些家伙则决定沿用老式的<cr><lf>.<br />
三种行尾格式如下:<br />
unix            <lf>      : \n<br />
dos             <cr><lf>  : \r\n<br />
mac             <cr>      : \r<br />
这意味着，如果你试图把一个文件从一种系统移到另一种系统，那么你就有换行符方面的麻烦。<br />
<br />
因为MS-DOS及Windows是回车＋换行来表示换行，因此在Linux下用Vim查看在Windows下写的代码，行尾后&#8220;^M&#8221;符号。<br />
在Vim中解决这个问题，很简单，在Vim中利用替换功能就可以将&#8220;^M&#8221;都删掉，键入如下替换命令行：<br />
:%s/^M//g<br />
<br />
注意：<br />
上述命令行中的&#8220;^M&#8221;符，不是&#8220;^&#8221;再加上&#8220;M&#8221;，而是由&#8220;Ctrl+v&#8221;、&#8220;Ctrl+M&#8221;键生成的，或者Ctrl+v，再按回车。<br />
<br />
或者使用这个命令：<br />
:% s/\r//g<br />
<a href="http://www.blogjava.net/lihao336/archive/2011/02/28/324872.html#345307">http://www.blogjava.net/lihao336/archive/2010/06/30/324872.html</a><br />
</cr></lf></cr></lf></lf></cr></cr></lf></lf></lf></cr>
<img src ="http://www.blogjava.net/lihao336/aggbug/348040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2011-04-11 10:32 <a href="http://www.blogjava.net/lihao336/archive/2011/04/11/348040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>