什么是vim
Vim(Vi IMproved)是一款文本编辑器,它是从 Vi 编辑器发展而来的。Vim 在功能上比 Vi 更加强大,并提供了更多的扩展性和定制选项。
vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于x window、 mac os、windows。
注意它就是一个单纯的编辑器,跟我们平时写代码用的比如vs、DEVC++等不同,vs这些是集成开发环境(IDE),集成开发环境就是一系列开发工具的组合套装,包含编辑器,编译器,链接器,调式器等。
vim的常用模式
我们这里主要介绍vim的3种模式:
正常/普通/命令模式(Normal mode)
控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode
插入模式(Insert mode)
只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。
末行/底行模式(last line mode)
文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即可进入该模式。要查看你的所有模式:打开vim,底行模式直接输入
:help vim-modes
除此之外还有替换模式和视图模式也会提一下。
vim的基本操作
使用vim打开文件及默认的模式
如果我们要使用vim对某个文件进行编辑,直接vim +空格 +文件名即可
vim 文件名
这里的界面是配置过了,没有配置是更基础的一个界面.进入vim之后,是处于[正常模式],如果去按一些按键会发现是没有反应的,要切换到[插入模式]才能够输入文字。
此外,如果后面跟的文件名是不存在的,vim也会自动帮你创建,但是需要保存最后才能新建出这个文件,否则文件不会创建.
怎么进入插入模式?
从命令模式切换到插入模式的方法不止一种,现在我们先记住一种:
按键盘上的
i
键就可以从命令模式切换到插入模式
现在我们就可以向文件里面写入内容了:
怎么退出vim?
我们先按ESC回退到普通模式,进入普通模式后,如果要退出,还需要我们进行到另一个模式——末行模式。在普通模式下,输入shift + ;
, 其实就是输入:
,就可以进入末行模式, 如果成功进入,我们就会看到最底行有一个:,
然后我们输入q(quit)或wq 回车就可以退出。
: w (保存当前文件)
: wq (输入「wq」,存盘并退出vim)
: q! (输入q!,不存盘强制退出vim)
如果不知道自己当前处在什么模式下了,那就无脑按Esc,就会回到命令模式下,然后再根据自己的需要切换到其它模式下。
另外我们退出的时候一般都是wq保存退出,如果带上!表示强制退出(有些文件退出的时候可能会报提示,不会直接退出,当然你要是没权限强制也没用)
vim命令集
先演示在末行模式下,列出行号和取消行号的操作, 默认vim打开一个文件是不会加行号的, 由于我配置过vim所以会自动加行号,配置在后面会演示.
显示行号: 末行模式下, 输入
set nu 或者 set number
,然后回车即可
取消行号,
set nonu 或者 set nonumber
普通模式命令集
复制粘贴
「yy」:复制光标所在行到缓冲区。
「n+yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。
「p」:将缓冲区内的字符贴到光标所在位置。「n+p」:将缓冲区内的字符贴到从光标所在位置到下数n行。
注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。
按4yy,复制光标所在行在内下数四行:
按p粘贴刚才复制的四行:
此外还有两个与复制相关的指令:
「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
「n+yw」:复制n个字到缓冲区
撤销上一次操作
「u」: 如果您误执行一个命令, 可以马上按下「u」,回到上一个操作. 按多次“u”可以执行多次回复。
「ctrl + r」: 撤销的恢复
按u
,就可以撤销你上一次的操作,u可以连续执行多次:这里按了四次u
现在对刚才的撤销操作反悔了,我想撤销刚才的撤销操作:这里按了四次ctrl+r
剪切&删除
行删除:
「dd」:删除光标所在行
「n+dd」:从光标所在行开始删除n行
按完dd后原来第2行的内容就没了,如果此时不进行操作的话,就相当于删除
那如果我想把它剪切到现在的14行,那就把光标移到第13行,敲p,就粘到13行下面了,完成了剪切
那如果想一次剪切多行,ndd然后把光标移到你想要的位置敲p就可以了,不继续操作,就是删除掉对应的n行
注意:如果我们进行了一些操作之后,进入末行模式对刚才的修改进行保存(w)了,保存之后依然可以用u 或者Ctrl+r 进行撤销和恢复保存之前的操作。
但是,如果你保存退出了,再次用vim打开,就无法进行撤销恢复的操作了
字符删除:
「x」:每按一次,删除光标所在位置的一个字符
「n+x」:例如,「6x」表示删除光标所在位置的“后面(包含自己在内)”6个字符
「X」:大写的X,每按一次,删除光标所在位置的“前面”一个字符
「n+X」:例如,「20X」表示删除光标所在位置的“前面”20个字符
和行删除一样, 如果删除后不进行操作就是删除,按p的话即完成剪切.
移动光标
文本首尾
按[gg]:进入到文本开始
按[shift+g]:进入文本末端
跳至指定的行
「n+shift+g」(n+G):例如,「15G」,表示移动光标至文章的第15行行首。
行首尾
按「 $ 」:移动到光标所在行的“行尾”
按「^」:移动到光标所在行的“行首”
按单词移动
w
(小写):光标从当前位置跳到下个”单词“的开头
但是注意这里的单词不一定就是我们平时所熟悉的那种英文单词,单个字母也算单词.
n+w
:就相当于敲n次w
依次敲w的效果:
与w对应的:
b
:光标回到上个”单词“的开头n+b
:相当于敲n次b
效果与w相反
上下左右移动光标
我们上下左右移动光标的时候可以用键盘上面的上下左右的四个键去移动,但是我们一般不使用这个.而是使用h(左)、j(下)、k(上)、l(右).
那为什么呢?
首先这四个键离我们常用的这些键比较近,当然这是最不重要的理由。
最重要的原因是因为,以前的键盘上根本都没有带箭头的上下左右四个键不过现在vim基本也都兼容上下左右四个键的使用建议还是使用hjkl四个键
文本内容大小写切换
我现在想把圈出来的字符小写变成大写
Shift ~
:快速大小写切换(原来大写变成小写,原来小写变大写)
如果我们按着
Shift ~
不放,他就可以一直向后转换大小写
再按一次大写变小写:
替换
r
:替换光标所在处的字符 (先按r键,在按自己想替换的字符,就可以完成替换)
n+r
:替换光标所在处向后的n个字符
替换模式
刚才是把1个或n个字符替换成另外一个字符,但这样即使替换多个它们被替换的是同一个字符。那如果我们想替换成不同的任意字符呢?
敲Shift+R
(其实就是大写R)
Shift+R
是让我们进入了另一种模式——替换模式
我们直接敲我们想替换的字符,它就会依次往后进行替换,我们替换完一个,光标会自动往下一个移动:
替换完之后按Esc,就又回到命令模式了
插入模式的切换
除了i之外,还有两种方式进入插入模式:
按「
i
」切换进入插入模式「insert mode」,光标位置不动
按「a
」进入插入模式后,光标会移动到原来位置的下一个
按「o
」进入插入模式后,会新起一行,并且光标移动到新的一行的起始位置
末行模式命令集
上面已经介绍过几个命令:
set nu
:显示行号set nonu
:取消显示行号q
:退出q!: 强制退出不保存
wq:
保存退出wq!
:强制保存退出
搜索匹配
「/关键字」: 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。
「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。「shift+3」(#): 往前查找与光标所在处单词匹配的同名单词, 按「n」会进行单次跳转.
用/查找会从第一个匹配项开始查找:
用?查找会从最后一个匹配项开始查找:
按n可以依次定位到下一个匹配项,/查找是向下定位,?查找是向上定位.
如果找不到会报错:
shift+3查找:
跳到文件中的某一行
「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。
不退出vim直接执行终端界面的命令
:!+对应的命令
如果我们用vim写完一个test.c,想编译运行它,我们之前的方法就是保存退出vim,然后去编译执行它。不退出vim,也可以实现:
按回车返回:
输入: ! ll
输入: !./a.out
多文件分屏显示
在末行模式下,输入
vs 文件名
它就自动创建好并打开,且分屏显示出来, 光标显示在那个文件,你当前编辑的就是哪个文件
如何切换到另一个文件呢?
切换的话需要在命令模式下,按住Ctrl 不放,然后快速按两次w就可以切换
怎么退出呢?
光标在哪个文件退出的就是哪个文件
当前光标在test.h文件下:
按回车就退出了:
继续保存退出:
小技巧:
首先说明: 在退出文件后,下次再用vim打开该文件光标仍会显示在上次打开文件时光标停留的位置:
退出前光标在第七行:
再次vim打开test.c:
光标仍在第7行:
如果我想要在打开文件时光标指定到特定的行该怎么操作呢?
比如:当前第9行后漏掉了一个分号
gcc编译后会报错第十行printf前期望一个分号
这时最好能打开文件后直接跳转到报错的位置,所以就可以用到这个技巧:
指令: vim + 要打开的文件名 + 行数
vim test.c +10就可以直接进入test.c文件的第十行了:
视图模式
批量化注释
1.ctrl+v进入视图模式
2.通过j/k或者其他移动光标的指令选中要注释的区域:
3.按shift+i:
4.输入//:
5.按ESC:
批量化删除注释:
1.ctrl+v进入视图模式
2.移动光标确认位置:
3.按d
vim的配置
Vim 的配置是用来自定义 Vim 的行为和外观的设置。通过修改 Vim 的配置,您可以根据自己的喜好和需求,定制编辑器的各种功能和界面元素。
vim在启动的时候,会自动在当前用户的目录下,寻找配置文件——
.vimrc
(自己配置的话可能需要我们自己创建这个文件,配置的内容就放在该文件里面),如果没有,就用默认的。
一个用户,一个vim配置,我们所做的配置,不会影响其他用户。
Vim使用全指南 (环境配置,插件推荐,美化) (C++,Python,MarkDown,R...)_vim配置推荐-CSDN博客
VimForCpp: 快速将vim打造成c++ IDE (gitee.com)
解决普通用户不能sudo的问题
之前的文章里遗留了一个问题,就是我们想使用sudo去对一些指令进行提权的时候,可能用不了sudo:
如果一个新的普通用户无法使用 sudo,有可能是因为该用户还没有被添加到授权列表中,或者没有正确配置 sudo 权限。在默认的配置下,普通用户是没有权限使用 sudo 命令的。这是因为 sudo 是用于以超级用户(root)权限执行命令的工具,而普通用户通常只被分配了较为有限的权限。
sudo 的目的是确保系统的安全性,避免普通用户在没有适当权限的情况下执行危险或敏感的操作。只有经过授权的用户才可以使用 sudo,并且需要提供自己的密码来进行身份验证。
那我们如何把一个普通用户添加到信任列表里面或者说如何对一个普通用户进行授权呢?
要允许特定的用户使用 sudo,需要 root 用户或具备相应权限的用户编辑 /etc/sudoers 文件
100 + shift + g 光标定位到100行,再把这一行的内容复制粘贴一遍把root改为相应的用户名就可以了:
修改完之后wq!直接强制退出
然后我们再返回普通用户就可以使用sudo了:
如果你不想让它使用了,把它从对应的配置文件里面删掉就行。