【linux系统编程】基础开发工具:vi/vim

2023-10-27

Linux文本编辑器 – vim

正文开始@Assassin

经典老图:
在这里插入图片描述
vim高清pdf

1. vim基本介绍:

vi/vim是多模式文本编辑器,其代码补全、编译及错误跳转等方便编程的功能十分丰富;vim是vi的升级版,vim兼容vi的所有指令,且在vi的基础上增加了许多新特性;例如语法加亮,可视化操作;vim具有跨平台的特性,不仅可以在终端运行,也可以运行于Windows,MacOS等操作系统;

vim在日常做开发的时候,主要解决编写代码的问题,本质上就是一个多模式的文本编辑器;vim与IDE只能说各有千秋,IDE对比vim自然有更为强大的代码补全,编写操作便捷,易于多文件管理的优点,同样地,vim相比于IDE也有更强的代码跳转,批量化操作快捷,更轻量化的优点,更为重要的是vim也可以进行相关配置以达到或趋于IDE同样的效果;

vim常用的有4种模式:命令模式/普通模式,插入模式,底行模式,可视化模式;

  • ① 命令模式(Normal mode):
    在命令模式下,用户可以控制屏幕光标的移动,字符、字或行的删除,复制粘贴,剪贴,修改等操作;命令模式也是Vim启动后的默认模式;
  • ② 插入模式(Insert mode):
    只有在插入模式下才能进行字符输入,插入模式是使用最频繁的编辑模式;
  • ③ 底行模式(Command mode):
    在底行模式下,用户可以将文件保存或退出,也可以进行查找字符串等操作;例如执行vim命令(" : " 键),搜索(" / " 和 " ? " 键)或者执行shell命令(" ! " 键)在底行模式下还可以直接输入 help vim-modes 查看当前vim所支持的所有模式;
  • ④ 可视化模式(Visual mode):
    可视化模式与普通模式比较相似,但是移动命令会扩大高亮的文本区域,高亮区域可以是字符、行或者是一块文本;当执行一个非移动命令时,命令会被执行到这块高亮的区域上; Vim的 " 文本对象 " 也能和移动命令一样用于该模式中;

底行模式中:

:help vim-modes 

查看当前云服务器的全部模式:
7种BASIC modes:
在这里插入图片描述
6种ADDITIONAL modes:
在这里插入图片描述
这里注意:不同服务器的编辑模式数量可能会不一致,我的是13种,小伙伴们的不一定是13种哈~~

2. vim下各模式的切换:

指令: vim [文件名]
功能: 使用vim编辑器打开相应文件,若文件不存在则默认直接创建

[Assassin@Ninghai Calculate_net]$ vim client.hpp 

进入vim后默认为命令模式(普通模式),需要输入字符需切换到插入模式,需要执行vim下的命令需切换到底行模式;
在这里插入图片描述
[命令模式] 切换至 [插入模式]:

  • 输入「i」:进入插入模式,光标位置不变
  • 输入「a」:进入插入模式,光标位置向后移动一个字符
  • 输入「o」:进入插入模式,光标位置切换至下一行的行首
  • 输入「I」:进入插入模式,光标位置位于当前行的行首
  • 输入「A」:进入插入模式,光标位置位于当前行的行尾
  • 输入「O」:进入插入模式,光标位置切换至上一行的行首

[命令模式] 切换至 [底行模式]:

  • 输入「Shift + ;」即可,实际上就是输入英文冒号「:」

[命令模式] 切换至 [可视化模式]:

  • 输入「 Ctrl + v 」,进入可视化模式中的可视化块模式

[插入模式][底行模式][可视化模式] 切换至 [命令模式]:

  • 插入模式,底行模式,可视化模式切换至命令模式都是直接输入「Esc」键即可

接下来简单介绍一哈各模式中的基本操作
ps: 插入模式就不说了,光写就完事了


3. vim命令模式:

