首页 > 代码库 > 【Vim】实用命令行

【Vim】实用命令行

在vim中高亮关键字

  • syntax enable 可以高亮关键字:一般后面还要在跟一个syntax on打开语法高亮
  • syntax clear 清除关键字高亮

在secureCRT不是xterminal模式的时候,试了一下,没起作用啊,如果是xterminal模式的时候是会起作用的


在vim中查找

  • / 后面跟要查找的字符串:从当前光标位置向上搜索
  • ? 后面跟要查找的字符串:从当前光标位置向下搜索
  • n 找下一个
  • N 找上一个

清除并重画屏幕

  • [Ctrl+l]组合键

vim快捷键定制

  • 对于键盘符号,可以使用:help key-notation查看帮助

定制编辑环境

set命令用来定制编辑环境。

  • set showmode 当vi处在输入模式下时显示提示信息
  • set sm 即时显示配对的)或}
  • set ts=n 把制表符设置为n(默认为8)
  • set ai 下一行从前一行的缩进位置开始
  • set number 在编辑器中显示行号
  • set nonu 取消在编辑器中的行号显示
  • set hlsearch 高亮显示搜索到的字符串
  • set incsearch 输入字符串就马上显示匹配点
  • set ruler 标尺,用于显示光标位置的行号和列号,逗号分隔。每个窗口都有自己的标尺。如果窗口有状态行,标尺在那里显示。否则,它显示在屏幕的最后一行上。
  • set cindent:cindent控制缩进量是通过shiftwidth选项的值,而不是通过tabstops的值,shiftwidth的默认值是8
  • set shiftwidth:改变shiftwidth的值
  • set helplang=cn :vim帮助文档无法显示中文时,加入这句试试
  • set encoding=utf-8
  • colo murphy:有的时候使用vim打开文件时,显示的颜色不适合阅读,可以使用这条命令将配色改成这种黑底

我在gvim中使用了上面的方法进行了设定,但是貌似没有起到作用,不知道是我使用得不对还是另有原因


移动光标

  • h 光标左移
  • l(或空格键) 光标右移
  • k(或[Ctrl+p]) 光标上移
  • j(或[Ctrl+n]) 光标下移
  • [Ctrl+f] 向前翻页
  • [Ctrl+b] 向后翻页
  • [Ctrl+d] 向前翻半页
  • [Ctrl+u] 向后翻半页
  • 1G 跳到文件首
  • 40G 跳到第40行
  • G 跳到文件尾
  • [Ctrl+g] 显示当前行号及文件的百分比
  • Ctrl +E scroll down
  • Ctrl +Y scroll up

在一行内移动光标

B、E和W命令的作用与b、e和w的作用一样,只是后者忽略了标点符号。

  • b 向后移动到单词首
  • e 向前移动到单词尾
  • w 向前移动到单词首
  • 0或| 移动到行首
  • 30| 移动到第30列
  • ^ 移动到本行的第一个单词的首字符
  • $ 移动到行尾
  • : num 跳转到指定行号

插入文本

  • i 在光标的左侧插入字符
  • 20i-[Esc] 插入20个连字符
  • I 在行首插入字符
  • a 在光标的右侧添加文本
  • A 在行尾添加文本
  • o 在当前行下面插入一空行
  • O 在当前行上面插入一空行

选择文本

  • ve:选择整个单词
  • yw:复制光标所在的单词
  • 5yl:复制5个字符的输入

删除和移动文本

  • x 删除光标所在的字符
  • 6x 删除光标位置的字符以及右侧的5个字符
  • X 删除前一个字符
  • dd 删除当前行
  • 4dd 删除4行
  • dw 删除一个单词
  • d0 删除到行首
  • d$ 删除到行尾
  • d 删除一个区域(只用于vim)
  • p 把被剪切的文本粘贴到下面(整行)或右侧(部分行)
  • P 把被剪切的文本粘贴到上面(整行)或左侧(部分行)
  • add 把当前行粘贴到缓冲区a里
  • ap 把缓冲区a里的内容粘贴到当前位置
  • J 把当前行于下一行合并为一行
  • xp 调换两个字符的位置(其实它是删除一个字符,然后再又粘贴一个字符)

