如果您在 Linux 终端中输入了一条命令,尤其是很长的命令,并且想要删除一个或多个单词并用其他内容替换它们,有没有一种方法可以在终端中快速执行此操作?
这与 Linux 无关,但在记事本等应用程序中,您可以选择一个或多个单词并一步删除它们。但是,据我所知,在终端中,我必须逐个字母地删除它们,这可能是一个缓慢的过程。
我知道 Vim 可以做到这一点,但我们假设我想直接在终端中编辑它,而不是在 Vim 中打开它。
答案1
默认情况下,您可以使用以下键绑定[1]在终端中移动光标
alt + b move one word backward
alt + f move one word forward
ctrl + b move one character forward
ctrl + f move one character forward
按单词移动比按字符移动要快得多。一旦你的角色就位,你就可以使用
alt + d to delete a word in cursor position
ctrl + d delete a character in cursor position
如果您有 vi 键绑定设置(谢谢@admstg)在 bash 中,您可以键入ESC
key 进入 vi 模式。以下是如何使用 vi 键绑定移动光标[2]
h move left by a character
l move right by a character
b move back by a word
w move forward by a word
dw delete word at cursor
x cut a character at cursor
u undo
r replace a character
v enter vi editor to edit the command
参考:
- [1]Linux 命令行第 81-83 页。
- [2]如何在 Bash 中使用 Vi 模式。
- [3]Bash Readline 交互。
答案2
我个人更喜欢经常使用以下键。我bash
主要使用其默认设置,并在 中定义了以下一些附加功能.inputrc
:
"\e[1;5A": previous-screen-line
"\e[1;5B": next-screen-line
CtrlUp并将CtrlDown光标移动到命令的上一个/下一个可视行。对于很长的多行命令很有用。
"\e[1;5C": forward-word
"\e[1;5D": backward-word
CtrlLeft并按CtrlRight单词水平移动光标。
"\e[3;5~": kill-word
"\b": backward-kill-word
CtrlDelete并CtrlBackspace删除右侧/左侧的整个单词。 (AltBackspace默认情况下应该这样做,但我更喜欢Ctrl与其他应用程序以及其他快捷键保持一致。)
当然Home,End和往常一样Delete,Backspace这些都是开箱即用的。
请查阅readline
手册的“编辑命令”部分,寻找您可能觉得方便的其他可能性。
切换到另一个流行的 shell,例如zsh
或fish
可能会提供更多(或只是不同)的选项,我对它们不熟悉,您可能还想看看。
一些终端模拟器(我不确定是哪些)允许用鼠标定位光标。这是一个黑客行为,一个有点不可靠的猜测:终端合成几个Left或Right按键(根据点击点与光标的相对位置),就像您多次按下这些箭头键一样,并假设应用程序( shell)将通过将光标移动到那里来对此做出反应(这通常是但并不总是正确的猜测)。
答案3
如果您使用通常的默认 emacs 键绑定(IE 不是 vi 绑定),您可以使用CtrlW从光标向后删除到下一个空格边界。
当尝试删除路径或 URL 的一部分时,这可能有点激进,因此也存在AltBackspace尊重各种其他单词边界字符的情况。
有许多可用的绑定,此处无法列出。
答案4
您可以使用vi
直接在终端中使用命令set -o vi
。