Linux之高效文本编辑利器 —— vim

目录

一、vim的基本概念

二、Vim 的三种基本模式

1. 命令模式(Command Mode)

2. 插入模式(Insert Mode)

3. 底行模式(Last Line Mode)

模式切换方法

 IDE例子:

三、vim的基本操作

进入vim

模式切换

保存与退出

四、使用vim的大坑注意事项

原因分析

键位编码差异

vim 的默认设计

终端/系统的中间处理

解决方案

方法 1:临时切换(推荐)

方法 2:修改 vim 配置(比较麻烦)

方法 3:切换输入习惯

底层原理

确保指令输入的一致性

五、vim命令模式命令集汇总

【移动光标】

【插入模式】

【模式切换】

【删除】

【复制粘贴】

【剪切】

【撤销】

【大小写切换】

【替换】

【更改】

【翻页】

【跳至指定行】

六、vim末行模式命令集汇总

行号设置

跳转与查找

文件操作

分屏操作

系统命令

问题提示

七、简单 Vim 配置 [了解]

配置文件位置

系统级配置

用户级配置

常用配置选项

插件安装指南

第一步:准备工作

 第二步:安装TagList插件

第三步:安装WinManager插件

第四步:验证安装

重量级选手 —— 一键切换到大佬的配置


一、vim的基本概念

        vim(vi IMproved)是一款功能强大的多模式文本编辑器,专为高效代码编辑而设计。作为开发者的得力助手,vim通过其独特的模式设计大幅提升了文本编辑效率。

        简单来说,vi和vim都是多模式编辑器,但vim是vi的升级版。它不仅完全兼容vi的所有命令,还新增了许多实用功能,比如语法高亮和可视化操作。此外,vim支持在多种环境中运行,包括终端、X Window、Mac OS和Windows系统。为便于学习,我们统一以vim为例进行讲解。


二、Vim 的三种基本模式

我们重点讲解 Vim 的三种基础模式(Vim 实际有多种模式,目前掌握这三种即可):

1. 命令模式(Command Mode)

  • 又称普通模式(Normal Mode)
  • 功能:
    • 控制光标移动
    • 执行删除字符、单词或整行操作
    • 进行文本复制和移动
    • 可切换到插入模式或底行模式

2. 插入模式(Insert Mode)

  • 功能:
    • 唯一支持文本输入的模式
    • 按 ESC 键返回命令模式
    • 后续最常用的编辑模式

3. 底行模式(Last Line Mode)

  • 功能:
    • 文件保存与退出
    • 文本替换操作
    • 字符串搜索
    • 显示行号等

模式切换方法

  • 命令模式下按 Shift+:进入底行模式
  • 查看所有模式:在 Vim 中输入 :help vim-modes 命令(共 12 种模式,包括 6 种基础模式和 6 种附加模式)

古老的计算机连接的键盘上使用的就是vim文本编辑器,如图中保留着的这四个功能键:

 IDE例子:


三、vim的基本操作

(这里演示了,后面就不演示了,太繁琐了,操作太多了,明白就可以了)

进入vim

在系统提示符号输入vim及文件名称后,就进入vim全屏幕编辑画面:

$ vim test.c

