解决方案

解决方案

我在 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

  1. 我们将命令翻译成 Python
  2. 我们用来xdotool模拟按下Ctrl+Insert
  3. 我们用来xdotool模拟输入翻译的命令
  4. 我们用来xdotool模拟按压Return
  5. 我们用来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_pybufsomewhere$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 缓冲区打开分割视图时,您都必须做两件事:

  1. 将两个缓冲区分配给 Terminator 中的同一组
  2. import os在你的 Python 缓冲区中

就这样。

故障排除

这并不完美。有一些小问题:

  1. #os.chdir这个东西也打印到 Bash 缓冲区中,这有点丑陋。这真的很美观,但您可以考虑做一些不同的事情,例如,在模拟输入命令之后,在模拟按下 之前Return,暂时停用广播并从 Bash 缓冲区中删除该命令(例如,模拟大量退格键或序列Ctrl+ A, Ctrl+ K)或其他。

  2. 的一些特殊参数cd将不起作用。例如cd -(更改为$OLDPWD)、cd ~(更改为$HOME)或cd(不带参数,也更改为$HOME)。这里也可以改进脚本以解决此类特殊情况(检查是否$1为特殊,并进行适当翻译)。不过,从现在开始,这些事情应该是小菜一碟。

  3. 的可选参数cd(例如 )cd -P somewhere将不起作用,因为翻译将在os.chdir("-P")这里进行。您可以使用$@而不是$1来查看所有参数,然后执行适当的操作。

希望我能帮上忙:)这是一个有趣的挑战!

相关内容