具有更好编辑功能的 Shell

具有更好编辑功能的 Shell

贝壳(至少我知道的)有真的糟糕的命令编辑能力。

例如:

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

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

有没有什么好的办法可以解决这些问题?

答案1

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+Right前进一个单词,请将其添加到您的~/.inputrc

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

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


您可能还想了解其他 shell。流行的“现代”、功能丰富的 shell 包括:

答案2

EDITOR您可以通过设置您选择的编辑器并点击CTRL+ X+ECTRL+ X/ CTRL+来在您选择的编辑器中编辑一个空的或部分输入的命令E,这将打开当前正在编辑的行EDITOR

例如,设置EDITORgedit将使CTRL++和+ / +在XGedit中打开当前行。ECTRLXCTRLE

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

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


通过在 Zsh 中添加以下内容可以启用相同功能~/.zshrc

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

答案3

端子本身没有文本编辑功能。终端提供文本区域并将键盘连接到某个东西。但是某物您在终端内运行的内容决定了它可以做什么。

贝壳这类命令bash通常是您在终端中发现的第一个运行命令。由于 shell 基于命令工作,因此您只能编辑当前命令。 提供优良命令编辑与 Bourne shell 相比,或者csh然而ksh你几乎不会想用它来编辑哪怕是一个短篇小说。

文本编辑器是您可以在 shell 中调用的命令之一。主要示例包括. vimemacs将使您能够编辑几乎任何内容。两者都包括内置编程环境,可将其功能扩展到您遇到的任何问题。

因此,解决方案是更好地理解这些工具的作用和目的,然后选择合适的人选

答案4

通常终端允许使用鼠标选择文本,但 shell 并不知道这一点。因此不幸的是bashzshfishes都不支持基于鼠标的编辑。我认为要做到这一点,他们需要对终端进行更大的控制。

然而(这有点牵强),如果你打开 Vim 或 GVim,然后使用以下命令输入 shell 命令:

:!...

然后你可以点击鼠标即可跳转到该行的任意位置:set mouse=a。(如果尚未启用,则需要先启用。)此模式下的编辑键可以通过:help cmdline-editing

Vim 还具有相当强大的命令历史模式,可以通过点击 进入q:。从那里,您可以使用 Vim 的正常模式命令进行复制、删除和粘贴。在此模式下,您可以获得用鼠标选择然后删除您想要的功能(通过点击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,那么您可以享受其高级编辑功能!可能最大的缺点是您必须通过键入或来启动每个:!命令q:

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

:,!ls

相关内容