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 是一个完整的条件渲染指令,当它的表达式为真时,才会渲染该指令所在的元素。如果表达式的值为假,则不会渲染该元素。这意味着在表达式为假时,该元素及其子元素都不会被渲染,就像它们从未存在过一…...
分布式幂等
分布式幂等 在分布式系统、网络通信和数据库操作中,幂等性是一个非常重要的概念,特别是在面对可能发生网络故障、消息重复、或者系统崩溃等情况时。 举个简单的例子,考虑一个银行转账的操作。如果转账操作是幂等的,那么无论你执…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
