vim入门技巧

內容目录

  • vim入门技巧
    • 一开始的时候须要知道的东东
    • 查找的技巧
    • 有关使用 搜索C_] 进行查找时单词的区分设定
    • 寄存器的使用
    • 标记缓冲区
    • 搜索时忽略大小写
    • vim中cscope的使用
    • 有关显示行号的技巧
    • vim的操做命令
    • vim的folder操做
    • vim的自动补全
    • vim中输入xml的相关快捷键
    • 使用vim编辑一个加密文件
    • 有关vim文件的编码设定

vim入门技巧¶

一开始的时候须要知道的东东¶

  1. vim命令行参数说明vim

    vim -C cmd file 打开文件前执行指定的命令函数

    vim -r file 恢复文件字体

    vim -R file 只读方式打开,但能够强制保存编码

    vim -M file 只读方式打开,不能够强制保存加密

    vim + file 打开文件定位到文件末尾spa

    vim +num file 打开指定的行插件

    vim +/string file 打开文件,跳转到指定的字符命令行

  2. 命令模式下的经常使用命令设计

    :w 保存文件orm

    ;wq 保存并退出, 在normal模式下使用 ZZ 也能够

    :o file 打开文件

    :n1,n2w file 保存从n1到n2的行为另外一个新文件

    :x 保存退出 在normal模式下使用ZZ也能够

    :q 退出,使用 :q! 强制退出

    :saveas file 另存为一个新文件

    :e 从新载人文件

    :e! 从新载入文件,并丢弃已经作的修改

    :f 显示文件的编辑状态

    :vs 竖直分割

    :sp 水平分割

    :pwd 显示vim的工做目录

    :cd path 改变vim的工做目录,可使用tab进行补全,方便的切换目录

    :set autochdir 让vim根据打开的文件自动切换工做目录,通常写到配置文件里

  3. normal模式下的经常使用命令

    [n]G 跳转到第[n]行

    H / M / L 跳转光标到当前屏幕(屏幕的内容是不动)的 开头/中间/结尾

    K man 光标所在的单词,好比一个函数

    gd 跳转到局部变量定义的地方

    gD 跳转到全局变量的定义的地方

    g; 跳转到上一次修改的地方

    g, 跳转到下一个修改过的地方

    % 匹配() {} [] 进行跳转

    ctrl + f 下向滚动一屏

    ctrl + b 向上滚动一屏

    ctrl + d 向下滚动半屏

    ctrl + u 向上滚动半屏

    ctrl + e 向下滚动一行

    ctrl + y 向上滚动一行

    ctrl + g 显示文件的编辑状态

    ctrl + w 进入分割窗口控制功能, 在这个前提下,可使用以下

    命令组合

    w 切换下一个窗口

    • 当前窗口增高一行
    • 当前窗口减小一行

    [n] _ 当前窗口尽量的大,也可使用n指定行数, 也可使用 :reesize n 指定当前窗口的行高

    = 全部的窗口使用一样的高度

    n ctrl+w _ 指定当前窗口使用n行

    < 当前窗口减小一列 ,

    n ctrl+w < 或者 ctrl+w [n] < 能够一次移动n列.

    | 当前窗口尽量的宽,

    n ctrl+w | 或者 ctrl+w [n] | 能够设定当前窗口使用n列

    ctrl + 0 显示字体的大小设置为初始大小

    n% 移动到n%的位置,注意没有:

    zz 或者 z + . 把光标所在的行移动的屏幕中间

    zt 或者 z + enter 把光标所在的行移动到屏幕开始

    zb 或者 z + - 把光标所在的行移动到屏幕末尾

  4. 替换<esc>

    使用vim的时候<ESC>这个键用于从任何模式,回到normal模式,有人曾经开玩笑说我要去买一个<ESC>脚踏板,可见 <ESC>这个键在vim中使用频率是多麽的高,并且,还那麽远,很是不方便,你没有想过,设计vim的人是否是脑子有坑呢,反正我想过^-^,直到看到一本叫 <<The Hard Way to Learn VimScript>> 的书才发现,是我脑子有坑.早点看这书就行了.也许凡人们 都喜欢犯的错误就是这样,没有深入的认识一个事物的时候,就慌忙下结论.怨天尤人,可神会一直对咱们微笑.直到咱们让阳光 照进内心,才抬头看到神灿烂的微笑.

    1. 使用命令

      :inoremap {多个任意字母} <esc>

      执行后, 快速输入 {多个任意字母} 就会退出到normal模式, 快速的意思是在一个光标闪烁以内,这也太简单了,若是 就着吗简单,那为啥不早点让我发现写到配置文件里啊,其实这是最麻烦的

    2. 不使用<ESC>退出到normal模式的方式(默认)

      Ctrl + c

      Ctrl + [

    3. 有关退出到normal模式的高级技巧

      使用ALT + {命令组合} , 这个执行之后,至关于在normal模式下使用了命令组合,执行后的状态取决于命令是什麽,好比

      在插入模式下输入了 ALT + j 那麽效果就是, 往下移动了一行,并进入了normal模式,

      在插入模式下输入了 ALT + O 哪买就是,在当前行上一行插入一行,并因为O的原始做用是插入进入insert模式,因此 执行后,效果就是在上一行插入了一行,而且停留在插入模式

  5. 快速选择

    想复制的东西,既不是一行,也不是一个单词,复制单词可使用 yw ,就得手动选择了,使用v ,按hjkl进行移动,而后y,相似命令以下:

    v 普通选择

    shift + v 按行选择

    ctrl + v 块选择

    gv 从新选中上次的选择,能够做为标记用.

  6. 在shift +v 进入选择一行后的快捷键

    首先声明这些都是用来选择的,要求就是先把光标移动的想要选择的行,而后按下shift+v而后在按下下面的快捷键才起效

    iw 选择光标所在的单词,别的不在选择了,对应须要复制函数名称的时候

    i( 或者 i) 选择在一行以内的()内的内容, 不包括() 必须在一行之内要不找不到,光标必须在()内部

    a( 或者 a) 选择在一行以内的()内的内容, 包括() 必须在一行之内要不找不到,光标必须在()内部

    i{ 或者 i} 选择在{}内的内容, 不包括{} 只选择最近匹配的 { } 执行一会一下选择了多行

    a{ 或者 a} 选择在{}内的内容, 包括{} 只选择最近匹配的 { } 执行之后一下选择了多行

    i< 或者 i> 选择<>之间的内容,不包括<>

    a< 或者 a> 选择<>之间的内容,包括<>

    相似的还有 i[ ( i] ) 和 a[ ( a] )

    is 光标在一个函数的声明出,按下后会选择这个函数声明体和函数上方的相邻注释,若是在函数定义的地方, 则选择函数开头的部分.

    ibi( 差很少,只是可查选择多行之间匹配的()以内的内容, 不包括 (),适用于参数写在多行的状况

    abi( 差很少,只是可查选择多行之间匹配的()以内的内容, 包括 (),适用于参数写在多行的状况

    tips 利用这些方便的选择技巧,就能够方便的进行函数头和函数复制了,没必要再来来回回去找匹配了.

  7. 查看变量或者函数的声明和定义

    [i 须要把光标移动到将要查看的函数或者变量的位置,只是查看声明,并不进行光标的跳转,这个很是有用,你也想在写函数的时候能看到声明的函数参数类型的吧.声明会在下方显示

    [ ctrl+i 这个就会跳转到函数的定义地方了,和 ctrl + ] 差很少了

    [ ctrl+d 这个会调整到对应的宏定义处

  8. 不使用ctags,cscope的时候,默认的跳转命令

    1. 文件跳转

    把光标移动到对应文件的字符上面,而后按 gf 便可,在新 的窗口打开可使用 ctrl+w f ,在新的tab中打开使用 ctrl+w gf

    使用 set suffixesadd+={.hpp} 能够设定在include的时候不加扩展名的状况,suffixesadd表示默认加上的扩展名

    使用 set path 查看搜索头文件的目录有哪些 , 分割的,使用 set path+={目录} 进行增长

    1. 函数跳转

    [[ 上一个函数的开头(须要首行的{), 说这个和语言扩展有关,

    若是把{写到了末尾就直接到文件头了,之后在研究如何改吧).

    ]] 下一个函数的开始,说明同上

    {{ 上一个块(空行隔开的)

    }} 下一个块(空行隔开的)

    [] 上一个函数的结尾

    ][ 下一个函数的结尾

    [( 当前区块的 ( 处

    ]) 当前区块的 ) 处

    同理 [{ ]} 用于{} 嵌套的状况,好比n层的if . [/ ]/ 用于调整到注释的/* */ [# ]# 用于#if和#else #endif 之间的跳转

    整理一下以下:

    第一个键表示方向,第二个键表示功能,

    [ 表示向前跳转, ] 表示向后跳转

    第二个是功能

查找的技巧¶

  • / 从当前位置向下查找
  • ? 从当前位置向上查找
    • 选中当期光标所在的 单词 而后向 查找
  • # 选中当前光标所在的 单词 而后向 查找
  • g* 选中光标所在的 单词 而后部分匹配向 查找
  • g# 选中光标所在的 单词 而后部分匹配向 查找
  • 部分匹配的意思是不区分大小写的匹配
  • set nowrapscan 和 set wrapscan 设置搜索的时候是否是能够在到最后的下一个从文件头开始查找

有关使用 搜索C_] 进行查找时单词的区分设定¶

在.vimrc 文件中设定 iskeyword 好比,比较烦人的一个地方是c语言的 Struct.Member 若是使用 w * # ] 功能时,没法区分 单词Member,按照Struct.Member是一个单词进行搜索,在.vimrc文件中添加:

set iskeyword += ,$,@,%,#,.,-

一行,这样,就能够了,使用逗号分割每个字符,结尾不能有, .

寄存器的使用¶

vim中a到Z是复制缓冲区,能够吧文本占时复制到缓冲区中,使用“ayy 把内容复制到a中,使用”ap 把a缓冲区中的内容取出来,要点就是使用”加在缓冲区名字的前面

主要是寄存器操做,简直神器,

首先,说用寄存器的命令要知道,C-R (ctrl+r)

好比说用a寄存器,就要说按Ctrl+r a 这样子.

0-9 a-z (只有小写) 都是vim的寄存器,

其中,1-9 是删除寄存器,分别记录上n次删除的内容,好比,我要复制上5次删除的内容使用 “5p 就能够了,

0 上一次复制的内容,yy自动存入,

/ 是上次搜索寄存器

  • 是系统粘贴板寄存器,好比”+yy是把当前行存入系统粘贴板,

a-z是具名寄存器,好比yy想存入a中,就是用 “ayy 这样子.

这些寄存器是能够混用的

好比 / 和 ? 我想搜上4次删除的内容,就能够用

/<CTRL+R>4 回车,

这样子哦,

输入/”4 只能搜”4这样的字符,这个和vim的配置相关.

标记缓冲区¶

缓冲区的范围也是a-Z,使用m[a-Z]进行标记,标记的是光标所在的位置,使用’[a-Z]会跳转到相应的位置,要点就是,使用m标记,使用’进行跳转。

使用 :marks 显示全部标记

搜索时忽略大小写¶

使用 :set ic开启忽略大小写,

使用 :set noic 关闭

ic 即 : ignore case 的简写

vim中cscope的使用¶

  1. cscope是用于多种语言的(其实主要仍是c了)的符号查找程序.这个很厉害啊,只是使用起来比ctags稍微麻烦一点.

  2. 在源码目录使用cscope -cb 会生成一个cscope.out文件,若是只有指定目录,就把须要的全部文件写到cscope.files文件里, 一行一个文件就好了,

  3. vimrc中也许有像set tag = xxx之类的设置,笨一点的方法就是使用cs add进行加入对应文件

  4. 使用 :cs f g XXX 找cscope.out中的XXX定义.

    f表示查找 g 表示找定义,可使用 :cs help 进行查看,很方便.

  5. 对上一条中 f的展开

    :cs help 会有说明

    add {file|dir} [prefix dir] 添加一个cscope.out文件,能够指定文件或者目录加入cscope.out文件 ,cscope默认使用vim开启的目录开始查找,若是改了目录,使用 prefix dir从新指定一个就行了,要否则就会报某某某文件找不到.

    find 查找,在加入的cscope.out文件中,按指定方式找对应的符号,g就是找定义,其余的看下一条.

    kill # 从加入的cscope.out文件中除去一个.# 是序号,也可使用文件指定,使用须要方便啊.

    show 显示已经加入的scope.out文件.前面就是kill须要的序号了.

    reset 初始化全部的加入的cscope.out文件.

  6. 有关:cs f g XXX中g的扩展

    0或s 查找这个符号.

    1或g 查找这个定义.

    2或d 查找这个函数调用的函数们.

    3或c 查找调用这个函数的函数们.

    4或t 查找这个字符串.

    6或e 查找这个egrep匹配模式.

    7或f 查找这个文件.

    8或i 查找include这个文件的文件们.

  7. 使用技巧.

    使用手工输入函数符号的是否是很麻烦呢,能够这样,使用 yw 复制一个单词,而后使用C_r 0 从复制复制寄存器中拿出上一个复制的内容.

有关显示行号的技巧¶

  • vim显示行号,很简单,开始显示,

    set number 简写 set nu .

    取消显示

    set nonumber 简写 set nonu

    显示相对行号 //对于查看结构体特别有用

    set relativenumber

    取消相对行号显示

    set norelativenumber

  • 有关line函数的使用

    这个函数是获得行数,使用 :help line 能够查看许多内容.

    line(‘.’) 当前行.

    line(“‘t”) t标记所在的行,没有的话,返回0

    做用:

    1. 给文件添加统一的前面 行号,是内容的序号,不是显示的.:

      :%s/^/\=line('.').' '

      解释:

      • %s 是全局搜索.
      • ^ 表示每一行的开头
      • \= 表示 使用后面的表达式结果进行替换,若是想使用\= ,哪买整个替换后的字符都要是 表达式的结果,就是说,\=只能写在最前面,不能从中间使用.
      • line(‘.’) 表示但前行的行号,这个号码是根据匹配游标移动改变的.
      • . 表示字符串链接,链接后面的’ ‘(空格) 你总不但愿行号后面没有空格吧?
    2. 计算但前行到指定行的行差

      这个比较麻烦,分一下几步:

      1. 在基准的行作一个标记,好比 ms 作一个s标记.
      2. 使用 / 或者其余什麽手段,移动到所在的行.
      3. 执行 :echo line(‘.’)-line(“‘s”) 就会在命令输入行打出一个数字,就是行差了,

      虽然比较麻烦,但是使用q 定义好宏之后,使用@执行就好多了.

vim的操做命令¶

  1. 概述

    这里的vim操做命令指的是按下 : 以后能够输入的命令

  2. 去掉全部空行

    :g/^s*$/d

    说明:

    g : 全局命令

    / : 分割符

    ^\s*$: 全部匹配开头和结尾只有 空格 的行.

    /d : 删除该行

vim的folder操做¶

  1. 配置

    set foldenable “设置容许折叠

    set foldmethod=[manual|indent|] “设置折叠方式,manul手动 indent按缩进折叠

    set foldlevel=3 “设置折叠的层级大小

  2. 操做

    在normal模式下进行fold操做

    z + c 折叠光标所在的区域(一次折叠一层)

    z + C 折叠光标所在的区域(一次把光标所在的区域折叠到最小)

    z + R 打开全部的折叠(一次打开到没有折叠的样子)

    z + r 打开全部的折叠(一次打开一层折叠,再桉一次这打开下一层)

    z + o 打开光标所在的折叠,或者 在光标所在的地方 按 l 也能够

    z + M 折叠全部能够折叠的代码(以最大深度进行折叠)

    z + m 折叠全部能够折叠的代码(以一层的深度递增折叠,再桉一次则折叠第二层)

vim的自动补全¶

  1. 配置

    这里使用的是Omni的自动补全插件,其余的后有一些不一样的地方

    set completeopt=menu,menuone “关掉补全的预览窗口

    let OmniCpp_MayCompleteDot = 1 “配置’.’之后给出补全信息

    let OmniCpp_MayCompleteArrow = 1 “配置’->’之后给出补全信息

    let OmniCpp_MayCompleteScope = 1 “配置’::’之后给出补全信息

    let OmniCpp_ShowPrototypeInAbbr = 0 “配置补全时是否显示函数原型,默认是不显示,1是显示

    还有一些其余配置,须要的话网上查

  2. 操做

    补全的操做都是在insert模式下进行的,全部的操做都是使用Ctrl做为修饰符的,这样才能区分是否是须要输入

    <C-i> 在任什么时候刻想要提示一下

    <C-g> 取消补全,隐藏补全的选择列表

    <C-n> 选择下一补全选项

    <C-p> 选择上一个补全选项

    <C-I> 根据头文件进行补全

    <C-f> 列出有关文件的补全

vim中输入xml的相关快捷键¶

<C-o> | <C-k> 把输入的字符变为xml的一个节点 div ==> <div> </div>

使用vim编辑一个加密文件¶

  1. 新建一个加密文件

    vim -x file 首次创建会让你输入密码

  2. 打开一个加密文件

    直接vim file就可了,若是是加密文件,vim会提示输入密码的.

  3. 给一个明文文件加密,或者改密码

    :set key= 清除密码

    :set key={密码} 设置密码为{密码}

    记得保存后才起效哦

有关vim文件的编码设定¶

  1. 以指定的编码打开文件

    :e ++enc={编码} {文件} 使用指定编码打开文件 编码的可选范围: utf8 ucs-bom gbk,cp936,gb2312,gb18030

  2. 查看文件的当前编码

    :set fenc 显示文件的编码

    :set enc 显示vim新建文件的时候的默认编码

  3. 以指定编码写入文件(无论文件的当前编码)

    :w ++enc={编码} [文件]