Я могу сделать встроенный терминальный CD gedit автоматически к каталогу текущего файла?

Как сделать сам gedit терминал для изменения каталога на местоположение файла, который в настоящее время открывается в gedit? Поскольку по умолчанию я имею к CD, пока я не добираюсь для представления расположения файла в моем gedit-встроенном терминале. Я знаю, что нет никакого прямого способа сделать так. Но если какой-либо длинный путь также возможен, я действительно хочу, чтобы сам встроенный терминал сделал динамично каталог изменения согласно в настоящее время открываемому файлу на любой текущей вкладке, открыт в gedit.

0
задан 21 December 2014 в 16:10

1 ответ

К моему собственному удивлению это может быть сделано. За эти 45 минут я протестировал его, это работало вполне хорошо на самом деле и не перестало работать на мне однажды.

Тем не менее, это должно быть рассмотрено экспериментальная возможность, так как это сделано полностью "снаружи", если можно так выразиться, с помощью xprop, wmctrl и xdotool. Для использования его необходимо будет принять несколько особенностей: это работает хорошо, пока у Вас есть все файлы, снабженные вкладками в одном окне, и Ваш щелчок мышью, для выбора вкладок, должен быть реальным щелчком: если Вы "держите" щелчок, вкладка открыта в новом окне.

Необходимо также знать о том, что различное gedit вкладки (файлы) совместно используют встроенное окно терминала того. Это означает что cd команда будет выполнена на переключателе вкладки, независимо от того, что могло бы работать в терминале.

Alltogether, необходимо будет видеть, работает ли он достаточно стабильный в ситуации и если он ведет себя хорошо в способе, которым Вы используете его.

Как это работает

Основной прием основан на том, что gedit по умолчанию имеет каталог файла на свое имя окна. Это используется, чтобы извлечь целенаправленный каталог и установить его, если он изменяется (путем нажатия на другую вкладку gedit окна).

Сценарий, работая в фоновом режиме, проверки:

  • если gedit работает (вообще)
  • если так, это проверяет, является ли frontmost окно gedit окном
  • если это так, это проверяет, отличается ли в настоящее время frontmost каталог файла от последней проверки, таким образом, другая вкладка, должно быть, была нажата (начиная с 1 секунду назад). Это также предотвращает бесполезный cd действия, если две вкладки работают в том же каталоге (который является: если все файлы снабжаются вкладками в одном окне).

Затем если a cd действие необходимо, сценарий перемещает мышь в середину gedit окно (x-wise), 70 пкс от нижней части окна (y-wise), который определенно будет на терминальном разделе окна. Затем это нажимает, вводитcd команда + Входит. Вы едва заметите, так как мышь попятилась к ее исходному положению. Необходимо будет дать ему время (appr. 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)

Автоматически установите рабочий каталог на в настоящее время передний большая часть файла:

enter image description here

CD на переключателе вкладки

enter image description here

Встроенное меню CD gedit терминала

Альтернатива, почти с тем же комфортом, могла быть gedit терминалом, созданным в функции. Только требуется два щелчка мышью (одно право - один оставленный):

  • Щелкните правой кнопкой с мышью в окне терминала
  • Выберите "Change Directory", и окно терминала будет CD к в настоящее время frontmost каталог файла:

    enter image description here

1
ответ дан 6 October 2019 в 06:27

Другие вопросы по тегам:

Похожие вопросы: