哪个组合键将清除 MySQL 控制台命令行?
我不确定这是否只是在任何 Unix/Linux 终端中清除当前编辑的行的子场景,或者在运行 MySQL 命令时行为是否实际上不同,或者可能取决于我正在运行的终端应用程序......
无论如何,我正在使用运行 MySQL 命令提示符的 Debian lenny Linux 框,这一切都是通过 putty 从 Windows 完成的。
通常,在编辑我正在编写的 SQL 时,我只想“重置”当前编辑并重新开始。
我知道我可以按 End 键,然后按足够的 Backspace 键直到行清除,但我正在寻找更快的方法......
我还知道按 Ctrl+C 会终止 mysql 控制台,然后我可以按向上箭头来获取执行控制台的命令并重新启动它。但这感觉像是过度终止(并且还会在屏幕上呈现相当多的文本...)。
谢谢。
答案1
我不确定这是否只是在任何 Unix/Linux 终端中清除当前编辑的行的子场景,或者在运行 MySQL 命令时行为是否实际上不同,或者可能取决于我正在运行的终端应用程序......
它不依赖于您的终端仿真器;MySQL 与您所想象的不同,但并非如此;并且它不是一个子集。
背景
简单的 Unix 和 Linux 程序仅从read()
标准输入获取输入。历史惯例是,Unix 和 Linux 中的终端通常在俗称“熟模式”和正式和适当称为“规范模式”的模式下运行。在这种模式下,内核的一部分称为生产线纪律进行所有的行编辑,并且程序只接收read()
用户发送的最后编辑的行行尾字符(通常LF
)从终端。
在规范模式下,行规程会识别并执行大量特殊字符。行尾字符只是其中之一。另一个是殺掉角色。这会“杀死” (line令规的) 编辑缓冲区。因为光标只能在行的末尾,行规则的编辑工具没有在正在编辑的行内移动光标的机制,这会杀死整行。
早在 20 世纪 80 年代和 90 年代,人们就想要一个比这更好的 TUI。他们想要能够在行内移动光标。他们想要插入/重写模式。他们想要命令历史记录。
因此,GNU Readline 及其同类产品应运而生。GNU Readline 是一个库,许多流行程序都使用它,包括 Bourne Again shell 和命令mysql
。Readline 将终端切换到俗称“原始模式”的状态(正式名称为“非规范模式”)。该程序read()
在终端发送字符时对其进行读取,而无需线路规则进行任何中间处理。Readline 会完成所有编辑工作,无需内核参与。
如今,终端花费大量时间处于非规范模式。当现代 shell 读取其输入时,它们就会这样做。(并非所有现代 shell 都使用 Readline。但它们都有使用非规范模式的东西。Z Shell 有自己的机制 ZLE。BSD 许可的程序使用 BSDlibedit
库,该库是 Christos Zoulas 从 Tenex C Shell for 4.4BSD 或 Editline 中获取的。)当使用终端的程序ncurses
处于活动状态时,它们就会这样做。规范模式主要发生在人们做一些事情时,比如意外地grep
使用终端,或者使用cat
终端输入创建文件,并且正朝着成为例外而不是常态的方向发展。
通常情况下,Readline 会从行规则中读取所有特殊键并创建键绑定(从字符序列到编辑操作的映射)将特殊字符与在规范模式下行规程所执行的操作相同的操作相匹配。
您可以使用命令查看行规则认为特殊字符是什么stty -a
。特别是,它会告诉您kill
特殊字符是什么。它通常是Control+ UASCIINAK
字符。从符号上讲,这个特殊字符称为VKILL
,来自 C 和 C++ 程序中用于设置它的常量的名称。
通常,Readline(或libedit
、或 ZLE 或 Editline)将具有从行规则的VKILL
字符到其“终止”操作之一的绑定。事实上,除非 Readline 的bind-tty-special-characters
变量关闭,否则它将重新定义这样的绑定每次调用它读取新的输入行时。实际上,要关闭这个功能非常困难。
有三个注意事项。
- 这些库库。它们具有各种可用的程序控制调谐旋钮,因此程序可以以微妙不同的方式使用它们。
- 该
mysql
命令可以使用任何一个GNU Readline或者libedit
。如果编译时使用,libedit
则常规键绑定是从VKILL
到em-kill-line
操作。这将删除整行并执行您想要的操作。 - 如果
mysql
使用 GNU Readline 编译,则VKILL
特殊字符通常绑定到unix-line-discard
。但这并不能完全满足您的要求,因为它只会删除从当前光标位置开始到行首。当然,如果只考虑行规程能做什么,这与规范模式下的行规程行为没有区别,因为光标位置始终位于行尾。
回答
- 如果
mysql
使用 Readline 构建:- 常规的Control+ U(或任何
stty -a
表示你的kill
角色的字符)将为你获取 Readline 的unix-line-discard
操作。这不会完全按照你的意愿执行,因为它只会删除从当前光标位置开始到行首。 - 您实际想要的操作是 Readline 的操作
kill-whole-line
,它会删除整行,而不管光标位置如何。 - 不幸的是,
kill-whole-line
并不绑定到您的VKILL
角色,或者默认情况下不绑定到任何字符;并且每次您开始新的输入行时, Readline 都会将 的绑定重置VKILL
回,除非您关闭并失去对 设置的行规则中特殊字符的自动镜像。unix-line-discard
bind-tty-special-chars
stty
- 因此绑定一些其他
kill-whole-line
您在文件中选择的字符序列,除非您对关闭~/.inputrc
的效果感到满意。bind-tty-special-chars
- 常规的Control+ U(或任何
- 如果
mysql
是用以下方式构建的libedit
:- 只要您处于“emacs”模式,常规的Control+ U(或任何
stty -a
表示您的kill
角色的字符)都会让您libedit
执行em-kill-line
操作(“emacs kill line”)。这正是您想要的。 - 您不必在
libedit
的~/.editrc
文件中执行任何操作。 - 在“vi”模式下,你的
VKILL
角色将被绑定到libedit
的vi-kill-line-prev
动作(“vi 杀死光标所在的行”)。
- 只要您处于“emacs”模式,常规的Control+ U(或任何
这一切都不以任何方式涉及您的终端仿真器。
进一步阅读
- 杰西·斯里索(2013年)。编辑行
- 编辑rc(5). FreeBSD 手册页。 FreeBSD 项目。
- 切特·拉米(2013年)。 GNU Readline 库。
- 通用终端接口. 开放群组基础规范。版本 7。IEEE Std 1003.1。2013 年。
- 彼得·斯蒂芬森(2003-03-23)。 “Z-Shell 行编辑器”。 Z-Shell 用户指南。
- “输入行编辑”。 MySQL 5.7 参考手册. 2014. 甲骨文公司。
答案2
一些有用的快捷方式:
- Ctrl+ W:删除前一个单词,重复,直到该行是空的
- Ctrl+ K:删除光标当前位置之后的所有内容
- Ctrl+ A:转到行首。与Ctrl+组合 K可删除。我通常只需按住Ctrl并依次按下A和即可。K
您可能还对以下内容感兴趣这在 U&L.se 上以及下图所示的按键绑定中回答: