4.Vim配置和使用
VI三大模式和基本命令
- 命令模式
//切换到输入模式
i //进入插入状态(按下i ,并不会输入一个字符,而被当作一个命令insert)
//再输入字符,会插入在光标前
a //进入追加状态(再输入字符,会追加在光标后)
o //进入新一行输入状态(再输入字符,会在新一行输入)
//移动光标
k 上
h 前 l 后
j 下
r //取代光标处的字符
x //删除当前光标所在处的字符。
//打开默认的模式
ctrl + f //下翻页
ctrl + b //上翻页
gg //跳到第一行
shift + g //跳到最后一行
yy //复制一行
v + h/j/k/l //选取字符串
y //复制
p //粘贴
dd //删除一整行
ndd //3dd: 删除3行
u //撤销,复原前一个动作
Ctrl+r //反撤销,回退到修改前状态
i //命令模式切换到编辑模式,直接按键盘上的i,出现INSERT
: //命令模式切换到底行模式(即可在最底一行输入命令)
-
编辑模式
编辑模式我们可以在这个模式上输入一些文本。
Esc //切换到命令模式
- 底行模式
:w //写入
:q //退出
:wq //写入并退出
:q! //不保存退出
/word //搜索字符串 word
// n: 查找下一个 shift + n: 查找上一个
:set nu //显示行号
:set nu! //隐藏行号
:30 //光标跳到第30行
Backspace //取消底行字符后,自动切换到命令模式
源码跟踪(挑战):vim + cscope + ctags
高效跟踪源码,是程序员 快速查bug 写程序的利器
vim:是vi的升级版,加了一些高亮显示和改进,如u可以无限撤销。
ctags cscope:帮助多个源文件间建立符号索引库(如跳到函数定义,查找函数的文件位置)
安装
$ sudo apt-get install vim ctags cscope
$ cd ~/linux-4.9.140 //进入源码目录
$ ctags -R //生成符号关联
$ cscope -Rbkq //生成索引库
VIM配置
$ vim ~/.vimrc 添加vim 的配置文件
"-------------------------------------------------------------------------------
" 基本设置
"-------------------------------------------------------------------------------
" When started as "evim", evim.vim will already have done these settings.
if v:progname =~? "evim"
finish
endif
"启用Vim的特性,而不是Vi的(必须放到配置的最前边)
set nocompatible
" 设置编码
set encoding=utf-8
set fenc=utf-8
set fileencodings=ucs-bom,utf-8,cp936,gb2312,gb18030,big5
"显示行号
set number
"设置默认打开窗口大小
"set lines=70 columns=100
"设置窗口透明度
"set transparency=10
"设置背景色
"set bg=dark
"用 koehler 调色板
colorscheme koehler
"隐藏工具栏和滑动条
set guioptions=aAce
"设置标签栏
"最多30个标签
set tabpagemax=30
"显示标签栏
set showtabline=2
"设定文件浏览器目录为当前目录
"set bsdir=buffer
"set autochdir
"保存100条命令历史记录
set history=100
"总是在窗口右下角显示光标的位置
set ruler
"在Vim窗口右下角显示未完成的命令
set showcmd
" 启用鼠标
if has('mouse')
set mouse-=a
endif
"设置语法高亮
if &t_Co > 2 || has("gui_running")
syntax on
endif
"-------------------------------------------------------------------------------
" 文本操作设置
"-------------------------------------------------------------------------------
"设置字体
set gfn=Courier:h15
"设置自动缩进
"设置智能缩进
set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab
set smarttab
"设置Tab键跟行尾符显示出来
"set list lcs=tab:>-,trail:-
"设置自动换行
set wrap
"设置Insert模式和Normal模式下Left和Right箭头键左右移动可以超出当前行
set whichwrap=b,s,<,>,[,]
"设置光标移动到屏幕之外时,自动向右滚动10个字符
set sidescroll=10
"设置使~命令成为操作符命令,从而使~命令可以跟光标移动命令组合使用
set tildeop
"在Insert模式下,设置Backspace键如何删除光标前边的字符。这里三个值分别表示空白字符,分行符和插入模式之前的字符。
set backspace=indent,eol,start
"定义键映射,不使用Q命令启动Ex模式,令Q命令完成gq命令的功能---即文本格式化。
map Q gq
" CTRL-U 在Insert模式下可以删除当前光标所在行所在列之前的所有字符. Insert模式下,在Enter换行之后,可以立即使用CTRL-U命令删除换行符。
inoremap <C-U> <C-G>u<C-U>
"使 "p" 命令在Visual模式下用拷贝的字符覆盖被选中的字符。
vnoremap p <Esc>:let current_reg = @"<CR>gvs<C-R>=current_reg<CR><Esc>
"-------------------------------------------------------------------------------
" 搜索设置
"-------------------------------------------------------------------------------
"打开搜索高亮
set hlsearch
"忽略大小写
set ignorecase
"在查找时输入字符过程中就高亮显示匹配点。然后回车跳到该匹配点。
set incsearch
"设置查找到文件尾部后折返开头或查找到开头后折返尾部。
set wrapscan
"put ctrl+shift+- s for find string
nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR>
nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR>
nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR>
nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR>
nmap <C-_>f :cs find f <C-R>=expand("<cfile>")<CR><CR>
nmap <C-_>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR>
"auto add cscope.out to vim 如:cs f s 命令不能用
cs add cscope.out
set csto:0
set cscopetag
set nocsverb
set csverb
"添加内核目录,让你在任意文件下搜索时,都能跳到内核信息
"cs add /home/jetbot/kernel/cscope.out /home/jetbot/kernel/
"set tags:./tags,tags,/home/jetbot/kernel/tags
"-------------------------------------------------------------------------------
" 文件设置
"-------------------------------------------------------------------------------
"设置当Vim覆盖一个文件的时候保持一个备份文件,但vms除外(vms会自动备份。备份文件的名称是在原来的文件名上加上 "~" 字符
if has("vms")
set nobackup
else
set backup
endif
"Enter换行时总是使用与前一行的缩进等自动缩进。
set autoindent
"设置智能缩进
set smartindent
"编辑一个文件时,你所编辑的内容没保存的情况下,可以把现在的文件内容与编辑之前的文件内容进行对比,不同的内容将高亮显示
if !exists(":DiffOrig")
command DiffOrig vert new | set bt=nofile | r ++edit # | 0d_ | diffthis
\ | wincmd p | diffthis
endif
vim常用命令
*vim 编辑器移动光标
命令模式下
K //向上移动
J //向下移动
H //向左移动
L //向右移动
Ctrl+F(PageDown)//下翻一屏
Ctrl+B(PageUp) //上翻一屏
gg //将光标定位到第一行
G //将光标定位到最后一行
ngg //将光标定位到第 n 行
*vim 编辑器的文本的复制和粘贴
先将光标放在我们要复制内容的行首,使用上下左右按键来选择文字,选择好之后按键盘上的 Y,接
着按 esc 键回到一般模式,把光标移动到我们要粘贴的地方,然后按键盘上的 p
v + h/j/k/l //选取字符串
y //复制
p //粘贴
yy //复制一行
nyy //复制当前行下的 n 行
*vim 编辑器的删除
方法一:直接进到编辑模式,使用 delete 来删除
方法二:使用 dd 命令
dd //删除光标所在行
ndd //删除 n 行
n1,n2d //删除指定范围的行。需要在命令行模式下操作。
*vim 编辑器的撤销
撤销是在一般模式下,而且我们关闭过的文本文件就不能在这做撤销动作了
u //撤销
ctrl+r //反撤销
*vim 编辑器的查找
在命令行模式下输入 “/” 或者 “?” 来查找的。
向下查找就是点击键盘上的“n”,他会向下查找了,按 ESC 回到一般模式,然后输入“?”,然后再
输入 da,敲下回车,然后按 n,他就会向上查找,所以说我们想要向上查找的话,我们使用“?”进到命 令行模式。
/xxx n //向下查找xxx,shift + n: 查找上一个
?xxx n //向上查找xxx
*vim 编辑器的暂停和返回
Ctrl+Z //暂停当前Vim回到Linux页面
fg+enter //回到中断的程序页面
vim 编辑器的替换
命令行模式
%s /old/new/g
vim编辑器的保存
:q! //强行退出
:wq //保存退出
:q //退出没有编辑过的文本
vim 编辑器文件的对比
vimdiff file1 file2 file3
vim + cscope + ctags常用命令
Ctrl + ] //调到定义处
Ctrl + o //返回上一次位置
//Ctrl + i 再返回
g f //跳到光标停留的include的头文件里
d w //删除个字符串
u //可无限撤销
:cs f f driver.c //搜索 driver.c 文件
g d //选中当前光标处的字符串
//再 n 查找下一个
ctrl shift - s //查找光标处的字符串
// j:下一条 k:上一条 f:下一页 b:上一页 shift+g: 到末尾
:cs f s attach //全局 搜索字符串 attach
Ctrl+w v // 垂直分割窗口
// Ctrl+w w 可在窗口间切换
// :q退出光标所在窗口
ctrl + //变大字体
:e . //编辑当前目录