Linux vim mode | raw / cooked
注:机翻,未校。
vim terminal “raw” mode
Vim 终端 “raw” 模式
1. 原始模式与已处理模式的区别
We know vim puts the terminal in “raw” mode where it receives keystrokes as they are typed, opposed to “cooked” mode where the command is not processed fully unless the end-user enters it in the terminal.
我们知道,vim 会将终端置于“原始”模式,在这种模式下,终端会即时接收按键输入,与“已处理”模式不同,在“已处理”模式下,命令只有在终端中输入后才会被完全处理。
2. 模式切换的机制
How does the shell distinguish when to go into either mode? How does this switch happen? Is there a mode in between “raw” and “cooked” mode?
那么,shell 是如何区分何时进入这两种模式的呢?这种切换是如何发生的?在“原始”模式和“已处理”模式之间是否存在一种中间模式?
To clarify, any process that has access to a terminal can change that terminal’s settings, simply by calling tcsetattr() with the appropriate attributes (the same call used by the termstate_ functions in cush).
需要明确的是,任何能够访问终端的进程都可以通过调用 tcsetattr() 并设置适当的属性来更改该终端的设置(cush 中的 termstate_ 函数也使用了相同的调用)。
vim is an example of a process that does that. Raw mode is also entered by the readline() function cush (and bash) uses. That’s why, for instance, Ctrl-A and Ctrl-E work and many other readline shortcuts. When readline() returns, the terminal is set back into whatever state it was in before the call, so we don’t notice. If we had implemented our shell with, say, scanf() and printf() only, we wouldn’t have put the terminal into the raw state, so a shell could be implemented without raw mode, albeit with less user comfort.
vim 是一个会这样做的进程的例子。cush(以及 bash)使用的 readline() 函数也会进入原始模式。这就是为什么,例如,Ctrl-A 和 Ctrl-E 以及许多其他 readline 快捷键可以正常工作。当 readline() 返回时,终端会恢复到调用之前的状态,所以我们察觉不到。如果我们只用 scanf() 和 printf() 来实现我们的 shell,我们就不会将终端置于原始状态,因此虽然可以实现一个没有原始模式的 shell,但用户体验会差很多。
3. POSIX 中的原始模式定义
As to what “raw” mode is and how to enter it. It turns out that “raw” vs “cooked” mode isn’t actually the official term (anymore). The terms come from Unix System 7. In POSIX, what’s commonly called “raw” mode is a combination of switches. tcsetattr(3) describes it as:
关于“原始”模式是什么以及如何进入它的问题。事实证明,“原始”模式与“已处理”模式并不是官方术语(至少不再是)。这些术语来源于 Unix System 7。在 POSIX 中,通常所说的“原始”模式实际上是一组组合开关。tcsetattr(3) 对其描述如下:
3.1 原始模式的设置
Raw mode
原始模式
cfmakeraw() sets the terminal to something like the “raw” mode of the old Version 7 terminal driver: input is available character by character, echoing is disabled, and all special processing of terminal input and output characters is disabled. The terminal attributes are set as follows:
cfmakeraw() 将终端设置为类似于旧版 Version 7 终端驱动程序中的“原始”模式:输入是逐字符可用的,回显被禁用,并且终端输入和输出字符的所有特殊处理都被禁用。终端属性被设置如下:
termios_p->c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP| INLCR | IGNCR | ICRNL | IXON);
termios_p->c_oflag &= ~OPOST;
termios_p->c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
termios_p->c_cflag &= ~(CSIZE | PARENB);
termios_p->c_cflag |= CS8;
You can look up what all these attributes mean, but the key attribute here is ICANON, and that’s how POSIX refers to line-by-line vs key-by-key processing mode, as “canonical” (line-by-line) and “non-canonical” mode.
您可以查阅这些属性的具体含义,但其中的关键属性是 ICANON,POSIX 就是通过它来区分逐行处理模式与逐键处理模式的,分别称为“规范”(逐行)模式和“非规范”模式。
4. 实践原始模式
If you want to try out raw mode yourself, here’s a short program:
如果你想自己尝试原始模式,这里有一个简短的程序:
4.1 示例代码
// raw.c
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
#include <assert.h>int
main()
{int terminal_fd = open(ctermid(NULL), O_RDWR);assert (terminal_fd != -1);struct termios tty_state;int rc = tcgetattr(terminal_fd, &tty_state);struct termios saved_tty_state = tty_state;assert (rc == 0);tty_state.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP| INLCR | IGNCR | ICRNL | IXON);tty_state.c_oflag &= ~OPOST;tty_state.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);tty_state.c_cflag &= ~(CSIZE | PARENB);tty_state.c_cflag |= CS8;printf("press ctrl-d to exit\n");rc = tcsetattr(terminal_fd, TCSANOW, &tty_state);assert (rc == 0);char c; while (read(0, &c, 1) == 1 && c != 0x4)write(1, &c, 1);// restore sane state on exitrc = tcsetattr(terminal_fd, TCSANOW, &saved_tty_state);assert (rc == 0);
}
4.2 编译与运行
Compile with gcc -o raw raw.c and then you can start it with ./raw. Everything input is echoed back. Ctrl-C and Ctrl-Z don’t work anymore. If you type Enter it goes to the beginning of the line (type Ctrl-J to go to the next line). Type Ctrl-D (0x4) to exit.
使用 gcc -o raw raw.c 编译该程序,然后可以通过 ./raw 启动它。输入的所有内容都会被回显。Ctrl-C 和 Ctrl-Z 不再起作用。如果你按下回车键,光标会回到行首(按下 Ctrl-J 可以移到下一行)。按下 Ctrl-D(0x4)退出。
5. 原始模式与已处理模式的应用
The program above demonstrates how to set a terminal into raw mode and restore its original state upon exit. It reads input character by character and echoes them back to the terminal. This behavior is typical of raw mode, where the terminal processes input and output at the character level without any special handling of control characters like Ctrl-C or Ctrl-Z.
上述程序演示了如何将终端设置为原始模式,并在退出时恢复其原始状态。它逐字符读取输入并将它们回显到终端。这种行为是原始模式的典型特征,在这种模式下,终端会在字符级别处理输入和输出,而不会对像 Ctrl-C 或 Ctrl-Z 这样的控制字符进行特殊处理。
This is particularly useful for applications like text editors (e.g., vim) or interactive shells that require fine-grained control over user input and terminal output. By disabling canonical processing (ICANON) and other terminal attributes, these applications can implement their own input handling mechanisms, such as key bindings and command-line editing features.
这对于像文本编辑器(例如 vim)或交互式 shell 这样的应用程序特别有用,因为它们需要对用户输入和终端输出进行精细控制。通过禁用规范处理(ICANON)和其他终端属性,这些应用程序可以实现自己的输入处理机制,例如按键绑定和命令行编辑功能。
In contrast, “cooked” mode (or canonical mode) is the default mode for most terminal applications. In this mode, the terminal buffers input until a newline character is received, allowing for line editing and processing of special control characters. This mode is more user-friendly for command-line interfaces where users expect to be able to edit their input before executing a command.
相比之下,“已处理”模式(或规范模式)是大多数终端应用程序的默认模式。在这种模式下,终端会将输入缓冲起来,直到接收到换行符,从而允许进行行编辑和处理特殊控制字符。在这种模式下,用户可以在执行命令之前编辑输入,因此对于命令行界面来说,这种模式更加用户友好。
6. 总结
To summarize, the distinction between raw and cooked modes lies in how the terminal handles input and output. Raw mode provides direct, character-by-character access, while cooked mode processes input line by line and interprets control characters. The ability to switch between these modes allows applications to tailor their behavior to the specific needs of the user interface they are implementing.
总之,原始模式和已处理模式的区别在于终端如何处理输入和输出。原始模式提供直接的逐字符访问,而已处理模式逐行处理输入并解释控制字符。能够在这些模式之间切换,使得应用程序可以根据它们所实现的用户界面的具体需求来调整行为。
【Linux】vim 三种模式的切换、常用命令总结
冰冷的希望于 2023-08-25 23:04:37 发布
vim 是一个非常强大而且常用的 Linux 文本工具。
1. 模式
vim 主要有三种模式,分别是命令模式、输入模式、末行模式,三者切换关系如下:

默认是命令模式,按 i、a 或 o 进入输入模式,再按 ESC 返回到命令模式。在命令模式输入 : 切换到末行模式,再按 ESC 又返回到命令模式。输入模式和末行模式之间不能直接切换,只能通过命令模式切换。
2. 命令模式
| 命令 | 说明 |
|---|---|
x、X | x 是删除下一个字符,X 是删除上一个字符 |
数字 + x | 删除指定数量的字符,例如 10x 表示删除 10 个字符 |
dd | 剪切(删除)光标所在行 |
数字 + dd | 删除指定数量的行,例如 20dd 表示删除 20 行 |
yy | 复制光标所在行 |
数字 + yy | 复制指定数量的行,例如 20yy 表示复制 20 行 |
p、P | p 是粘贴到下一行,P 是粘贴到上一行 |
u | 撤销 |
Ctrl+r | 反撤销 |
.(小数点) | 重复上一个动作 |
gg、G | gg 是回到第一行,G 是回到最后一行 |
数字 + G | 跳转到指定行,例如 20G 表示跳转到第 20 行 |
y1G、yG | y1G 是复制当前行前面的所有数据,yG 是复制当前行之后的全部数据 |
d1G、dG | d1G 是删除当前行前面的所有数据,dG 是删除当前行之后的全部数据 |
v、V、Ctrl+v | v 是光标起始和结束之间的文本会被选中,V 是光标起始和结束之间的所有行被选中,Ctrl+v 是光标起始和结束之间构成的矩形区域被选中 |
3. 输入模式
| 命令 | 说明 |
|---|---|
i、I | i 是从光标所在位置开始输入,I 是从光标所在行第一个非空白字符开始输入 |
a、A | a 是从光标所在的下一个字符开始输入,A 是从光标所在行的最后一个字符开始输入 |
o、O | o 是从光标所在行的下一行新的一行开始输入,O 是从光标所在行的上一行新的一行开始输入 |
r、R | r 是取代光标所在的字符一次,R 是依次取代光标所在字符 |
4. 末行模式
| 命令 | 说明 |
|---|---|
:w | 保存 |
:q | 退出 |
:wq 或 ZZ | 保存并退出 |
:q! 或 ZQ | 不保存退出 |
:set nu | 显示行号 |
:set nonu | 隐藏行号 |
:/搜索的文本 | 搜索指定文本 |
:%s/要替换的字符/替换后的字符/g | 全局替换文本,% 表示对整个文件进行操作,g 表示全局替换 |
via:
-
CS3214 Computer Systems - Spring 2025
https://courses.cs.vt.edu/cs3214/spring2025/questions/rawmode -
How to avoid vim set terminal to raw mode when stdin is /dev/null? · Issue #15893 · vim/vim · GitHub
https://github.com/vim/vim/issues/15893 -
【Linux】vim 三种模式的切换、常用命令总结_描述一下 vim 命令的状态,不同状态之间的切换方式?-CSDN 博客
https://blog.csdn.net/qq_39147299/article/details/108972206
相关文章:
Linux vim mode | raw / cooked
注:机翻,未校。 vim terminal “raw” mode Vim 终端 “raw” 模式 1. 原始模式与已处理模式的区别 We know vim puts the terminal in “raw” mode where it receives keystrokes as they are typed, opposed to “cooked” mode where the command…...
IMX8MP Android 10系统编译SDK
概述: 本文描述了在Ubuntu 20.04操作系统上搭建IMX8MP Android10系统编译环境。 ubuntu主机端设置 1. ubuntu 20.04 1. 450G Free Disk space 2. 16GB RAM以上 3. 安装 sudo apt-get install uuid uuid-dev zlib1g-dev liblz-dev liblzo2-2 liblzo2-dev lzop …...
defineAsyncComponent和一般的import有什么区别
defineAsyncComponent 和一般的 import 是 Vue 中用于引入组件的两种不同方式,它们在使用场景、加载时机和性能优化等方面存在显著区别,下面为你详细介绍: 1. 语法和使用方式 一般的 import(静态导入) 一般的 import…...
ICLR 2025 机器人智能灵巧操作更进一步DexTrack
现实世界的机器人距离科幻小说里的机器人世界还有多远?通用灵巧操控何时才能实现?朝着这一伟大的目标,研究通用灵巧操控轨迹跟踪的 DexTrack 便应运而生。 论文地址:https://arxiv.org/abs/2502.09614代码地址:https:/…...
Golang开发
Golang 文章目录 Golang预备技术一、算法与数据结构第1章:基础算法第2章:数据结构第3章:搜索与图论第4章:数论第5章:动态规划第6章:贪心第7章:算法竞赛入门 二、Linux操作系统与Shell编程三、计…...
AI入门7:python三种API方式调用本地Ollama+DeepSeek
回顾 书接上篇:各种方式搭建了本地知识库: AI入门:AI模型管家婆ollama的安装和使用-CSDN博客 AI入门2:本地AI部署,用ollama部署deepseek(私有化部署)-CSDN博客 AI入门3:给本地d…...
IIS+ASP程序500错误排查及解决方法
IISASP程序500错误排查及解决方法 一、基础配置检查 检查IWAM账户密码一致性 IIS运行ASP程序依赖IWAM账户,若系统更新或域策略调整导致密码不一致会引发500错误。需同步IIS元数据库与应用池账户密码15。 验证目录权限 确保站点文件目录的Network Servi…...
Java 中 LinkedList 的底层数据结构及相关分析
Java 中 LinkedList 的底层数据结构及相关分析 1. 概述 LinkedList 是 Java 集合框架(Java Collections Framework,JCF)中的一个双向链表实现,它位于 java.util 包下,支持 列表(List) 和 队列…...
《线程池:Linux平台编译线程池动态库发生的死锁问题》
关于如何编译动态库可以移步《Linux:动态库动态链接与静态库静态链接》-CSDN博客 我们写的线程池代码是闭源的,未来想提供给别人使用,只需要提供so库和头文件即可。 系统默认库文件路径为: usr/lib usr/loacl/lib 系统默认头文件…...
Python Bug修复案例分析:Python 中常见的 IndentationError 错误 bug 的修复
在 Python 编程的世界里,代码的可读性和规范性至关重要。Python 通过强制使用缩进来表示代码块的层次结构,这一独特的设计理念使得代码更加清晰易读。然而,正是这种对缩进的严格要求,导致开发者在编写代码时,稍有不慎就…...
合React宝宝体质的自定义防抖hook
本文为开发开源项目的真实开发经历,感兴趣的可以来给我的项目点个star,谢谢啦~ 具体博文介绍: 开源|Documind协同文档(接入deepseek-r1、支持实时聊天)Documind 🚀 一个支持实时聊天和接入 - 掘…...
以太坊节点间通信机制 DEVp2p 协议
文章目录 概要1. 协议概述2. 协议栈与关键技术3. RLPx 协议核心机制3.1 数据包结构3.2 加密握手流程 4. 核心子协议与消息类型4.1 基础控制消息4.2 以太坊子协议示例4.3 网络 ID 列表 5. 安全与防攻击机制6. 节点标识与声誉管理7. 对比其他区块链通信协议8. 总结 概要 1. 协议…...
Pytorch使用手册—自定义 C++ 和 CUDA 扩展(专题五十二)
提示 从 PyTorch 2.4 开始,本教程已被废弃。请参考 PyTorch 自定义操作符,了解关于通过自定义 C++/CUDA 扩展扩展 PyTorch 的最新指南。 PyTorch 提供了大量与神经网络、任意张量代数、数据处理等相关的操作。然而,您可能仍然会发现自己需要一个更自定义的操作。例如,您可能…...
AI大模型在物联网行业的应用场景深度解析
AI大模型在物联网行业的应用场景 引言 AI大模型与物联网(IoT)的融合正在重塑产业智能化格局。通过海量数据的实时处理与智能决策能力,AI大模型为物联网设备赋予了更高效的感知、分析和响应机制,推动智慧城市、智能制造、医疗健康…...
OpenCV旋转估计(1)用于估计图像间仿射变换关系的类cv::detail::AffineBasedEstimator
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 基于仿射变换的估计器。 这种估计器使用匹配器估算的成对变换来为每个相机估算最终的变换。 cv::detail::AffineBasedEstimator 是 OpenCV 库中…...
PyCharm的终端(terminal)中进入指定conda虚拟环境
参考这篇博文: PyCharm的终端(terminal)中进入指定conda虚拟环境_pycharm配置conda终端-CSDN博客...
高级java每日一道面试题-2025年3月05日-微服务篇[Eureka篇]-Eureka在微服务架构中的角色?
如果有遗漏,评论区告诉我进行补充 面试官: Eureka在微服务架构中的角色? 我回答: 在微服务架构中,Eureka作为Netflix开源的服务发现组件,在解决服务间通信的寻址问题方面扮演着至关重要的角色。以下是结合提供的内容对Eureka在微服务架构中的角色进行…...
c++类和对象(下篇)下
下面就来补充一下c雷和对象最后一点内容. 首先先补充一下上一篇博客上c类和对象(下篇)上-CSDN博客最后学习的静态成员变量的小练习求123...n_牛客题霸_牛客网 (nowcoder.com)下面就是题解.灵活的运用了静态成员变量不销毁的特点,建立数组利用构造函数来完成n次相加. class A{ …...
HTTP 失败重试(重发)方案
在 Qt 网络开发中,使用 QNetworkAccessManager 进行 HTTP 请求时,可能会遇到网络超时、服务器错误等情况。为了提高请求的可靠性,可以实现 HTTP 失败重试(重发) 机制。下面介绍几种常见的 失败重发方案: 单…...
使用WebDAV将文件传输到实时(RT)目标 转发
如何配置Web分布式创作和版本控制(WebDAV)服务器并使用它来与我的实时(RT)目标之间传输文件? 在目标上安装 WebDAV 和 SSL 支持 NI Linux Real-Time 您无需完成任何安装 WebDAV 和 SSL 支持的步骤。默认情况下,这些组件在NI Linu…...
Web爬虫利器FireCrawl:全方位助力AI训练与高效数据抓取
Web爬虫利器FireCrawl:全方位助力AI训练与高效数据抓取 一、FireCrawl 项目简介二、主要功能三、FireCrawl应用场景1. 大语言模型训练2. 检索增强生成(RAG):3. 数据驱动的开发项目4. SEO 与内容优化5. 在线服务与工具集成 四、安装…...
如何避免PRD(需求文档)成为“沟通黑洞”
在撰写PRD(需求文档)时,要避免成为“沟通黑洞”,必须聚焦目标清晰、需求拆解、协同评审、持续迭代等关键点。其中,协同评审尤其重要——通过在文档完成初期就邀请相关部门共同审阅讨论,可以及早发现需求逻辑…...
c++基础知识--返回值优化
在 C 中,Named Return Value Optimization(NRVO,具名返回值优化) 是一种编译器优化技术,用于消除函数返回一个局部对象时的拷贝或移动操作。它是 返回值优化(RVO) 的一种更复杂的变体࿰…...
go面向对象编程三大特性,封装、继承和多态
1.简介 go具有面向对象编程的封装、继承和多态的特性,只是实现的方式和其它OOP语言不一样,下面看下go的三大特性是如何实现的。 2.封装 2.1基本介绍 封装就是把抽象出的字段和对字段的操作封装在一起,数据被保护在内部,程序的其它包只能通过被授权的操作(方法),才能…...
巧用符号链接搬移C盘中的软件数据目录到其他盘
#工作记录 我们知道,在Windows11系统,有些软件是不能指定安装目录的,有些软件即使指定了安装目录可是在更新版本之后还是会安装到默认的C盘目录中(比如剪映),而且每次安装某些软件之后,这些软件…...
使用 PIC 微控制器和 Adafruit IO 的基于 IoT 的 Web 控制家庭自动化
使用 PIC 微控制器和 Adafruit IO 的基于 IoT 的 Web 控制家庭自动化 家庭自动化一直是我们大多数人的灵感来源。从我们舒适的椅子或任何房间的床上切换交流负载,而无需伸手去触碰另一个房间的开关,听起来很酷,不是吗!.现在,在物联网时代,多亏了 ESP8266 模块,它使从世界…...
高性能Java并发编程:线程池与异步编程最佳实践
Future模式与CompletableFuture 处理异步任务时,Future与CompletableFuture是强有力的工具。 实战案例:多API并行调用 假设我们需要从多个微服务获取数据,然后合并结果: public UserProfileDto getUserProfile(Long userId) {…...
【Java篇】一气化三清:类的实例化与封装的智慧之道
文章目录 类和对象(中)五、对象的构造及初始化5.1 如何初始化对象5.2 构造方法5.2.1 构造方法的概念5.2.2 构造方法的特性 5.3 默认初始化5.4 就地初始化 六、封装6.1 封装的概念6.2 访问限定符6.3 封装扩展之包6.3.1 包的概念6.3.3导入包6.3.3全类名6.3…...
VMware上调整centos终端的背景颜色
目录 1. 正常打开一个终端,背景颜色默认为白色 2. 在打开的终端页面上右击,选择“配置文件首选项” 3. 取消默认勾选的 “使用系统主题中的颜色” 即可 1. 正常打开一个终端,背景颜色默认为白色 2. 在打开的终端页面上右击,选择…...
Netty源码—1.服务端启动流程二
大纲 1.服务端启动整体流程及关键方法 2.服务端启动的核心步骤 3.创建服务端Channel的源码 4.初始化服务端Channel的源码 5.注册服务端Channel的源码 6.绑定服务端端口的源码 7.服务端启动流程源码总结 5.注册服务端Channel的源码 (1)注册服务端Channel的入口 (2)注册…...
