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 exit
    rc = 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 主要有三种模式,分别是命令模式、输入模式、末行模式,三者切换关系如下:

在这里插入图片描述

默认是命令模式,按 iao 进入输入模式,再按 ESC 返回到命令模式。在命令模式输入 : 切换到末行模式,再按 ESC 又返回到命令模式。输入模式和末行模式之间不能直接切换,只能通过命令模式切换。

2. 命令模式

命令说明
xXx 是删除下一个字符,X 是删除上一个字符
数字 + x删除指定数量的字符,例如 10x 表示删除 10 个字符
dd剪切(删除)光标所在行
数字 + dd删除指定数量的行,例如 20dd 表示删除 20 行
yy复制光标所在行
数字 + yy复制指定数量的行,例如 20yy 表示复制 20 行
pPp 是粘贴到下一行,P 是粘贴到上一行
u撤销
Ctrl+r反撤销
.(小数点)重复上一个动作
ggGgg 是回到第一行,G 是回到最后一行
数字 + G跳转到指定行,例如 20G 表示跳转到第 20 行
y1GyGy1G 是复制当前行前面的所有数据,yG 是复制当前行之后的全部数据
d1GdGd1G 是删除当前行前面的所有数据,dG 是删除当前行之后的全部数据
vVCtrl+vv 是光标起始和结束之间的文本会被选中,V 是光标起始和结束之间的所有行被选中,Ctrl+v 是光标起始和结束之间构成的矩形区域被选中

3. 输入模式

命令说明
iIi 是从光标所在位置开始输入,I 是从光标所在行第一个非空白字符开始输入
aAa 是从光标所在的下一个字符开始输入,A 是从光标所在行的最后一个字符开始输入
oOo 是从光标所在行的下一行新的一行开始输入,O 是从光标所在行的上一行新的一行开始输入
rRr 是取代光标所在的字符一次,R 是依次取代光标所在字符

4. 末行模式

命令说明
:w保存
:q退出
:wqZZ保存并退出
:q!ZQ不保存退出
:set nu显示行号
:set nonu隐藏行号
:/搜索的文本搜索指定文本
:%s/要替换的字符/替换后的字符/g全局替换文本,% 表示对整个文件进行操作,g 表示全局替换

via:

当前,全球经济格局深刻调整,数字化浪潮席卷各行各业,智能物流作为现代物流发展的必然趋势和关键支撑,正迎来前所未有的发展机遇。以人工智能、物联网、大数据、云计算、区块链等前沿信息技术的快速迭代与深度融合为驱动,智能物流不再是传统物流的简单技术叠加,而是正在经历一场从自动化向智能化、从被动响应向主动预测、从信息孤岛向全面互联的深刻变革。展望2025年,智能物流系统将不再局限于提升效率、降低成本的基本目标,而是要构建一个感知更全面、决策更精准、执行更高效、协同更顺畅的智慧运行体系。这要求我们必须超越传统思维定式,以系统化、前瞻性的视角,全面规划和实施智能物流系统的建设。本实施方案正是基于对行业发展趋势的深刻洞察和对未来需求的精准把握而制定。我们的核心目标在于:通过构建一个集成了先进感知技术、大数据分析引擎、智能决策算法和高效协同平台的综合智能物流系统,实现物流全链路的可视化、透明化和智能化管理。这不仅是技术层面的革新,更是管理模式和服务能力的全面提升。本方案旨在明确系统建设的战略方向、关键任务、技术路径和实施步骤,确保通过系统化部署,有效应对日益复杂的供应链环境,提升整体物流韧性,优化资源配置效率,降低运营成本,并最终为客户创造更卓越的价值体验。我们致力于通过本方案的实施,引领智能物流迈向更高水平,为构建现代化经济体系、推动高质量发展提供强有力的物流保障。
电源题电赛单相并网离网软件硬件锁相环单极性双极性调制等代码及仿真环路计算资料+原理图PCB内容概要:本文档是一份关于电力电子与能源系统仿真研究的技术资料集合,涵盖单相并网/离网系统、软件与硬件锁相环设计、单极性与双极性调制技术、虚拟同步机控制建模、P2G-CCS耦合系统、微电网优化调度、光伏风电联合运行、储能配置及需求响应等多个电力系统核心主题。文档提供了大量基于Matlab/Simulink的代码实现与仿真模型,包括LLC谐振变换器小信号分析、永磁同步电机控制、DC-AC变换器设计、光伏阵列故障仿真、直流微电网建模等,并附有原理图与PCB设计资源。同时整合了智能优化算法(如遗传算法、粒子群、灰狼优化器)、机器学习模型(如LSTM、CNN-GRU-Attention)在负荷预测、故障诊断、路径规划等领域的应用案例,形成一个跨学科的科研资源包。; 适合人群:电气工程、自动化、能源系统及相关专业的研究生、科研人员以及从事电力电子、微电网、新能源控制方向的工程师;具备Matlab/Simulink编程基础和一定电力系统理论知识者更佳。; 使用场景及目标:① 支持电赛或科研项目中对并网逆变器、锁相环、调制策略的设计与验证;② 用于复现高水平论文(如EI/SCI)中的优化调度、控制算法与仿真模型;③ 辅助开展微电网能量管理、储能配置、需求响应策略等课题的研究与代码开发;④ 提供可直接调用的算法模板与仿真平台,提升科研效率。; 阅读建议:建议按照文档结构逐步浏览,优先下载并整理网盘中的完整资源包,结合具体研究方向选取对应代码与模型进行调试与二次开发;对于复杂算法(如NSGA-II、ADMM、MPC),应配合文献理解其数学原理后再实施仿真;关注其中“论文复现”类内容以提升学术研究规范性与技术深度。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值