Linux下vim的便捷使用

本篇较多的都是关于 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

哈哈哈哈哈哈