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 + K或Alt + 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 + E或CTRL + X / CTRL + E (编辑EDITOR
打开当前正在编辑的行),将空或部分键入的命令编辑到您选择的编辑EDITOR
;
例如,将EDITOR
设置为gedit
将使CTRL + X + E和CTRL + 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或csh
或ksh
相比, bash提供了出色的命令编辑function ,但即使是简短的故事也很难编辑。
文本编辑器是您可以在shell中调用的命令之一。 领先的例子是vim和emacs 。 vim
或emacs
将使您能够编辑几乎任何东西。 两者都包含内置的编程环境,可以将您的能力扩展到您遇到的任何问题。
因此,解决方案是更好地了解这些工具正在做什么和打算做什么,并为工作挑选合适的工具。
通常终端允许用鼠标选择文本,但是shell没有意识到这一点。 所以不幸的是bash
, zsh
, fish
和es
都不支持基于鼠标的编辑。 我认为这样做,他们需要更好地控制终端。
但是(如果您打开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