0%

vim 导航

基本的导航

如果你只是使用h,j,k,l字符来导航,那你就太弱了,如果让你到有万行代码的第5500行你如何操作呢,如果让你去第10屏你将如何操作呢?下面的几个技巧教你在很少击打键盘情况下非常高效的导航文件内容。

滚动整屏或半屏

请使用下面的页导航按键:

  • CTRL-F 向下滚动整页(Forward)
  • CTRL-B 向上滚动整页(Back)
  • CTRL-D 向下滚动半页(Down)
  • CTRL-U 向上滚动半页(Up)

词导航

  • w 移动到下一个单词的开始
  • W 移动到下一个WORD的开始
  • e 移动到当前单词的结尾
  • E 移动到当前单词的结尾
  • b 移动到前一个词的开始
  • B 移动到前一个词的开始

在一行中特殊位置上的位置光标

  • 0(zero) 移动到当前行的开始位置
  • $(美元符号) 移动到当前行的结束位置
  • ^(…) 移动到当前行的第一个非空字符
  • g_ 移动到当前行的最后一个非空字符

快速跳转至文件首尾

导航键 描述

:0 跳转至文件头–方法1

gg 跳转至文件头–方法2

1G 跳转至文件头–方法3

:$ 跳转至文件尾–方法1

G 跳转至文件尾–方法2

段落、章节和句子导航

  • { 移动到当前段落的开始
  • } 移动到下一个段落的开始
  • [[ 移动到当前章节的开始
  • ]] 移动到下一个章节的开始
  • ( 移动到前一个句子的开始
  • ) 移动到下一个句子的开始

使用CTRL-o和CTRL-I跳转

Vim使用跳转列表来跟踪你的导航,你可以通过这个列表来向前或者向后导航。

跳转列表保留所有地方的轨迹,它可以跟踪文件名、行号和列号。

查看调整列表::jumps

导航键 描述
CTRL-o 跳转到上一个位置点
CTRL-I 跳转到下一个位置点
5CTRL-o 跳转到显示在位置0上面的位置5
5CTRL-I 跳转到显示在位置0下面的位置5

Vim命令行导航

当从命令行打开一个文件,你可以通过指定命令行参数来导航到一个特殊的位置,如下:

导航键 描述
$ vim +142 打开文件到143行
$ vim +/search-term 打开文件移动到向下搜索到指定词语的位置
$ vim +?search-term 打开文件移动到向上搜索到指定词语的位置
$ vim -t TAG 移动到指定的TAG处

在非常长的行中导航

当你遇到非常长的行(没有任何新的行)时,Vim对待它作为单个行。
因此,当你对这一行输入j键后,它将跳到下一行上。然而,你会觉得它跳过了好多行。但实际上它只是跳过一个长行。

可视化行:让我们假设有一个非常长的行,它回绕成5个可视化行。为了讨论的目的,让我们称每一单独的行为可视化行。

下面的快捷方式可以帮我们有效地导航一个非常长的行,只需要在前面的基础上加上一个g即可

导航键 描述
gj 向下滚动一个可视化行
gk 向上滚动一个可视化行
g^ 移动到当前可视化行的开始位置
g$ 移动到当前可视化行的结束位置
gm 移动到当前可视化行的中间位置

文本编辑

下面说明各种改变文件中文本的方法。

描述
cc 改变当前整行;与S键一样, 它会删除掉整行,并且进入到插入模式等待输入新文本
C 从当前光标位置改变当前行, 这会使出当前行中光标位置之后的文本,进入插入模式等待输入新的文本。

替换文本

这个与r的区别是,s会提前删除掉字符然后进入输入模式。

描述
s 使用新的字符替换当前字符
S 使用新的文本替换当前行
4s 使用新的文本替换4个字符(从当前位置开始)
4S 使用新的文本替换4行(从当前行开始)

插入文本

下面解释各种插入文本到文件的方法。

描述
i 在当前位置插入文本
I 在行的开始位置插入文本,键:大写的I,例如India
o 在当前行之后插入一行,并且插入文本,键:小写o,例如:orange
O 在当前行之前插入一行,并且插入文本键:大写O,例如:Orange
:r FILENAME 插入另外一个文件内容到当前文件的当前行之后
:r! COMMAND 插入执行命令的输出到当前文件的当前行之后

例如:你可以插入当前的日期和时间到你编辑的文件中,执行下面的命令:

:r! date

恢复删除的文本

如果你有与误操作删除文本,你可以恢复它。你可以恢复到9个删除文本的片段。

恢复删除 描述
“1p 恢复第一次删除
“2p 恢复第二次到最后一次删除
“3p 恢复第三次到最后一次删除

如果你不确切知道你删除的东西,你可以通过下面的方式浏览所有9次删除的缓冲区。当你看到你希望恢复的文笔,只需要在这一步停止。

浏览所有删除的内容,直到你找到正确的一个。

