本篇较多的都是关于 vim 的快捷使用,另外夹杂着一些我觉得好用的技巧。
1.快捷键设置
举个栗子,例如每次在vim中敲完代码,退出vim再编译链接有点麻烦,可以用快捷键替换来实现写完代码立即运行
nnoremap <F5> :!gcc -o a.out % && ./a.out<CR>
写到vim配置文件 (~/.vimrc) 中即可。
如果没有,可以自己创建一个,但是创建之后,会缺少一些基本配置,因为默认的配置文件是 /etc/vimrc ,里面有一些原本的功能,有了 ~/.vimrc 后,系统会使用这个,所以配置时,建议其他功能一起配置。
这其实是一条映射,也就是把<F5>
映射成后面一长条语句,当按下F5,就相当于执行了那一条语句。
nnoremap
表示生效范围
1.第一个 n 代表
普通模式
,如果要在插入模式下实行替换,可以用i
,可视模式为v
;
2.nore
表示不递归,看网上说大概是大概是 no recursion…?如果不加 nore,将会递归替换,大多数时候容易造成混乱。
<F5>
表示按下F5键;
:
进入命令行模式;
!
在vim的命令行模式下用shell的命令;
!gcc -o a.out %
%代表当前文件名,gcc -o a.out % 即为编译链接当前文件,生成 a.out;
&&
表示同时执行两条命令
./a.out
运行当前目录下的a.out文件
<CR>
回车即"enter"键(也可小写)
定义组合键时,例如
ctrl + w
,配置时为<c-w>
;
alt + w
时, 配置为<m-w>
(w为任意键)
如果还没学会这个,那我们再来看一条(这个就不算快捷键了,只是简单的替换而已):
inoremap ( ()<esc>i
即在插入模式下,输入(
,就会自动变为输入()<esc>i
,为什么输入 () 不够,还要推出回到普通模式再输入 i 呢?因为这样,光标就会移动到括号中间,方便输入啦。现在学会了没有呢?
(后面第九条还有更多的 vim 的配置,这条为啥单独写这呢…我也不知道…可能是因为这个在我看来属于自己设置快捷键,你想实现什么功能就实现什么功能,可以设置单独的键,而后面的只能算配置自己的 vim 吧)
!!敲黑板:这个设置完真的是超级方便。
2.设置书签
在某一行,按下m,再按某个字母,例如’a’,表示在这一行设置了名为a的书签,当要查找这个书签时,按下单引号,再按下书签名即可。
设置书签:
mx
//x代表任意字母
查找书签:'x
//x代表设置书签时选择的任意字母
同时还可以设置很多字母,设置很多个书签。。。有时候写代码,函数与测试文件分开时,需要写一个函数测试一下,那在函数与测试代码之间就需要跳来跳去,用书签就很方便。
总体来说,写较长的代码,并且需要来回切换的时候比较方便吧,但是也可以直接开两个窗口(我屏幕小,还是喜欢跳来跳去…)
3.打开标签页
就像我们的网页,同时开启多个上面会有多个标签页,vim 也能这样:
:tabe xxx
xxx 为文件名,也可以加上路径,使得可以同时打开多个文件。
gt
切换到下一个标签页
gT
切换到上一个标签页
:q
关闭当前标签页
这个我倒是不常用…可能是因为我一般代码就开一两个窗口而已,最多也就三个,所以打开 vim 的时候我就会直接打开两个,然后用 :bn
来切换,但是什么时候我会用到呢,一般写着写着,突然发现要看下以前某个文件,我就会用标签页的方式打开(当然你也可以直接新开个窗口)。
4.快捷缩进与注释
[单行快捷缩进]
按“>>”或“<<”
(向右缩进/向左缩进)
无需选中本行,光标在这一行即可,按两下shift+
, 或两下shift+.
即可。
[快捷缩进]
进入可视块模式后,选中每行第一个字母,按
"<"
(shift+,) 向左缩进
">"
(shift+.) 向右缩进
[快捷注释]
进入可视块模式,选中注释的行开头,按
shift+i/I
(即在行首插入) ,再按//
,再按两下esc
[取消注释]
可视块模式选中所有的
//
,再按d(或x)
删除
总结:常用,非常好用。
5.vim的粘贴格式
很多时候可能复制了一段代码,要粘贴到vim里。然后就发现,啊这格式咋不了啊,多出来辣么多空格是咋回事…
就是格式的问题…
输入:set paste
,就可以解决格式问题,而只是简单的粘贴文本。
记得粘贴完成后退出 set no paste
。
emmmmm,很好记,要用到的时候能记住就好了,不然会发现粘贴格式很乱。
6.vim内快捷查找
:/xxx
查找“xxx”这个词
[按n查找下一个 N查找上一个]
[如果输入完:/xxx
后,再按*
,即完全匹配查找(如果你查找的是 a,有个词叫 aa ,这时候查找结果不会有 aa )]
?xxx
[不需要冒号,也是查找 xxx 这个词,但是和 :/xxx 方向相反]
:n
到第n行
不记住这个的话…还用什么 vim …
7.快捷替换
:%s/word1/word2
[把当前行第一个word1替换为word2]
:n1,n2 s/word1/word2/gc
[n1行到n2行,把word1都替换为word2,有c会一个个询问是否替换]
[如果只有/g
,就不会询问,直接全部替换]
这个有时候超级方便,我有时候用别的编辑器比如 word 什么的,也超希望能有这个功能…用过 n 多次,但是永远记不住…每次要用就打开自己这篇博客来看下…
8.vim内置分屏
依靠命令行模式来进行分屏,写代码时如果和前面有段代码要比对这些,但是又看不到前面的,就可以这么干(当然你也可以再打开个窗口啦,只是有时候分屏比较方便,虽然很多终端也自带分屏功能…)
:vs
水平分屏(后面+空格+文件名,可以打开指定文件来分屏)
ctrl+w
再移动光标,会在分屏幕模式下,左右移动光标
:sp
垂直分屏
ctrl+g
再移动光标,会在分屏幕模式下,上下移动光标
:q
退出当前分屏窗口
:qa
退出当前所有分屏窗口
可以将这些组合键设置成快捷键,更方便~
(但是悄咪咪的说一句…我一般直接再开个屏…因为我蠢记不住…)
9.vim的基本配置
vim ~/.vimrc 修改配置文件
(加个 .
代表隐藏文件)
syntax on " 语法高亮
set hlsearch " 设置搜索结果高亮 highlight search
set number " 显示行号
set tabstop=4 " Tab代表4个空格的宽度(我一般用2个)
set autoindent " 表示换行后自动缩进
set history=1000 " 记住的历史操作的数量,默认的是20
set mouse=a " 可以使用鼠标
"set mouse-=a " 不可使用鼠标
" 括号匹配
inoremap ( ()<ESC>i
inoremap { {<CR>}<ESC>O
inoremap [ []<ESC>i
inoremap " ""<ESC>i
inoremap ' ''<ESC>i
" inoremap jk <ESC> " jk退出
" 检测下一个是不是右括号,是的话自动覆盖(摘自百度)
inoremap ) <c-r>=ClosePair(')')<CR>
inoremap ] <c-r>=ClosePair(']')<CR>
inoremap } <c-r>=CloseBracket()<CR>
inoremap " <c-r>=QuoteDelim('"')<CR>
inoremap ' <c-r>=QuoteDelim("'")<CR>
function ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\<Right>"
else
return a:char
endif
endf
function CloseBracket()
if match(getline(line('.') + 1), '\s*}') < 0
return "\<CR>}"
else
return "\<Esc>j0f}a"
endif
endf
function QuoteDelim(char)
let line = getline('.')
let col = col('.')
if line[col - 2] == "\\"
return a:char
elseif line[col - 1] == a:char
return "\<Right>"
else
return a:char.a:char."\<Esc>i"
endif
endf
关于这一块的配置…本来是只写了这么点,其余的希望大家自己直接上网搜的,因为我自己写的一些配置,可能不是很好,怕误导了大家。但是写完这篇博客后的几个月的今天…还是忍不住给大家分享几条我的配置,由于是自己写的,也借阅网上的配置,所以写的我自己都觉得不太好…
nnoremap ii i<TAB>
这个就是,大家有没有发现…有时候敲代码,光标在行首,按了个 i
,光标还是在行首,但是我想要直接写代码滴呀,我要缩进啊,于是就设置个快捷键…按两下 i ,就直接进入插入模式,并且前面有缩进,真的超级方便…
nnoremap qq <esc>A
有时候正在输入,但是想立马到行尾,就可以这样实现先回到普通模式,再插入到行尾
其余的我想到再补充~~
10.vim内使用shell命令行
有时候需要在 vim 内使用 shell 的命令(例如要编译执行当前代码),当然可以立马新开一个窗口,或者像之前讲过的那样设置快捷键,但是现在要讲的是另一种方法:
:!xxx
即先进入 vim 的命令行模式,在按下 !
,这时候的目录是你当前文件的目录,然后就可以输入命令了,例如有时候,需要编译执行当前文件,就可以直接这么用。
是的…你用再开个窗口大法也可以,但是我还是会经常用这个的,因为方便啊,再开个窗口还要移动光标,这个直接按个 :
就好啦。
11.按键使用
总结了一些vim下常用的按键,已经熟练使用vim的请跳过本条…
(所有的大写建议 shift+… 来使用)
(1)一般模式下
移动光标:
(前面加数字,可以一下子跳很多格)
左:
h
;
下:j
;
上:k
;
右:l
;
b
:移到前一个单词开头
w
:移到后一个单词开头
e
:移到后一个单词末尾
gg
:移到首行开头
shift+g
/G
:移到末行开头
0
(零):移到当前行开头
^
:移动到行首非空白字符
$
:移到当前行行尾
[]
:跳转到上一个函数
][
:跳转到下一个函数
模式转换:
i
:进入插入模式(写在光标之前)
a
:进入插入模式(写在光标之后)
shift+i
/I
:进入插入模式(写在行首)
shift+a
/A
:进入插入模式(写在行尾)
o
(字母o):到下一行,插入空行,并进入插入模式
shift+o
/O
(大写O):到上一行,插入空行,并进入插入模式
esc
:退出插入模式,回到命令模式
:
(冒号):到命令行模式
复制粘贴删除:
yy
(或Y
):复制一行(3yy为复制3行)
p
:粘贴
dd
:删除一行(5dd为删除5行)
x
:删除一个字符(3x删除后面3个字符)
dw
:从当前光标开始,删除到单词结束
d$
:从当前光标开始,删除到行尾
r
:替换
shift+r
/R
:行替换
可视模式:
v
:可视模式
ctrl+v
:可视块模式
shift+v
/V
:可视行模式
撤销:
u
:撤销
ctrl+r
:取消撤销
(2)命令行模式中:
保存与退出
:w
保存
:q
退出 (:qw 保存并退出 :q! 不保存退出)
其他:
:set nu
设置行号 (set nonu 取消行号)
:set mouse=a
设置可以使用鼠标
:set mouse-=a
设置不能使用鼠标
普通模式下, 将光标放在
(
/[
/{
上,按下%
,光标将会跳到下一个匹配的)
/]
/}
,再次按%
,将会跳回去。(可用于调试时查看括号配对)
更具体的可以看 vimtutor
(直接在bash输入即可)
12.学会查找
按文件名查找:
find -name <filename>
这是一个最简单的查找命令,按名字查找当前目录下的文件,查找结果会显示路径。
按文件内容查找:
grep xxx <directory>
“xxx” 是你要查找的字符串,是要查找的目录。当然我们还可以添加选项,如-n
显示行号,-i
查找时忽略大小写,-v
反向查找。其他还可以搭配管道等等应用,但最简单的应用
参考
https://blog.csdn.net/sunlanchang/article/details/52549756