首先说明
这篇文章不是从简单的vim操作开始,它只是我自己的使用vim的过程中有些记忆不牢靠的地方,所以记录下来,如何没有帮助你,请不要生气
以下操作是在正常模式下进行的。
Copy, paste
如果在两个vim编辑器中,可以使用”yy”&”p”,但是使用这个命令,vim内部寄存器的内容无法推送到系统的粘贴板中,就会导致无法在vi 和其他应用程序之间转移数据,那么,怎么办呢?
在vim的配置文件中: set clipboard
使用 xclip
.
在debian下,
sudo apt install xclip
首先,使用”ggVG”和”y”将所有的vim正在编辑的文本内容发送到xclip程序中,接着打开另一个终端,键入下面的命令:
xclip -o
这个时候再使用“shift” + “ctrl” + “c” copy 到系统的粘贴板上就可以使用了。
退出
这个居然也有快捷键,就是两个大写的ZZ,并且效果等同于:wq
移动到指定字符
h、j、k、l 分别表示左、下、上、右的移动的方向,其中j、k是在行间移动。 h、l是在行内的字符中移动。
如果想在当前行内快速的移动,则可以使用f、t和F、T命令。
“f“命令移动到光标右边的指定字符上,例如,”fx“,会把移动到光标右边的第一个’x’字符上。”F“命令则反方向查找,也就是移动到光标左边的指定字符上。
“t“命令和”f“命令的区别在于,它移动到光标右边的指定字符之前。例如,”tx“会移动到光标右边第一个’x’字符的前面。”T“命令是”t“命令的反向版本,它移动到光标右边的指定字符之后。
这四个命令只在当前行中移动光标,光标不会跨越回车换行符。
可以在命令前面使用数字,表示倍数。例如,”3fx“表示移动到光标右边的第3个’x’字符上。
“;“命令重复前一次输入的f, t, F, T命令,而”,“命令会反方向重复前一次输入的f, t, F, T命令。这两个命令前也可以使用数字来表示倍数。
移动到行首、行尾
在vim中,移动到行尾的快捷键是$,移动到行首的快捷键是0.^是移动到行首第一个 非空的字符处
按单词移动
vim中,移动光标到下一个单词的词首,使用命令”w“,移动光标到上一个单词的词首,使用命令”b“;移动光标到下一个单词的结尾,用命令”e“,移动光标到上一个单词的结尾,使用命令”ge“。
翻页
Ctrl-f 即 PageDown 翻页。
Crtl-b 即 PageUp 翻页。
Ctrl + U 向上翻半页
Ctrl + D 向下翻半页
删除单词
d 命令有这个功能,比如,“dw”,这样留下的是normal模式,使用这个“cw”的模式,可以擦除这个字并且处于插入模式下。
. 命令
你没有看错,这就是一个 . 命令,让你重复上一次的命令。
合并命令
“J”命令就是将2行合并一行的命令。
改变大小写
”~”就是这个键。
在编辑模式下操作
其中用的最多的就是在插入模式下,输入多余的字的问题,在stackoverflow上有一个问题,就是问到这的,看来我这样的习惯还是不少的。
在插入模式移动光标
Ctrl + o 然后你可以随意的使用normal模式下的行为一次。
Ctrl + t 在编辑模式下缩进一个tab键
Ctrl + d 在编辑模式下回退一个tab键
使用Ctrl + ^ 去代替Caps Lock 键
这个在我的配置文件中实现了这样的功能,请使用Ctrl+f寻找一下。
搜索
简单搜索
/strings 就是搜索strings的字符串
注意, .*[]^%$~ 这些字符有特殊的含义, 想搜寻他们的话,必须使用”".
?
从文件的后面向前查找, 在显示匹配高亮的时候,按下”n”,就给你移动到下一条。
”/”是从前往后查找, 如果你接着执行”?”就会让你从后往前找。
文本
首先说明一点,vim的粘贴板其实一直很厉害,关键是自己没有开发出来,vim可以有26个粘贴板的。
cut, paste, copy
当你使用“dw”或者“dd”的命令是,再按一次p就把刚才删除的单词重新复制回来了。
如果你想键入“the”,但是你不小心输入了“teh”, 这是很正常的行为,这里,你可以将光标移动到字母“e“上,接着使用”xp“命令即可。”x”是删除字母e并保存到寄存器中,”p”将文字放到光标之后,”P”是将光标放到单词之后。
删除一大块text
这是强悍,你可能都没有听说过的方法。使用标记命令: mark
-
在你想要删除文本的地方使用命令 ‘ma’
-
移动光标到你想要删除文本的末尾
-
使用命令 “d’a”
其中的’a’可以使用其他的小写字母。
使用命令:
: marks
会展示所有的marks,如果使用
: marks args
就会展示当前文件的mark所在的行。
上面marks命令的第三个步骤,可以将d换为y,那样就成了复制一整大的文本。
过滤
这个技术用的这不多,这里有两类主要的:
在normal模式下,”!!ls”和”!!date”是最常用的命令。
编辑多个文件
vim 1.c 2.c 这样就会只打开1.c,如果你想快速切换到2.c,那么需要输入”: next”,在2.c中回到1.c, 需要使用”: previous”.
不在insert模式下,你可以使用”Ctrl+^”来切换这两个文件的编辑。
(注意,我将这个命令在insert模式下改为转为开启Caps Lock键,详情就在本文中)
正在编辑哪个文件
”: args”就是这个命令。
界面
打开一个新的窗口
:split
想要切换编辑的窗口的命令是”ctrl+w”
:split new-file
buffers
这块的东西有点罗嗦,
-
活动的(Action)
-
隐藏的(Hidden)
-
未活动的(Inactive)
:buffers
这句命令就是找出所有的buffers.
- Inactive buffer
h buffer is hidden
% Current file
# Alternate buffer
+ File has been modified
选择一个buffer
当你使用上面的命令,就会列出所有的buffer,怎么选择其中的一个呢?很简单,就是使用
:3buffer
或者
:sbuffer number
其中第一种方法可以在原视图中打开,这样就不会被分割太小了。带”s”的可以看成”split”和”buffer”的合体。
visual mode
先说一下visual是干什么用的。当你使用这个模式,你可以将某一块的文本选中,并且会高亮,然后你就可以处理其他的事务了。
进入
在normal模式下按下”v”键就可以了。注意这里,按下小写的”v”,是基于字符的visual mode,如果是大写的”V”,那么直接选中整行。如果这时候接着使用”Ctrl + v”则会以正方形的格式呈现。
编辑
如同在其他模式下的编辑一样,只不过已经选中了某快区域。
d
如果你选中了一行的一个字,这个命令就会删除那个选中的字。
D
如果你选中了一行的一个字,这个命令就会删除整行的字。
整体偏移 >
发现了一个在写markdown文件有用的文件了,就是使用visual mode选中文本(最好用”ctrl + v”)整体选中,接着按下”>”就可以整体偏移一个Tab键了。
程序员的指令
vim融合了很多的指令,这些指令对于你提高开发进度,具有不小的作用。
列出函数定义处
([CTRL-I, ]CTRL-I)是找出函数定义,这个命令,真的很有用,配合ctags,详情另看我的另一篇文章。
变量定义
“gd” 是寻找局部的变量定义,”gD”是寻找全局的变量定义。当然,前提是你把光标放在变量处。
展示宏定义
在定义的关键词处,按下”[d”两个键即可展示出相关的宏。
匹配括号
无论什么括号,都可以通过”%”来匹配另一半。对于c语言来说,还有评论(/* */), #if,#else,#endif
其他的作用,比如,如果有以下的代码:
void test()
{
{
printf("hello\n"):
}
}
你想着把代码块(里层)的printf语句缩进一个tab键,你可以使用visual mode,然后”>”,你还可以使用”%”键选择括号后,使用”>i{“这个组合,意思就是”inner {} block”
寻找man 手册
比如,你在写c语言的时候,恰巧不知道这儿的一个系统调用open()怎么使用,你可以将光标放在open上,按下大写的”K”,就可以看到man手册了
展示文件空格情况
这一个在Makefile文件的编写中具有很大的价值,因为Makefile特别注意这样的错误,那么使用
:set list
就可以看出是不是缩进的一个tab键(“^I”)
排序
有两种方式,只不过就是运用命令”!sort”的改进版。这里简单的介绍一种:
-
利用visual模式选中你想要排序的文本
-
执行”!sort”
Make文本
:make
这一部分才是vim对于c的厉害之处,现在,先看一下,其中的奥妙。
在你键入了上面的命令之后,如果没有错误报出,那么恭喜你,你的程序没有语法错误,假如不幸,报错了,使用下面的方法就可以让自己省点时间去调试错误。
先说第一点,就是有错误出来了,那么按一下”Enter”键,就会返回到你的程序的第一个出错点,光标就是定格在那里,不用动。修改完了,使用:
:cprevious
和
:cNext
目测这两个函数不是很好用,那么,
:clist or :cc
就很有用处了。前者是将错误列表重新显现,后者是展现现在的错误。
搜索字符串
真没有想到vim还提供这样的命令,
:grep -w printf *.c
在当前目录下grep所有的printf的关键词,其中,”-w”是全词匹配。
好,写了不少了,vim的基本技巧就写道这了,下一次我们开始另一篇神奇之旅。 谢谢!!!
替换字符串
可以直接使用, 在noraml模式下:
:1,ns/old-string/new-strng/g
# $: 最后一个