有没有办法在终结者中镜像目录更改?

Kas*_*snu 3 python command-line bash terminator bashrc

我在 Ubuntu 12.04 上使用 Terminator 作为我的主要终端。我喜欢它,因为它让我可以在同一个视图中同时打开 python 解释器和 bash 终端。

令人讨厌的是,我最终在目录之间移动了很多,然后我必须这样做两次。有没有办法设置终结器配置来做到这一点?使终结者镜像目录发生变化。

我想我不是唯一一个感到沮丧的人!

Mal*_*ppa 11

好的。如果我理解正确的话,您基本上在拆分视图中有一个Terminator窗口,其中一个缓冲区是 Bash shell,另一个是 Python 解释器。现在,每当您cd Pictures/在 Bash 缓冲区中键入命令时,您都希望自动将命令发送os.chdir("Pictures/")到 Python 缓冲区,以便它与您的 Bash shell 同时更改目录。有点像这张图片:

在此处输入图片说明

...os.chdir当您cd在 Bash 缓冲区中键入命令时,应自动输入 Python 缓冲区中的命令。对?如果是的话,这里有一个...

解决方案

步骤 1:将两个缓冲区分配到同一组

终结者支持窗口组。我们将这两个缓冲区分配到同一组,以便稍后使用终结者的功能向同一组中的窗口广播命令。在这个例子中,我将两个缓冲区分配给一个名为Tau的组(实际名称无关紧要,但要确保两个缓冲区的名称相同)。

在此处输入图片说明

步骤 2:定义键盘快捷键以打开和关闭群组广播

默认情况下,Terminator 没有这些快捷键,但我们现在需要它们,所以我们将通过 Terminator 的Preferences菜单定义它们。我用Ctrl+Insert打开群组广播,用Ctrl+Delete关闭它。您可以选择您喜欢的任何其他键盘快捷键,但您必须适当地调整步骤 3。

在此处输入图片说明

现在,您可以按Ctrl+ Insert,您在一个缓冲区中输入的任何内容都会出现在另一个缓冲区中。通过键入Ctrl+Delete您再次停用该行为。

如果Python解释器所理解的命令,例如cd Pictures/,改变这两个缓冲区的目录,你会现在要做的是类似Ctrl+ Insertcd Pictures/Ctrl+ Delete,广播命令原样。但是普通的 Python 解释器并不理解这个cd命令。您可以使用IPython,它可以理解它,而不是纯 Python 解释器。但是,我假设 (1) 您想要纯 Python 解释器,并且 (2) 您不想记住在每个cd命令之前和之后按下这些组合键。那么,让我们进入第 3 步。

第 3 步:翻译cd命令并将其自动发送到 Python 缓冲区

cd在实际更改当前 shell 中的工作目录之前,我们将重新别名 Bash 的内置命令以执行更多操作。也就是说,每当用户输入时cd somewhere

  1. 我们将命令翻译成 Python
  2. 我们xdotool用来模拟按下Ctrl+Insert
  3. 我们xdotool用来模拟输入翻译后的命令
  4. 我们xdotool用来模拟压制Return
  5. 我们xdotool用来模拟按下Ctrl+Delete

这样,翻译后的命令就会被发送到 Python 缓冲区。如果没有,请安装xdotool

sudo apt-get install xdotool 
Run Code Online (Sandbox Code Playgroud)

我们想要作为别名的脚本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
Run Code Online (Sandbox Code Playgroud)

说明:当我们cd为上述脚本设置别名时,无论何时我们键入cd somewhere,Bash 都会将其转换为OURSCRIPT somewhere. 由于我们的脚本以函数 call 结束cd_to_pybuf,它实际上会cd_to_pybuf使用somewhereas 参数调用函数($1在函数内可用;注意 bash 扩展在这里不起作用,所以我们不能使用类似的东西!*来获取原始参数命令,$BASH_COMMAND也有问题)。该函数完全执行上面列举的步骤。在旁注中,我们还在模拟#按下Ctrl+之前模拟了输入Insert,因为我们之后输入的任何内容都会出现在两个缓冲区中,而 Bash 不理解os.chdir命令,所以用这个#符号我们把它变成了 Bash 的注释。在这些xdotool东西之后,我们还在cdBash 缓冲区中执行实际的命令。

所以现在,我们重新别名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'
Run Code Online (Sandbox Code Playgroud)

瞧!就是这样。

奖励:别名 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'
Run Code Online (Sandbox Code Playgroud)

你必须记住的

为了在未来工作,每当你打开一个带有 Bash 和 Python 缓冲区的拆分视图时,你必须做两件事:

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

就这样。

故障排除

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

  1. 这个#os.chdir东西也被打印到 Bash 缓冲区有点难看。这是真正的美容,但你可以考虑做一些不同的,例如,你的模拟输入命令后模拟按下前Return暂时停用广播和删除命令(例如,模拟了很多退格的,或序列Ctrl+ ACtrl+ K)从Bash 缓冲区或其他任何东西。

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

  3. 的可选参数cd,例如,例如,cd -P somewhere将不起作用,因为翻译将在os.chdir("-P")此处。您可以使用$@而不是$1查看所有参数,然后做适当的事情。

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

  • `HISTCONTROL=ignorespace` 是一个常见的设置。所以,如果你在 `#` 前面加上一个空格,它很可能不会被保存在历史中。 (2认同)