我在 Ubuntu 12.04 上使用 Terminator 作为我的主要终端。我喜欢它,因为它让我可以在同一视图中同时打开 Python 解释器和 Bash 终端。
令人恼火的是,我最终在目录之间移动了很多次,然后我不得不重复两次。有没有办法设置终结器配置来做到这一点?让终结器镜像目录更改。
我猜我不是唯一一个觉得这令人沮丧的人!
答案1
好的。如果我理解正确的话,你基本上有一个终结者窗口处于拆分视图中,其中一个缓冲区是 Bash shell,另一个是 Python 解释器。现在,每当您cd Pictures/
在 Bash 缓冲区中键入命令时,您都希望自动将命令发送os.chdir("Pictures/")
到 Python 缓冲区,以便它与您的 Bash shell 同时更改目录。有点像这张图片中的那样:
...os.chdir
当您在 Bash 缓冲区中键入命令时,Python 缓冲区中的命令应该会自动输入cd
。对吗?如果是,这里有一个...
解决方案
步骤 1:将两个缓冲区分配给同一组
Terminator 支持窗口组。我们将这两个缓冲区分配给同一个组,以便稍后使用 Terminator 向同一组中的窗口广播命令的功能。在此示例中,我将两个缓冲区分配给名为牛头(实际名称并不重要,但要确保两个缓冲区的名称相同)。
第 2 步:定义用于打开和关闭群组广播的键盘快捷键
默认情况下,Terminator 没有这些键盘快捷键,但我们现在需要它们,因此我们将通过 Terminator 的优先菜单。我使用Ctrl+Insert来打开群组广播,使用Ctrl+Delete来关闭它。您可以选择任何其他您喜欢的键盘快捷键,但您必须适当调整步骤 3。
现在,您可以按Ctrl+ Insert,您在一个缓冲区中输入的任何内容都会出现在另一个缓冲区中。通过输入Ctrl+ ,Delete您可以再次停用该行为。
如果 Python 解释器能够理解这样的命令cd Pictures/
,即在两个缓冲区中更改目录,那么您现在所要做的就是执行类似Ctrl+ Insertcd Pictures/
Ctrl+ 的操作Delete,以广播该命令照原样。但是普通的 Python 解释器无法理解此cd
命令。您可以使用伊班,它确实能理解它,而不是纯 Python 解释器。但是我假设 (1) 你想要纯 Python 解释器,并且 (2) 你不想记住在每个cd
命令之前和之后按下这些组合键。所以,让我们进入第 3 步。
步骤 3:cd
自动翻译并发送命令到 Python 缓冲区
我们将重新设置 Bash 的内置cd
命令的别名,以便在实际更改当前 shell 中的工作目录之前执行更多操作。也就是说,每当用户输入 时cd somewhere
,
- 我们将命令翻译成 Python
- 我们用来
xdotool
模拟按下Ctrl+Insert - 我们用来
xdotool
模拟输入翻译的命令 - 我们用来
xdotool
模拟按压Return - 我们用来
xdotool
模拟按下Ctrl+Delete
这样翻译后的命令就会被发送到 Python 缓冲区。如果你没有,请安装xdotool
:
sudo apt-get install xdotool
我们想要作为别名的脚本cd
将如下所示:
function cd_to_pybuf {
xdotool type "#"
xdotool key Ctrl+Insert
xdotool type "os.chdir(\"$1\")"
xdotool key Return
xdotool key Ctrl+Delete
cd "$1"
}
cd_to_pybuf
解释:当我们将cd
上述脚本别名化后,每当我们输入 时cd somewhere
,Bash 都会将其转换为OURSCRIPT somewhere
。由于我们的脚本以函数调用 结尾,因此它实际上将使用作为参数cd_to_pybuf
调用该函数(在函数内可用;请注意,bash 扩展在这里不起作用,因此我们不能使用类似的东西来获取原始命令的参数,并且cd_to_pybuf
somewhere
$1
!*
$BASH_COMMAND
也有问题)。此函数执行上述步骤。顺便提一下,我们#
在模拟按Ctrl+之前也模拟了输入Insert,因为在此之后输入的任何内容都会出现在两个都缓冲区,而 Bash 无法理解该os.chdir
命令,因此#
我们用该符号将其变成 Bash 的注释。完成这些操作后,我们还会在 Bash 缓冲区中xdotool
执行实际命令。cd
所以现在,我们重新cd
为该脚本添加别名,并对其进行测试:
成功了!os.chdir("..")
Python 缓冲区中的命令是自动输入的。我没有这样做。我所做的只是cd ..
在 Bash 缓冲区中输入。您可以看到该命令#os.chdir("..")
也自动输入到了 Bash 缓冲区中,但由于它是注释,因此没有实际效果。
要使此更改永久生效,请将该别名放入~/.bashrc
,即在~/.bashrc
添加的行中:
alias cd='function cd_to_pybuf { xdotool type "#"; xdotool key Ctrl+Insert; xdotool type "os.chdir(\"$1\")"; xdotool key Return; xdotool key Ctrl+Delete; cd "$1"; }; cd_to_pybuf'
瞧!就是这么简单。
奖励:别名pwd
有时你可能想同时检查两个缓冲区中的当前工作目录。我们可以使用与 forcd
和 re-alias完全相同的技术pwd
。以下命令可以达到目的,~/.bashrc
如果你愿意,也可以将其放入你的缓冲区中:
alias pwd='function pwd_to_pybuf { xdotool type "#"; xdotool key Ctrl+Insert; xdotool type "os.getcwd()"; xdotool key Return; xdotool key Ctrl+Delete; pwd; }; pwd_to_pybuf'
你必须记住的是
为了将来能够实现此功能,每当您使用 Bash 和 Python 缓冲区打开分割视图时,您都必须做两件事:
- 将两个缓冲区分配给 Terminator 中的同一组
import os
在你的 Python 缓冲区中
就这样。
故障排除
这并不完美。有一些小问题:
#os.chdir
这个东西也打印到 Bash 缓冲区中,这有点丑陋。这真的很美观,但您可以考虑做一些不同的事情,例如,在模拟输入命令之后,在模拟按下 之前Return,暂时停用广播并从 Bash 缓冲区中删除该命令(例如,模拟大量退格键或序列Ctrl+ A, Ctrl+ K)或其他。的一些特殊参数
cd
将不起作用。例如cd -
(更改为$OLDPWD
)、cd ~
(更改为$HOME
)或cd
(不带参数,也更改为$HOME
)。这里也可以改进脚本以解决此类特殊情况(检查是否$1
为特殊,并进行适当翻译)。不过,从现在开始,这些事情应该是小菜一碟。的可选参数
cd
(例如 )cd -P somewhere
将不起作用,因为翻译将在os.chdir("-P")
这里进行。您可以使用$@
而不是$1
来查看所有参数,然后执行适当的操作。
希望我能帮上忙:)这是一个有趣的挑战!