Автоматическое открытие вкладок в окне файлового менеджера Thunar.
В заметке рассматривается вариант открытия вкладок в окне Thunar с помощью терминала и bash-скрипта, что позволит автоматически открыть окна с желаемыми вкладками и путями до каталогов. Это может оказаться полезным, если для работы нужно регулярно держать открытыми определённый набор каталогов, сгруппированных в виде вкладок в окне файлового менеджера, и не хочется тратить время на открытие каждого вручную после перезагрузки сессии. Такой вариант особенно актуален, если по какой-то причине нежелательно сохранять сессию через штатные средства Linux-дистрибутива.
Введение.
Основным действующим лицом в решении поставленной задачи будет скрипт с набором bash-команд. Да, описанный ниже скрипт можно составить на любом другом интерпретируемом языке (все основные языки идут из коробки в Linux-дистрибутивах), но в виду того, что будет необходимо обращаться к другим Linux-утилитам, bash для такой задачи несколько удобнее и проще.
Справка:
man bash
Довольно неплохое руководство по синтаксису bash-команд:
https://github.com/denysdovhan/bash-handbook
Данная заметка опирается на англоязычную статью по открытию вкладок через терминал с помощью bash: https://forums.linuxmint.com/viewtopic.php?t=244076
В ней представлен продвинутый вариант, требующий установки дополнительных пакетов, а в данном варианте рассмотрен простейший и примитивный, но рабочий вариант.
Код скрипта.
Тоже самое для удобства копирования:
#!/bin/bash
IFS=$’\n’
thunar
for dir in $(cat /home/$USER/thunar-tab-list1); do
if [[ $i -eq 0 ]]; then
xdotool key ctrl+l && xdotool type «$dir» && xdotool key Return
i=$(( $i + 1 ))
elif [[ $i -ge 1 ]]; then
xdotool key ctrl+t ctrl+l && xdotool type «$dir» && xdotool key Return
else
echo «Something is wrong!»
fi
done
exit 0
Скрипт примитивный и очень простой, но работает.
Пояснения.
Строка 5.
Переменная IFS — Input Field Separator — разделитель полей, служит для определения границ командных слов. В скрипте применяется для случаев, если в путях до каталогов есть пробелы. В данном случае командная оболочка не будет разделять пути до каталогов по пробелам на отдельные части. При IFS=$’\n’ интерпретатор разделит строки только по переносу строки, что и требуется, так как пути до директорий будут в виде списка и отделены друг друга переносом строки (содержимое списка рассмотрено ниже). Подробнее с IFS можно ознакомиться здесь:
https://www.opennet.ru/docs/RUS/bash_scripting_guide/c3270.html#IFSREF
Примечание: Специалисты отмечают, что применение IFS=$’\n’ для последующей обработки вывода от прочих утилит, является хаком и считается неправильным в плане безопасного поведения кода. В данном случае оно работает удовлетворительно, поэтому этим и ограничимся.
Строка 10.
/home/$USER/thunar-tab-list1 — это текстовый файл, в котором перечислены пути до каталогов, которые нужно открыть в виде вкладок.
Пример содержимого списка:
/home/$USER/Downloads/
/home/$USER/Documents/
/home/$USER/Pictures/
Пути отделены друг от друга переносом строки.
Лучше указывать абсолютные пути.
Строка 14.
xdotool — утилита имитирует ручной ввод комбинаций клавиш и нажатий кнопок мыши, а так же позволяет осуществлять ряд манипуляций с окнами и рабочим столом.
В виду того, что в Thunar не реализовано удобное выполнение действий через терминал, приходится имитировать нажатие клавиш, с чем отлично справляется xdotool.
Имитируется нажатие клавиш Ctrl + L, это активирует выделение содержимого поля адресной строки в файловом менеджере, следующим шагом туда вставляется путь из переменной dir, а затем имитируется нажатие клавиши Return (Enter), что выполняет переход по подставленному адресу.
Переменная «$dir» взята в кавычки, чтобы её значение для интерпретатора точно было строкой.
Если всё сделано правильно, то результат выполнения будет таким:
Несколько окон с вкладками.
По аналогии можно открыть несколько окон, где у каждого будет собственный набор вкладок. Пример реализации для открытия четырёх окон:
Тоже самое для удобства копирования:
#!/bin/bash
IFS=$’\n’
thunar
for dir in $(cat /home/$USER/thunar-tab-list1); do
if [[ $i -eq 0 ]]; then
xdotool key ctrl+l && xdotool type «$dir» && xdotool key Return
i=$(( $i + 1 ))
elif [[ $i -ge 1 ]]; then
xdotool key ctrl+t ctrl+l && xdotool type «$dir» && xdotool key Return
else
echo «Something is wrong!»
fi
done
i=0
thunar
for dir in $(cat /home/$USER/thunar-tab-list2); do
if [[ $i -eq 0 ]]; then
xdotool key ctrl+l && xdotool type «$dir» && xdotool key Return
i=$(( $i + 1 ))
elif [[ $i -ge 1 ]]; then
xdotool key ctrl+t ctrl+l && xdotool type «$dir» && xdotool key Return
else
echo «Something is wrong!»
fi
done
i=0
thunar
for dir in $(cat /home/$USER/thunar-tab-list3); do
if [[ $i -eq 0 ]]; then
xdotool key ctrl+l && xdotool type «$dir» && xdotool key Return
i=$(( $i + 1 ))
elif [[ $i -ge 1 ]]; then
xdotool key ctrl+t ctrl+l && xdotool type «$dir» && xdotool key Return
else
echo «Something is wrong!»
fi
done
i=0
thunar
for dir in $(cat /home/$USER/thunar-tab-list4); do
if [[ $i -eq 0 ]]; then
xdotool key ctrl+l && xdotool type «$dir» && xdotool key Return
i=$(( $i + 1 ))
elif [[ $i -ge 1 ]]; then
xdotool key ctrl+t ctrl+l && xdotool type «$dir» && xdotool key Return
else
echo «Something is wrong!»
fi
done
exit 0
Рекомендую для каждого окна с набором вкладок сделать отдельные списки. Это сильно упрощает скрипт и улучшает контроль. В данном примере списки называются так:
/home/$USER/thunar-tab-list1
/home/$USER/thunar-tab-list2
/home/$USER/thunar-tab-list3
/home/$USER/thunar-tab-list4
Использование и безопасность.
Самым простым вариантом будет размещение файла скрипта в /home/$USER/.local/bin/. Это специальный каталог для скриптов пользователя. Для его использования не требуются права суперпользователя. Размещение скрипта в этом каталоге позволит выполнять его через терминал быстрым вводом имени скрипта без указания пути, так как каталог является стандартным для хранения исполняемых файлов. В данном примере файл скрипта называется так: /home/$USER/.local/bin/thunar-tab.sh
В целях безопасности стоит выставить следующих уровень прав:
sudo chmod 500 ~/.local/bin/thunar-tab.sh
Разрешить пользователю чтение и выполнение, всё прочее запретить; его группе — запретить всё; остальным — запретить всё. Тем самым для редактирования файла потребуются права суперпользователя, но выполнять его можно с правами обычного пользователя, которому принадлежит файл.