Как открыть каталог Nautilus в текущем Терминале?

13

Мне не нравится, когда открываются десятки терминалов. Есть ли способ добавить Open в текущий терминал вместо Open in 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. Поскольку скрипт использует реальный путь , связанные каталоги также будут работать правильно.

Больше информации о скриптах наутилуса здесь .


В качестве альтернативы, выберите свое собственное окно терминала, если у вас есть несколько

Если вы хотите иметь возможность выбрать, в каком окне терминала вы будете открывать текущую (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выхода из системы :)
Джейкоб Влийм
1
@Benny работает только от щелчка правой кнопкой мыши.
Джейкоб Влейм
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), а также параметр командной строки для выполнения команды внутри эмулятора.

Вы можете зарегистрировать скрипт обработчика файлов, как любое другое сопоставление типов файлов в вашем файловом менеджере.

Дэвид Фёрстер
источник