模式切换

  • 进入vim后默认处于[命令模式],此时需要切换到[插入模式]才能输入文字

  • [命令模式]切换至[插入模式]

    • 输入「a」:在当前光标的后一位置进入插入模式。

    • 输入「i」:在当前光标处进入插入模式。

    • 输入「o」:在当前光标处新起一行进入插入模式。

  • [插入模式]切换至[命令模式]:按ESC

    • 在[插入模式]下,只能持续输入文字。

    • 如需修改错误,有两种方式(均可实现文字修正):

    • 按「ESC」键切换至[命令模式],再移动光标进行删除
    • 直接删除错误内容
  • [命令模式]切换至[末行模式]

    • Shift + ;(即输入:

保存与退出

在[正常模式]下,按:进入末行模式后:

  • w 保存当前文件

  • wq保存该文件并退出vim

  • q!不保存该文件并强制退出vim


四、使用vim的大坑注意事项

        我在使用vim遇到的情况是 vim 中一个非常经典的数字键盘输入问题,根本原因在于:(前提你的外设键盘是全键键盘)数字小键盘(Numpad)(右边)的输入信号和主键盘区的数字键(左边)在系统中被识别为不同的键位以下是详细解释和解决方案:

原因分析

  1. 键位编码差异

    • 主键盘区数字键(如字母区上方的 1 2 3)在系统中被识别为普通数字键

    • 小键盘数字键(Numpad)在系统中被识别为 特殊功能键(如 KP_1 KP_2 KP_3

  2. vim 的默认设计

    • vim 的普通模式命令(如 3l仅响应主键盘区的数字输入

    • 小键盘的数字输入会被 vim 识别为无效命令或插入操作(部分系统会直接输入数字字符)

  3. 终端/系统的中间处理

        某些终端模拟器(如 iTerm2、GNOME Terminal)或系统驱动会将小键盘数字转为特殊信号,导致 Vim 无法正确解析 

解决方案

方法 1:临时切换(推荐)

  • 关闭 NumLock
    按下键盘的 NumLock 键(指示灯熄灭),此时小键盘会变成方向键/功能键,避免误触发插入模式

方法 2:修改 vim 配置(比较麻烦)

        在系统级配置下(当然也可以是用户级配置,后面第七点有讲),vimrc在根目录下的etc目录中,在 vimrc 中添加以下配置,强制兼容小键盘输入:

" 允许小键盘数字作为命令前缀
set notimeout
set ttimeout
set timeoutlen=100
map <Esc>OQ 1
map <Esc>OR 2
map <Esc>OS 3
map <Esc>Ot 4
map <Esc>Ou 5
map <Esc>Ov 6
map <Esc>Ow 7
map <Esc>Ox 8
map <Esc>Oy 9
map <Esc>Op 0

方法 3:切换输入习惯

  • 使用主键盘区数字键输入命令

  • 需要输入大量数字时再开启小键盘

底层原理

        小键盘的数字键在终端中实际发送的是 转义序列(如 ESC O q 代表 KP_1),而 Vim 默认不将这些序列识别为数字命令。这与终端类型(TERM 环境变量)、键盘驱动、GUI 环境都有关联。

        如果问题持续,建议在终端设置中检查「将小键盘数字作为普通键发送」选项(常见于 XShell/iTerm2 的高级设置)。

确保指令输入的一致性

        在输入命令时,必须严格遵守规范的输入方式。例如:若要执行「G」命令(跳转到文章末尾),就必须准确输入大写字母G,而不能使用小写字母g。


五、vim命令模式命令集汇总

【移动光标】

  • 按「k」:光标上移。
  • 按「j」:光标下移。
  • 按「h」:光标左移。
  • 按「l」:光标右移。
  • 按「$」:移动到光标所在行的行尾。
  • 按「^」:移动到光标所在行的行首。
  • 按「gg」:移动到文本开始。
  • 按「Shift+g」:移动到文本末尾。
  • 按「n+Shift+g」:移动到第n行行首。
  • 按「n+Enter」:当前光标向下移动n行。
  • 按「w」:光标从左到右,从上到下的跳到下一个字的开头。
  • 按「e」:光标从左到右,从上到下的跳到下一个字的结尾。
  • 按「b」:光标从右到左,从下到上的跳到上一个字的开头
  • 按「G」:移动到文章的最后
  • 按「#l」:光标移到该行的第#个位置,如:5l,56l
  • 按「ctrl」+「b」:屏幕往"后"移动一页
  • 按「ctrl」+「f」:屏幕往"前"移动一页
  • 按「ctrl」+「u」:屏幕往"后"移动半页
  • 按「ctrl」+「d」:屏幕往"前"移动半页

【插入模式】

  • 按「i」:在当前光标处进入插入模式(从光标当前位置开始输入文件)
  • 按「a」:在当前光标的后一位置进入插入模式(从光标下一位置开始输入文字)
  • 按「o」:在当前光标处新起一行进入插入模式(插入新行并从行首输入文字)

【模式切换】

  • 「ESC」键:从插入模式切换为命令模式
  • 输入「Shift+;」即可进入底行模式,实际上就是输入「:」

【删除】

  • 按「x」:删除光标所在位置的字符(每按一次删除一个字符)
  • 按「nx」:删除光标所在位置开始往后的n个字符(如「6x」删除后面6个字符)
  • 按「X」:删除光标所在位置的前一个字符(大写的X)
  • 按「nX」:删除光标所在位置的前n个字符(如「20X」删除前面20个字符)
  • 按「dd」:删除光标所在行
  • 按「ndd」:删除光标所在行开始往下的n行(从光标行开始删除#行)

【复制粘贴】

  • 按「yy」:复制光标所在行到缓冲区
  • 按「nyy」:复制光标所在行开始往下的n行到缓冲区(如「6yy」拷贝6行文字)
  • 按「yw」:将光标所在位置开始到字尾的字符复制到缓冲区
  • 按「nyw」:将光标所在位置开始往后的n个字复制到缓冲区(复制#个字)
  • 按「p」:将已复制的内容在光标的下一行粘贴上(需与"y"命令配合)
  • 按「np」:将已复制的内容在光标的下一行粘贴n次

【剪切】

  • 按「dd」:剪切光标所在行
  • 按「ndd」:剪切光标所在行开始往下的n行
  • 按「p」:将已剪切的内容在光标的下一行粘贴上
  • 按「np」:将已剪切的内容在光标的下一行粘贴n次

【撤销】

  • 按「u」:撤销(可多次按撤销多步操作)
  • 按「Ctrl+r」:恢复刚刚的撤销(撤销的恢复)

【大小写切换】

  • 按「~」:完成光标所在位置字符的大小写切换
  • 按「n~」:完成光标所在位置开始往后的n个字符的大小写切换

【替换】

  • 按「r」:替换光标所在处的字符
  • 按「R」:替换光标所到位置的字符,直到按下「Esc」键为止

【更改】

  • 按「cw」:将光标所在位置开始到字尾的字符删除,并进入插入模式(更改到字尾处)
  • 按「cnw」:将光标所在位置开始往后的n个字删除,并进入插入模式(如「c3w」更改3个字)

【翻页】

  • 按「Ctrl+b」:上翻一页(屏幕往"后"移动一页)
  • 按「Ctrl+f」:下翻一页(屏幕往"前"移动一页)
  • 按「Ctrl+u」:上翻半页(屏幕往"后"移动半页)
  • 按「Ctrl+d」:下翻半页(屏幕往"前"移动半页)

【跳至指定行】

  • 按「Ctrl+g」:列出光标所在行的行号
  • 按「nG」:移动到第n行行首(如「15G」跳转到第15行)

六、vim末行模式命令集汇总

        在使用底行模式之前,请先按「ESC」键确保处于普通模式,再按「:」进入底行模式,输入完指令后按Enter回车键执行该指令。

行号设置

  • 「set nu」:显示行号

  • 「set nonu」:取消行号

跳转与查找

  • 「#」:跳转到指定行(如「:15」跳转到第15行)

  • 「/关键字」:向下查找关键字(按「n」查找下一个)

  • 「?关键字」:向上查找关键字(按「n」查找上一个)

文件操作

  • 「w」:保存文件

  • 「q」:退出vim(加「!」强制退出)

  • 「wq」:保存并退出

分屏操作

  • 「vs 文件名」:垂直分屏打开新文件

  • 「Ctrl+w+w」:在分屏间切换光标

系统命令

  • 「!指令」:执行外部Shell命令(如「!ls」查看目录)

问题提示

  • / 和 ? 查找的区别:/是向下查找,?是向上查找


七、简单 Vim 配置 [了解]

配置文件位置

  • 系统级配置

    • 路径:/etc/vimrc

    • 说明:这是公共的 vim 配置文件,对所有用户有效

  • 用户级配置

    • 路径:~/.vimrc(如果不存在,则需要手动创建它

      # 1. 确保在主目录
      cd ~# 2. 创建.vimrc文件
      touch .vimrc# 3. 编辑配置文件(按i进入编辑模式,添加配置后ESC+:wq保存退出)
      vim .vimrc

    • 说明:

      1. 从管理员切换到用户:su [用户名]

      2. 进入主目录:cd ~

      3. 编辑配置文件:vim .vimrc

常用配置选项

  • 启用语法高亮::syntax on
  • 显示行号::set nu
  • 设置缩进为4个空格::set shiftwidth=4

插件安装指南

        要打造美观实用的 Vim 环境,默认配置可能功能有限。你可以通过安装插件来增强体验。首先请确认你正在为正确的用户进行配置,然后按照以下步骤操作:

第一步:准备工作

  1. 确保已创建用户级vim配置

    cd ~
    touch .vimrc
    mkdir -p ~/.vim/{doc,plugin}  # 创建插件所需目录

 第二步:安装TagList插件

  1. 下载插件

    #直接下载(需有wget)
    wget http://www.vim.org/scripts/download_script.php?src_id=19574 -O taglist.zip

  2. 解压安装

    unzip taglist.zip -d taglist
    cd taglist# 复制文件到vim配置目录
    cp doc/taglist.txt ~/.vim/doc/
    cp plugin/taglist.vim ~/.vim/plugin/

        3.配置(编辑~/.vimrc)

vim ~/.vimrc

i进入插入模式,添加:

" TagList配置
let Tlist_Show_One_File=1     " 只显示当前文件的标签
let Tlist_Exit_OnlyWindow=1   " 如果只有taglist窗口则退出vim
let Tlist_Use_Right_Window=1  " 在右侧显示窗口

ESC后输入:wq保存退出

第三步:安装WinManager插件

  1. 下载插件

    wget http://www.vim.org/scripts/download_script.php?src_id=754 -O winmanager.zip

  2. 解压安装

    unzip winmanager.zip -d winmanager
    cd winmanagercp doc/winmanager.txt ~/.vim/doc/
    cp plugin/winmanager.vim ~/.vim/plugin/
    cp plugin/wintagexplorer.vim ~/.vim/plugin/

  3. 配置(编辑~/.vimrc)

    vim ~/.vimrc

    添加:

    " WinManager配置
    let g:winManagerWindowLayout='FileExplorer|TagList'  " 窗口布局
    nmap wm :WMToggle<cr>  " 设置wm快捷键切换窗口管理器

        保存退出(:wq

第四步:验证安装

  1. 重启Vim

  2. 测试功能

  • 打开一个C文件::e test.c

  • 普通模式下输入wm,应该可以看到:

    • 左侧的文件浏览器

    • 右侧的函数标签列表

  • 再次输入wm可关闭

更具体请移步到:手把手教你把Vim改装成一个IDE编程环境(图文)_vim 打造成 ide-CSDN博客,其他手册,请执行 vimtutor 命令。

重量级选手 —— 一键切换到大佬的配置

        上述的配置 vim 方法可能会比较复杂,特别是需要安装插件时,不建议手动逐个配置。更简单的方式是直接运行以下命令(注意:要在需要配置 vim 的用户下执行此命令,不建议直接在 root 用户下操作):

curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh

执行后会提示输入 root 密码,按指引操作即可:

稍微有点慢,我们等一下安装:

安装配置完成后,手动执行source ~/.bashrc命令即可生效:

        这时我们打开上次的test.c,可以看到此时vim文本编辑器具备了语法高亮、自动补全、行号显示和自动缩进等功能:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/84811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【STM32】HAL库 之 CAN 开发指南

基于stm32 f407vet6芯片 使用hal库开发 can 简单讲解一下can的基础使用 CubeMX配置 这里打开CAN1 并且设置好波特率和NVIC相关的配置 波特率使用波特率计算器软件 使用采样率最高的这段 填入 得到波特率1M bit/s 然后编写代码 环形缓冲区 #include "driver_buffer.h&qu…

《Scientific Reports撤稿门技术节分析》——从图像篡改检测到学术伦理重建的技术透视

2023年以来&#xff0c;《Scientific Reports》等开放获取期刊频繁曝出大规模撤稿事件&#xff0c;涉及数据造假、图像重复、AI生成内容篡改等技术性学术不端行为。本文以技术视角切入&#xff0c;系统分析撤稿事件背后的技术动因、检测手段漏洞、学术出版体系的技术短板及应对…

Client请求Grpc服务报错

现象&#xff1a;err: rpc error: code Unimplemented desc 背景&#xff1a;调用链路A->B->C&#xff0c;A是一个Http协议的接口&#xff0c;B也是一个Http协议的接口&#xff0c; 但C是一个Grpc协议的接口。 解决思路&#xff1a;查看C服务对应的proto&#xff0c;比…

机器学习课程设计报告 —— 基于口红数据集的情感分析

目录 一、课程设计目的 二、数据预处理及分析 2.1 数据预处理 2.2 数据分析 三、特征选择 3.1 特征选择的重要性 3.2 如何进行特征选择 3.3 特征选择的依据 3.4 数据集的划分 四、模型训练与模型评估 4.1 所有算法模型不调参 4.2 K-近邻分类模型 4.3 GaussianNB模…

Flutter 实现6个验收码输入框

开箱即用&#xff0c;初始化时就唤起键盘&#xff0c;并选中第一个 import package:flutter/material.dart;import dart:async; // 引入 Timer 类class VerificationCode extends StatefulWidget {final String phoneNumber;const VerificationCode({super.key, required this.…

如何查看服务器有几张GPU

要查看服务器上有多少张 GPU&#xff0c;你可以使用以下几种方法&#xff1a; 1.1 使用 nvidia-smi工具&#xff08;针对 NVIDIA GPU&#xff09;&#xff1a; 如果你的服务器上安装了 NVIDIA GPU 驱动程序&#xff0c;那么可以使用 nvidia-smi 命令查看详细的 GPU 信息。 n…

3099. 哈沙德数

​题目来源&#xff1a; LeetCode题目&#xff1a;3099. 哈沙德数 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 按要求求和判断即可。 解题代码&#xff1a; #python3 class Solution:def sumOfTheDigitsOfHarshadNumber(self, x: int) -> int:sumDigi…

数字化回归本质:第一性原理驱动的制造业转型与AI+云PLM系统实践

2014年&#xff0c;埃隆马斯克在南加州大学商学院的毕业演讲上&#xff0c;留下了一场5分钟的精彩分享&#xff0c;他将自己对工作和人生的思考总结为五个要点&#xff0c;其中一点说到了他的决策方式&#xff1a; “也许你听我说过&#xff0c;要从物理学的角度思考问题&…

仿DeepSeek AI问答系统完整版(带RAG本地知识库+联网搜索+深度思考) +springboot+vue3

今天教大家如何设计一个企业级的 deepseek问答 一样的系统 , 基于目前主流的技术&#xff1a;前端vue3&#xff0c;后端springboot。同时还带来的项目的部署教程。 系统的核心功能 1. 支持本地上传文档知识库&#xff0c;RAG技术。 支持的文档有txt&#xff0c;doc&#xff0c…

27、请求处理-【源码分析】-怎么改变默认的_method

27、请求处理-【源码分析】-怎么改变默认的_method 要改变 Spring Boot 中默认的 _method 参数&#xff0c;可以通过以下步骤实现&#xff1a; #### 原理分析 Spring Boot 中默认的 HiddenHttpMethodFilter 用于将表单中的 _method 参数值映射为实际的 HTTP 方法&#xff08;如…

欧拉角转为旋转矩阵

外旋是固定坐标系&#xff0c;内旋是动态坐标系。外旋和内旋具有等价性。 固定坐标系依次绕xyz轴旋转&#xff0c;旋转矩阵 动态坐标系依次绕zyx轴旋转&#xff0c;旋转矩阵 numpy和scipy计算对比 import numpy as np from numpy import sin, cos, pi # 抑制科学计数法&#…

【AI学习笔记】Coze平台实现生成小红书热门多图笔记

背景前摇&原视频教程&#xff1a; 最近总是在小红书上刷到多图组成的养生小妙招、效率提升小tips、退休奶奶疗愈语录等等这样的图文笔记&#xff0c;而且人物图像一眼就是AI画的。 当时我以为这个排版和文字是人工的&#xff0c;就让AI保持角色一致性画了下图&#xff0c;…

如何选择自动化编程平台

从事自动化行业的工作者都知道&#xff0c;做PLC编程需要PLC编程软件&#xff0c;做HMI可视化需要HMI编程软件&#xff0c;做SCADA需要SCADA编程软件&#xff0c;做DCS需要DCS软件&#xff0c;做仿真调试需要仿真软件。这些软件有国外的、国内的&#xff0c;有传统自动化厂商开…

Bug 背后的隐藏剧情

Bug 背后的隐藏剧情 flyfish 1. 「bug」&#xff1a;70多年前那只被拍进史书的飞蛾 故事原型&#xff1a;1947年哈佛实验室的「昆虫命案」 1947年的计算机长啥样&#xff1f;像一间教室那么大&#xff0c;塞满了几万根继电器&#xff08;类似老式开关&#xff09;&#xff…

如何将通话记录从Android传输到Android

“如何将通话记录从 Android 转移到 Android&#xff1f;我换了一部新的 Android 手机&#xff0c;想要将通话记录复制到其中。”您需要将通话记录从 Android 传输到 Android 是一种常见的情况&#xff0c;因为通话记录是手机上最重要的数据之一。幸运的是&#xff0c;如果您从…

Android 云手机横屏模式下真机键盘遮挡输入框问题处理

一、背景 打开横屏应用,点击云机EditText输入框,输入框被键盘遮挡,如下图&#xff1a; 未打开键盘状态: 点击第二个输入框,键盘遮挡了输入框&#xff1a; 二、解决方案&#xff08;推荐第三中方案,博主采用的也是第三种方案&#xff09; 博主这里整理了三种方案&#xff1a;…

进程IO之 进程

一、进程相关概念 1.什么是进程 程序&#xff1a;静态的&#xff0c;编译好的可执行文件&#xff0c;存放在磁盘中的指令和数据的集合 进程&#xff1a;动态的&#xff0c;是程序的一次执行过程&#xff0c;是独立的可调度的任务 2.进程的特点 &#xff08;1&#xff09;对…

Condition源码解读(二)

本章我们继续将Condition的最后一个方法signal方法&#xff0c;如果前面没有看过的可以点击LockSupport与Condition解析来看看Condition解读的前半部分。 signal方法&#xff1a; public final void signal() {if (!AbstractQueuedLongSynchronizer.this.isHeldExclusively())…

股票收益率的计算

首先&#xff0c;需要从 Tushare.pro 注册一个账号并调用其API获取股票日线数据&#xff08;具体操作请查看官网&#xff09;。 以通过调用tushare获取股票000001(平安银行)的股票数据为例&#xff0c;这里不设置日期&#xff0c;那么默认获取Tushare提供的所有历史数据。也可…

《算法笔记》13.2小节——专题扩展->树状数组(BIT) 问题 D: 数列-训练套题T10T3

数列(sequence.pas/c/cpp) - 问题描述 一个简单的数列问题&#xff1a;给定一个长度为n的数列&#xff0c;求这样的三个元素ai, aj, ak的个数&#xff0c;满足ai < aj > ak&#xff0c;且i < j < k。 - 输入数据 第一行是一个整数n(n < 50000)。 第二行n个整…