【移动光标】:

  • ① 输入「k」:光标上移
  • ② 输入「j」:光标下移
  • ③ 输入「h」:光标左移
  • ④ 输入「l」:光标右移
  • ⑤ 输入「$」(Shift + 4):移动光标至当前行的行尾
  • ⑥ 输入「^」(Shift + 6):移动光标至当前行的行首
  • ⑦ 输入「gg」:移动光标至到文本的起始位置
  • ⑧ 输入「Shift + g」:移动光标至文本最末尾位置
  • ⑨ 输入「n + Shift + g」:移动光标至第n行的行首
  • ⑩ 输入「n + Enter」:当前光标向下移动n行
  • ⑪ 输入「w」:光标按照从左到右,从上到下的方式跳转到下一个word的开头
  • ⑫ 输入「e」:光标按照从左到右,从上到下的方式跳转到下一个word的结尾
  • ⑬ 输入「b」:光标按照从右到左,从下到上的方式跳转到上一个word的开头
  • ⑭ 数字键搭配 k,j,h,l:例如 5 + l 就是光标往所在行右移5个字符,3 + h 便是往所在行左移3个字符,1 + j 是光标往下移动1行,4 + k是光标往下移动4行
  • ⑮ 输入「Shift + m」(M):移动光标至当前页的正中间行的第一个字符
  • ⑯ 键盘上的上下左右键参照 k,j,h,l

配图效果也不明显,建议自行尝试

【删除】:

  • ① 输入「x」:删除光标所在位置的字符
  • ② 输入「nx」:删除光标所在位置开始往后的n个字符
  • ③ 输入「X」(shift + x):删除光标所在位置的前一个字符
  • ④ 输入「nX」(n + shift + x):删除光标所在位置的前n个字符
  • ⑤ 输入「dd」:删除光标所在行
  • ⑥ 输入「ndd」:删除光标所在行开始往下的n行
  • ⑦ 输入「dw」:删除一个word,删除光标所在位置到单词尾的字符
  • ⑧ 输入「ndw / dnw」:删除n个word,删除光标所在位置开始往后的n个word

配图效果也不明显,建议自行尝试

【复制粘贴】:

  • ① 输入「yy」:复制光标所在行到缓冲区
  • ② 输入「nyy」:复制光标所在行开始往下的n行到缓冲区
  • ③ 输入「yw」:yw,复制一个单词,将光标所在位置开始到单词尾的字符复制到缓冲区,注意使用yw复制单词后再使用p粘贴时,默认直接在当前行粘贴
  • ④ 输入「nyw」:复制n个单词,将光标所在位置开始往后的n个word复制到缓冲区,nyw使用p粘贴时跟yw同理,在当前行粘贴
  • ⑤ 输入「p」:将已复制的内容在光标的下一行粘贴
  • ⑥ 输入「np」:将已复制的内容在光标的下一行粘贴n次

小贴士: 这里出现了yy跟yw复制时粘贴是否在当前行的情况,应该不是粘贴p的问题,原因在于yy是复制一整行,包括了换行符 " \n ",粘贴时自然也就在下一行了,而yw是单纯复制word,不存在粘贴时换行的情况~~

【剪切】:

  • ① 输入「dd」:剪切光标所在行
  • ② 输入「ndd」:剪切光标所在行开始往下的n行
  • ③ 输入「p」:将已剪切的内容在光标的下一行粘贴上
  • ④ 输入「np」:将已剪切的内容在光标的下一行粘贴n次
  • ⑤ 补充:dw同样也有剪切的功能

【撤销】:

  • ① 输入「u」:撤销操作,多次按u会撤销多次
  • ② 输入「Ctrl + r」:恢复刚刚的撤销,反撤销

【大小写切换】:

  • ① 输入「~」(Shift + `):完成光标所在位置字符的大小写切换
  • ② 输入「n~」(n + Shift + `):完成光标所在位置开始往后的n个字符的大小写切换
  • ③ 长按「~」:完成光标所在位置到行尾所有字符的大小写切换

【字符替换】:

  • ① 输入「r」:替换光标所在位置的字符
  • ② 输入「R」:进入字符替换模式,可替换光标所到位置的字符,直到按下「Esc」键为止

