Mevcut Terminalde Nautilus dizini nasıl açılır?


Yanıtlar:


13

Kirli ya da değil, aşağıdaki çözüm 30 dakika içinde mükemmel bir şekilde çalıştı. Çözüm, dizinin içindeki bir dosyayı (herhangi birini) sağ tıklayabildiğiniz sürece çalışır:

1.

resim açıklamasını buraya girin

2.

resim açıklamasını buraya girin

3.

resim açıklamasını buraya girin

Nautilus alfabesi

#!/usr/bin/env python3
import subprocess
import os
import time

def replace(path):
    for c in [("%23", "#"), ("%5D", "]"), ("%5E", "^"),
              ("file://", ""), ("%20", " ")]:
        path = path.replace(c[0], c[1])
    return path

def get(command):
    try:
        return subprocess.check_output(command).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        pass

t = get(["pgrep", "gnome-terminal"])
if t:
    w = [l.split()[0] for l in get(["wmctrl", "-lp"]).splitlines() if t in l][0]
    # get the current path
    current = replace(os.getenv("NAUTILUS_SCRIPT_CURRENT_URI"))
    dr = os.path.realpath(current)
    # raise the found terminal window
    subprocess.call(["wmctrl", "-ia", w])
    time.sleep(0.3)
    # copy the cd command to clipboard
    c1 = "printf 'cd ' | xclip -in -selection c"
    c2 = 'echo "'+"'"+dr+"'"+'"  | xclip -in -selection c'
    # paste & run it
    for c in [c1, c2]:
        subprocess.call(["/bin/bash", "-c", c])
        subprocess.call(["xdotool", "key", "Control_L+Shift+v"])
        time.sleep(0.05)

Nasıl kullanılır

  1. Senaryo ihtiyaçları wmctrl, xdotoolve xclip:

    sudo apt-get install wmctrl xdotool xclip
    
  2. Komut dosyasını boş bir dosyaya kopyalayın, içine open_in_terminal(uzantı yok) kaydedin ~/.local/share/nautilus/scripts. Gerekirse dizini oluşturun. Komut dosyasını yürütülebilir yapın

Bu kadar. Oturumu kapatıp tekrar açın, betiği görüntüdeki gibi kullanabilirsiniz (2).

açıklama

  • Bir dosyaya sağ tıklayarak nautilus'u kullanarak yolu alabiliriz "NAUTILUS_SCRIPT_CURRENT_URI".
  • Bir komut dosyasında, daha sonra bu yolu panoya yükleyebiliriz (kullanarak xclip)
  • Daha sonra, komut dosyası (ilk bulunan) gnome-terminalpenceresini yükseltir ve komuttan önce yolu yapıştırırcd . Kullandığımız bu yana echopanoya içine bütün çizgi yüklemek için, Returndahildir.

notlar

  1. Terminalde çalışan hiçbir şey olmaması gerektiği açık olmalı ve sadece bir terminal penceresi açıksa en iyi sonucu verir. Birden fazla olması durumunda, komut dosyası en eski gnome-terminalpencereyi seçer .
  2. Komut dosyasının uygulamada kapsamlı bir şekilde test edilmesi gerekir. Ben koştuğumda, Masaüstünün terminal penceresine ulaşmak için dört veya beş görünüm arasında "seyahat etmesi" gerekmediğinde bile, zamanlama tek bir sorun bile değildi. EĞER hatalar birkaç satır, ancak oluşacak daha biz aslında yapabiliriz beklemek Terminal penceresi yetiştirilmek üzere bir (daha) akıllı bir şekilde. Bakalım ne olacak. Gerekli görünmüyor.
  3. Komut dosyası realpath'i kullandığından, bağlantılı dizinler de düzgün çalışır.

Nautilus betikleri hakkında daha fazla bilgi burada .


Alternatif olarak, çoklu terminaliniz varsa kendi terminal pencerenizi seçin

Geçerli (nautilus) dizinini hangi terminal penceresinde açacağınızı seçmek istiyorsanız, aşağıdaki komut dosyasını kullanın.

Pratikte nasıl çalışır?

  1. Dizin içindeki (herhangi bir durumda) dosyayı aşağıdaki gibi sağ tıklayın (bu durumda masaüstüm):

    resim açıklamasını buraya girin

  2. Kullanmak istediğiniz terminal penceresine tıklayın (veya başka bir şekilde yükseltin), dizine cd olacaktır:

    resim açıklamasını buraya girin

Senaryo

#!/usr/bin/env python3
import subprocess
import os
import time

def replace(path):
    for c in [("%23", "#"), ("%5D", "]"), ("%5E", "^"),
              ("file://", ""), ("%20", " ")]:
        path = path.replace(c[0], c[1])
    return path

def get(command):
    try:
        return subprocess.check_output(command).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        pass

# check if gnome-terminal runs
pid = get(["pgrep", "gnome-terminal"])

