Linux(7):Vim 程序编辑器
vi
基本上 vi 共分为三种模式,分别是【一般指令模式】、【编辑模式】与【指令列命令模式】。
这三种模式的作用分别是:
一般指令模式(command mode)
以 vi 打开一个文件就直接进入一般指令模式了(这是默认的模式,也简称为一般模式)。在这个模式中,可以使用【上下左右】按键来移动光标,可以使用【删除字符】或【删除整列】来处理文件内容,也可以使用【复制、贴上】来处理文件数据。
编辑模式(insert mode)
在一般指令模式中可以进行删除、复制、贴上等等的动作,但是却无法编辑文件内容的。要等到按下『i , I , o, O, a,A,r,R
』等任何一个字母之后才会进入编辑模式。
通常在Linux中,按下这些按键时,在画面的左下方会出现【INSERT 或REPLACE】的字样,此时才可以进行编辑。而如果要回到一般指令模式时,则必须要按下【Esc】这个按键即可退出编辑模式。
指令列命令模式(command-line mode)
在一般模式当中,输入『:/?
』三个中的任何一个按钮,就可以将光标移动到最底下那一列。在这个模式当中,可以提供【搜寻资料】的动作,而读取、存盘、大量取代字符、离开 vi、显示行号等等的动作则是在此模式中达成的。
一般指令模式可与编辑模式及指令列模式切换,但编辑模式与指令列模式之间不可互相切换。
实例:
1.使用 vi filename
进入一般指令模式;
2.按下 i
进入编辑模式,即可编辑文字;
3.按下 Esc
按钮回到一般指令模式;
4.进入文件列模式,文件储存并离开 vi
环境。
使用:wq
存档(write)并离开(quit)。使用 ls -l
显示刚刚创立的文档:
按键说明
移动光标
第一部份:一般指令模式可用的按钮说明,光标移动、复制贴上、搜寻取代等
按键 | 说明 |
---|---|
h 或 向左箭头 | 光标左移一个字符 |
j 或 向下箭头 | 光标下移一个字符 |
k 或 向上箭头 | 光标上移一个字符 |
l 或 向右箭头 | 光标右移一个字符 |
如果想要进行多次移动的话,例如向下移动30列,可以使用"30j
"或"30↓
”的组合按键,亦即加上想要进行的次数(数字)后,按下动作即可。
按键 | 说明 |
---|---|
[ctrl]+[f] | 屏幕向下移动一页,相当于 [Page Down] |
[ctrl]+[b] | 屏幕向上移动一页,相当于 [Page Up] |
[ctrl]+[d] | 屏幕向下移动半页 |
[ctrl]+[u] | 屏幕向上移动半页 |
+ / - | 光标移动到非空格字符的 下 /上 一列 |
n<space> | n代表数字,按下数字后再按下空格键,光标会向右移动这个列的 n 个字符。 |
0 或 功能键 [Home] | 这是数字 0,移动到这一列的最前面字符处 |
$ 或 功能键 [End] | 移动到这一列的最后面字符处 |
H | 光标移动到这个屏幕的最上方的那一列的第一个字符 |
M | 光标移动到这个屏幕中央的那一列的第一个字符 |
L | 光标移动到这个屏幕的最下方的那一列的第一个字符 |
G | 光标移动到文件的最后一列 |
nG | 移动到这个文件的第 n 列 |
gg | 移动到这个文件的第一列,相当于 1G |
n<Enter> | n 为数字。光标向下移动 n 列 |
搜寻与取代
按键 | 说明 |
---|---|
/word | 向光标之下寻找一个名为 word 的字符串 |
?word | 向光标之上寻找一个名为 word 的字符串 |
n | n 是英文按键,代表重复前一个搜寻动作 |
N | N 是英文按键,代表反向前一个搜寻动作,前一个动作为 /word,则按下 N 后,表示动作?word |
:n1,n2s/word1/word2/g | n1 与 n2 为数字。在第 n1 与 n2 列之间寻找 word1这个字符串,并将其替代为 word2 |
:1,$s/word1/word2/g | 从第一列到最后一列寻找 word1这个字符串,并将其替代为 word2 |
:1,$s/word1/word2/gc | 从第一列到最后一列寻找 word1这个字符串,并将其替代为 word2,且取代前显示提示字符给用户确认是否需要取代 |
删除复制与黏贴
按键 | 说明 |
---|---|
x,X | 在一列字当中,x 为向后删除一个字符(相当于[del]按键),X 为向前删除一个字符(相当于[backspace]亦即是退格键) |
nx | 连续向后删除 n 个字符 |
dd | 删除游标所在的那一列 |
ndd | 删除游标所在的向下 n 列 |
d1G | 删除光标所在到第一列的所有数据 |
dG | 删除光标所在到最后一列所有的数据 |
d$ | 删除游标所在处到该列的最后一个字符 |
d0 | 删除游标所在处,到该列最前面的一个字符 |
yy | 复制游标所在的那一列 |
nyy | 复制游标向下的 n 列 |
y1G | 复制游标所在的第一列的所有数据 |
y | G 复制光标所在列到最后一列的所有数据 |
y0 | 复制光标所在的那个字符到行首的所有数据 |
y$ | 复制光标所在的那个字符到行尾的所有数据 |
p,P | p 为将已复制的数据在光标下一列粘上,P 则为粘在光标上一列。 |
J | 将光标所在列与下一列的数据合成同一列 |
c | 重复删除多个数据,10cj 代表向下删除 10 列 |
u | 复原前一个动作 |
[ctrl]+r | 重做上一个动作 |
. | 重复前一个动作 |
第二部份:一般指令模式切换到编辑模式的可用的按钮说明
进入插入或取代的编辑模式
按键 | 说明 |
---|---|
i, I | 进入插入模式(Insert mode ): i 为【从目前光标所在处插入】,Ⅰ为【在目前所在列的第一个非空格符处开始插入】 |
a, A | 进入插入模式(Insert mode ):a 为【从目前光标所在的下一个字符处开始插入】,A 为【从光标所在列的最后一个字符处开始插入】 |
o, O | 进入插入模式(Insert mode ):o 为【在目前光标所在的下一列处插入新的一列】;О 为在目前光标所在处的上一列插入新的一列 |
r, R | 进入取代模式(Replace mode ) :r 只会取代光标所在的那一个字符一次;R 会一直取代光标所在的文字,直到按下ESC为止 |
ESC | 退出编辑模式 |
第三部份:一般指令模式切换到指令列模式的可用按钮说明
指令列模式的储存、离开等指令
按键 | 说明 |
---|---|
:w | 将编辑的数据写入硬盘文件中 |
:w! | 若文件为只读,强制写入该文件 |
:q | 离开 vi |
:q! | 不保存强制离开 |
:wq | 储存后来开,若为 !wq 则为强制储存后离开 |
ZZ | 若文件没有变动,则不储存离开,若文件更改过,储存后离开 |
:w [filename] | 将编辑的数据储存成另一个文件(类似另存新档) |
:r [filename] | 在编辑的数据中,读入另一个文件的内容。即将 [filename] 中的内容加到光标后面 |
:n1,n2 w [filename] | 将 n1 到 n2 的内容储存成 filemname 这个文件 |
:! command | 暂时离开 vi 到指令模式下执行 command 的显示结果。 |
vim 环境变更
按键 | 说明 |
---|---|
:set nu | 显示 行号,设定之后,会在每一列的前缀显示该列的行号 |
:set nonu | 与 :set nonu 相反,取消行号 |
vim的暂存档、救援回复与开启时的警告讯息
当我们在使用vim 编辑时,vim 会在与被编辑的文件的目录下,再建立一个名为.filename.swp
的文件。
- 可能有其他人或程序同时在编辑这个文件:
找到另外那个程序或人员,请他将该 vim 的工作结束,然后你再继续处理;
如果只是要看该文件的内容并不会有任何修改编辑的行为,那么可以选择开启成为只读(O)文件。 - 在前一个 vim 的环境中,可能因为某些不知名原因导致vim中断(crashed):
如果之前的 vim 处理动作尚未储存,此时你应该要按下[R],亦即使用®ecover 的项目,此时 vim 会载入.man_db.conf.swp 的内容,让你自己来决定要不要储存。这样就能够救回来你之前未储存的工作。不过那个.man_db.conf.swp 并不会在你结束vim后自动删除,所以你离开vim后还得要自行删除.man_db.conf.swp才能避免每次打开这个文件都会出现这样的警告;
如果确定这个暂存盘是没有用的,那么可以直接按下 [D] 删除掉这个暂存盘,亦即(D)elete it这个项目即可。此时 vim 会载入man_db.conf ,并且将旧的.man_db.conf.swp删除后,建立这次会使用的新的.man_db.conf.swp。
[O]pen Read-Only: 打开此文件成为只读档,可以用在只是想要查阅该文件内容并不想要进行编辑行为时。
(E)dit anyway: 还是用正常的方式打开你要编辑的那个文件,并不会载入暂存盘的内容。不过很容易出现两个使用者互相改变对方的文件等问题!不好不好!
®ecover: 就是加载暂存盘的内容,用在你要救回之前未储存的工作。不过当你救回来并且储存离开vim后,还是要手动自行删除那个暂存档喔!
(D)elete it: 你确定那个暂存档是无用的!那么开启文件前会先将这个暂存盘删除!这个动作其实是比较常做的!因为你可能不确定这个暂存档是怎么来的,所以就删除掉他吧!哈哈!
(Q)uit: 按下q就离开 vim ,不会进行任何动作回到命令提示字符。
(A)bort: 忽略这个编辑行为,感觉上与quit非常类似!也会送你回到命令提示字符就是啰!
Vim 的额外功能
使用 vi 时其实就是在使用 vim
区块选择
按键 | 说明 |
---|---|
v | 字符选择,会将光标经过的地方反白选择 |
V | 列选择,会将光标经过的列反白选择 |
[Ctrl ]+v | 区块选择,可以用长方形的方式选择资料 |
y | 将反白的地方复制起来 |
d | 将反白的地方删除掉 |
p | 将刚刚复制的区块,在游标所在处贴上 |
多文件编辑
按键 | 说明 |
---|---|
:n | 编辑下一个文件 |
:N | 编辑上一个文件 |
:files | 列出目前这个 vim 的开启的所有文件 |
多窗口功能
按键 | 说明 |
---|---|
: sp [ filename] | 开启一个新窗口,如果有加 filename,表示在新窗口开启一个新文件,否则表示两个窗口为同一个文件内容(同步显示) |
[ctrl ]+w+j, [ctrl ]+w+↓ | 按键的按法是:先按下[ctrl]不放,再按下 w 后放开所有的按键,然后再按下 j (或向下箭头键),则光标可移动到下方的窗口 |
[ctrl ]+w+k, [ctrl]+W+↑ | 同上,不过光标移动到上面的窗口。 |
[ctrl]+w+ q | 其实就是:q结束离开。如果我想要结束下方的窗口,那么利用[ctrl]+W+↓ 移动到下方窗口,按下 :q 离开,也可以按 [ctrl]+w+q |
vim 的挑字补全功能
组合按钮 | 补齐的内容 |
---|---|
[ctrl]+x -> [ctrl]+n | 透过目前正在编辑的这个【文件的内容文字】作为关键词,予以补齐 |
[ctrl]+x ->[ctrl]+f | 以当前目录内的【文件名】作为关键词,予以补齐 |
[ctrl]+x -> [ctrl]+o | 以扩展名作为语法补充,以 vim内建的关键词,予以补齐 |
vim 环境设定与记录:~/.vimrc,~l.viminfo
vim 会主动的将你曾经做过的行为登录下来,记录在 ~/.viminfo 文件中。
整体 vim 的设定值一般是放置在 /etc/vimrc 这个文件,不过,不建议你修改他。可以修改~/.vimrc这个文件(预设不存在,自行手动建立 ),将所希望的设定值写入。
vim 常用指令示意图
图来源于:http://www.cnblogs.com/kevin2chen/p/6709968.html
Vim 使用注意事项
1.中文编码问题
中文编码有 big5 与 utf8 两种,如果文件是使用 big5 编码制作的,但在 vim 的终端接口中你使用的是万国码(utf8),编码不同,所以中文文件乱码。
这时考虑:
1.Linux系统默认支持的语系数据:这与/etc/locale.conf有关;
2.终端界面(bash)的语系:这与 LANG,LC_ALL这几个变数有关;
3.文件原本的编码;
4.开启终端机的软件,例如在 GNOME底下的窗口接口。
事实上最重要的是上头的第三与第四点,只要这两点的编码一致,你就能够正确的看到与编辑中文文件。
先修改语系编码:
LANG=zh_TW.big5
export LC_ALL = zh_TW.big5
然后在终端接口工具栏的【终端机】–>【设定字符编码】–>【中文(正体)(BIG5)】项目点选一下,如果一切都没有问题了,再用vim 去开启那个 big5编码的文件,就没有问题了!
2.DOS 与Linux 的断行字符
可以利用cat -A
来观察以 DOS (Windows系统)建立的文件的特殊格式,也可以发现在 DOS 使用的断行字符为^M$
,称为CR
与LF
两个符号。而在 Linux 底下,则是仅有LF($)
这个断行符号。
在 Linux 底下的指令在开始执行时,判断依据是【Enter】,而 Linux 的 【Enter】 为 LF 符号,不过,由于DOS 的断行符号是CRLF ,也就是多了一个 ^M
的符号出来。
在不同的系统之间复制一些纯文本文件时,要使用unix2dos
或 dos2unix
来转换一下断行格式。
语系编码转换
iconv -f 原本编码 -t 新编码 filename [-o newfile]
可以使用 iconv
进行文件语系编码的转换
《鸟哥的Linux私房菜-基础篇》学习笔记
相关文章:

Linux(7):Vim 程序编辑器
vi 基本上 vi 共分为三种模式,分别是【一般指令模式】、【编辑模式】与【指令列命令模式】。 这三种模式的作用分别是: 一般指令模式(command mode) 以 vi 打开一个文件就直接进入一般指令模式了(这是默认的模式,也简称为一般模式)。在这个模…...

windows搭建gitlab教程
1.安装gitlab 说明:由于公司都是windows服务器,这里安装以windows为例,先安装一个虚拟机,然后安装一个docker(前提条件) 1.1搜索镜像 docker search gitlab #搜索所有的docker search gitlab-ce-zh #搜索…...
力扣:单调栈算法思路题
单调栈分为单调递增栈和单调递减栈,通过使用单调栈我们可以访问到最近一个比它大(小)的元素。 🍊 单调递增栈:单调递增栈就是从栈底到栈顶数据是依次递增,通常是寻找某方向第一个比它小的元素。 …...

11 月 25 日 ROS 学习笔记——3D 建模与仿真
文章目录 前言一、在 ROS 中自定义机器人的3D模型1. 在 rviz 里查看3D模型2. xacro 二、Gazebo1. urdf 集成 gazebo2. 综合应用1). 运动控制及里程计2). 雷达仿真3). 摄像头信息仿真4). kinect 深度相机仿真5). 点云 前言 本文为11 月 25 日 ROS 学习笔记——3D 建模与仿真&am…...