【更改】:

  • ① 输入「cw」:将光标所在位置开始到单词尾的字符删除,并进入插入模式
  • ② 输入「ncw / cnw」:将光标所在位置开始往后的n个单词(word)删除,并进入插入模式

【翻页】:

  • ① 输入「Ctrl+b」:向上翻一页
  • ② 输入「Ctrl+f」:向下翻一页
  • ③ 输入「Ctrl+u」:向上翻半页
  • ④ 输入「Ctrl+d」:向下翻半页

【查找字符串】:

  • ① 向下查找「 / + 字符串」 :底行模式下输入 / +待查找的字符串,回车后便可高亮对应的字符串,按 n 跳转到下一个匹配到的字符串,Shift + n 向上匹配字符串

在这里插入图片描述

  • ② 向上查找「 ? + 字符串」 :底行模式下输入 ? +待查找的字符串,回车后便可高亮对应的字符串,按 n 跳转到上一个匹配到的字符串,Shift + n 向下匹配字符串

在这里插入图片描述

【全文格式对齐】:

  • 输入「gg=G」:实现全文格式对齐

在这里插入图片描述
gg=G:
在这里插入图片描述

以上操作都建议自己尝试一哈,有些懒得配图了,而且不是gif的话效果也不明显


4. vim底行模式:

在处于命令模式下,输入「:」即可进入底行模式

【行号设置】:

  • ① 输入「set nu」后回车:显示行号
  • ② 输入「set nonu」后回车:取消行号

这里浅看一下⑧:
在这里插入图片描述set nu:显示行号 ; 取消行号就不看了
在这里插入图片描述

【保存退出】:

  • ① 输入「w」后回车:write,写入文件,保存文件
  • ② 输入「q」后回车:quit,默认不保存退出vim,如果无法离开vim,可在「q」后面跟一个「!」表示强制退出
  • ③ 输入「wq」后回车:保存并退出
  • ④ 输入「wq!」后回车:强制保存并退出

【分屏指令】:

  • ① 输入「vs 文件名」后回车:在vim窗口下打开另一个指定文件,实现多文件的编辑
  • ② 输入「Ctrl+w+w」后回车:光标在多屏幕下进行切换

like this:Ctrl + ww实现窗口之间的跳转
在这里插入图片描述

【执行shell指令】:

  • 输入「! + 指令」:在不退出vim的情况下,可以在指令前面加上「!」就可以执行Linux shell指令,例如查看目录、编译当前代码,查看man手册等

在这里插入图片描述

【新建存档 / 读取存档】:

  • ① 输入「w + 文件名」后回车:write,将该文件的内容储存成另一个文件(类似另存新档)
  • ② 输入「r + 文件名」后回车:read,在编辑的文件中,读入另一个文件的数据,追加式读入数据

在这里插入图片描述
ll:
在这里插入图片描述
less:
在这里插入图片描述
读取存档就不演示了,注意 r 读取是追加式的,不会覆盖原有的数据

【字符串替换】:

  • ①「%s/原字符串]/[目的字符串]/g」:全文范围将原字符串替换出目标字符串

替换前:
在这里插入图片描述
替换后:
在这里插入图片描述

  • ②「s/原字符串]/[目的字符串]/g」:在当前行中,将所有的原字符串替换成目标字符串

替换前:
在这里插入图片描述
替换后:
在这里插入图片描述

  • ③「n1,n2s/原字符串]/[目的字符串]/g」:将n1行到n2行中所有的原字符串替换成目标字符串

替换前:
在这里插入图片描述
替换后:
在这里插入图片描述

补充:在底行模式下,使用命令 " %s/[待替换字符串]/[目标字符串]/g " 时:

不加%表示替换光标所在行,加%则表示替换全文;
不加g表示只替换行中第一个匹配到的字符串,加g则表示替换行中所有匹配到的字符串

是否带g请自行测试;

5. vim可视化模式:

vim的可视化模式只简单介绍一下快速批量化注释和去注释,有一说一,可视化模式在日常编程中用的不是很多,掌握简单的注释操作应该就ok了,深入的话可以自行搜索了解