if pid:
    t = 0
    while t < 30:
        # see if the frontmost window is a terminam window
        active = get(["xdotool", "getactivewindow"])
        if pid in get(["xprop", "-id", active]):       
            # get the current path
            current = replace(os.getenv("NAUTILUS_SCRIPT_CURRENT_URI"))
            dr = os.path.realpath(current)
            # copy the cd command to clipboard
            c1 = "printf 'cd ' | xclip -in -selection c"
            c2 = 'echo "'+"'"+dr+"'"+'"  | xclip -in -selection c'
            # paste & run it
            for c in [c1, c2]:
                subprocess.call(["/bin/bash", "-c", c])
                subprocess.call(["xdotool", "key", "Control_L+Shift+v"])
                time.sleep(0.05)
            break
        else:
            t += 1
            time.sleep(0.5)

Kurmak

İlk senaryo gibi.

açıklama

Komut dosyasının birinciden bir farkı vardır: bulunan ilk terminal penceresini otomatik olarak yükseltmek yerine, ilk terminal penceresinin odaklanmasını bekler. Sonra o pencerenin içindeki dizine cd's.


komut dosyasını yine de başlatmak için dosya kullandığınızdan, sadece sys.argv [1] yolundan dosya adını kaldırın. senaryoyu çok daha kısa hale getirecek
Sergiy Kolodyazhnyy

1
@TonyLancer menüsü, ~/.local/share/nautilus/scriptsoturumu kapatıp tekrar oluşturduktan sonra görünür :)
Jacob Vlijm

1
@Benny sadece nautilus sağ tıklama çalışır.
Jacob Vlijm

1
@ Komut dosyasının ortamını ana işlemden aktarır. Bu durumda, Nautilus betiğin ana işlemidir ve betiğin ortamını ayarlar. Aynı şeyi python yorumlayıcısından veya bir komut dosyasından yapmaya çalışıyorsanız, farklı bir üst süreç olacaktır, bu nedenle geri dönecektir Noneçünkü böyle bir değişken yoktur (Nautilus dışında).
Sergiy Kolodyazhnyy

1
@JacobVlijm harikasın. Tamamen çalışıyor! Şimdi ikinci betiğin nasıl çalıştığını anladım, tetik konusunda haklısın. Ubuntu topluluğu için gerçekten güzel bir alet. Tabii ki herhangi bir senaryo için birçok gelişme düşünebiliriz, ancak bu işi yapar. Cevabınızda ikinci komut dosyasının Alt Tab ile çalıştığını belirtin.
Vitor Abella

8

Eminim bunu yapmanın bir yolu yoktur, ancak sizin için yardımcı olabilecek bir çözümüm var.

Her zaman bir dizini Nautilus'tan bir terminal penceresine sürükleyip bırakabilirsiniz ve Nautilus bu dizini geçirip komut satırına yapıştıracaktır, böylece cdklasörü terminale sürükleyip enter tuşuna basabilirsiniz.


8

En basit yol şudur:

  1. Nautilus'tan Ctrl+ tuşuna basın L, bu adres çubuğunu düzenleme için açar. basın Ctrl+C
  2. Terminale geçin ve yolu yapıştırmak için cdboşluk, ardından Shift+ Insert (or INS)yazın. Vur Enter.

Senaryolara veya ekstra çalışmaya gerek yok.


Yolu yapıştırmak için Ctrl + Shift + V tuşlarını kullanıyorum.
Katu

1
evet, bunu yapmanın başka bir yolu. Linux'un iki panosu var, bu yüzden Ctrl + Shift + V birincil ve Shift + Insert ikincil içindir, ancak ikincisi sadece iki anahtar gerektirdiğinden, çoğunlukla bunu kullanıyorum. Bir şeyi vurgulamadığınız sürece paylaşılırlar - o zaman şeyler ikincil panoya girer
Sergiy Kolodyazhnyy

1

Bence bunu dolaşmadan çözmenin tek zarif yolu, tmux gibi bir terminal çoklayıcı kullanmak ve dosya yöneticinize sahip olmaktır .

  • mevcut bir oturumda yeni terminal pencereleri aç veya
  • yeni bir tmux oturumuyla yeni bir terminal öykünücüsü başlatın.

Aşağıdaki kabuk betiği bunu başarır:

#!/bin/sh
set -e
TMUX=tmux
#TERMINAL_EMULATOR='gnome-terminal -x'

cd "$1"
if $TMUX has-session; then
  exec $TMUX new-window
else
  exec ${TERMINAL_EMULATOR:-x-terminal-emulator -x} $TMUX
fi

TERMINAL_EMULATORyeni terminal pencereleri için istenen terminal emülatörünü (herhangi bir x-terminal-emulatornoktaya ilişkin varsayılanı beğenmezseniz ) ve komutun emülatör içinde yürütmesi için bir komut satırı seçeneğini içerir.

Dosya işleyicinizi, diğer herhangi bir dosya türü ilişkilendirmesi gibi dosya yöneticinize kaydedebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.