一些对程序员特别有用的快捷键

  • [[ = 移动到前一个行首的{字符上,等价于?^{:其实就是查找上一个函数
  • ]] = 移动到下一个行首的{字符上,等价于/^{:其实就是查找上一个函数
  • [] = 移动到前一个行首的}字符上,等价于?^} :用起来感觉不是很方便
  • ][ = 移动到下一个行首的}字符上,等价于?^}:用起来感觉不是很方便
  • f = 到前一个空行上
  • g = 到下一个空行上
  • gd = 到当前局部变量的定义处(当前的意思是光标停留其上的单词).:使用之后所有与当前光标所在的单词匹配上的单词都高亮了
  • gD:跳转到变量定义的地方
  • * = 到与当前单词相同的下一个单词上
  • # = 到与当前单词相同的上一个单词上
  • ‘‘ = 到上次光标停靠的行
  • %:可以让光标移动到与他相匹配的括号上去:这个非常有用
  • >增加缩进,x>表示增加以下x行的缩进
  • <减少缩进,x<表示减少以下x行的缩进
  • syntax enable + syntax on打开语法高亮

修改文本

  • rch 把光标位置的字符替换为ch
  • R 替换光标右边的文本
  • s 把光标所在的字符替换为任意个字符
  • S 替换整行内容
  • cw 修改一个单词
  • c 修改区域里的文本(vim)
  • ~ 改变所扫描的或区域里的字母的大小写
  • !tr‘[a-z]‘‘[A-Z]‘把区域里的字母转换为大写(vim)
  • !tr‘[A-Z]‘‘[a-z]‘把区域里的字母转换为小写(vim)

vim 的tab相关

vim 从 vim7 开始加入了多标签切换的功能, 相当于多窗口。之前的版本虽然也有多文件编辑功能, 但是总之不如这个方便啦。

  • :tabnew [++opt选项] [+cmd] 文件 : 建立对指定文件新的tab
  • :tabe 在一个新tab中打开指定的文件
  • :tabc 关闭当前的tab
  • :tabo 关闭所有其他的tab
  • :tabs 查看所有打开的tab
  • :tabp 前一个
  • :tabn 后一个

标准模式下:

  • gt , gT 可以直接在tab之间切换
  • :help table:详细用法请查看相关帮助文档

Vim比较两个文件

  • vim -d file1 file2 直接打开两个文件对比
  • vim file1打开第一个文件,然后使用vert diffsplit file2打开第二个文件进行对比;vert表示垂直分割窗口,默认为水平分割窗口
  • 直接对比两个文件的不同:使用diffthis分别在两个窗口输入;
  • [c, ]c定位不同点: 分别跳到前一个、后一个不同点;
  • ctrl-w w:窗口跳转: 跳到下一个窗口
  • ctrl-w h/l: 跳到左侧(右侧)窗口
  • ctrl-w j/k 跳到上方(下方)窗口
  • dp文档合并:将差异点的当前文档内容合并到另外一个文档(diff put)
  • do 将差异点的另一个文档内容拷贝到当前文档
  • zo 临时展开被折叠的相同内容
  • zc 重新折叠

复制文本

  • yy 复制当前行
  • 6yy 复制六行
  • yw 复制单词
  • y 复制区域(vim)
  • p 把复制的文本粘贴到右边或下面
  • P 把复制的文本粘贴到左边或上面
  • "ayy 把当前行复制到缓冲区a里
  • "ap 恢复缓冲区a里的内容

