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,
xdotool用来模拟按下Ctrl+Insertxdotool用来模拟输入翻译后的命令xdotool用来模拟压制Returnxdotool用来模拟按下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 缓冲区的拆分视图时,你必须做两件事:
import os 在你的 Python 缓冲区中就这样。
故障排除
这并不完美。有一些小问题:
这个#os.chdir东西也被打印到 Bash 缓冲区有点难看。这是真正的美容,但你可以考虑做一些不同的,例如,你的模拟输入命令后模拟按下前Return暂时停用广播和删除命令(例如,模拟了很多退格的,或序列Ctrl+ A,Ctrl+ K)从Bash 缓冲区或其他任何东西。
一些特殊的参数cd将不起作用。诸如cd -(更改为$OLDPWD)、cd ~(更改为$HOME)或cd(不带参数,也更改为$HOME)之类的内容。在这里,还可以改进脚本以解决此类特殊情况(检查是否$1特殊,并进行适当翻译)。不过,从这里开始,这些事情应该是小菜一碟。
的可选参数cd,例如,例如,cd -P somewhere将不起作用,因为翻译将在os.chdir("-P")此处。您可以使用$@而不是$1查看所有参数,然后做适当的事情。
希望我能帮上忙 :) 这是一个有趣的挑战!
| 归档时间: |
|
| 查看次数: |
871 次 |
| 最近记录: |