- 论坛徽章:
- 2
|
回复 #21 windaoo 的帖子
-------- -------- -------- -------- -------- -------- -------- --------
我先说说我常用的功能吧:
1. 自动完成 ( alt + -> )
di'I' (用'I'代表插入符位置,下同)
会提示
div
div_t
...
2. 列出成员 ( ctrl + j )
div_t r;
r.'I'
会提示quot与rem, 还会提示它们的类型。
当然, 你要这么理解:
原帖由 windaoo 于 2009-7-30 18:31 发表 ![]()
其实看你怎么想,有这个功能和没这个功能都有好处,有的好处是可以快速上手,没有的好处是强迫你把结构体记在心里。
我认为记在心里对我有好处
参见“理想的功能”
首先, 这2个功能让我代码写得快。
嗯,我知道,vim可以结合ctags、cscope。可能有自动完成功能。
而列出成员功能,在http://bbs3.chinaunix.net/thread-1521350-1-1.html 这贴中,暂时没人能解决。
反而暴露了诸多vim使用者的心理, 参见"理想的功能"。
再者,不能拿template这种关键字, 还有printf这种标准库函数来比。
支持前者自动完成、高亮的功能太简单, 而后者可以ctags之后一直使用。
而在VA的帮助下, 我在代码前部分声明了一个函数(无论是include 得来还是手写):
some_type some_function(parameter* p);
就立即能在后部分得到自动完成功能。
par(ameter) argument;
arg(ument).mem(ber) = some(_value);
some_(type) r = some_(function)(&arg(ument));
括号中是保守估计自动完成节省的字数。
我不知道visual assisant是按什么频率去更新符号的。 ctags能自动更新吗? 怎么做?
3. 参数提示 ( ctrl + shift + space )
div('I'
会提示
div_t div(int a,int b);
ldiv_t div(long a,long b); // 包括所有重载
提示中,第1个参数会加粗,随着输入参数分隔符",",加粗的效果会依次滑向另一个参数,让我时刻知道现在应该键入哪一个实际参数。
提示的地方就在插入符附近,眼光不用离开我正在编辑的地方。
而不是构造一个什么表达式,再去搜索源代码,然后将目光移动到一个存放结果(可能还不止一个)的地方。
其三, 我知道这3个快捷键设计得都不好,尤其是参数提示很容易将输入法按出来……
但实际上, 这3个快捷键是我刚刚去查的(菜单上会写),而我平时都没使用过…… 因为它们都是自动的。
输入2-4个字符之后, 自动完成就会自动出现。
输入.或者->或者::之后,列出成员就会自动出现。
输入函数调用的左括号"("之后, 参数提示就会自动出现。
我根本不需要记任何一个快捷键或者构造什么表达式。
当我错过这些功能自动的时候, 或者想它再次出现的时候, 也不需要任何命令或者快捷键或者构造任何表达式。
对自动完成,继续输入1个字符即可。
对列出成员,参数提示, backspace然后重新输入.、->、::即可。
-------- -------- -------- 理想的功能 -------- -------- -------- --------
每个人都有自己需要的功能。
也许该功能对你而言是没有作用的, 甚至是有害的, 但这不足以称为“vim不提供该功能,所以它优秀”的论据。
看看这些评论:
原帖由 progliker 于 2009-7-30 23:16 发表 ![]()
看样子LZ是IDE用惯了。
原帖由 hotoldbaby 于 2009-7-31 12:02 发表 ![]()
linux是分散开发模式,不收钱,免费模式。
你是被微软惯的懒了,被微软洗脑了。
Linux玩法是不一样的。
所以你也许可以在vim上自己增加这个功能,还真是不错的想法。
是否"vim提供的功能"就一定是提高效率的(未必,见“鼠标与键盘”)?
是否"vim不提供的功能"就一定是“无用的”、“被洗脑”?
是否凭自己是vim用户或linux用户就可以持有一种优越感
我也不想和他们争论了,就让他们继续自己骗自己吧
-------- -------- -------- 鼠标与键盘 -------- -------- -------- --------
windaoo是务实的人, 所以我现在来回答:
原帖由 windaoo 于 2009-7-30 18:25 发表 ![]()
f, w, b, e, 等这些命令,以及它们的大写
一些组合功能,比如 df, cw, d%, 3p, 3==, 等 等
还有与 ctags + cscope 配合的跳转功能
如果ls知道怎么在vim中实现我上面提到的那3个功能, 还望赐教啊~~~
w : ctrl + ->
b : ctrl + <-
e : 我不知道, 不过有个迂回的办法……
e : ctrl + -> , <-
ge: ctrl + <-
f,df, cw, d%, 3p, 3== : 我不知道它们是做什么的……………………
ctags + cscope
goto declaration (menu + a)
goto definition (menu + g)
回答完毕。
首先, 我得承认, 在“修改代码”的时候, 如果能熟练使用这些命令, 也许真的会提高编辑效率。
(“首次录入代码”的时候,自动完成和参数提示才是最重要的功能。这时候根本不需要这些插入符定位命令)
但提高也是有代价的, 要熟练使用这些命令并不是简单的工作。
要熟练到什么程度? 我举个例子:
原帖由 redspider 于 2009-7-31 09:27 发表 ![]()
简单举个例子,俺要移动第5行至第13行到第1257行下面,没有编辑器能比 Vim 做得更高效。
首先,要对完成这个案例的命令很熟。
其次!!!常被人忽略的是, “第5行至第13行到第1257行下面”,5、13、1257是怎么得来的???
为什么要移动5到13行? 而不是6到12行? 因为你看中的是那些行上的代码, 而不是行号。 1257也是。
行号还比较简单, word怎么办?
要熟练到“看到一段代码,就知道这代码有几个word”比“鼠标直接选取该段文本”更快, 这绝对不是一个很容易完成的事情。
原帖由 windaoo 于 2009-7-30 19:14 发表 ![]()
一是因为我觉得对我来说投入真的没有多高
那是你已经习惯了(同时还可以见下面”初学者“那段讨论)。
小结,要想将vim的编辑功能发挥出来(至少发挥到比使用鼠标快的地步), 绝对不是轻松的事情。
让代码简洁,清晰,并且足够快?
还是让代码繁琐,但达到最快?
是使用鼠标, 并且足够快?
还是记住繁杂的命令,并达到最快?
别忘了, 相对于鼠标, 那些命令也是要占用的脑cpu更多。
前者直观的选择文本。
后者,对于以word为单位的那些定位, 难道你们真的可以不数,数也不会数错?
我们不是打字员, 而是程序员。
我们输入的不是文字, 而是代码。 在输入代码的同时,还要考虑其他很多事情(比如下面即将谈到的事情)。
-------- -------- -------- vim是否值得学 -------- -------- -------- --------
我也说了, vim是值得学的(我自己都打算去学), 如果你要写很多种不同的代码的话。
还有个很值得考虑的原因:
原帖由 redspider 于 2009-7-31 09:27 发表 ![]()
第三点就是: Vim 可以运行在很多平台下,在不同的环境下保持相同的操作习惯,也应该算效率的一个方面
否则, 如果只写一种代码, 就得考虑一下了。
即使熟练使用vim, 将它的编辑功能发挥到极致, 但别忘了它也仅仅是个编辑器。
它有它的长处, 也有它的短板。
我知道这种贴最后很难有好下场, 但我还是回了。
一是想揭露vim的短处:比如该贴最开始提到的几个功能,还有即将说到的调试功能。 希望能给初学者们一些好的建议, 而不是一味的听到”vim神话“。
(当然,是我认为好的建议。它是不是真的好? 难说…… 所以需要讨论……)
这里回答问题的人肯定都不算初学者, 能设身处地的为它们考虑么?
愿意看到他们折腾一周的vim, 再折腾一周gcc和make, 才能开始学习C/C++语言?
VS的编辑器的学习成本可以说几乎为0。 它唯一的学习成本可能就是工程管理, 和学习make应该算是同一数量级的。
第二个原因嘛, 是希望各位多多暴露出vim的优势, 比如windaoo和jamesr已经暴露出一些vim中可以完成, 而其他编辑器中无法完成的功能了。
-------- -------- -------- 下面说调试问题 -------- -------- -------- --------
原帖由 windaoo 于 2009-7-30 19:14 发表 ![]()
为什么你会觉得很牵强,开两个窗口切换很累吗?又不用老是切来切去的
你觉得是在一个窗口上好, 还是两个窗口来回切好? 是前者方便, 还是后者方便?
这明显是一种不怎么方便的方式, 为什么你一定要说它“没什么不方便”。
所以我说牵强。
关于调试,gdb我不会(否则我真的可以不用vs了……), kgdb也不知道能达到什么效果。
我只能大致描述一下, vs的调试器能显示什么。
-------- -------- -------- 各窗口介绍 -------- -------- --------
-------- -------- 1. 编辑窗口 -------- --------
编辑窗口上可以显示变量、参数的值, 鼠标移上去就ok。
可以切换到反汇编窗口(menu + d, 切换回源代码 menu + g) 。
截一段代码吧:
31: printf("hello world\n" ) ;
00411BE2 68 50 EA 41 00 push offset string "hello world\n" (41EA50h)
00411BE7 FF 15 30 45 42 00 call dword ptr [__imp__printf (424530h)]
00411BED 83 C4 04 add esp,4
这上面包含有如下信息(每一类信息都可以单独开或关):
1. 源代码(以及行号) 比如 31: printf("hello world\n" ) ;
源代码对应的汇编代码在该行源代码之后, 下一行源代码之前。
每行是一条指令, 以下分析第1条指令
00411BE2 68 50 EA 41 00 push offset string "hello world\n" (41EA50h)
在vs的编辑窗口中, 该指令依次显示了如下信息。
2. 地址
该条指令的地址是00411BE2
3. 机器码
该条指令的机器码是68 50 EA 41 00
第1字节是0x68, 在x86上是push指令。后4个字节是push的操作数。
4. 汇编代码
上面5字节机器码是一条指令 push 双字立即数
5. 符号名
x86上使用小端,双字立即数50 EA 41 00其实是0041EA50h。
那0041EA50h地址上到底是什么呢? 是一个string literal ("hello world\n " )的地址。
如果关闭符号名显示, 该行就只会显示
... push 0041EA50h
下一行也只会显示
... call dword ptr ds:[00424530h]
是 push "hello world\n" ; call printf ;清晰呢
还是 push 0041EA50 ; call 00424530 ;清晰?
顺便说, 在编辑窗口上, 依然鼠标指向变量、寄存器的时候, 值会显示出来。
也别说只有“汇编代码”的信息才是有用的,“机器码、地址、符号名”没用。
在我研究动态构造机器码时,这3种信息帮了我不少忙。
我知道,gdb也绝对是可以获取这些信息的。
但在vs中, 所有的信息都不需要敲任何一条命令,vim能配置到这么方便吗?
不要说敲变量名就比鼠标移动更快。 有键盘敲得快的人, 也有鼠标移得准的人。
鼠标移动是常数时间(反应时间,跟屏幕大小无关), 敲键盘还得看变量名有多长……
说点题外话, vim提供的很多命令, 都是作为鼠标的替代品而已。
像上面那种按单词, 按n个单词, 按行什么的命令, 如果使用鼠标, 根本就不需要记那么多东西, 当然熟练之后的速度可能会比不上键盘。
但就这个案例“调试时显示一个变量(寄存器)的值”, 我不觉得有比“鼠标移动上去就显示”更快捷的方案。
-------- -------- 2. 线程 -------- --------
多少个线程就有多少个条目。
每个条目有:每个线程id, 入口函数,当前活动函数, 优先级。
鼠标双击将切换到对应线程的堆栈。
btw:
其实都有很傻的键盘接口:tab,上下左右,回车。 只是使用鼠标习惯了。
调试时还需要疯狂的输入代码吗?
调试时,我脑袋里应该想“到底出了什么bug”,还是“我要通过什么命令才能看到那个值”???
-------- -------- 3. 调用堆栈 -------- --------
从上往下, 调用链由深到浅。
每一层是一个函数, 包含的信息有:函数所在模块(调试dll时会用到), 函数实际参数(也就是说能显示参数的值)。
双击可以切换到某一层函数,将更新控制线、局部变量等东西。
-------- -------- 4. 寄存器、局部变量、自动窗口、watch -------- --------
寄存器、局部变量、自动窗口、watch:
只有watch是可以随意添加和删除条目的, 其他窗口的条目都是固定的。
寄存器窗口:
固定显示一些寄存器的值。
(我也不清楚x86上到底有多少寄存器,显示的有这些:EAX EBX ECX EDX ESI EDI EIP ESP EBP EFL)
局部变量窗口:
当前函数上,控制线处还处于局部作用域的变量。
自动窗口:
显示被该条指令影响的所有寄存器、变量(包括临时变量,比如返回值)
顺便一提, 他们都是自动更新的, 执行一条指令后,如果某变量(寄存器)有改动, 显示的值就会有跟新,并会显示为红色。
-------- -------- -------- 窗口布局 -------- -------- --------
如果这么多窗口还是要切来切去就没意思了。
所有的这些窗口都是一个整体, ide窗口是它们的容器。要怎么排列就看自己了。
[ 本帖最后由 OwnWaterloo 于 2009-7-31 14:39 编辑 ] |
|