启动编辑器

  • vi +100 foo 打开文件foo并把光标定位在100行
  • vi +/pat foo 打开文件foo并把光标定位在pat第一次出现的行
  • vi +foo 打开文件foo,把光标定位在文件尾
  • vi foo1 foo2 ... 打开文件foo1,用n切换到foo2等
  • vi -r foo 把交换文件里的内容恢复到缓冲区里
  • vi -R foo 一只读模式打开foo文件

保存与退出

  • :w 保存文件并继续编辑
  • :w bar 同微软Windows操作系统中的“另存为……”
  • :w! bar 同上,但是覆盖现存的文件bar
  • :n1,n2w foo 把n1到n2之间的行保存到文件foo
  • :n1,n2w>>foo 把n1到n2之间的行添加到foo文件尾
  • :.w foo 把当前行保存到文件foo
  • :$w foo 把最后一行保存到文件foo
  • :x 保存并退出编辑器
  • :wq 同上
  • :q 如果文件的内容没有变化则退出编辑器
  • :q! 放弃修改并退出编辑器

vim中目录浏览

  • :E :打开vim默认路径的文件夹
  • :到上级目录
  • D :删除文件(大写)
  • R :改文件名(大写)
  • s :对文件排序(小写)
  • x :执行文件

多文件编辑

如果当前行还没有保存(并且 autowrite 未设置),则不能使用:e、:n和:rew命令。命令后面的!使得安全特性无效。

  • :e foo 停止对当前文件的编辑,开始编辑foo文件
  • :e! foo 同上,但是取消对当前文件的修改
  • :e! 装入当前文件的最近保存的内容
  • [Ctrl+^] 返回到最近编辑的文件
  • :n 编辑下一个文件(当用vi同时编辑多个文件时)
  • :set autowrite(aw) 在用:n切换到下一个文件之前自动保存当前文件
  • :rew 返回到文件列表的第一个文件(当用vi同时编辑多个文件时)
  • :r foo 把foo文件的内容插入当前行的下面

多窗口(vim)

  • :sq 把当前窗口拆分为两个
  • :new 打开一个新的空白窗口
  • :[Ctrl+w][Ctrl+w] 在窗口之间切换 Ctrl+w+R 将窗口移到右边 Ctrl+w+L 将窗口移到左边
  • :on 把当前窗口变为唯一的窗口
  • :q 退出当前窗口
  • :qa 退出所有窗口
  • :xa 保存并退出全部窗口
  • [Ctrl]+ 增大窗口尺寸
  • [Ctrl]- 减小窗口尺寸

搜索与重复

搜索模式pat可以时一个字符串,也可以是一个正则表达式。vi使用一套专用的字符序列来执行一行内的搜索。

  • /pat 向前搜索pat
  • ?pat 向后搜索pat
  • /printf向前搜索printf
  • ?[0-0]$ 向后搜索行尾的数字
  • /^# 向前搜索行首的#
  • n 按上次搜索方向重复搜索
  • N 按与前次搜索的相反方向重复搜索
  • :set wrapscan(ws) 继续搜索直至达到文件尾
  • :set ignorecase(ic) 搜索时不区分大小写
  • :set magic 保留正则表达式字符的意义
  • fc 在当前行向前搜索字符c
  • Fc 在当前行向后搜索字符c
  • ; 在当前行重复上次向前搜索
  • , 在当前行重复上次逆向搜索
  • * :向下查找光标所在的单词,类似于/
  • #:向上查找光标所在的单词,类似于?

替换

源模式s1也可以是正则表达式。使用欧冠地址时,"."代表当前行,"$"代表最后一行,"1,$"代表整个文件。

  • :.s/s1/s2 把当前行中第一次出现的s1替换为s2
  • :1,$s/s1/s2 把整个文件里的s1替换为s2
  • :1,$s/echo/printf/g 把全部的echo替换为printf
  • :1,$s/s1/s2/gc 按交互方式把全部s1替换为s2
  • :1,$s/#//g 删除文件中所有的“#”
  • :3,10s/^/#/g 在3至10行的行首插入“#”
  • :$s/$/;/ 在最后一行的行尾插入“;”
  • :1,$s/s1/s2/g把所有的s1替换为s2
  • :1,$s/HEAD/<&>/g 把所有的HEAD替换为

