当我们在 shell 上打开 Vi 编辑器时到底会发生什么 [已关闭]

问题描述 投票:0回答:1

当我们编写命令

vi <filename>
时,到底发生了什么 - 没有为它打开新窗口,看起来它确实进入了shell之外的某种其他模式。当我们离开
vi
时,我们又回到了 shell。

它是否使用哈希来检查

<filename>
是否已经存在以及 if:

  • 它不存在于用户输入的目录中,它使用
    create
    系统调用来预留磁盘空间。
  • 如果存在则使用系统调用
    open

除此之外,所有文本编辑器(如

nano
emacs
)都会发生这种情况吗?

linux bash vi
1个回答
3
投票

vi
使用终端(实际上是终端模拟器)。用 Unix 的话说,它是一个 tty。阅读 TTY 揭秘tty(4)(适用于
/dev/tty
)、pty(7)伪终端)。

它使用一些终端库,如 ncurses,构建于 termios(3) 之上。另请参阅 ioctl_tty(2) (实际上

vim
不要使用
ncurses
,只是与
ncurses
相关的较低级别 libtinfo

看起来它确实进入了 shell 之外的其他模式。

这不是 shell 的模式,而是 tty 的模式(处理终端仿真器)。 ANSI 转义代码 也相关。

另请参阅 stty(1)

终端IO不仅在libc中缓冲,也在内核中缓冲。了解线路纪律

关于编辑文件,

vi
的工作方式与大多数文本编辑器一样,它在内存中维护一个描述缓冲区当前内容的数据结构,并在内存中处理该结构。仅当您保存缓冲区时,内容才会写入文件(使用与文件相关的系统调用,如 open(2)write(2)close(2))。

顺便说一句,

vim
是免费软件(或开源),因此请下载并研究它的vim
源代码
。而且 emacsnano 也是免费软件。

花时间阅读一些优秀的 Linux 系统编程书籍(例如旧的 ALP 或较新的书籍),然后阅读 syscalls(2)。请注意,终端 IO 在细节上相当复杂(因为 terminals 例如 VT100VT220 很复杂)。所以你可能想使用像

ncurses
这样的库(或者可能是 readline

顺便说一句,在 2023 年,考虑使用图形用户界面(例如XorgWayland显示服务器)以及使用一些开源图形小部件工具包的开源编辑器。

vim
GNU emacs等的最新变体使您能够使用鼠标和各种字体以及语法突出显示

© www.soinside.com 2019 - 2024. All rights reserved.