MidJourney笔记(3)-Prompts
MidJourney的Prompts介绍 MidJourney的Prompts是MidJourney的核心之一,这也是我们后续使用MidJourney过程中最重要的工作内容,根据生成的图片,不断的优化我们的Prompts内容。 那Prompts的中文意思是提示的意思。 Prompts的提示语有很多,最基础的用法就是: /imagine prompt…...
贪心 D. Least Cost Bracket Sequence
Problem - D - Codeforces 题目大意:给一个只包含(,),?三个字符的字符串。每个?可以转为(或者),对于第 i i i个?转为(需要花费 a i a_i ai,转为)需要花费 b i b_i bi。现在问能否让该字符串转为合法的括号匹配…...

iOS APP包分析工具 | 京东云技术团队
介绍 分享一款用于分析iOSipa包的脚本工具,使用此工具可以自动扫描发现可修复的包体积问题,同时可以生成包体积数据用于查看。这块工具我们团队内部已经使用很长一段时间,希望可以帮助到更多的开发同学更加效率的优化包体积问题。 工具下载…...

在 VSCode 中使用 GDB 进行 C/C++ 程序调试(图文版)
(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮࿰…...
任意文件读取漏洞理解
任意文件读取漏洞理解 1. 漏洞描述: 任意文件读取漏洞是指攻击者可以利用漏洞读取系统上的任意文件,包括敏感信息的配置文件、用户数据甚至系统文件,从而获取未经授权的访问权限。 2. 漏洞原理: 这种漏洞通常是由程序处理用户输入…...
linux 安装yum
问题1:File "/usr/libexec/urlgrabber-ext-down", line 28 except OSError, e: ^ 问题2:yum File "/usr/bin/yum", line 30 except KeyboardInterrupt, e: ^ vim /usr/…...
数学启发式
学习资料: 优化求解器 | Gurobi 数学启发式算法:参数类型与案例实现 数学启发式算法 | 可行性泵 (Feasibility Pump)算法精讲:一份让您满意的【理论介绍编程实现数值实验】学习笔记(PythonGurobi实现) 大佬到底是大佬!这些资料太…...
Win10/Win11 使用Wsl的Ubuntu 子系统搭建CGO环境,相当于Ubuntu下开发。GO环境CGO搭建,支持交叉编译
背景: 之前是使用Mac 开发,最近切换到win11下面。发现使用cgo编译有问题。 下面记载了我的使用方法。 环境: win11(win10理论一样) win11 安装了wsl2的环境,并且安装了ubuntu系统。 在win11 上面安装了g…...

CSS新特性(2-2)
CSS新特性(2-2) 前言box相关box-shadow background背景rgba颜色与透明度transform:rotate(Xdeg) 2D旋转transform:tranlate 平移 前言 本文继续讲解CSS3其他的新特性,想看之前新特性点击这里,那么好本文正式开始。 box相关 box…...

为什么,word文件在只读模式下,仍然能编辑?
Word文档设置了只读模式,是可以编辑的,但是当我们进行保存的时候就会发现,word提示需要重命名并选择新路径才能够保存。 这种操作,即使可以编辑文字,但是原文件是不会受到影响的,编辑之后的word文件会保存到…...
29 - 装饰器模式:如何优化电商系统中复杂的商品价格策略?
开始今天的学习之前,我想先请你思考一个问题。假设现在有这样一个需求,让你设计一个装修功能,用户可以动态选择不同的装修功能来装饰自己的房子。例如,水电装修、天花板以及粉刷墙等属于基本功能,而设计窗帘装饰窗户、…...

逆矩阵相关性质与例题
1.方阵的行列式:就是将方阵中的每一个元素转换至行列式中。 1.性质一:转置方阵的行列式等于转置前的行列式。(对标性质:行列式与它的转置行列式相等) 2.性质二:|ka||a|*k的n次方,n为方阵阶数。 …...
Ruoyi项目传List到后台并使用Excel模板下载数据的方法以及遇到的各种前后端数据交互问题
import { download } from @/utils/requestconst app = createApp(App)// 全局方法挂载 app.config.globalProperties.download = download 首先因为ruoyi-ui中的main.js有配置如上全局注册: 因此只需要在vue中定义一个方法直接使用this.download调用下载即可: (download的3…...

区块链技术将如何影响未来的数字营销?
你是否听腻了区块链和数字营销等流行语,却不明白它们对未来意味着什么?那么,准备好系好安全带吧,因为区块链技术将彻底改变我们对数字营销的看法。从建立消费者信任到提高透明度和效率,其可能性是无限的。 让我们来探…...
小程序wx:if和hidden的区别?
wx:if:wx:if 是一个完整的条件渲染指令,当它的表达式为真时,才会渲染该指令所在的元素。如果表达式的值为假,则不会渲染该元素。这意味着在表达式为假时,该元素及其子元素都不会被渲染,就像它们从未存在过一…...
分布式幂等
分布式幂等 在分布式系统、网络通信和数据库操作中,幂等性是一个非常重要的概念,特别是在面对可能发生网络故障、消息重复、或者系统崩溃等情况时。 举个简单的例子,考虑一个银行转账的操作。如果转账操作是幂等的,那么无论你执…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...