“1pu.u.u.u.u.

你也可以使用:reg查看寄存器0到9中(删除寄存器)的文本,这会告诉你每个寄存器中使什么内容。

以只读模式打开

使用-R选项在只读模式下打开文件,如下所示:

1
vim -R filename.txt

或者

1
view filename.txt

当你不想编辑一个文件时,使用上面的方法中的一个是习惯问题。这帮助你避免造成不必要的文件修改。

文件保存

当你执行:w时,它会保存文件。
:w的主要问题是当你输入:w时,不管文件有没有改变,它都会更新文件时间戳。

幸运的是,:up可以保存文件,并且只是在文件存在改变时修改时间戳。

可视化模式类型 描述
v 小写的v 开始正常的可视化模式,在可视化模式下使用箭头导航选择文本
V(大写) 开始行可视化模式
CTRL-V 开始可视化块模式

vim 自动补全

自动单词不全

  • CRTL+X CRTL+N :单词前向补全;
  • CRTL+X CRTL+P :单词后向补全;

自动行补全

  • CRTL+X CRTL+L :自动行补全;

自动文件名补全

  • CRTL+X CRTL+F :文件名自动补全;

字典补全

只需要在vimrc中设置:set dictionary+=/usr/share/dict/words即可补全words中的单词。
也可以使用CTRL+X CTRL+K来显示匹配的单词。

词典自动补全

设置:set thesaurus+=/the/path/of/thesaurus文件,然后使用CTRL+X CTRL+T就可以找到相关单词的同义词。

可视化

下面是可视化模式下集中不同的类型:

可视化模式命令 描述
退出可视化模式
d 仅删除高亮的文本,例如,如果只是选择一行的部分,它只是删除该行上选择的部分。
D 删除高亮文本下的行,例如,如果只选择行的部分,它会删除整行。
y 仅拷贝(yank)高亮的文本
Y 拷贝高亮文本所在的行
c 删除高亮文本,进入插入模式
C 删除高亮文本所在的行,进入插入模式

窗口

  • :split file —打开水平的两个窗口
  • :vsplit file —打开垂直的两个窗口
  • CTRL+WW来移动到下一个窗口,或者使用CTRL+W{h/j/k/l}按照方向移动到相应的窗口;
  • CTRL+W (+/-)来增加或减小当前的窗口所占比例大小;
  • :N split filename来打开占用N列的窗口文件。

更改窗口显示标题

:set title titlestring=’I\ am\ coding\ now’

更改配色方案

可以使用:!ls $VIMRUNTIME/colors来查看支持的配色方案并更改。

1
2
3
4
5
6
Press ENTER or type command to continue
README.txt default.vim elflord.vim koehler.vim pablo.vim shine.vim zellner.vim
blue.vim delek.vim evening.vim morning.vim peachpuff.vim slate.vim
darkblue.vim desert.vim industry.vim murphy.vim ron.vim torte.vim

Press ENTER or type command to continue

编辑文件

使用vim –p file1 file2 file3 …. fileN可以打开多个文件,与不加-p的区别在于,这些文件全部显示在一个tab上。

然后我们就可以使用:tabn :tabp来到下一个tab或者上一个tab
可以使用:help tab来查看详情。

如何在插入状态下输入命令

先输入CTRL+O,然后就可以输入命令了,比如5j,就会跳转5行,然后重新进入插入状态。
注意,这里只能执行一次哟。

查看当前文件细节

使用CTRL+G或者gCTRL+G,得到的信息分别为基本信息和更详细信息。

数字增加或减少的快捷键

可以使用CTRL+A或者CTRL+X来将某位数字加1或者减1。

跳转到变量定义处

可以使用gd或者gD来跳转到变量定义处,一个为local定义,一个是global定义,在跳转过程中,会将该变量高亮显示。

标签

使用标签来创建的书签有两种类型的书签:局部书签和全局书签。

这里我们介绍下局部书签:

