Bagaimana cara membuka direktori Nautilus di Terminal saat ini?

13

Saya tidak suka puluhan terminal dibuka. Apakah ada cara untuk menambahkan Buka di Terminal saat ini daripada Buka di Terminal saat menggunakan Nautilus?

Vitor Abella
sumber
Hanya solusi kotor sejauh yang bisa saya bayangkan. Saya bisa memberi satu jika Anda baik-baik saja dengan itu ...
Jacob Vlijm

Jawaban:

13

Kotor atau tidak, solusi di bawah ini bekerja dengan sempurna dalam 30 menit saya sering mengujinya. Solusinya berfungsi selama Anda dapat mengklik kanan file (apa saja) di dalam direktori:

1.

masukkan deskripsi gambar di sini

2.

masukkan deskripsi gambar di sini

3.

masukkan deskripsi gambar di sini

Skrip Nautilus

#!/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)

Cara Penggunaan

  1. Kebutuhan skrip wmctrl, xdotooldan xclip:

    sudo apt-get install wmctrl xdotool xclip
    
  2. Salin skrip ke file kosong, simpan sebagai open_in_terminal(tanpa ekstensi) di ~/.local/share/nautilus/scripts. Buat direktori jika perlu. Jadikan skrip dapat dieksekusi

Itu dia. Logout dan kembali dan Anda akan memiliki skrip yang tersedia seperti pada gambar (2).

Penjelasan

  • Mengklik kanan file, kita bisa mendapatkan path menggunakan nautilus ' "NAUTILUS_SCRIPT_CURRENT_URI".
  • Dalam sebuah skrip, kita dapat memuat path ini ke clipboard (menggunakan xclip)
  • Selanjutnya, skrip memunculkan jendela (pertama kali ditemukan) gnome-terminaldan menempelkan path, didahului oleh cdperintah. Karena kami biasa echomemuat seluruh baris ke clipboard, Returndisertakan.

Catatan

  1. Harus jelas bahwa tidak boleh ada yang berjalan di terminal, dan itu bekerja dengan baik jika hanya ada satu jendela terminal yang terbuka. Jika ada beberapa, skrip mengambil gnome-terminaljendela tertua .
  2. Naskah perlu diuji secara menyeluruh dalam praktik. Ketika saya menjalankannya, waktunya tidak ada masalah bahkan satu kali, bahkan ketika Desktop harus "bepergian" melintasi empat atau lima viewports untuk sampai ke jendela terminal. JIKA kesalahan akan terjadi, dengan beberapa baris lagi kita bisa membuatnya benar-benar menunggu dengan cerdas (er) cara untuk jendela terminal dinaikkan. Mari lihat apa yang terjadi. Sepertinya tidak perlu.
  3. Karena skrip menggunakan realpath , direktori yang ditautkan juga akan berfungsi dengan benar.

Informasi lebih lanjut tentang skrip nautilus di sini .


Atau, pilih jendela terminal Anda sendiri jika ada banyak

Jika Anda ingin dapat memilih di jendela terminal mana Anda akan membuka direktori saat ini (nautilus), gunakan skrip di bawah ini.

Cara kerjanya dalam praktik

  1. Klik kanan (ada) file di dalam direktori (dalam hal ini desktop saya) seperti di bawah ini:

    masukkan deskripsi gambar di sini

  2. Klik pada (atau naikkan sebaliknya) jendela terminal yang ingin Anda gunakan, dan itu akan cd ke direktori:

    masukkan deskripsi gambar di sini

Naskah

#!/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)

Mempersiapkan

Persis seperti naskah pertama.

Penjelasan

Script memiliki satu perbedaan dari yang pertama: alih-alih secara otomatis menaikkan jendela terminal yang pertama ditemukan, ia menunggu jendela terminal pertama untuk memiliki fokus. Kemudian cd ke direktori di dalam jendela itu.

Yakub Vlijm
sumber
karena Anda tetap menggunakan file untuk meluncurkan skrip, cukup hapus nama file dari jalur sys.argv [1]. itu akan membuat skrip jauh lebih pendek
Sergiy Kolodyazhnyy
1
@TonyLancer menu muncul setelah membuat ~/.local/share/nautilus/scriptskeluar direktori dan kembali :)
Jacob Vlijm
1
@ Benny hanya bekerja dari nautilus klik kanan.
Jacob Vlijm
1
@ Benny lingkungan untuk skrip akan diturunkan dari proses induk. Dalam kasus ini, Nautilus adalah proses induk dari skrip, dan mengatur lingkungan untuk skrip. Jika Anda mencoba melakukan hal yang sama dari juru bahasa atau skrip python, ia akan memiliki proses induk yang berbeda, oleh karena itu ia akan kembali Nonekarena tidak ada variabel seperti itu (di luar Nautilus).
Sergiy Kolodyazhnyy
1
@JacobVlijm Anda luar biasa. Sepenuhnya bekerja! Sekarang saya mengerti bagaimana script kedua bekerja, Anda benar tentang pemicu. Ini benar-benar gadget yang bagus untuk komunitas ubuntu. Tentu saja kita bisa memikirkan banyak perbaikan untuk skrip apa pun, tetapi yang ini berhasil. Sebutkan saja dalam jawaban Anda bahwa skrip kedua berfungsi dengan Alt Tab.
Vitor Abella
8

Saya cukup yakin tidak ada cara untuk melakukan ini, namun saya punya solusi untuk Anda yang mungkin bisa membantu.

Anda selalu dapat menarik dan melepas direktori dari Nautilus ke jendela terminal dan Nautilus akan melewati direktori itu dan menempelkannya ke baris perintah, sehingga Anda bisa melakukannya cdlalu seret folder ke terminal dan tekan enter.

Jorge Castro
sumber
8

Cara termudah adalah ini:

  1. Dari nautilus, tekan Ctrl+ L, ini akan membuka bilah alamat untuk mengedit. Tekan tombol Ctrl+C
  2. Beralih ke terminal dan ketik cd, spasi, lalu Shift+ Insert (or INS)untuk menempelkan path. Hit Enter.

Tidak perlu skrip atau kerja ekstra.

Sergiy Kolodyazhnyy
sumber
Saya menggunakan Ctrl + Shift + V untuk menempelkan path.
Katu
1
ya, itu cara lain untuk melakukannya. Linux sebenarnya memiliki dua clipboard, jadi Ctrl + Shift + V adalah untuk primary dan Shift + Insert adalah untuk yang kedua, tetapi karena yang kedua hanya membutuhkan dua tombol, saya menggunakannya sebagian besar. Mereka dibagikan, kecuali Anda menyorot sesuatu - saat itulah hal-hal masuk ke clipboard sekunder
Sergiy Kolodyazhnyy
1

Menurut pendapat saya, satu-satunya cara yang elegan untuk menyelesaikan masalah ini tanpa menggunakan fusi adalah dengan menggunakan terminal multiplexer seperti tmux dan minta manajer file Anda

  • buka jendela terminal baru di dalam sesi yang ada atau
  • memulai emulator terminal baru dengan sesi tmux baru.

Script shell berikut hanya mencapai itu:

#!/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_EMULATORmemegang emulator terminal yang diinginkan untuk windows terminal baru (jika Anda tidak suka default apa pun yang x-terminal-emulatormenunjuk ke) ditambah opsi baris perintah untuk perintah untuk mengeksekusi di dalam emulator.

Anda dapat mendaftarkan skrip penangan file seperti asosiasi tipe file lainnya di manajer file Anda.

David Foerster
sumber