【添加注释】:

Ctrl + v 进入块选择模式,然后移动光标(h,j,k,l)选中要注释的行,再按大写的 I 进入行首插入模式输入注释符号如 // 或 #,输入完毕之后,按 Esc,Vim 会自动将选中的所有行首都加上注释,保存退出完成注释:
在这里插入图片描述
效果:
在这里插入图片描述
【取消注释】:

Ctrl + v 进入块选择模式,选中需要删除行的注释符号,注意 // 要选中两个,选好之后按 d 即可删除注释,Esc 保存退出:
在这里插入图片描述
效果:
在这里插入图片描述

6. 额外补充:

6.1 非法退出:

小白在vim中编辑时可能会出现各种各样的问题,比如编辑错了想按 Ctrl + z之类的退出编辑,或者直接关掉服务器,这样暴力操作过后下次再打开文件时可能会出现如下提示信息:生成一个.swap文件(安全机制)
在这里插入图片描述
根据提示,我们可以按 R 进行recovery进入文件,不过这样操作在下次进入文件是依旧会出现上述提示

解决方法:
找到该.swap文件,使用 rm 进行删除即可
在这里插入图片描述
rm:rm后即可正常进入文件
在这里插入图片描述

6.2 shell界面多文件打开:

vim -o file1 file2
vim -O file1 file2
# -o: 小写o会上下分屏打开两个文件
# -O: 大写O会左右分屏打开两个文件
# 使用-o上下打开两个文件后,可以通过输入 [Ctrl + w + 上下箭头/j,k]切换文件
# 使用-O左右打开两个文件后,可以通过输入 [Ctrl + w + 左右箭头/h,l]切换文件
# ps:两种方式均可通过 [Ctrl + ww]进行切换

这里只演示上下分屏:

[Assassin@Ninghai Calculate_net]$ vim -o client.hpp server.hpp

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【linux系统编程】基础开发工具:vi/vim 的相关文章