标签命令 描述
ma 在当前位置处创建一个名为“a”的标签
`a(反引号 a) 跳转到书签“a”的精确位置
‘a(单引号 a) 跳转到包含标签“a”哪行的开始

在单个文件中,当你希望跳转到特殊位置或者行上,你可以使用本地标签。如果你的标签名称是小写字符,那么它是个局部标签。

注意:Vim与Vi不同的是在编辑器推出之后该标签还是存在的,这是一个让许多UNIX用户吃惊的强大特征。

文件加密

在vim中使用:X然后输入密码就可是设置每次打开文件都要输入设置的密码,同时可以使用:set key=来取消密码。

保存会话

如果在编辑当前文件的时候,想编辑另外一个文件,可以使用:mksession来保存当前对话,等回来的时候,重新使用vim –S Session.vim即可打开原来保存的会话,这个会话会保存buffer、窗口大小、自定义选项、文件夹、当前目录等。

在vim中执行shell命令

使用方式为:!cmd即可。

比如在修改源码的时候,我比较喜欢使用:!date这样就可以快速注释修改的时间了。

vimbook–OPL –official publications library

又大概看了一遍VIM-OPL,大概记了一些还不是很熟的知识点。

1 Basic Editing

x—删除字符

u—撤销

Ctrl+U—还原

ZZ—保存退出

o—在当前行下方新建一行

O—在当前行上方新建一行

CTRL+] && CTRL+T:浏览器间前进后退

帮助前缀

What Prefix Example

Normal-mode commands (nothing) :help x

Control character CTRL- :help CTRL-u

Visual-mode commands v :help v_u

Insert-mode commands i :help i_

ex-mode commands : :help :quit

Command-line editing c :help c_

Vim command arguments – :help -r

Options ‘ (both ends) :help ‘textwidth’

​ 特殊键需要使用尖括号括起来,例如向上的键:help

移动到行首行尾

使用$移动到行尾,如果是2$就是移动到当前光标所在的下一行的行尾;

0是移动到行首

^是移动到第一个非空的字符上。

搜索字符

fx:即为从光标开始向前搜索字符x的所在;

Fx:即为从光标开始向后搜索字符x的所在;

与之相同的为tx和Tx,不过只是在前一个字符停下而已。

我在哪里

使用CTRL+G可以显示出你位于那里

向上或向下卷动

CTRL+U:向上移动半屏

CTRL+D:向下移动半屏

组合的威力

如果对于,当光标在<时,使用df>将会把整体删除,然后使用.就可以进行相同的编辑操作。

改变大小写

~

键盘宏–处理更复杂的操作

stdio.h

fcntl.h

unistd.h

stdlib.h

修改为

#include “stdio.h”

#include “fcntl.h”

#include “unistd.h”

#include “stdlib.h”

方法如下:

qa 开始录制宏到寄存器a

^ 移动到行首

i#include “ 在行首插入字符串#include

$ 移动到行尾

a” 在行尾添加”

j 移动到下一行

q 停止录制宏

然后我们就可以使用@a来重复刚才的动作。

输入图标或键盘上没有的符号

可以使用:digraphs来查看可以输入的符号,输入方法为CTRL-Kat****,即可输入@。

正则表达式搜索

/^include:只搜索每行中的第一个include

/include$:只搜索每行中的最后一个include

/^include$:只搜索准确的include,而不显示诸如includeaaa等。

正则表达式总结

x The literal character x

^ 行的开始

$ 行的结尾

. 匹配单个字符

character 诸如.*[]ˆ%/?~$需要来搜索

使用标记mark

  1. 使用:mark a来标记a

  2. 移动到另一个位置

  3. 执行d’a就可以删除从当前位置到a的文本

使用标记的好处是它可以为你一直保持,你可以随时跳转回去。

使用标记后,可以使用y’a来复制当前位置到标记的地方。

!!的妙用

!!date就是把当前 时间插入,同样地!!ls就是把当前文件夹列表的内容插入到当前行。

直接在vim中打开另一个文件

​ 如果你已经使用vim打开了一个文件,又想打开另外一个文件,可以先退出在打开另一个,但是还有一个比较快捷的方法,就是直接:vi filename,就可以自动关闭原来的文件,打开filename。

我位于那个文件

​ 输入:args可以在打开过个文件的时候定位到底在那个文件。

三种visual模式

l V:选择整行;

l v:按照字符选择;

l CTRL+V:矩形块选择;

Visual模式中连接多行

在V模式下,使用J可以连接各行,而gJ可以不让连接的各行有空格。

Visual模式下平移

选定文本后,使用SHIFT+>来平移文本。

多行插入相同文本

使用CTRL+V选定文本后,使用I即可插入在选定的地方插入相同文本(光标其实);而A在选定的区域之后。

如果c程序的后缀名不是c

可以使用:set filetype=c来强制默认为c类型

自动缩进

有三个缩进

l cindent

l smartindent

l autoindent

程序中定位

*:可以定位到光标下的单词;

gd:移动到变量的定义处;

[d:显示宏定义

匹配对

%:用于匹配()、/* */、{}或[];

查找man信息

在关键词上直接敲K就可以打开man帮助信息。

在文件中直接make

我们可以在文件中直接使用:make来编译程序,这样就可以自动定位到错误的地方。:cc可以列出所有的编译信息,:cnext或这:clist可以到下一个报警错误或者列出所有信息。

进入命令行模式

按下Q即可进入。

文本格式命令

:range center/right/left width可以居中

自动补全

我们可以使使用CTRL+N或者CTRL+P来自动搜索匹配的词。

显示字符的ascii码

输入ga就可以显示出光标下字符的各个进制数。

处无为之事,行不言之教;作而弗始,生而弗有,为而弗恃,功成不居!

欢迎关注我的其它发布渠道