Vi学习
趁着台风,在家学习学习vi
vim的配置
- .vimrc文件是vim的配置文件,位于~/.vimrc, vim的字体 快捷键 插件 均可通过配置文件配置
前缀键;各类 vim 插件帮助文档中经常出现 <leader>,即,前缀键。vim 自带有很多快捷键,再加上各类插件的快捷键,大量快捷键出现在单层空间中难免引起冲突,为缓解该问题,引入了前缀键 <leader> , 默认的前缀键是\
" 定义快捷键的前缀,即<Leader>
let mapleader=";"
- 插件管理
.vim/ 目录是存放所有插件的地方。vim 有一套自己的脚本语言 vimscript,通过这种脚本语言可以实现与 vim 交互,达到功能扩展的目的。一组 vimscript 就是一个 vim 插件,vim 的很多功能都由各式插件实现。
vim 插件目前分为 *.vim 和 *.vba 两类,前者是传统格式的插件,实际上就是一个文本文件,通常 someplugin.vim(插件脚本)与 someplugin.txt(插件帮助文件)并存在一个打包文件中,解包后将 someplugin.vim 拷贝到 ~/.vim/plugin/ 目录,someplugin.txt 拷贝到 ~/.vim/doc/ 目录即可完成安装,重启 vim 后刚安装的插件就已经生效,但帮助文件需执行 :helptags ~/.vim/doc/ 才能生效,可通过 :h someplugin 查看插件帮助信息。传统格式插件需要解包和两次拷贝才能完成安装,相对较繁琐,所以后来又出现了 *.vba 格式插件,安装便捷,只需在 shell 中依次执行如下命令即可
vim someplugin.vba
:so %
:q
不论是直接拷贝插件到目录,还是通过 *.vba 安装,都不便于插件卸载、升级,后来又出现了管理插件的插件 vundle。
我希望每个插件在 .vim/ 下都有各自独立子目录,这样需要升级、卸载插件时,直接找到对应插件目录变更即可;另外,我希望所有插件清单能在某个配置文件中集中罗列,通过某种机制实现批量自动安装/更新/升级所有插件。vundle(https://github.com/VundleVim/Vundle.vim )为此而生,它让管理插件变得更清晰、智能。
vundle 会接管 .vim/ 下的所有原生目录,所以先清空该目录,再通过如下命令安装 vundle
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
接下来在 .vimrc 增加相关配置信息
" vundle 环境设置
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
" vundle 管理的插件列表必须位于 vundle#begin() 和 vundle#end() 之间
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'altercation/vim-colors-solarized'
" 插件列表结束
call vundle#end()
filetype plugin indent on
其中,每项
Plugin 'altercation/vim-colors-solarized'
对应一个插件,后续若有新增插件,只需追加至该列表中即可;
需要安装插件,先找到其在 github.com 的地址,再将配置信息其加入 .vimrc 中的call vundle#begin() 和 call vundle#end() 之间,最后进入 vim 执行
:PluginInstall
便可通知 vundle 自动安装该插件及其帮助文档。
要卸载插件,先在 .vimrc 中注释或者删除对应插件配置信息,然后在 vim 中执行
:PluginClean
即可删除对应插件。插件更新频率较高,差不多每隔一个月你应该看看哪些插件有推出新版本,批量更新,只需执行
:PluginUpdate
Vim操作
移动
- hjkl
- gg 文件第一行
- G 文件最后一行
- 123+G 跳转到指定行 ( 4% 数字+% 按百分比跳转 )
- H/M/L 跳转到当前屏幕的 顶部/中间/底部
- ^ 移动到行首第一个非空白, 0 移动到行首
- $ 移动到行尾 (^ $ 和正则一样)
- % 移动到当前代码区块的开始/结尾(匹配(),[],{})
- ctrl + g 查看当前文件总行数
按单词移动
- w / b 下一个/上一个 单词词首
- W / B 下一个/上一个 字符串头
- e / ge 下一个/下一个 单词词尾
- E / gE 下一个/上一个 字符串尾部
上面这些命令都使用’iskeyword‘选项中的字符来确定单词的分界,还有几个命令,只把空白字符当做”单词“的分界。当然,这里说的”单词“已经不是传统意义上的单词了,而是由非空白字符构成一串字串
查找
- /xxx 查找光标后的单词 xxx
- ?xxx 查找光标前的单词 xxx
- n / N 移动到下一个/上一个 匹配
- ftext 在当前行向前查找text
- Ftext 在当前行向后查找text
- :g/text/command 在所有包含text的行运行command所表示的命令
- :v/text/command 在所有不包含text的行运行command所表示的命令
vim保存了查找历史, 在输入 / 或 ? 后, 可以通过 <C-p> 和 <C-n> 或者上下光标键, 翻看历史记录, 再次查找
另外你还可以使用 q/ 和 q? 命令,在vim窗口最下面打开一个新的窗口,这个窗口会列出你的查找历史记录,你可以使用任何vim编辑命令对此窗口的内容进行编辑,然后再按回车,就会对光标所在的行的内容进行查找。
vim中有许多与查找相关的选项设置,其中最常用的是incsearch(输入内容时, 即对输入的内容开始匹配) ,hlsearch(高亮), ignorecase(忽略大小写)。
替换 ( :s 命令)
:[range]s/from/to/[flags]
range
:范围,如果没有指定范围,则作用于但前行。
- :1,10s/from/to/ 表示在第1到第10行(包含第1,第10行)之间搜索替换;
- :10s/from/to/ 表示只在第10行搜索替换;
- :%s/from/to/ 表示在所有行中搜索替换;
- 1,$s/from/to/ 同上。
flags
有如下四个选项
- c confirm,每次替换前询问;
- e error, 不显示错误;
- g globle,不询问,全部替换。如果不加 g 选项,则只替换每行的第一个匹配到的字符串;
- i ignore,忽略大小写。
这些选项可以合并使用,如 cgi 表示不区分大小写,全部替换,替换前询问。
- & 重复执行最后的 :s (替换)命令
执行Shell命令
:!ls -al
撤销
- u 撤销上一次操作
- Ctrl+r 恢复上一步被撤销的操作
删除
- x 删除当前字符
- X 删除光标前的字符, 前面可以加数字
- dw 删除一个词
- dd 删除当前行
复制, 粘贴, 剪切
选中文字
- v+光标移动 (按字符选择)高亮选中所要的文本,然后进行各种操作(比如,d表示删除)。
- V (按行选择)
- v+选中的内容+c 更改选中的文字
复制 :y(ank)
- y 用v命令选中文本后,用y进行复制
- yy 复制当前行, 等同于(Y)
- y0 复制当前位置到行首
- y$ 复制当前位置到行末
粘贴
- p 在光标位置之后粘贴
- P 在光标位置之前粘贴
剪切
- v + 选中的内容 + d 剪切
剪切板
-
简单的复制粘贴
vim提供12个剪贴板,它们的名字分别为vim有11个粘贴板,分别0,1, 2 ... 9, a, "; 如果开启了系统剪贴板,则会另外多出两个 + 和 *。使用 :reg 命令,可以查看各个粘贴板里的内容。
:reg
在vim中简单用y只是复制到 " (双引号)粘贴板里,同样用p粘贴的也是这个粘贴板里的内容。 -
复制和粘贴到指定剪贴板
要将vim的内容复制到某个粘贴板,需要退出编辑模式,进入正常模式后,选择要复制的内容,然后按 "Ny 完成复制,其中N为粘贴板号(注意是按一下双引号然后按粘贴板号最后按y),例如要把内容复制到粘贴板a,选中内容后按 "ay 就可以了。
要将vim某个粘贴板里的内容粘贴进来,需要退出编辑模式,在正常模式按 "Np ,其中N为粘贴板号。比如,可以按 "5p 将5号粘贴板里的内容粘贴进来,也可以按 "+p 将系统全局粘贴板里的内容粘贴进来。 -
系统剪切板
Vim支持系统剪贴板,需要打开clipboard功能。使用下面的命令,检查当前版本的Vim,是否支持clipboard。
$ vim --version
如果不支持的话,需要安装图形化界面的vim(即gvim),或者重新编译vim。
$ sudo apt-get install vim-gnome
另一种方法,是安装vim-gui-common。
$ sudo apt-get install vim-gui-common
缩进文本
选项 | 作用 |
---|---|
^i(ctrl+i)或tab | 插入文本时,插入移动的宽度,移动宽度是事先定义好的 |
:set ai | 打开自动缩进 |
:set sw=n | 将移动宽度设置为n个字符 |
n<< | 使n行都向左移动一个宽度 |
n>> | 使n行都向右移动一个宽度,例如 3>> 就将接下来的三行每行都向右移动一个移动宽度 |
多窗口
参考:
[https://github.com/yangyangwithgnu/use_vim_as_ide#0.1]
[http://easwy.com/blog/archives/advanced-vim-skills-basic-move-method/]
[https://github.com/ruanyf/articles/blob/master/dev/vim/operation.md]
[http://tanqisen.github.io/blog/2013/01/13/vim-search-replace-regex/]