Shell具有更好的编辑function

壳(至少我所知道的)具有非常糟糕的命令编辑function。

例如:

  • 我无法将光标指向命令的任何一点。
  • 我无法在命令中选择和退格/删除/替换文本。

目前这些令人分心,我使用gedit编辑命令,然后将它们粘贴到终端。

有没有什么解决方案对这些有益?

Bash实际上相当擅长这个。 你只需要学习它的快捷方式。 例如(在默认的emacs模式下):

  • Ctrl + A :移动到行的开头。
  • Ctrl + E :移动到行尾。
  • Ctrl + B :向后移动一个字符。
  • Ctrl + F :向前移动一个字符。
  • Alt + B :向后移动一个单词。
  • Alt + F :向前移动一个单词。
  • Ctrl + K :删除(剪切)所有内容,直到行尾。
  • Alt + D :删除(剪切)光标后的单词。
  • Ctrl + W :删除(剪切)光标前的单词。
  • Ctrl + Y :猛拉(粘贴)缓冲区中的内容(例如,使用Ctrl + KAlt + D剪切的内容)

还有更多。 阅读man readline以了解还有什么可用。 您可以通过将它们放在~/.inputrc来指定不同的快捷方式。 例如,要使Ctrl + Left返回一个单词并按Ctrl + 向右前进一个单词,将其添加到~/.inputrc

 "\e[1;5D": backward-word "\e[1;5C": forward-word 

要找出这些奇怪代码的含义,请按Ctrl + V然后按您要使用的键。 如果您尝试使用Ctrl + Right ,您将看到^[[1;5C 。 在~/.inputrc替换^[\e


您可能还想查看其他shell。 流行的“现代”,function丰富的shell包括:

  • zsh的
  • KSH

您可以通过将EDITOR设置为您选择的编辑器并按CTRL + X + ECTRL + X / CTRL + E (编辑EDITOR打开当前正在编辑的行),将空或部分键入的命令编辑到您选择的编辑EDITOR ;

例如,将EDITOR设置为gedit将使CTRL + X + ECTRL + X / CTRL + E打开Gedit中的当前行。

要使其成为永久解决方案,您可以在~/.bashrc设置EDITOR

这允许甚至使用完全成熟的图形文本编辑器来编辑命令; 要运行已编辑的命令,只需保存并关闭文档。


通过在~/.zshrc添加以下内容,可以在Zsh中启用相同的function:

 autoload -U edit-command-line zle -N edit-command-line bindkey '^xe' edit-command-line bindkey '^x^e' edit-command-line 

终端本身没有文本编辑function。 终端提供文本区域并将键盘连接到某些东西。 但是你在终端内运行的东西决定了它能做什么。

bash这样的shell通常是你会发现在终端内运行的第一件事。 由于shell基于命令工作,因此您只能编辑当前命令。 与Bourne shell或cshksh相比, bash提供了出色的命令编辑function ,但即使是简短的故事也很难编辑。

文本编辑器是您可以在shell中调用的命令之一。 领先的例子是vim和emacs 。 vimemacs将使您能够编辑几乎任何东西。 两者都包含内置的编程环境,可以将您的能力扩展到您遇到的任何问题。

因此,解决方案是更好地了解这些工具正在做什么和打算做什么,并为工作挑选合适的工具。

通常终端允许用鼠标选择文本,但是shell没有意识到这一点。 所以不幸的是bashzshfishes都不支持基于鼠标的编辑。 我认为这样做,他们需要更好地控制终端。

但是(如果您打开Vim或GVim,然后使用以下命令输入shell命令,这有点延伸)

 :!... 

然后你可以点击你的鼠标跳转到该行的任何地方 。 (您将需要:set mouse=a如果尚未启用,请先:set mouse=a第一个。)此模式下的编辑键可以看到:help cmdline-editing

Vim还有一个非常强大的命令历史模式,可以通过点击q 到达。 从那里你可以使用Vim的普通模式命令猛拉,删除和粘贴。 在此模式下,您可以获得所需的鼠标选择,然后删除所需的function(通过按d )。

这里一个重要的警告是Vim实际上并没有运行实时shell会话。 您执行的每个命令都将在子进程中运行。 因此,子进程对环境变量或shell选项所做的任何更改都将丢失。

也就是说,您可以 Vim进程中修改环境变量,并在Vim的命令行中使用它们,甚至可以将它们导出到子进程:

 :let $FOO="bar" " the $ and the quotes are mandatory here :echo $FOO " Vim's own echo command bar :!echo "$FOO" " Passing the variable to a shell command bar :!bash " Opening a child shell $ echo "$FOO" bar 

因此,如果您愿意假装Vim实际上是某种奇怪的shell,那么您可以享受其高级编辑function! 可能最大的缺点是你必须输入以下任一项来启动每个命令:! 或者q:

哦顺便说一句,如果你想将shell命令的输出输入你当前的Vim缓冲区,你可以这样做(但要注意它会破坏你当前的行):

 :,!ls