一、Vim 介绍
Vim是一个编辑器。
Vim or Emacs就好比倚天和屠龙,得一可得天下。
Vim就像学钢琴一样,一旦学会,终身受益无穷。
主要使用他来编辑Python、Shell等脚本文件,也可以编辑Java,C/C++。同样可以用他来写markdown、html、css等等。
Vim的优点:
- 跨平台(Linux, Mac OS X, Windows)
- 配置、安装插件简单(以文件的形式管理)
- 小巧、安装方便、开源、免费
- 通用性强,支持N(N>40)种编程语言
可能有以下几种声音:
- Vim过时了,用Vim就是找虐,别装比了,专心学好数据结构与算法吧。
- 我是Java党,我只用Eclipse,也能安装各种插件。我是.Net党,我喜欢强大的VS,也有牛比的插件(如VC助手)
- 我是果粉,我喜欢Xcode的优雅,也是免费的,有苹果罩着,LLVM代码补全用着超爽。
- 我也知道用Vim或者Emacs很强大,但是学习曲线真的很陡,我还是老老实实用我的IDE吧。
- 我在用TextMate、Notepad++、Sublime text 2,我用着很爽,这些也是神器,我不需要Vim。
其他优秀的编辑器:
- Emacs
- Sublime Text
在开始之前推荐把Caps Lock 和Ctrl键对换,因为在Linux,Vim,Emacs下面很多快捷键都要用到Ctrl,用了Caps Lock键之后可以用小指很方便的进行操作。
把Home目录下的配置文件都软链接到Dropbox上
二、Vim基本操作
1)三种模式
1. Normal Mode
- 启动Vim后,vim在normal模式下。
- normal模式下可以用hjkl来移动光标,进行一些基本的vim操作。
- 按i,a等键可以进入insert模式。
- 如果想返回 normal模式,请按 ESC 键。
2. Insert Mode
- 在insert mode下,可以输入文本,就像使用“记事本”一样。
3. Visual Mode
- 可以进行一些行、块、选中操作。
> - v 进入visual mode
> - V 进入行选择
> - <C-v> 进入块选择
> 在visual 模式下按o移动端点
2)移动光标
1. 基本移动
- h → 左
- j → 下
- k → 上
- l → 右
- <C-f> → 向下翻一页
- <C-b> → 向上翻一页
- <C-d> → 向下翻半页
- <C-u> → 向上翻半页
- gg → 移动到第一行
- G → 移动到最后一行
可以通过配置来使上下左右键无效
2. 进阶
2.1 行移动
- 0 → 数字零,到行头
- ^ → 到本行第一个不是blank字符的位置(所谓blank字符就是空格,tab,换行,回车等)
- $ → 到本行行尾
- g_ → 到本行最后一个不是blank字符的位置。
2.2 搜索移动
- /pattern → 搜索 pattern 的字符串(如果搜索出多个匹配,可按n键到下一个,按N到上一个)
/\
来搜索单词 - f\
→ 移动到\ 字符处 - t\
→ 移动到\ 字符之前
2.3 单词移动
- w → 移至次一个字(word)字首。当然是指英文单字。
- W → 同上,但会忽略一些标点符号。
- e → 移至前一个字字尾。
- E → 同上,但会忽略一些标点符号。
- b → 移至前一个字字首。
- B → 同上,但会忽略一些标点符号。
用最快的速度定位到想要的位置
2.4 行、段移动
- \
G → 移动到\ 行 - ) → 移至下一个句子(sentence)首。
- ( → 移至上一个句子(sentence)首。
- } → 移至下一个段落(paragraph)首。
- { → 移至上一个段落(paragraph)首。
- % → 这是匹配 {},[],()
sentence 是以 . ! ? 为区格。
paragraph 是以空白行为区格。
3)插入模式
- a → 在光标后插入
- A → 在当前行最后插入
- i → 在光标前插入
- I → 在当前航最前插入
- o → 在当前行后插入一个新行
- O → 在当前行前插入一个新行
控制撤销的粒度
4)删除
- x → 删除一个字符
- X → 向前删除一个字符
- s → 删除一个字符并进去insert模式
- S → 删除一行并进入insert模式
- d\
→ 从当前光标位置开始删除 - dd → 删除一行
- c\
→ 从当前光标位置开始删除并进入insert模式
Vim很多操作都可以在前面加数字
5)复制、粘贴
- y\
→ 从当前光标位置开始复制 - yy → 复制一行
- p → 在光标之后粘贴
- P → 在光标之前粘贴
:reg 进入剪切板,可以看 到当前所有的剪切板里面的内容
- 系统剪切板
a 宏剪切板
6)撤销
- u → 撤消
→ 反撤消
7)替换
- r → 替换一个字符
- R → 从当前光标开始替换
8) Mark
- `` → 当前文件中上次跳转动作之前的位置
- `. → 上次修改的地方
- `^ → 上次插入的地方
- `[ → 上次修改或复制的起始位置
- `] → 上次修改或复制的结束位置
- `< → 上次高亮选区的起始位置
- `> → 上次高亮选区的结束位置
大写字母可以用来进行全局标记,可以在文件之间跳转
9)打开/保存/退出/改变文件
- :e <path/to/file> → 打开一个文件
- :w → 存盘
- :saveas <path/to/file> → 另存为 <path/to/file>
- :x, ZZ 或 :wq → 保存并退出 (:x 表示仅在需要时保存,ZZ不需要输入冒号并回车)
- :q! → 退出不保存
- :qa! → 强行退出所有的正在编辑的文件,就算别的文件有更改。
三、Vim配置
用户目录下的.vimrc文件就是Vim针对当前用户的主配置文件,该文件不是必备的,没有的话就创建它。文件位于当前用户的主目录下,可以用~/.vimrc找到,Vim启动时会自动运行文件中的每条命令。
通过.vimrc我们可以为Vim进行个性化配置,包括使用方式、显示风格、编写函数和运行插件等。
从Insert模式进入到Normal模式
inoremap jk什么是noremap?
快速移动
- nnoremap <C-j> 5j
- nnoremap <C-k> 5k
- nnoremap <C-l> 5l
- nnoremap <C-h> 5h
- vnoremap <C-j> 5j
- vnoremap <C-k> 5k
- vnoremap <C-l> 5l
- vnoremap <C-h> 5h
强迫自己
- inoremap <esc> <Nop>
- noremap <Up> <Nop>
- noremap <Down> <Nop>
- noremap <Left> <Nop>
- noremap <Right> <Nop>
设置Leader
- let mapleader = “,”
选择一个单词
- nnoremap <space> viw
四、安装插件
1)Vim目录结构
.
├── autoload # Vim启动时载入的脚本
├── colors # 存放主题
├── compiler # 存放编译器需要的文件
├── doc # 帮助文档
├── ftplugin # 对不同的文件类型执行不同的脚本
├── indent # 缩进的样式
├── keymap # 映射键
├── lang # 语言文件
├── plugin # 插件文件夹
└── tutor # 教程
2)安装Pathogen来管理插件
从Github下载Pathogen
git clone https://github.com/tpope/vim-pathogen安装
安装到~/.vim/autoload/pathogen.vim
或mkdir -p ~/.vim/autoload ~/.vim/bundle && \ curl -LSso ~/.vim/autoload/pathogen.vim \ https://tpo.pe/pathogen.vim
- 配置
把下面的代码加入到~/.vimrc
execute pathogen#infect()
3) 安装插件
把下载的插件复制到~/.vim/bundle/
或
git clone https://github.com/Lokaltog/vim-powerline \
~/.vim/bundle/vim-powerline
4) 推荐插件
- Pathogen 插件管理
- NerdTree 文件管理
- UltiSnips 定义代码块输入
- Syntastic 检查语法
- DelimitMate 成对生成(),{},[]
- SuperTab tab键增强
- Vim-indent-guides 缩进帮助
- Molokai Molokai主题
- Taglist 根据生成的Tag文件,高亮类、变量、函数和关键字。
- Vim-multiple-cursors 重构变量
- Nerdcommenter 快速注释
- emmet-vim 快速编写HTML
四、使用Vim
使用f,t,;来快速移动
print("argument1","argument2","argument3")
在参数的逗号后面加空格
0f,s, jk ;. ;.
删除、移动(dw,cw,de,ce,…)
控制撤销的粒度
<C-a> <C-x> 来加减数字
安装插件可以加减时间、日期
批量注释、取消注释
def main():range = [1,2,3,4] for rangeElement in range: print rangeElement print range.length
使用
加A 选择括号或者双引号
print(“hello“)
vi”
va”用ga来打印字符信息
Visual 的使用
- 批量修改
li.one a{ background-image: url('/images/sprite.png');} li.two a{ background-image: url('/images/sprite.png');} li.three a{ background-image: url('/images/sprite.png');}
- 在行首或者行末插入
在每一行最后插入分号。var foo = 1 var bar = 'a' var foobar = foo + bar
方法一、使用.来重复操作
方法二、使用$来对最后进行批量插入
方法三、使用命令模式
:'\<,'\>normal .
- 批量修改
使用*,#来查找单词,使用gd来定位到第一个单词
统计当前匹配的个数
:%s///gn
用 :noh 来清屏使用/,?来查找
批量替换
- 把n行到m行的source替换为target
:n,m s/source/target/g
- 把n行到最后一行的source替换为target
:n,$ s/source/target/g
- 替换所有行
:%s/source/target/g
- 输入当前光标的单词
:%s/<C-r><C-w>/tatget/g
- 替换的时候进行确认
:%s/<C-r><C-w>/tatget/gc
y 替换此处
n 忽略此处
q 退出替换过程
l 替换此处匹配后退出
a 替换此处与之后所有的匹配向上滚动屏幕 向下滚动屏幕
- 把n行到m行的source替换为target
从Vim执行Shell命令
:write | !python %
q: 进入命令行窗口
添加编号
:let i = 1
qa
I=i jk
:let i += 1
q`:’\<,’>normal @a
编辑宏 :put a
复制回宏 :d a
五、参考资料
- 简明 Vim 练级攻略
- Vim-as-a-python-ide
- Vim Directory Structure
- Learn Vimscsript the Hard way
- 打造属于自己的Vim神器
- 谁说Vim不是IDE?(二)