Answers:
这只是关于bash
和的有趣注释readline
,但是如果您将EDITOR
环境变量设置为vim
,则点击Ctrl+ x+ e将在中打开当前行vim
。此外,如果键入Meta(Alt/Opt/Esc)+ Ctrl+ e,则bash将在当前命令行上执行就地扩展,即:
$ echo $EDITOR # Assuming EDITOR was set
与Meta(Alt/Opt/Esc)+ Ctrl+ e将成为
$ echo vim # Assuming EDITOR was set
与Ctrl+ x+ e将成为
1 echo vim # Assuming EDITOR was set
~
~
/tmp/sometmpbufferfile
注意,退出vim后,vim缓冲区的内容在命令行上执行。
当我想在bash中执行多行命令(例如for循环或需要here语句的程序)时,这些功能对我来说非常有用,并且提供了一种有趣的方式来保存一些命令行历史记录以供以后使用。
因此,要回答原始问题,您也可以写
$ This is an example
然后打Ctrl+ x+ e加载它在vim
。你也可以
$ $(cat /etc/hosts)
然后执行Meta(Alt/Opt/Esc)+ Ctrl+ e然后Ctrl+ x+ e,这会将所有主机文件放在一行上并加载到其中vim
(可能不是这些功能的最佳使用方式-但是,可以从所讨论的几个示例中推断出这些方法的有用性这里)。
请注意,我假设您readline
已设置为emacs
mode。如果将您的模式readline
设置为vim
mode,则可以使用以下命令轻松发现相关的绑定:
bind -p
和搜索edit-and-execute-command
或shell-expand-line
,将其分别与绑定相关联Ctrl+ x+ e和Meta(Alt/Opt/Esc)+ Ctrl+ e。
set -o vi
将其打开。然后,您可以v
在正常模式下使用映射在编辑器中编辑当前命令。
shell-expand-line
从扩展文本中删除换行符; 2. edit-and-execute-command
尝试执行在缓冲区中编写的命令退出vi时,无论是否保存。
在bash中,我发现使用<(command)
语法替换进程很有用,例如:
vim <(echo This is example.)
vim <(cat /etc/hosts)
也可以看看:
bash
和zsh
(不sh
,ksh
,dash
,fish
,csh
,tcsh
,等)
/proc/PID/fd/FD
。如果您编写缓冲区并退出,Vim不会抱怨,但是您写入的文件将被操作系统删除。使用-
打开的缓冲区作为文件名没有文件关联,因此,如果您尝试退出而没有(只要不使用bang命令或类似命令)退出Vim将会警告您。
vimdiff <(echo foo) <(echo bar)
。
:next
并:prev
重新读取流,什么也没得到。还值得一提的是,这些过程不是相互平行的(例如cat <(sleep 3; echo a) <(echo b)
,按顺序打印),并且在cat
交错写入和读取时,vim
在文件中等待“完成读取”,然后显示除外框以外的所有内容。
:help stdin
...令人惊讶的是,通过询问内置文档的问题,他们能很快找到答案。