Як відкрити каталог Nautilus у поточному терміналі?


13

Мені не подобається відкривати десятки терміналів. Чи можна додати Open у поточному терміналі замість Open у Terminal під час використання Nautilus?


Тільки брудні рішення, наскільки я можу собі уявити. Я можу дати вам це, якщо ви добре з цим ...
Яків Влійм

Відповіді:


13

Брудне чи ні, розчин нижче спрацював ідеально за 30 хвилин, які я часто перевіряв. Рішення працює до тих пір, поки ви можете клацнути правою кнопкою миші файл (будь-який) всередині каталогу:

1.

введіть тут опис зображення

2.

введіть тут опис зображення

3.

введіть тут опис зображення

Наутілус сценарій

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

Як користуватись

  1. Потреби сценарію wmctrl, xdotoolі Xclip:

    sudo apt-get install wmctrl xdotool xclip
    
  2. Скопіюйте скрипт у порожній файл, збережіть його як open_in_terminal(без розширення) в ~/.local/share/nautilus/scripts. Створіть каталог за потреби. Зробіть сценарій виконуваним

Це воно. Вийдіть із системи та увійдіть назад, і сценарій буде доступний, як на зображенні (2).

Пояснення

  • Клацнувши правою кнопкою миші на файл, ми можемо отримати шлях за допомогою nautilus ' "NAUTILUS_SCRIPT_CURRENT_URI".
  • У сценарії ми можемо завантажити цей шлях у буфер обміну (використовуючи xclip)
  • Згодом скрипт піднімає (вперше знайдене) gnome-terminalвікно і вставляє шлях, який передує cdкоманді. Оскільки ми використовували echoдля завантаження всієї лінії в буфер обміну, Returnвходить.

Примітки

  1. Повинно бути зрозуміло, що в терміналі не повинно працювати нічого, і це найкраще працює, якщо відкрито лише одне вікно терміналу. Якщо їх декілька, сценарій вибирає найстаріше gnome-terminalвікно.
  2. Сценарій потрібно ретельно перевірити на практиці. Поки я проходив це, терміни не були жодними проблемами, навіть коли робочий стіл не мав "подорожувати" через чотири чи п’ять вікон перегляду, щоб дістатися до вікна терміналу. Якщо трапляються помилки, проте, на кілька рядків більше, ми могли б змусити насправді чекати розумним (ер) способом підйому вікна терміналу. Подивимося, що станеться. Це не здається необхідним.
  3. Оскільки сценарій використовує realpath , також пов'язані каталоги працюватимуть правильно.

Більше інформації про сценарії nautilus тут .


Крім того, виберіть власне вікно терміналу, якщо у вас кілька

Якщо ви хочете мати можливість вибрати, у якому вікні терміналу ви б відкрили поточний каталог (nautilus), скористайтеся сценарієм нижче.

Як це працює на практиці

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

    введіть тут опис зображення

  2. Клацніть на (або підніміть інше) вікно терміналу, яке ви хочете використовувати, і воно перейде в каталог:

    введіть тут опис зображення

Сценарій

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

Налаштування

Так само, як перший сценарій.

Пояснення

Сценарій має одну відмінність від першого: замість того, щоб автоматично підняти перше знайдене вікно терміналу, він чекає, коли перше вікно терміналу має фокус. Потім він переходить до каталогу всередині цього вікна.


оскільки ви все одно використовуєте файл для запуску сценарію, просто видаліть ім’я файлу з шляху sys.argv [1]. це зробить сценарій набагато коротшим
Сергій Колодяжний

1
@TonyLancer меню з'являється після створення ~/.local/share/nautilus/scriptsвиходу з каталогу та повернення :)
Jacob Vlijm

1
@Benny працює лише від nautilus правою кнопкою миші.
Яків Влійм

1
@Benny середовище для сценарію передається з батьківського процесу. У цьому випадку Nautilus є батьківським процесом сценарію, і він створює середовище для сценарію. Якщо ви намагаєтесь зробити те саме з інтерпретатора python або скрипту, він матиме інший батьківський процес, тому він повернеться, Noneоскільки такої змінної немає (за межами Nautilus, що є).
Сергій Колодяжний

1
@JacobVlijm ти приголомшливий. Повністю працює! Тепер я зрозумів, як працює другий сценарій, ви маєте рацію щодо тригера. Це дійсно приємний гаджет для спільноти ubuntu. Звичайно, ми можемо подумати про багато вдосконалень, як для будь-якого сценарію, але цей робить свою роботу. Просто згадайте у своїй відповіді, що другий сценарій працює з Alt Tab.
Вітор Абелла

8

Я майже впевнений, що немає способу зробити це, однак у мене є рішення, яке може допомогти.

Ви завжди можете перетягнути каталог з Nautilus у вікно терміналу, і Nautilus передасть цей каталог і вставить його в командний рядок, щоб ви могли це зробити, cdа потім перетягніть папку на термінал і натисніть клавішу Enter.


8

Найпростіший спосіб такий:

  1. З nautilus натисніть Ctrl+ L, це відкриє адресний рядок для редагування. Натисніть Ctrl+C
  2. Переключіться на термінал і введіть cdпробіл, а потім Shift+, Insert (or INS)щоб вставити шлях. Удар Enter.

Немає необхідності в сценаріях або додатковій роботі.


Для вставки контуру я використовую Ctrl + Shift + V.
Кату

1
так, це ще один спосіб зробити це. Насправді у Linux є два буфера обміну, тому Ctrl + Shift + V призначений для основного, а Shift + Insert - для другорядного, але оскільки для другого потрібні лише дві клавіші, я використовую це в основному. Їм ділиться, якщо ви щось не виділите - саме тоді матеріал переходить до буфера обміну
Сергій Колодяжний

1

На мою думку, єдиний елегантний спосіб вирішити це без обдумування - це використовувати термінальний мультиплексор типу tmux і мати свого файлового менеджера

  • відкрити нові вікна терміналу всередині існуючого сеансу або
  • запустити новий емулятор терміналу з новим сеансом tmux.

Наступний сценарій оболонки досягає саме цього:

#!/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_EMULATORутримує потрібний емулятор терміналу для нових вікон терміналів (якщо вам не подобається за замовчуванням будь-які x-terminal-emulatorточки), а також параметр командного рядка для команди, що виконується в емуляторі.

Ви можете зареєструвати скрипт обробника файлів, як і будь-яке інше об'єднання типів файлів у вашому файловому менеджері.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.