- Вопрос или проблема
- (Очень) ограниченные параметры командной строки nautilus
- Как это работает; процесс
- Как настроить
- Как использовать
- Примечание
- ПРАЗДНИК:
- Пользователи Nemo
- Ответ или решение
- Установка необходимых инструментов
- Настройка скрипта на Python
- Изменение запускающего файла Nautilus
- Использование
- Примечания
Вопрос или проблема
Как сделать так, чтобы файловый менеджер Nautilus запоминал мои открытые вкладки?
Можно ли сохранить открытые вкладки между закрытием и открытием файлового менеджера Nautilus?
Предпочтительно даже между разными выходами и перезагрузками.
(Очень) ограниченные параметры командной строки nautilus
К сожалению, nautilus не предлагает вариантов командной строки для чтения открытой директории своих окон, и у него нет никаких опций для отправки существующего окна в другую директорию. Поскольку вы не можете запомнить то, что не видите, на первый взгляд у нас не остается вариантов.
Тем не менее
У нас есть xdotool
, чтобы не делать то, что nautilus
не может, но по крайней мере подделать поведение, которое вы описываете. Мы можем сделать так, чтобы “вы верили в это”, если бы не знали, как это делается.
Хотя приведенное ниже решение не сохраняется после перезагрузки, “запоминание” (возможно, с вкладками) окна и всех открытых директорий вполне возможно в рамках одной сессии. Поскольку вы упомянули, что вас это интересует как “второй выбор”, вот оно.
Как это работает; процесс
Хотя мы не можем закрыть окно и сохранить его вкладки и открытые директории, мы можем сделать так, чтобы существующее окно казалось (и полностью) исчезло, с помощью xdotool
.
Если мы затем изменим поведение лаунчера nautilus
так, чтобы он сначала искал возможные немаппированные окна для перенаправления перед открытием нового, то по сути мы получаем ровно то же поведение, как если бы nautilus
запоминал последние использованные окно(а).
Как настроить
-
Скопируйте скрипт ниже в пустой файл, сохраните его как
remember.py
#!/usr/bin/env python3 import subprocess import os app = "nautilus" wfile = os.environ["HOME"]+"/.unmapped_"+app def get(cmd): # просто помощник return subprocess.check_output(cmd).decode("utf-8").strip() def check_windowtype(w_id): # проверка типа окна; только немаппированные "NORMAL" окна return "_NET_WM_WINDOW_TYPE_NORMAL" in get(["xprop", "-id", w_id]) def get_pid(app): # (попытка) получить pid приложения try: return get(["pgrep", app]) except subprocess.CalledProcessError: pass def get_matches(pid): # получить список окон, выбрать действительные (реальные) окна приложения ws = get(["wmctrl", "-lpG"]).splitlines() matches = [w.split() for w in ws if pid in w] return [w for w in matches if check_windowtype(w[0]) == True] try: # попытка прочитать файл с немаппированными окнами wininf = [l.split() for l in open(wfile).readlines()] except FileNotFoundError: # если нет, немаппируем окна текущего приложения filebrowserwins = get_matches(get_pid(app)) if filebrowserwins: open(wfile, "wt").write(("\n").join((" ").join(l) for l in filebrowserwins)) for w in [w[0] for w in filebrowserwins]: subprocess.Popen(["xdotool", "windowunmap", w]) else: arg = "--new-window" if app == "nautilus" else "" subprocess.Popen([app, arg]) else: # повторно перепривязываем немаппированные окна for w in wininf: wid = w[0]; geo = w[3:7] subprocess.call(["xdotool", "windowmap", wid]) subprocess.Popen(["wmctrl", "-ir", wid, "-e", "0,"+(",").join(geo)]) os.remove(wfile)
-
Скрипту нужны
wmctrl
иxdotool
:sudo apt-get install wmctrl xdotool
-
Скопируйте лаунчер
nautilus
из/usr/share/applications
в~/.local/share/applications
для версий 15.04 и более поздних:
cp /usr/share/applications/org.gnome.Nautilus.desktop ~/.local/share/applications
для более ранних версий Ubuntu:
cp /usr/share/applications/nautilus.desktop ~/.local/share/applications
-
откройте локальную копию с помощью gedit:
gedit ~/.local/share/applications/org.gnome.Nautilus.desktop
(в случае
15.04 +
)и найдите первую строку, начинающуюся с
Exec=
. Измените её на:Exec=python3 /path/to/remember.py
Сохраните и закройте файл.
-
Создайте сочетание клавиш с той же командой: Выберите: Системные настройки > “Клавиатура” > “Сочетания клавиш” > “Пользовательские сочетания”. Нажмите “+” и добавьте команду:
python3 /path/to/remember.py
-
Теперь выйдите из системы и войдите снова
Как использовать
Использование очень просто:
-
Чтобы открыть окно, действуйте как обычно: нажмите на лаунчер nautilus. Группируйте окно как хотите:
-
Чтобы раз и навсегда закрыть окно, закройте его, нажав на кнопку закрытия окна (x).
-
Чтобы сохранить окно(а) + все его вкладки:
нажмите сочетание клавиш. Окно(а) исчезнут (казалось бы, закрылись). -
В следующий раз, когда вы нажмете на лаунчер, окна nautilus появятся точно так же, как в последний раз, даже позиции окон будут сохранены.
Это все
Примечание
- В проводимых мной тестах я не нашел никаких недостатков (14.04). Если вы столкнетесь с каким-либо, пожалуйста, упомяните!
- В разделе Как использовать я предложил нажать на иконку nautilus для перенаправления возможных немаппированных окон. Однако нажатие сочетания клавиш будет делать то же самое, так что вы можете увидеть, что работает для вас наиболее удобно. Также, если вы открыли папку двойным щелчком после того, как вы немаппировали одну или несколько папок, немаппированные папки все равно будут перепривязаны с помощью сочетания клавиш.
ПРАЗДНИК:
Пользователи Nemo
Пользователи Nemo также могут использовать вышеуказанное решение, но:
-
В верхней части скрипта измените:
app = "nautilus"
на:
app = "nemo"
-
В пункте 3 используйте:
cp /usr/share/applications/nemo.desktop ~/.local/share/applications
-
В пункте 4 используйте:
gedit ~/.local/share/applications/nemo.desktop
Проверено, работает с nemo
Я рекомендую использовать другой файловый менеджер, если это вам подходит, так как Nautilus не имеет этой функции.
Вот одно альтернативное приложение, которое справляется с задачей: SpaceFM
У него есть богатые функции, такие как, конечно, повторное открытие последних вкладок.
Чтобы сделать его умолчательным файловым менеджером:
xdg-mime default spacefm.desktop inode/directory
Попробуйте эти скрипты для сохранения и восстановления вкладок файлового менеджера nautilus.
https://github.com/susurri/nautilus_save_tabs/
Самый простой способ доступа к папкам — это создание закладок. Вы не сможете оставить вкладки открытыми, но по крайней мере сможете быстро увидеть нужные папки (и, если задуматься, закладки выполняют функцию вкладок).
Просто откройте папку в Nautilus, зайдите в меню Закладки и добавьте закладку.
Эта функция доступна в pantheon files и dolphin на сегодняшний день.
Ответ или решение
К сожалению, файловый менеджер Nautilus на данный момент не поддерживает функцию запоминания открытых вкладок между сессиями, что затрудняет работу с несколькими каталогами сразу, особенно если у вас есть привычка закрывать менеджер файлов и открывать его вновь.
Тем не менее, существует несколько обходных решений, которые позволят имитировать данное поведение. Ниже приведен один из методов, использующий утилиты xdotool
и wmctrl
для сохранения и восстановления состояния открытых окон Nautilus в рамках одной сессии.
Установка необходимых инструментов
Для начала убедитесь, что у вас установлены wmctrl
и xdotool
. Это можно сделать с помощью следующей команды в терминале:
sudo apt-get install wmctrl xdotool
Настройка скрипта на Python
- Создайте новый файл и сохраните его как
remember.py
с следующим содержимым:
#!/usr/bin/env python3
import subprocess
import os
app = "nautilus"
wfile = os.environ["HOME"] + "/.unmapped_" + app
def get(cmd):
return subprocess.check_output(cmd).decode("utf-8").strip()
def check_windowtype(w_id):
return "_NET_WM_WINDOW_TYPE_NORMAL" in get(["xprop", "-id", w_id])
def get_pid(app):
try:
return get(["pgrep", app])
except subprocess.CalledProcessError:
pass
def get_matches(pid):
ws = get(["wmctrl", "-lpG"]).splitlines()
matches = [w.split() for w in ws if pid in w]
return [w for w in matches if check_windowtype(w[0])]
try:
wininf = [l.split() for l in open(wfile).readlines()]
except FileNotFoundError:
filebrowserwins = get_matches(get_pid(app))
if filebrowserwins:
open(wfile, "wt").write(("\n").join((" ").join(l) for l in filebrowserwins))
for w in [w[0] for w in filebrowserwins]:
subprocess.Popen(["xdotool", "windowunmap", w])
else:
arg = "--new-window" if app == "nautilus" else ""
subprocess.Popen([app, arg])
else:
for w in wininf:
wid = w[0]; geo = w[3:7]
subprocess.call(["xdotool", "windowmap", wid])
subprocess.Popen(["wmctrl", "-ir", wid, "-e", "0,"+(",".join(geo))])
os.remove(wfile)
- Сделайте скрипт исполняемым:
chmod +x /path/to/remember.py
Изменение запускающего файла Nautilus
- Копируйте файл запуска для Nautilus в свое пользовательское пространство:
cp /usr/share/applications/org.gnome.Nautilus.desktop ~/.local/share/applications/
- Откройте скопированный файл с помощью любого текстового редактора (например,
gedit
):
gedit ~/.local/share/applications/org.gnome.Nautilus.desktop
- Найдите строку, начинающуюся с
Exec=
, и измените её на:
Exec=python3 /path/to/remember.py
Сохраните изменения и закройте файл.
Использование
Теперь, когда вы хотите скрыть (но не закрыть) окно Nautilus с открытыми директориями и вкладками, просто нажмите соответствующую комбинацию клавиш или иконку Nautilus. Это окно будет "памятьем" для вашего следующего запуска Nautilus, и оно откроется так же, как было до этого.
Примечания
- Обратите внимание, что это решение не сохраняет состояния при перезагрузке системы. Оно работает только в пределах одной сессии.
- Если вы хотите альтернативный файловый менеджер с лучшими возможностями по управлению вкладками, рассмотрите варианты, такие как SpaceFM или другие, которые могут предлагать такую функциональность официально.
Если у вас есть дополнительные вопросы или потребуется помощь, не стесняйтесь задавать их!