💘 Vim is awesome! Here is my awesome practice and study log.
Switch branches/tags
Nothing to show
Clone or download

README.md

Vim Practice 知识共享协议(CC协议) Attribution-NonCommercial-ShareAlike CC BY-NC-SA

0. 序

0.1 Vim vs. Emacs

一上来就要说一个『宗教性』问题,很危险啊! 😄 这节不会说2个编辑器有什么不好,再者自己并不熟悉Emacs,只说自己了解到的一点感觉。

Vim:编辑器之神;Emacs:神的编辑器。 🎭

上面的这句调侃不重要,重要的是效率❗️

个人没入Emacs圈,牛掰编辑器先入的是Vim。自己作为一个Emacs圈外人,对于两者对比的感觉是:

  • Vim,从 编辑理念 出发并思考很深,通过面向编辑的语言进而脚本化/编程化的能力实现平台化。
    • 契合了 编辑器之『神』 的说法。
    • Vim提供了一套面向编辑的语言:
      • diw:delete in word,删除光标所在单词;dd:删除行(重复命令是对行操作)。
      • x:删除一个字符,5x:重复5次删除字符(即删除5个字符)。
      • 一旦你熟悉习惯这门语言,编辑的过程 就是 思考的过程。
      • 另外,这门语言本身就是可编程的(即编程语言),像上面用数字表示命令的重复执行次数,以及可以用norm命令或是宏把指令脚本化。这里不展开了。
  • Emacs,平台理念 很深,以平台化思路承载和带动编辑理念。
    • 契合了 『神』的编辑器 这个说法。只要你喜欢可以把Emacs打造成Vim,当然Emacs也提供一套自己编辑风格,基于组合快捷键,现在各种软件都提供快捷键来加速操作,尤其是程序员的IDE更是重度依赖熟练的使用快捷键。
    • 关于Emacs的平台特质可以看看文章:
      • 程序员的编辑器 —— Vim,也提到了一点:
        vi追求的是快捷——启动程序迅速,编辑文本高效,功能专注,而Emacs追求的是功能的丰富强大以及集成带来的方便,在Emacs里头可以发邮件,上新闻组,听MP3,浏览网页,玩游戏,几乎可以login -> emacs -> logout了 :-),vi和Emacs都是程序员的编辑器,相比而言,Emacs更是提供了一种程序员的生活氛围。
      • 从Vim到Emacs到Evil
        Emacs只是个强大的平台,提供各种定制来满足每个人的不同需求。所以Thanks Evil,我已把Emacs 打造成了理想的『Vim化的Emacs Editor』,我可以纵情使用更方便的方式来工作。
        这个思路已经被解决方案化了,即是spacemacs,已经是最火的Vim/Emacs配置发行版了,我还一直没有去上手 😑,真是山外有山而学无止境啊~ 😲

0.2 关于编辑本身

Editing is a rewording activity. -- Alan J. Perli
编辑是推敲改写的过程。 —— 艾伦·杰·佩利(计算机程序设计领域的科学家,首届图灵奖的获得者)

人类智慧输出包含了『录入』和『编辑』操作。

目前,『键盘录入』/『键盘编辑』是主流方式。
键盘操作效率的关键是『打字指法』/『盲打』。

对于录入,当然还有语音录入等等(期待脑电波的录入方式成为现实 😄)。
对于中文,还多一样,即『输入法』,如五笔、拼音。

『编辑器』 对于 编辑 的重要性 不言而喻。

综上,智慧输出包含了:

  1. 键盘操作:
    • 打字指法
  2. 录入 => 键盘录入:
    • 输入法
  3. 编辑 => 键盘编辑:
    • 编辑器

上面『打字指法』和『编辑器』的顺序重要的,如果你还不能 盲打,那么不要想着要找一个的编辑器就能高效了! 👯

1. 学习资料

