清除 mysql 控制台中当前编辑的行

清除 mysql 控制台中当前编辑的行

哪个组合键将清除 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变量关闭,否则它将重新定义这样的绑定每次调用它读取新的输入行时。实际上,要关闭这个功能非常困难。

有三个注意事项。

  1. 这些库。它们具有各种可用的程序控制调谐旋钮,因此程序可以以微妙不同的方式使用它们。
  2. mysql命令可以使用任何一个GNU Readline或者 libedit。如果编译时使用,libedit则常规键绑定是从VKILLem-kill-line操作。这将删除整行并执行您想要的操作。
  3. 如果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-discardbind-tty-special-charsstty
    • 因此绑定一些其他kill-whole-line您在文件中选择的字符序列,除非您对关闭~/.inputrc的效果感到满意。bind-tty-special-chars
  • 如果mysql是用以下方式构建的libedit
    • 只要您处于“emacs”模式,常规的Control+ U(或任何stty -a表示您的kill角色的字符)都会让您libedit执行em-kill-line操作(“emacs kill line”)。这正是您想要的。
    • 您不必在libedit~/.editrc文件中执行任何操作。
    • 在“vi”模式下,你的VKILL角色将被绑定到libeditvi-kill-line-prev动作(“vi 杀死光标所在的行”)。

这一切都不以任何方式涉及您的终端仿真器。

进一步阅读

答案2

一些有用的快捷方式:

  • Ctrl+ W:删除前一个单词,重复,直到该行是空的
  • Ctrl+ K:删除光标当前位置之后的所有内容
  • Ctrl+ A:转到行首。与Ctrl+组合 K可删除。我通常只需按住Ctrl并依次按下A和即可。K

您可能还对以下内容感兴趣在 U&L.se 上以及下图所示的按键绑定中回答:

在此处输入图片描述

相关内容