Skip to content

💘 Vim is awesome! Here is my practice and study log.

License

Unknown, Unknown licenses found

Licenses found

Unknown
LICENSE
Unknown
LICENSE.png
Notifications You must be signed in to change notification settings

oldratlee/vim-practice

Repository files navigation

💘 Vim Practice

知识共享协议(CC协议) Licence: CC BY-NC-SA 4.0
GitHub stars GitHub forks GitHub watchers GitHub Contributors

0. 序

0.1 Vim vs. Emacs

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

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

上面的这句调侃不重要,重要的是效率:heavy_exclamation_mark:

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

  • Vim,从 编辑理念 出发并思考很深,通过面向编辑的语言进而脚本化/编程化的能力实现平台化。
    • 契合了 编辑器之『神』 的说法。
    • Vim提供了一套面向编辑的语言:
      • diwdelete in word,删除光标所在单词;dd:删除行(重复命令是对行操作)。
      • x:删除一个字符,5x:重复5次删除字符(即删除5个字符)。
      • 一旦你熟悉习惯这门语言,编辑的过程 就是 思考的过程。
      • 另外,这门语言本身就是可编程的(即编程语言),像上面用数字表示命令的重复执行次数,以及可以用norm命令或是宏把指令脚本化。这里不展开了。
  • Emacs平台理念 很深,以平台化思路承载和带动编辑理念。
    • 契合了 『神』的编辑器 这个说法。只要你喜欢可以把Emacs打造成Vim,当然Emacs也提供一套自己编辑风格,基于组合快捷键,现在各种软件都提供快捷键来加速操作,尤其是程序员的IDE更是重度依赖熟练的使用快捷键。
    • 关于Emacs的平台特质可以看看文章:
      • 程序员的编辑器 —— Vim,也提到了一点:
        vi追求的是快捷——启动程序迅速,编辑文本高效,功能专注,而Emacs追求的是功能的丰富强大以及集成带来的方便,在Emacs里头可以发邮件,上新闻组,听MP3,浏览网页,玩游戏,几乎可以login -> emacs -> logout了 :-),viEmacs都是程序员的编辑器,相比而言,Emacs更是提供了一种程序员的生活氛围。
      • VimEmacsEvil
        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要去重启机器吧~
      (:joy: 可以看看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. 学习viVim编辑器(中文版) | 《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 - 你的新朋友!
  4. 通过官方的vimtutor定期适量的学习 / 通过游戏http://vim-adventures.com/来学习~
  5. 通过看高手的操作视频方法来学习

3.2 7 Habits For Effective Text Editing 2.0

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

编辑器的选择

  1. 如果你已经熟悉精通了一个编辑器,挺好的。这里不会讨论『VimEmacs更好』这个问题,但你可能会觉得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完美解决 MacVim/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 VimVim自己来配置。

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分词的相关资源