1.1 关于『学习』本身的规律

  1. 学习一样新事物的先进,不在于刚开始看到的点,而在于理解 一整套 方法,整套方法背后蕴含体现的是理念。
  2. 上手新事物必然先经历一个能力下降阶段,因为你要放弃你所熟悉的,重新接纳新的一套方法。
  3. 有下面想法同学必然禁锢于原地踏步:
    • 不愿去理解理念(整套方法),而是用当前自己熟悉的技能点去比新事物的点。
    • 不愿接受上手新事物的学习成本和先要经历能力下降的一个阶段。

1.2 个人的Vim入坑路径

  1. 看一下Vim整体评论性文章,觉得值得入门上手。
    这点基本不是问题,Vim名声在外,问题其实是入门门槛。
  2. 通过vimtutor,上手了解些基本操作。这时候心理上要注意:
    • 这只是了解基本,不要认为这一步可以在日常中方便的使用了。
    • 让自己可以在Vim环境生存下来。首先要避免为了退出Vim要去重启机器吧~
      (😂 可以看看Stack Overflow:帮助一百万开发者退出 Vim)
  3. 系统学习,边看《Vim实用技巧 - 以思维的速度编辑文本》边操作,完成实践和理念储备。
    这一步我保持一个相对慢速但持续的过程,两三周时间。
  4. 配置上spf13-vim发行版,舒适强大专业的Vim环境配置。
    很多人不推荐这么做,去使用别人的一大套配置。
    我这么做比较实用,原因是:避免大量配置打磨的时间投入,先接纳有心人的专业经验。
    中间会去填spf13-vim可能的一些坑。
  5. 了解一些经典插件并逐个实战,如surround。

1.3 文章/讨论

1.4 上手

  • vimtutor

1.5 速查

内容比较精简且有中文版的:

  1. Vim Cheat Sheet中文版 - vim.rtorr.com
  2. Graphical vi/Vim Cheat Sheet and Tutorial中文版(右图,点击看大图)
    该图的来源链接,官网中文版。 # 这张图你肯定在别人桌子上见过 😄

内容比较丰富的:

  1. Beautiful Vim Cheat-Sheet (右图,点击看大图)
    # 个人觉得这个是信息表达最好的一个! 💘💖 该图的来源链接,这个Sheet Cheat的评论和官网。
  2. Cheat Sheet - michael.peopleofhonoronly.com

Cheat Sheet有几个就够用了,别多看了你~ 当然还有更多Vim Cheat Sheet 😂

1.6 系统学习

  1. Vim user manual/reference,即是Vim的内置帮助系统,内容丰富!!
    中文版 http://sourceforge.net/projects/vimcdoc/files/pdf-manual/
    1. 学会用Vim的内置帮助 :h :h 'option' :h command :h :ex_command :h ctrl-w
    2. Vim帮助系统的帮助,即如何使用Vim的帮助系统: :h helphelp
  2. 个人整理的 Vim书籍豆列
    1. 个人先看的是《Vim实用技巧 - 以思维的速度编辑文本》 | Practical Vim, Second Edition
      以编辑理念和实践模式为纲介绍,推荐之。
      词句共灵感一射,编辑与思考齐飞!
    2. 学习vi和Vim编辑器(中文版) | 《Learning the vi and Vim Editors》,行文稳健(很合我的风格):
      1. 先介绍基本功能再说明如何组合技术,从熟悉到领会。
      2. 再介绍基本编辑器(vi/ex)再说明Vim,从历史发展的过程更能深入理解功能适用场景。
      3. 还介绍vi/Vim的周边信息,如vi/Vim的名家名言,各个变种,vi/Emacs的文化等等
  3. vim-galore - Everything you need to know about Vim | 中文译文
    Vim方方面面资料汇总。

2. Vim配置/插件的资源

2.1 经典的配置发行版/插件站点

2.2 经典插件介绍

3. 分享视频及其笔记

3.1 Learning Vim in a Week

