当我们写命令vi <filename>
时,究竟会发生什么-没有打开任何新窗口,看来它肯定会进入 shell 之外的其他模式。然后,当我们离开vi
之后,我们将返回外壳。
它是否使用哈希检查<filename>
是否已经存在以及是否:
create
系统调用在磁盘上保留空间的用户输入的目录中。open
。除此之外,nano
和emacs
之类的所有文本编辑器还会发生这种情况吗?
答案 0 :(得分:3)
vi
使用终端(实际上是terminal emulators)。用Unix的话来说是一个tty。阅读The TTY Demystified,tty(4)(用于/dev/tty
),pty(7)(pseudoterminals)。
它使用一些ncurses之上的终端库,例如termios(3)。另请参见ioctl_tty(2)(实际上vim
不使用ncurses
,而仅使用与ncurses相关的较低级别libtinfo
)
看来它肯定会进入外壳之外的其他模式。
这不是Shell的模式,而是tty(与终端仿真器配合)的模式。 ANSI escapes codes也很重要。
另请参阅stty(1)。
终端IO不仅在libc中缓冲,而且在内核中。了解有关line discipline的信息。
关于编辑文件,vi
的工作方式与大多数text editors相似,它在内存中维护描述缓冲区当前内容的数据结构,并在内存中对该结构进行处理。仅在保存缓冲区时,才会将内容写入文件(使用文件相关的系统调用,例如open(2),write(2),close(2))。
顺便说一句,vim
是免费软件(或开放源代码),因此请下载并研究其vim
中的source code。 emacs和nano也是免费软件。
花点时间阅读一些不错的Linux系统编程书籍(例如旧的ALP或更新的书籍),然后再阅读syscalls(2)。请注意,终端IO的细节非常复杂(因为terminals(例如VT100或VT220很复杂)。因此,您可能想使用ncurses
(或readline)之类的库