vim入门技巧

杀马特。学长 韩版系。学妹 提交于 2019-11-29 04:06:25

內容目录

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

vim入门技巧¶

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

  1. vim命令行参数说明

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

    vim -r file 恢复文件

    vim -R file 只读方式打开,但可以强制保存

    vim -M file 只读方式打开,不可以强制保存

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

    vim +num file 打开指定的行

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

  2. 命令模式下的常用命令

    :w 保存文件

    ;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={编码} [文件]

     

    易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
    该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!