![为什么在控制台中剪切和粘贴时文本换行比在任何其他应用程序中慢得多?](https://linux22.com/image/1528951/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%9C%A8%E6%8E%A7%E5%88%B6%E5%8F%B0%E4%B8%AD%E5%89%AA%E5%88%87%E5%92%8C%E7%B2%98%E8%B4%B4%E6%97%B6%E6%96%87%E6%9C%AC%E6%8D%A2%E8%A1%8C%E6%AF%94%E5%9C%A8%E4%BB%BB%E4%BD%95%E5%85%B6%E4%BB%96%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E4%B8%AD%E6%85%A2%E5%BE%97%E5%A4%9A%EF%BC%9F.png)
我经常使用 Vim,但有时我感觉自己可以用凯特ctrl。因此我通过+从 vim 复制文件c并将其粘贴到 Kate 中。
这样,一切都会很快。但如果我将其重新粘贴到 Vim,即使使用,粘贴过程也会变得非常慢:set paste
。
我多少能理解这一点,因为 Vim 可以做很多事情,但不仅仅是 Vim。但在其他应用程序中,我也看到了同样的情况。将内容粘贴到 MYSQL 服务器中也很慢。bash 和 Zsh 也是如此。
我不明白为什么在图形应用程序中粘贴需要自动换行的长文本(几乎总是)比在命令行中更快。在 GUI 中执行此操作不是需要更多计算吗?我的意思是,从技术上讲,命令行是一个非常大的像素块(每个像素可以显示单个字母)。命令行分辨率远低于 GUI,因此应该更快。
答案1
vim 有一个 GUI 版本(gvim),包括一个用于 Windows 的版本(以及一个用于在 X-GUI 上运行的‘Cygwin’的版本(也可以在 Windows 上运行)。
我会尝试原生的 gvim,看看它是否能提供你想要的速度。
注意:我认为最新的 vim 根本无法在控制台中运行(问题太多)。(澄清:cygwin 版本无法在 Windows cmd.exe 中运行 - 没有终端支持。它确实可以在常规 TTY 仿真器以及 cygwin tty 仿真器和 cygwin-X 下运行 - 最好的可能是 cygwin-X - 我运行我的 linux-gvim 会话,仅通过 cygwin 的 X。我与服务器的连接是“内部”的(不暴露给互联网),所以我不需要使用加密,所以它运行得非常快。
但是,为了更好地回答原始海报的问题,有一些未知数 - 比如他在谈论什么控制台,当他提到 zsh 和 bash 时,他是在谈论 cygwin 版本,还是在 win10-linux 子系统下运行的版本,或者什么?
最初认为问题可能是您使用的控制台,因此建议尝试本机版本,但至于为什么控制台速度较慢——我将在下面提到。请记住:即使您运行文本控制台——它仍然可能在 Windows 桌面上运行。因此,它是文本控制台窗口的 GUI 仿真——而不是像旧的 Windows 之前的 DOS 控制台那样基于实际硬件的控制台(例如,它使用图形硬件进行滚动)。至于本机 vim 版本:
尝试https://tuxproject.de/projects/vim/
我推荐这个版本: http://tuxproject.de/projects/vim/complete-x64.exe
如果您不关心如何更快地将文本粘贴到 vim 中,而只想知道为什么控制台速度较慢 --- gui 可以直接接受粘贴的文本,而无需通过逐个字符的读/写界面(控制台)。通过控制台涉及一次读取和写入单个字符。即粘贴进入视窗(操作系统),将其转换为发送到控制台输入驱动程序的单字符流。这些字符进入系统缓冲区(不是 vim)。然后 vim 必须从系统中读取这些字符。虽然您可以读取/写入多个字符,但它们仍然由底层软件一次处理和显示 1 个字符。效率非常低。当 vim 更新控制台时 - 它会写入字符并输出 tty 移动代码(输入时则不然)以移动文本。一切都通过将图形操作转换为发送到控制台的字符代码来处理,控制台会解释字符代码以模拟 TTY。
除此之外,它仍然会执行 vim 所做的正常处理——但要查看哪个影响更大,运行 vim 的 GUI 版本将会切断所有的控制台内容。
除了模拟控制台的正常缓慢之外,Windows 中的控制台还在 Windows 中运行——而且自 XP 以来,Windows 一直在添加更多间接层。XP 中至少添加了 1 个,这是一个合理的小/快速层,但到了 vista/win7,每个键的延迟都非常明显。每个键都会发生这些延迟!据我所知,Win10 添加了更多层以允许云和远程设备间接访问。
至于 GUI 版 vim 中的粘贴功能——它添加了间接操作,但它们针对的是整个粘贴消息(而不是每个字符)。因此,vim 会获取它可以处理的整个粘贴文本,而无需用每个字符更新屏幕——因此只需更新 1 个屏幕即可需要粘贴的文本处理完毕后。可能还会进行更多操作,具体取决于处理速度和视频速度——例如,vim 有时会在处理时间较长时显示部分进度,但我相信这是 vim 中可切换的选项。