Youtube视频地址,讲解了入门Vim时

  • 观念上的改变/注意事项
    • 总有更好的做法
    • 学习Vim是个持续的过程,可以不断提高能力,进而逐步提升效率。
  • 不要在平时的工作使用中开始学习Vim!因为 工作紧急需要的效率 与 Vim刚开始学习时摸索的低效 有矛盾!
  • Vim命令记忆法

还给出实用的Tips:

  1. Hack(定制)你的键盘
    • 通过Seil修改Caplock键成ECS键
    • 通过karabiner修改键盘重复前延迟和加速重复频率,以快速地在Vim中导航
  2. Graphical vi/Vim Cheat Sheet and Tutorial
    中文版 http://blog.ngedit.com/vi-vim-cheat-sheet-sch.gif
  3. .vimrc - 你的新朋友!
    • 一定要 版本控制 起来!
    • 可以偷借你朋友的配置文件(dotfiles),或是借鉴 https://github.com/thoughtbot/dotfiles
  4. 通过官方的vimtutor定期适量的学习 / 通过游戏http://vim-adventures.com/来学习~
  5. 通过看高手的操作视频方法来学习

3.2 7 Habits For Effective Text Editing 2.0

Youtube视频地址,2007-02-13,Vim作者 Brian Moolenaar 在Google做的演讲,讲解了编辑器的选择、达到高效编辑的方法和理念。

编辑器的选择

  1. 如果你已经熟悉精通了一个编辑器,挺好的。这里不会讨论『Vim比Emacs更好』这个问题,但你可能会觉得Emacs并不爽~ 😂
  2. 但不要使用像Notepad这样简陋的编辑器,你浪费了大量的生命! 😲
  3. 要么用一个觉得的爽的编辑器,要么转用Vim吧~ 😜 除此再没有其它的出路!(There is NO other RULE!)

达到高效的3个基本步骤

这部分的总结页:

  1. 发觉低效
    • 发现你浪费时间的地方
  2. 找到更快的方法
    • 阅读在线帮助
    • 阅读速查手册、书籍等等
    • 问问朋友或是同事
    • 搜索网络
    • 自己搞定
  3. 使之成为习惯
    • 动手做起来
    • 持续改进

附原文:

  1. Step 1: Detect inefficiency
    • Find out what you waste time on
  2. Step 2: Find a quicker way
    • read the on-line help
    • read the quick reference, books, etc.
    • ask friends and colleagues
    • search the internet
    • do It yourself
  3. Step 3: Make it a habit
    • do it
    • keep on improving

如何做到低效地编辑

@oldratlee 这是我最喜欢的一节 😂

  • 必须立即开始编辑文本。没空去读文档或是学新的命令。
    结果一直只会用原始的命令。
  • 想学习编辑器提供的每一个功能,总是想用最快捷的命令。
    结果是浪费大量的时间去学习从不会用到的内容。

附原文:

How not to edit effectively

  • You have to get the text ready right now. No time to read documentation or leam a new command.
    You will keep on using primitive commands.
  • You want to learn every feature the editor offers and use the most efficient command all the time.
    You will waste a lot of time learning things you will never use.

4. 个人关心的问题

欢迎高手指点!请提交Issue。

4.1 中文输入法在Vim便利切换的问题

问题说明:

本来Vim是有模式的(Normal/Command/Insert/Replace/Visual/...),再加上中文需要输入法切换(你处在中文输入还是英文输入状态),中文编辑需要在脑子记住当前是哪个状态的,个人觉得这很蛋疼。

理想的状态期望:

  • 当切换到如Normal/Command模式时,自动切换到英文输入法。
  • 切回到Insert模式时,还原文字输入时所用的输入法状态(中文输入/英文输入)。

解决方法:

解法参见@CodeFalling的完美解决 Mac 下 Vim/Emacs 的输入法切换问题:

  1. 安装配合工具fcitx-remote-for-osx
  2. 安装Vim插件fcitx-vim-osx

PS: Thanks for your PERFECT works! @CodeFalling

4.2 Vim打开文件乱码问题

问题说明:

