Vim 开发 Rails 的那些坑

最近两个多月一直在用号称编辑器之神的 Vim 做着 Ruby on Rails 的开发。今天就来总结一下,讲讲我对文本编辑器、脚本语言的一些想法和遇到的坑。

  1. 麻烦的代码跳转,查看代码不方便。使用 IDE 的一大优势就是查看代码非常方便,Vim 这样的文本编辑器当然也可以使用 ctags 这样的插件支持代码跳转。但是只要你新加了一个方法,就要重新生成一次 tag 文件,你说麻烦不麻烦?

  2. 缺乏函数的outline(Vim 也许有这样的插件,只是我没有用到)。有的时候写了一个方法,过的时间久了你就忘了这个方法的存在。假设你开始写一个旧的项目,那么你每当要写一个新的函数的时候,你就要思索一下了,到底有没有写过类似的方法?总不见得每次都把相关源码重新看一遍吧!

  3. 鸡肋的代码补全。Vim 的代码补全基本靠猜,猜的策略大概就是根据你当前打开的页面中的关键词、过往的输入词频之类的,还是不能根据程序的上下文进行代码提示。我见过的比较智能的 IDE 比如 RubyMine,甚至能够对你的代码风格进行指导,在写的过程中就能提高你的代码质量。

  4. 快捷键的配置五花八门。Vim 的强大很多时候是依靠强大的插件功能和自定义配置文件。每个人都有自己的偏好和习惯,时间长了就固化了。不同人之间配置不同、操作习惯不同,那么无形中就给团队协作制造了一堵屏障。

  5. 静态语言的一大优势是在代码编写阶段就可以做类型检查,因此借助 IDE 就可以做到查看当前对象的可用方法以及使用说明。而写脚本语言则必须时常上网查看一下语言手册,冷不丁还可能遇到拼写错误。这些重复的行为和低级的错误一定程度上抵消了脚本语言带来的生产力优势。

说一些关于 IDE 和文本编辑器的话题。总有感觉很 Geek 的家伙会冒出来说使用 IDE 会让人变傻之类云云。但是我的观点恰恰相反,程序员的本职功能还是尽可能地解放出生产力,解决当前的业务问题。专注于业务本身而不是纠结这么些个细枝末节才是正确的态度。

一些观点认为:Vim 这样的文本编辑器的优势在于远程调试(例如 SSH 连接远程设备)的时候无法使用图形界面,而终端使用文本编辑器则不受影响。

但是我们有 Git

借助 Git 我们可以把远程的代码克隆到本地进行修改,修改完直接推送然后远程更新即可。使用 SSH 进行远程连接需要保证网络连接持续稳定,而使用 Git 只要求克隆和推送时两次连接的网络稳定即可!

历史证明编程工具总是向着以性能换取开发效率的方向演进。未来的程序员应该是 problems solver,而不是 coder。

Vimtutor练习心得

A. 光标定位(482)

ctr + g 显示光标当前所在的行数
shift + g(G) 光标移动到文档末尾
gg 移动到文档首行
数字 + G 移动到指定行

B. 搜索命令(505)

? + 字符串 从当前位置向前查找
/ + 字符串 从当前位置向后查找
n 同向查找上一次的搜索内容
N 反向查找上一次的搜索内容

C. 光标跳转

ctl + o 后退,回到光标跳转之前的位置
ctl + i 前进,跳转到光标的下一个跳转位置

D. 字符串的替换(551)

:[(%|#,#)]s/oldstring/newstring[/(g|c|gc)]
参数说明:

  1. [(%|#,#)]指定替换操作有效行的范围。%表示全文所有行,#,#表示从某一行到另一行之间。不指定该参数表示有效行仅为当前行。
  2. [/(g|gc)]指定替换模式。g表示替换每个有效行内所有符合的字符串,c表示替换有效行内第一个符合的字符串并在替换时提示确认,gc是两者的复合表示替换有效行内所有符合的字符串并在替换时提示确认。不指定该参数表示仅替换每个有效行内遇到的第一个符合的字符串。

E. 文件操作(597)

: + ! + windows命令提示符 调用windows命令
: + r + 空格 + 文件名 将文件入读当前文档
: + w + 空格 + 文件名 将保存当前文件。可以先按“v”选择文本然后保存选定的文件。
: + 行数1 + , + 行数2 + 空格 + w + 空格 + 文件名 将当前文档的特定行保存至文件
: + r + 空格 + ! + windows命令提示符 执行windows命令并将输出信息输入到当前文档

F. 复制粘贴文本(782)

y + 数字 + w 复制若干个单词
y + 数字 + l 复制若干个字母
y + $ 复制到句为
p 粘贴

注(复制多行的方法):
描述:将第 i 行到第 j 行复制到第 k 行之后

(1)
: + i + , + j + 空格 + (co|copy) + k
同理将第 i 行到第 j 行移动到第 k 行之后
: + i + , + j + 空格 + (m|move) + k

(2)
光标移动到结束行,ma
光标移动到起始行,输入y’a
光标移动到需要复制的行,输入p,行前复制则输入大写P

(3)
光标移动到起始行,输入ma
光标移动到结束行,输入mb
光标移动到粘贴行,输入mc
然后输入:’a,’b, co ‘c 把co换成m就是剪切
若要删除多行,则输入:’a,’b de

G. 设置类命令的选项(806)

/字符串\c 仅在本次搜索匹配中忽略大小写
:set ic/ignorecase 搜索时忽略大小写
:set noic/noignorecase 禁用忽略大小写
:set hls/nohlsearch 高亮匹配项highlightsearch
:set nohls/nohlsearch 禁用高亮
:set is/incsearch 使 Vim 在你输入字符串的过程中就显示匹配点
:set nois/noincsearch 关闭输入时匹配