标志与书签

  • ma 设置一个标签a
  • ‘a 移动到标签a
  • " 在当前标志与前一个标志位置之间切换

重做与恢复

  • .重复上次命令
  • u 取消上次的编辑命令(在vim里取消所有以前的命令)
  • [Ctrl+r] 重做上次取消的操作(只限于vim)
  • U 取消所有对当前行的操作
  • "4p 从缓冲区中恢复第4次最近的删除操作

缩写表示

  • :ab name stg 把name缩写为stg
  • :unab stg 删除stg缩写
  • :ab 列出所有的缩写

映射键

  • :map key commands 把key映射到commands
  • :map! key commands 在输入模式下把key映射到commands
  • :unmap key 取消命令模式下的key映射
  • :unmap! key 取消输入模式下的key映射
  • :map 显示命令模式下所有的映射
  • :map! 显示输入模式下的所有映射

与UNIX的接口命令

  • :!cmd 执行UNIX的cmd命令
  • :!%把当前文件作为shell或perl脚本执行
  • :r !cmd 把cmd命令的结果插入到当前行的下面
  • :r !head -n 3 foo 把foo文件前三行内容插入到当前行的下面
  • sh 暂时退出UNIX shell 环境
  • [Ctrl+z] 暂停编辑(用fg命令可以返回vi编辑器)
  • :!cc% 编译正在编辑的C程序
  • :!javac %编译正在编辑的Java程序

其它

  • 在文件中要修改部分文本的缩进:在命令模式下,按v去选择多行,再按shift+>(<)来改变缩进。
  • 也可以使用3再按shift+>(<)来改变缩进(3倍)

插件安装

  • 普通插件自己将*.vim复制到~/.vim/plugin中即可
  • *.vmb的插件:则首先需要使用vim将插件打开,然后使用命令:so %进行安装
  • *.vba的插件:首先使用vim打开插件,然后使用UseVimBall ~/.vim进行安装

Vim的折叠

  • 设置折叠方式: 可用选项 ‘foldmethod‘ 来设定折叠方式:set fdm=*
  • 6 种方法来选定折叠:
    • manual 手工定义折叠
    • indent 更多的缩进表示更高级别的折叠
    • expr 用表达式来定义折叠
    • syntax 用语法高亮来定义折叠
    • diff 对没有更改的文本进行折叠
    • marker 对文中的标志折叠

注意,每一种折叠方式不兼容,如不能即用expr又用marker方式,我主要轮流使用indent和marker方式进行折叠。
使用时,用:set fdm=marker 命令来设置成marker折叠方式(fdm是foldmethod的缩写)。
要使每次打开vim时折叠都生效,则在.vimrc文件中添加设置,如添加:set fdm=syntax,就像添加其它的初始化设置一样。

  • 折叠命令
    选取了折叠方式后,我们就可以对某些代码实施我们需要的折叠了,由于我使用indent和marker稍微多一些,故以它们的使用为例:
    如果使用了indent方式,vim会自动的对大括号的中间部分进行折叠,我们可以直接使用这些现成的折叠成果。
    在可折叠处(大括号中间):
    zc 折叠
    zC 对所在范围内所有嵌套的折叠点进行折叠
    zo 展开折叠
    zO 对所在范围内所有嵌套的折叠点展开
    [z 到当前打开的折叠的开始处。
    ]z 到当前打开的折叠的末尾处。
    zj 向下移动。到达下一个折叠的开始处。关闭的折叠也被计入。
    zk 向上移动到前一折叠的结束处。关闭的折叠也被计入。