Vim打开文件是乱码,常见的原因是编码识别错误。

解决方法:

可以在.vimrc配置文件中设置好Vim的用于尝试识别的编码序列,依次使用序列中的编码直到这个编码可以正确显示文件中的字符:

" 需要配置到 .vimrc 中
set fileencodings=ucs-bom,utf-8,gb18030,utf-16le,big5,euc-jp,euc-kr,latin1

如果仍然识别成乱码(比如文件包含多种编码的字符,一定会有乱码),可以在命令模式显式指定编码重新打开文件,命令如下:

" 用UTF8编码重新打开加载当前文件
:e ++enc=utf-8
" 用GBK编码重新加载
:e ++enc=gbk
" GB18030字符集是GBK的超集,为了方便键入使用GBK名

" 可以进一步在 .vimrc 中配置Mapping,省得繁琐的键入
nnoremap <Leader>eu :e ++enc=utf-8<CR>
nnoremap <Leader>eg :e ++enc=gb18030<CR>

更多原因解析和处理方法参见@滇狐的文章VIM文件编码识别与乱码处理,讲得深入浅出、鞭辟入里!

PS:
像Vim一样,字符编码也是一个很具计算机风味的话题,这里不解释,如果不清楚可以自己搜索研究一下。

4.3 转换文件编码

问题说明:

如题。

解决方法:

" 设置写文件时使用UTF8编码
:set fileencoding=utf-8
" 写文件(完成文件编码转换)
:w

" 为了方便键入,使用短选项名fenc并写成一行
:se fenc=utf8 | w

" 文件转换成GBK编码
:se fenc=gbk | w
" GB18030字符集是GBK的超集,为了方便键入使用GBK名

" 可以进一步在 .vimrc 中配置Mapping,省得繁琐的键入
nnoremap <Leader>eU :set fileencoding=utf-8 \| w<CR>
nnoremap <Leader>eG :set fileencoding=gb18030 \| w<CR>

参考资料: How can I change a file's encoding with vim? - vi.stackexchange.com

4.4 Vim字体设置

问题说明:

合适字体可以方便识别,提高效率和心情,不能说不重要! 💋

  • 对在控制台中运行的Vim命令,字体由终端配置。
  • GUI Vim由Vim自己来配置。

Mac下,终端常用的是iTerm/terminal应用,GUI Vim用的是MacVim应用。

解决方法:

详见单独一页的说明:设置Vim字体。

4.5 查看所有的Vim Map

问题说明:

下面的场景下,会想查看所有的Vim Map:

  1. Vim可以定制自己命令,为了不重写已有的快捷键(Map)
  2. 也看看想要功能是不是已经有Map了

解决方法:

redir > map.txt | silent map | redir END
" 如果文件已经存在加上!来覆盖输出的文件
redir! > map.txt | silent map | redir END

4.6 crontab -e修改失败

问题说明:

crontab修改后,报crontab: temp file must be edited in place出错信息,crontab没有修改。

$ crontab -e
# ... I do my thing in vim & :wq
"crontab.9ZcXiFaawt" 6L, 203C written
crontab: temp file must be edited in place

解决方法:

在.vimrc配置文件中设置,对于crontab文件不使用备份文件:

" 需要配置到 .vimrc 中
autocmd BufNewFile,BufRead crontab.* set nobackup | set nowritebackup

更多说明参见:

4.7 Vim中文分词支持的问题

问题说明:

不像英文,中文的词的分离没有像空格这样明显分隔,词相关的移动变得很麻烦。

解决方法:

目前还 没有 找到解法。总得来说,这个问题不大,可以替代的做法:

  • Hack/加速系统的按键重复后,可以简单地用hjkl在小/大范围内快速导航。
  • 用词以外的方式也可以比较快地完成导航,如
    • 在大范围的按段跳、按页跳(CTRL-D/CTRL-F)。
    • 按搜索跳
      • fz/Fz/tz/Tz
      • n/N

Vim分词的相关资源