从这篇文章开始,我们要来学习一些Linux中的开发工具。
这篇文章,我们先来学习一下Linux中的文本编辑器——vim。
1. 什么是vim
首先我们来认识一下什么是vim
Vim(Vi IMproved)是一款文本编辑器,它是从 Vi 编辑器发展而来的。Vim 在功能上比 Vi 更加强大,并提供了更多的扩展性和定制选项。 vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于x window、 mac os、windows。我们这里统一按照vim来进行讲解。
2. vim的常用模式
上面提到,vim是一款多模式编辑器
注意它就是一个单纯的编辑器,跟我们平时写代码用的比如vs、DEVC++等不同,vs这些是集成开发环境(IDE),集成开发环境就是一系列开发工具的组合套装,包含编辑器,编译器,链接器,调式器等。 另外,既然是多模式的话,就涉及到每种模式的用法和差别,以及不同模式之间的切换。 虽然是多模式,但是我们在日常开发中最常用的也就3~5中模式。
那常用的模式都有哪些呢?
我们这里主要讲解vim的3种模式: 正常/普通/命令模式(Normal mode) 插入模式(Insert mode) 末行/底行模式(last line mode) 除此之外还有一个替换模式和视图模式我们讲的时候也会提一下。
3. vim的基本操作
那要使用vim进行编辑,首先第一个问题我们怎么打开vim呢?
如果我们要使用vim对某个文件进行编辑,直接vim +空格 +文件名即可 vim 文件名
当然如果后面跟的文件名是不存在的,vim也会自动帮你创建,你也可以选择先创建,再用vim编辑 比如,我现在创建一个文件test.c,然后用vim打开它
然后敲回车
🆗,打开之后就是这样子
那上面说vim有好几种模式,那我们打开vim之后它是处于那种模式呢?
我们进入vim之后,它默认是处于命令(正常)模式的。 命令模式主要用于控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入插入模式或者末行模式下。 那在命令模式下如果你去按一些按键会发现是没有反应的,也输不进去东西(除非你按到切换模式的命令切换到其他模式下了可能会有反应)。
那么如果你进入vim之后想对文件进编辑,那么需要进入到插入模式下:
那怎么进入呢? 🆗,从命令模式切换到插入模式的方法不止一种,现在我们先记住一种: 就是按键盘上的i
这个键就可以从命令模式切换到插入模式
这是我们打开之后默认的样子,现在在命令模式下。 我现在敲i
这个键
我们会看到左下角就会出现-- INSERT --
的字样,此时我们就进入插入模式了 那现在我们就可以向文件里面插入内容了
此时它就像一个记事本一样,我们可以随意写入和删除内容。
那然后我编辑好了,想退出vim,怎么退出?
那在插入模式我们一般是不能退出的,那怎么做呢? 我们先回退到命令模式,按键盘上的Esc键就可以从其它模式回退到命令模式
进入命令模式后,如果要退出,还需要我们进行到另一个模式——末行模式。 在命令模式下,输入shift + ;
, 其实就是输入:
,就可以进入末行模式
如果成功进入,我们就会看到最底行有一个:
然后我们输入q
(quit)回车就可以退出。 但是呢? 由于我们对文件进行了修改,直接q退出可能会退不了
所以我们要wq
,wq就代表保存写入的内容并退出(保存退出)
末行模式下输入wq,然后回车
就退出来了,并且我们刚才写入的内容也成功保存了。
再给大家补充一点注意事项:
如果你不知道自己当前处在什么模式下了,那你就无脑的去按Esc,就会回到命令模式下,然后再根据自己的需要切换到其它模式下。 另外我们退出的时候一般都是wq保存退出,如果带上!表示强制退出(有些文件退出的时候可能会报提示,不会直接退出,当然你要是没权限强制也没用)。
4. vim命令集
首先为了后面方便演示和讲解,先给大家说一个在末行模式下,列出行号和取消行号的操作:
现在再次用vim打开上面我们创建的文件test.c
打开之后默认处在命令模式下,然后我们shift + ;
即:
进入末行模式
那现在我们想让里面的文本显示行号,怎么做呢? 输入set nu
,然后回车即可
如果想取消行号,set nonu
上面说这个命令是在末行模式下的。
但是我们要学的大部分命令其实都是在命令模式下用的指令。
4.1 命令模式命令集
那下面,我就边演示边给大家讲解命令模式下命令集
首先来一个
复制粘贴
现在我的光标在第5行。 那我现在向复制光标所在的这一行: 按yy
,就可以复制光标所在行的内容
按完yy
,并没有什么反应,但是此时已经复制好了。 那我想把复制的内容,粘贴到当前光标位置的下一行。 对应的指令是p
按一次,就粘贴一次,一直按,就一直粘贴
当然,你如果按100p,就直接粘100行
即npp
,直接粘n行到光标所在行之后 那刚才yy是复制一行的内容,如果想一次复制n行可以吗? 当然,nyy
就可以一次复制n行(从当前行开始向下,带上当前行一共n行) 比如我现在想复制文本前3行
那我把光标放到第一行,然后敲3yy,就可以把前3行复制 是否成功复制前3行,我们可以粘贴出来看一下
现在我已经敲了3yy了,然后我把光标移到第3行,把它粘到第3行下面,我再敲p去粘贴
就可以了。 同样的np就可以粘n次。
依次撤销上一次操作
刚才复制的3行,我再敲个20p,粘贴20次,然后
我后悔了,我想把刚才粘贴的操作撤销掉,可以吗? 当然: 按u
,就可以撤销你上一次的操作,u可以连续执行多次
这是敲了20p之后的样子,我按u
我们看到下面会显示变化的信息 再按u
再按u
可以连续撤销
对撤销进行撤销(恢复)
那如果我现在对刚才的撤销操作反悔了,我想撤销刚才的撤销操作(注意理解这句话的意思),能做到吗?
可以的。 ctrl + r
,对之前的撤销进行恢复
这是之前连续撤销之后的样子 我敲ctrl + r
再敲ctrl + r
就可以这样一直恢复,恢复到不能再恢复为止
剪切&删除
上面讲了复制粘贴,那剪切怎么做?
比如现在光标在第3行,我们把第3行的内容进行剪切 那我就在光标在第3行的情况下敲dd
此时原来第3行的内容就没了,如果此时不进行操作的话,就相当于删除那如果我想把它剪切到现在的11行,那就把光标移到第10行,敲p,就粘到10行下面了
就剪切完成了 那如果想一次剪切多行,同样的,ndd,然后把光标移到你想要的位置敲p就可以了,不继续操作,就是删除掉对应的n行
我现在3dd
3行就没了 再敲p
就粘到光标所在行下面 当然照样可以np
然后给大家说一下:
如果我们进行了一些操作之后,进入末行模式对刚才的修改进行保存(w)了,保存之后依然可以用u 或者Ctrl+r 进行撤销和恢复保存之前的操作。 但是,如果你保存退出了,再次用vim打开,就无法进行撤销恢复的操作了
大家可以试一下,这里就不详细的演示了
移动光标(上下)
现在我把刚才的文本搞的行数多一点,然后来学一些移动光标的操作
我先粘贴个1000行内容
然后,我现在想把光标移动到最后一行,怎么做?
现在在第1行 🆗,Shift+G
(即输入大写g),就可以直接把光标移动到文本最末尾
然后我又想快速回到第1行:
gg
:移动光标到文本开始 直接敲gg
就回到第1行了
那现在我想把光标定位到第n行,比如第88行,第456行,怎么做呢?
n+Shift+G
:将光标定位到指定的第n行 比如78+Shift+G
移动光标(左右)
刚才学的是光标的上下移动,那左右移动呢?
比如,如何快速定位到文本的最后一行:
现在有这样一行长文本,我想直接定位到最后一个字符 Shift+4
:移动到光标所在行文本的“行尾”
直接定位到行首
Shift+6
:移动到光标所在行文本的“行首“
另外还有:
w
(小写):光标从当前位置跳到下个”单词“的开头 但是注意这里的单词不一定就是我们平时所熟悉的那种英文单词,大家可以多试一试,看一下它的一个效果,有些东西文字没办法很好地给大家说清楚 我来简单演示一下,比如
现在光标在p的位置,我现在敲w
再敲
相信大家能看出来它是怎么移动的。 当然它也支持加n n+w
:就相当于敲n次w 比如现在在开头
敲3w
那w是向后移动,向前呢?
b
:光标回到上个”单词“的开头nb
:相当于敲n次b
敲b
敲3b
文本内容大小写切换
在vim中还可以快速的进行大小写的切换:
比如
我现在想把圈出来的字符小写变成大写 Shift ~
:快速大小写切换(原来大写变成小写,原来小写变大写)
现在光标在h
的位置,此时我敲Shift ~
>它把h变成大写H,并且光标自动移到下一个位置 所以如果我们按着Shift ~
不放,他就可以一直向后转换大小写
当然也可以快速把大写换成小写
替换
接下来学习一些替换操作:
r
:替换光标所在处的字符
即先按r键,在按自己想替换的字符,就可以完成替换
我现在先按r,再按m
如果你想再换成其它字符,就再按r,然后再按你想替换的字符。
nr
:替换光标所在处向后的n个字符
我现在想把从当前光标位置开始向后的10个字符替换成x 那就敲10r ,再敲x
4.2 替换模式
刚才我们学的是把1个或n个字符替换成另外一个字符,但这样即使替换多个它们被替换的是同一个字符。
那如果我们想按自己的想法替换成不同的任意字符呢?
比如我现在想把这一段改成abcdefg...
不同的字母,怎么做呢? 我们敲Shift+R
(其实就是大写R)
敲完之后我们会发现左下方出现-- REPLACE --
其实Shift+R
是让我们进入了另一种模式——替换模式 然后,我们直接敲我们想替换的字符,它就会依次往后进行替换
我们替换完一个,光标会自动往下一个移动。
那替换完毕呢?
Esc,就又回到命令模式了
左下角就没有replace了
4.3 命令模式命令集(续)
我们再回到命令模式,继续学一些命令
删除
x
:每按一次,删除光标所在位置的一个字符
比如,光标现在在a的位置,我按一次x
a就被删掉了,光标到b了 我继续按就继续删 按着x不放,就一直往后删
nx:一次删除n个
我现在想把abcde这5个一次删掉 那么敲5x,就可以一次删掉5个
另外,刚才的删除都是从左往右删,如果从右往左呢? Shift X
(即大写X):删除光标所在位置前面位置的一个字符 n Shift X
:删除光标所在位置前面的n个字符
现在光标在g的位置 我按一次Shift X
按5 Shift X
4.4 上下左右移动光标
然后想给大家说一下:
我们上下左右移动光标的时候可以用键盘上面的上下左右的四个键去移动
但是我们一般不使用这个
而是使用h(左)、j(下)、k(上)、l(右) 那为什么呢? 首先这四个键离我们常用的这些键比较近,当然这是最不重要的理由。 最重要的原因是因为,以前的键盘上根本都没有带箭头的上下左右四个键
不过现在vim基本也都兼容上下左右四个键的使用 建议还是使用hjkl四个键
4.5 插入模式的切换
上面我们说了从命令模式进入插入模式的方式不止一种,上面只讲了一个i
但其实呢,有好多个,我们这里主要学习三个:
按「i
」切换进入插入模式「insert mode」,光标位置不动 按「a
」进入插入模式后,光标会移动到原来位置的下一个 按「o
」进入插入模式后,会新起一行,并且光标移动到新的一行的起始位置
大家可以自己试一试看看效果
4.6 末行模式命令集
末行模式上面我们已经学过几个操作了:
set nu
:显示行号set nonu
:取消显示行号q
:退出wq
:保存退出wq!
:强制保存退出
下面我们再来学几个,注意是在末行模式下
搜索匹配
/文本内容:匹配对应的文本内容并高亮显示
然后我按n可以依次定位到下一个匹配项
如果找不到会报错
不退出vim直接执行终端界面的命令
如果我们用vim写完一个test.c,想编译运行它,我们之前的方法就是保存退出vim,然后去编译执行它。
但其实,不退出vim,也可以搞:
我现在已经写好了,想编译它 可以不用退出vim,在末行模式下 输入!,然后敲对应的命令就好了 比如,编译这个test.c
回车
他就会执行对应命令并跳转到这个页面显示对应的结果,我们按任意键回到vim中
然后我们可以查看一下有没有生成可执行程序
!ls -l
回车
已经生成了 然后!./a.out
执行
就执行成功了
替换
末行模式下也可以进行一些替换操作
比如我现在想把所以hello替换成HELLO 那这样做:
回车
就替换好了
多文件分屏显示
我们平时写代码可能还会多文件分离编译或者头文件源文件分开,就像这样
那我们在vim上可以不可以这样搞呢?
可以的。 比如
我现在把test.c修改成这样,然后我想在创建一个头文件test.h
,把show函数的声明和头文件的包含放到test.h
里面 怎么做呢? 我们还没创建test.h文件,不过我们直接用vim打开文件,如果文件不存在,最后我们选择保存的话他会自动帮我们创建 所以,在末行模式下,我直接输入vs test.h
它就自动帮我创建好并打开,且分屏显示出来 现在分屏了,你去看你的光标在那个文件,你当前编辑的就是哪个文件
那如何切换到另一个文件呢? 切换的话需要在命令模式下,按住Ctrl 不放,然后快速按两次w就可以切换
然后我把它编辑成这样
当然你还可以继续创建新文件去分屏,但我们一般不会分太多,那样体验也不好
那这种情况我们怎么退出呢?
比如我现在要退出test.c,那首先要确保光标在test.c里面 然后,进入末行模式
还是wq就可以保存退出了
此时就只剩test.h了 继续保存退出
我们看到test.h也自动生成了
编译运行照样是可以的
然后,再给大家提一点:
我们进入vim之后,尽量就不要在使用鼠标操作了
5. vim的配置
Vim 的配置是用来自定义 Vim 的行为和外观的设置。通过修改 Vim 的配置,您可以根据自己的喜好和需求,定制编辑器的各种功能和界面元素。
vim在启动的时候,会自动在当前用户的目录下,寻找配置文件——.vimrc
(自己配置的话可能需要我们自己创建这个文件,配置的内容就放在该文件里面),如果没有,就用默认的。 一个用户,一个vim配置,我们所做的配置,不会影响其他用户。
那关于vim的配置,网上也可以找到很多相关的内容,这里就不详细介绍了。
配置好大概就是这样的:
6. 解决普通用户不能sudo的问题
我们之前的文章里遗留了一个问题,就是我们想使用sudo去对一些指令进行提权的时候,可能用不了sudo:
另外大家看图,我们会发现一个奇怪的问题: 我们想用sudo提权,但是他让我们输入的却不是root的密码,而是当前的普通用户的密码。 但是我输了自己的密码还是用不了。
那这是怎么回事呢?
我当前这个用户之所以用不了sudo,是因为我并不在系统的信任列表里面。 如果一个新的普通用户无法使用 sudo,有可能是因为该用户还没有被添加到授权列表中,或者没有正确配置 sudo 权限。 在默认的配置下,普通用户是没有权限使用 sudo 命令的。这是因为 sudo 是用于以超级用户(root)权限执行命令的工具,而普通用户通常只被分配了较为有限的权限。 sudo 的目的是确保系统的安全性,避免普通用户在没有适当权限的情况下执行危险或敏感的操作。只有经过授权的用户才可以使用 sudo,并且需要提供自己的密码来进行身份验证。
那我们如何把一个普通用户添加到信任列表里面或者说如何对一个普通用户进行授权呢?
🆗,要允许特定的用户使用 sudo,需要 root 用户或具备相应权限的用户编辑 /etc/sudoers 文件。 我们可以看一下这个文件
它的拥有者和所属组都是root。 所以,要给普通用户授权的话,一般需要超级用户root进行操作,因为root一般不受权限约束。
那具体怎么做呢?
我们用vim打开对应的/etc/sudoers这个文件:
然后怎么添加呢? 我们找到这一行:
然后直接把100行复制一下,拷贝到下面,再把root改成你当前的普通用户名就行了
然后保存退出,退出不了直接强制退出
然后我们再返回普通用户就可以使用sudo了。 如果你不想让它使用了,把它从对应的配置文件里面删掉就行。