我可以让 gedit 嵌入式终端 cd 自动转到当前文件的目录吗?

我可以让 gedit 嵌入式终端 cd 自动转到当前文件的目录吗?

如何让 gedit 终端本身将目录更改为当前在 gedit 中打开的文件的位置?默认情况下,我必须 cd 直到我到达 gedit 嵌入式终端中的当前文件位置。我知道没有直接的方法可以做到这一点。但如果还有任何长距离的方法,我真的希望嵌入式终端本身能够根据当前在 gedit 中打开的任何当前选项卡中打开的文件动态更改目录。

答案1

令我惊讶的是,这是可以做到的。在我测试的 45 分钟里,它实际上运行得很好,而且没有一次失败。

尽管如此,它应该被视为一个实验性的选项,因为它完全是“从外部”完成的,也就是说,借助xpropwmctrlxdotool。要使用它,您必须接受一些特性:只要您将所有文件都放在一个窗口中,它就可以正常工作,并且您的鼠标单击(选择选项卡)应该是真实的点击:如果您“按住”点击,则选项卡将在新窗口中打开。

您还应该知道,不同的gedit选项卡(文件)共享一个嵌入式终端窗口。这意味着cd无论终端中正在运行什么,命令都将在选项卡切换时执行。

总之,您必须查看它在您的情况下是否运行足够稳定,以及在您使用时是否表现良好。

怎么运行的

主要技巧基于这样一个事实:默认情况下,gedit 的窗口名称中包含文件目录。这用于提取目标目录,并在其发生更改时进行设置(通过单击 gedit 窗口的另一个选项卡)。

在后台运行的脚本检查:

  • 如果 gedit 运行
  • 如果是,则检查最前面的窗口gedit 窗口
  • 如果是这种情况,它会检查当前最前面的文件的目录是否与上次检查的目录不同,因此一定是单击了另一个选项卡(自 1 秒前以来)。cd如果两个选项卡在同一目录中工作(即:如果所有文件都放在一个窗口中),这还可以防止不必要的操作。

然后,如果需要执行操作cd时,脚本会将鼠标移动到窗口中间gedit(x 方向),距离窗口底部(y 方向) 70 像素,这肯定位于窗口的终端部分。然后单击,输入命令cd+ Enter。您几乎不会注意到,因为鼠标已移回其原始位置。您需要给它时间(大约 0.5 秒)来执行操作,cd然后才能继续工作,但同样,您可能根本不会注意到延迟。

如何使用

  • 如果您的系统上尚未安装,wmctrl请先安装xdotool

    sudo apt-get install wmctrl
    sudo apt-get install xdotool
    
  • 将以下脚本复制到一个空文件中,并将其另存为set_directory.py

  • 通过命令运行:

    python3 /path/to/set_directory.py
    
  • 我建议您gnome-terminal在使用gedit+ 嵌入式终端时从(最小化)窗口运行它;对于这样一个特定的任务来说,让它持续运行似乎有点小题大做。

剧本

#!/usr/bin/env python3
import os
import subprocess
import socket
import time
home = os.environ["HOME"]
last_dr = ""

def get(cmd):
    try:
        return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8").strip()
    except:
        return ""

def execute(cmd):
    subprocess.call(["/bin/bash", "-c", cmd])

def get_windowid():
    cmd = "xprop -root"
    frontmost = [l for l in get(cmd).splitlines() if "ACTIVE_WINDOW(WINDOW)" in l][0].split()[-1]
    return frontmost[:2]+"0"+frontmost[2:]

def get_dirfromname(name):
    dr = name[name.find("(")+1:name.find(")")].replace(" ", "\\ ")
    if "~" in dr:
        dr = dr[dr.find("~"):]
    if os.path.exists(dr.replace("~", home+"/")):
        return dr
    else:
        return None

def cd(coords, dr):
    currmouse = get("xdotool getmouselocation").split()[:2]
    currcoords = (" ").join([it.split(":")[-1] for it in currmouse])
    x_set = str(int((int(coords[0])+int(coords[2])/2)))
    y_set = str(int(int(coords[1])+int(coords[3])-70))
    execute("xdotool mousemove "+x_set+" "+y_set+"&&xdotool click 1")
    execute("xdotool type 'cd "+dr+"'"+"&&xdotool key KP_Enter")
    execute("xdotool mousemove "+currcoords)

def update_directory():
    global last_dr
    try:
        pid = get("pidof gedit")
    except subprocess.CalledProcessError:
        pass
    else:
        wid = get_windowid()
        wdata = get("wmctrl -lpG")
        wdata = [l for l in wdata.splitlines() if pid in l and wid in l] if len(wdata) != 0 else []
        if len(wdata) != 0:
            wdata = wdata[0]; coords = wdata.split()[3:7]
            wname = wdata.split(socket.gethostname()+" ")[-1]
            dr = get_dirfromname(wname)
            if dr != None and dr != last_dr:
                time.sleep(1)
                cd(coords, dr)
                last_dr = dr

while True:
    update_directory()
    time.sleep(1)

自动将工作目录设置为当前最前面的文件

在此处输入图片描述

标签切换上的 cd

在此处输入图片描述

gedit 终端的内置 cd 菜单

替代,几乎同样舒适的,还有内置的 gedit 终端功能。只需点击两次鼠标(一次右键,一次左键):

  • 在终端窗口中单击鼠标右键
  • 选择“更改目录”,终端窗口将 cd 到当前最前面的文件的目录:

    在此处输入图片描述

相关内容