随机推荐

  • 农业温室大棚养殖系统智能监控方案

    温室大棚农作物的种植给人们的生活带来极大的便利 并得到了迅速的推广和应用 在不适宜植物生长的季节 为保证作物温室生育期和作物产量 实时地收集温度 湿度 光照 气体浓度以及土壤水分等信息并汇总物通博联智能网关上传到物通博联云 为了给农作物创造
  • WebSocket 协议使用

    WebSocket 协议实现在受控环境中运行不受信任代码的一个客户端到一个从该代码已经选择加入通信的远程主机之间的全双工通信 用于这个的安全模型是通 常由 web 浏览器使用的基于来源的安全模型 该协议包括一个打开阶段握手 接着是基本消息帧
  • 数据分析之数据预处理、分析建模、可视化

    大纲 思维导图 1 数据分析概述 1 1 简介 1 2 发展历程 1 3 应用领域 1 4 开发流程 2 数据类型 2 1 结构化与非结构化数据 2 2 定性与定量数据 2 3 截面数据与时间序列数据 3 数据来源 4 数据预处理方法 4
  • 初始vue(二)

    vue详细学习 二 class的操作 div class play judge data judge true div data msg div 1212323 div data msg div 1212323 div 不能解析 的内容 d
  • 【深度学习】Pytorch 系列教程(一):PyTorch数据结构:1、Tensor(张量):维度(Dimensions)、数据类型(Data Types)

    目录 一 前言 二 实验环境 三 PyTorch数据结构 0 分类 1 Tensor 张量 1 维度 Dimensions 0维 标量 1维 向量 2维 矩阵 3维张量 2 数据类型 Data Types 一 前言 ChatGPT PyTo
  • linux中gvim配置

    文章目录 前言 一 在哪配置 二 设置语句 三 运行结果 前言 对于在linux上工作的硬件工程师来说 换到一个新的服务器或者工作环境 首先要做的几件事中肯定有一项是设置gvim配置 这里纪录下我的常用gvim配置和注释 仅供参考 如有错误
  • mysql TRUNCATE delete

    mysql truncate 和delete 都用与删除数据表里的数据 truncate命令则是直接将全表的数据清空掉 delete命令可以不带where 可以达到同样的目的 delete通过where带上条件删除部分数据 从这可以看出de
  • Nginx_http_upstream_check_module应用

    ngx http upstream check module 该模块可以为Nginx提供主动式后端服务器健康检查的功能 该模块在Nginx 1 4 0版本以前没有默认开启 它可以在配置编译选项的时候开启 configure with htt
  • C++的特性(封装、继承、多态、抽象)的详解

    封装 封装目的 模块化 信息隐藏 封装 隐藏对象的属性和实现细节 仅对外公开接口和对象进行交互 将数据和操作数据的方法进行有机结合 是通过特性和行为的组合来创建新数据类型让接口与具体实现相隔离 C 中是通过类来实现的 为了尽量避免某个模块的
  • MIPI I3C简介

    前面的文章介绍过MIPI联盟发布的MIPI CSI DSI D PHY等接口 这一篇文章来简单聊一聊I3C 同样由MIPI联盟制定 主要用于替代传统的USRT I2C和SPI 并向下兼容I2C 由于已经有网友写过相关的文章 并且写的很不错
  • signature=462fd3702561f02c1dc8858a887d01f8,baly-20201118

    0001747079 20 000139 txt 20201119 0001747079 20 000139 hdr sgml 20201119 20201119073031 ACCESSION NUMBER 0001747079 20 0
  • EF(Entity Framework)通用DBHelper通用类,增删改查以及列表

    其中 通用类名 DBhelper 实体类 UserInfo 1 新增 2 DBHelper
  • wedo巡线机器人编程教程_这是一个机器人和编程的时代

    图中在草地上自在奔跑的机器人是波士顿动力公司 BostonDynamics 开发的类人双足机器人Atlas 由麻省理工 MIT 电子工程与计算机科学系的教授马克 雷波特在1992年创立 一直致力于将机器人变成自然界的一个新物种 经过20多年
  • Springboot集成knife4j实现风格化API文档

    Springboot集成knife4j实现风格化API文档 POM引入插件
  • GoLang之使用uber-go/dig进行依赖注入

    文章目录 GoLang之使用uber go dig斤进行依赖注入 1 依赖输注入介绍 2 main函数反面例子 3 下载DI依赖 4 main函数使用DI优化 5 注意点 GoLang之使用uber go dig斤进行依赖注入 注 本文是基
  • AtomicInteger、Unsafe类、ABA问题

    AtomicInteger Java中的AtomicInteger大家应该很熟悉 它是为了解决多线程访问Integer变量导致结果不正确所设计的一个基于多线程并且支持原子操作的Integer类 AtomicInteger内部有一个变量UnS
  • Linux 中的 chroot 命令及示例

    Linux Unix系统中的chroot命令用于更改根目录 Linux Unix 类系统中的每个进程 命令都有一个称为root 目录的当前工作目录 它更改当前正在运行的进程及其子进程的根目录 在此类修改的环境中运行的进程 命令无法访问根目录
  • 巧用redis实现点赞功能,它不比mysql香吗?

    提到点赞 大家一想到的是不是就是朋友圈的点赞呀 其实点赞对我们来说并不陌生 我们经常会在手机软件或者网页中看到它 今天就让我们来了解一下它的实现吧 我们常见的设计思路大概分为两种 一种自然是用MySQL等数据库直接落地存储 另外一种就是将点
  • 常见linux服务器存储空间,怎么在linux上查看服务器的存储空间多大

    1 Linux下可以在 proc cpuinfo中看到每个cpu的详细信息 但是对于双核的cpu 在cpuinfo中会看到两个cpu 常常会让人误以为是两个单核的cpu 其实应该通过Physical Processor ID来区分单核和双核
  • 【linux系统编程】基础开发工具:vi/vim

    Linux文本编辑器 vim 正文开始 Assassin 目录 Linux文本编辑器 vim 1 vim基本介绍 2 vim下各模式的切换 3 vim命令模式 4 vim底行模式 5 vim可视化模式 6 额外补充 6 1 非法退出 6 2