具有更好的编辑功能的Shell


11

Shell(至少我所知道的)具有非常差的命令编辑功能。

例如:

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

目前,这些命令分散了我的注意力,我在将命令粘贴到终端之前使用gedit编辑命令。

有没有适合这些的解决方案?


3
您正在将一个终端与一个外壳合并。
JdeBP

Answers:


13

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。流行的“现代”,功能丰富的外壳包括:


gnome-terminal您必须使用ESC按钮,而不是ALT 向前和向后导航一个单词。。..或切换到不使用Alt作为其应用程序菜单的终端。。。像xterm或sakura
Sergiy Kolodyazhnyy 2015年

@Serg不在我的系统上,谢谢。我不知道您是否以这种方式设置它,还是Ubuntu对其进行了一些默认调整。Esc通常被用作Alt的同义词。
terdon

终端之间没有共享切割缓冲区。
Craig Hicks

7

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

例如,设置EDITORgedit将使CTRL+ X+ ECTRL+ X/ CTRL+ E在Gedit中打开当前行。

要使其成为永久解决方案,您可以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

2
fc如果设置了FCEDIT变量,也可以使用命令来调用它。好答案 !
Sergiy Kolodyazhnyy 2015年

1
@Serg谢谢,但是fc打开了前面的命令(在某些方面它甚至更整洁)。我不知道,谢谢!
kos 2015年

6

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

bash通常,诸如Shell之类的东西是您要在终端内部运行的第一件事。由于外壳基于命令工作,因此您只能编辑当前命令。 提供了出色的编辑命令相比Bourne shell或cshksh但却是几乎你想编辑甚至一个小故事的东西。

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

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


我知道区别,但是可以做些什么来改善bash的命令编辑吗?
UniversallyUniqueID

1
把它放在脚本中?
小鸡

0

通常,终端允许使用鼠标选择文本,但是外壳并没有意识到这一点。因此bash,很遗憾zsh,,fish和都不es支持基于鼠标的编辑。我想这样做,他们将需要对终端进行更大的控制。

但是(这一个有点夸张),如果你使用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实际上是某种怪异的外壳,那么您可以享受其高级编辑功能!可能的最大缺点是,您必须通过键入:!或来启动每个命令。q:

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

:,!ls
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.