当我们编写命令
vi <filename>
时,到底发生了什么 - 没有为它打开新窗口,看起来它确实进入了shell之外的某种其他模式。当我们离开 vi
时,我们又回到了 shell。
它是否使用哈希来检查
<filename>
是否已经存在以及 if:
create
系统调用来预留磁盘空间。open
。除此之外,所有文本编辑器(如
nano
和 emacs
)都会发生这种情况吗?
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
的源代码。而且 emacs 和 nano 也是免费软件。
花时间阅读一些优秀的 Linux 系统编程书籍(例如旧的 ALP 或较新的书籍),然后阅读 syscalls(2)。请注意,终端 IO 在细节上相当复杂(因为 terminals 例如 VT100 或 VT220 很复杂)。所以你可能想使用像
ncurses
这样的库(或者可能是 readline)
顺便说一句,在 2023 年,考虑使用图形用户界面(例如Xorg或Wayland显示服务器)以及使用一些开源图形小部件工具包的开源编辑器。
vim
或GNU emacs等的最新变体使您能够使用鼠标和各种字体以及语法突出显示。