Russian (Pусский) translation by Ellen Nelson (you can also view the original English article)
Будучи разработчиком, я постоянно пользуюсь файловым менеджером. Мне часто хочется расширить файловый менеджер, для облегчения автоматизации моих задач. К сожалению, стандартные файловые менеджеры на большинстве систем, часто очень ограничены.

Файловый менеджер fman полностью меняет игру. fman это минималистичный двухпанельный файл-менеджер. Расширяемый по подобию Sublime Text, используя Python. По умолчанию он использует те же сочетания клавиш, что и Commander One и другие похожие файловые менеджеры. Вы можете использовать его на macOS, Windows, и Linux.
По состоянию на февраль 2017, fman все ещë в закрытой бете и каждый может запросить доступ. Автор планирует начать продажи к 1-му марта 2017.
Мощь переходов
Одной из уникальных особенностей fman является мощь перехода. Когда вы нажимаете Command-P, fman запрашивает название каталога.

fman ищет совпадения. Если у вас много каталогов со словом fman — вы увидите пути на все каталоги, содержащие это слово. Это позволяет довольно просто найти нужный каталог.
Пользовательские параметры
Если вам не нравится стандартное сочетание клавиш, вы можете изменить из каталога User, в котором находятся плагины. На macOS каталог с плагинами находится ~/Library/Application Support/fman/Plugins/
.
На Windows, каталог плагинов находится %APPDATA%\fman
. В системе Linux, он находится ~/.config/fman
.
Папка User
в каталоге плагинов содержит файл Key Bindings.json
. Этот JSON-файл содержит ваши настройки для «горячих клавиш». Формат файла такой:
[ { “keys”: [“Down”], “command”: “move_cursor_down” }, { “keys”: [“Shift+Down”], “command”: “move_cursor_down”, “args”: {“toggle_selection”: true} }, { “keys”: [“Up”], “command”: “move_cursor_up” }, { “keys”: [“Shift+Up”], “command”: “move_cursor_up”, “args”: {“toggle_selection”: true} }, { “keys”: [“Home”], “command”: “move_cursor_home” }, { “keys”: [“Shift+Home”], “command”: “move_cursor_home”, “args”: {“toggle_selection”: true} }, { “keys”: [“End”], “command”: “move_cursor_end” }, { “keys”: [“Shift+End”], “command”: “move_cursor_end”, “args”: {“toggle_selection”: true} }, { “keys”: [“PgDwn”], “command”: “move_cursor_page_down” }, { “keys”: [“Shift+PgDown”], “command”: “move_cursor_page_down”, “args”: {“toggle_selection”: true} }, { “keys”: [“PgUp”], “command”: “move_cursor_page_up” }, { “keys”: [“Shift+PgUp”], “command”: “move_cursor_page_up”, “args”: {“toggle_selection”: true} }, { “keys”: [“Ins”], “command”: “move_cursor_down”, “args”: {“toggle_selection”: true} }, { “keys”: [“Space”], “command”: “toggle_selection” }, { “keys”: [“Backspace”], “command”: “go_up” }, { “keys”: [“Enter”], “command”: “open” }, { “keys”: [“Return”], “command”: “open” }, { “keys”: [“F4”], “command”: “open_with_editor” }, { “keys”: [“Shift+F4”], “command”: “open_with_editor”, “args”: {“create_new”: true} }, { “keys”: [“F5”], “command”: “copy” }, { “keys”: [“Shift+F6”], “command”: “rename” }, { “keys”: [“F6”], “command”: “move” }, { “keys”: [“F7”], “command”: “create_directory” }, { “keys”: [“F8”], “command”: “move_to_trash” }, { “keys”: [“Delete”], “command”: “move_to_trash” }, { “keys”: [“F9”], “command”: “open_terminal” }, { “keys”: [“F10”], “command”: “open_native_file_manager” }, { “keys”: [“F11”], “command”: “copy_paths_to_clipboard” }, { “keys”: [“Ctrl+Right”], “command”: “open_in_right_pane” }, { “keys”: [“Ctrl+Left”], “command”: “open_in_left_pane” }, { “keys”: [“Cmd+C”], “command”: “copy_to_clipboard” }, { “keys”: [“Cmd+V”], “command”: “paste” }, { “keys”: [“Cmd+Alt+V”], “command”: “paste_cut” }, { “keys”: [“Cmd+A”], “command”: “select_all” }, { “keys”: [“Space”], “command”: “move_cursor_down”, “args”: {“toggle_selection”: true} }, { “keys”: [“Cmd+Backspace”], “command”: “move_to_trash” }, { “keys”: [“Cmd+.“], “command”: “toggle_hidden_files” }, { “keys”: [“F2”], “command”: “show_volumes” }, { “keys”: [“Cmd+P”], “command”: “go_to”} ]
В этом файле, вы определяете при нажатии каких клавиш, выполняется желаемая команда. Я использую этот файл, чтобы понять какие команды есть в этой программе.

Нажмите Shift-Command-P в fman для отображения командной строки, в которой выполняются команды. Командная строка отображает горячие клавиши назначенные на команду.
Чтобы использовать команду в командной строке, вместо подчеркивания набирайте пробел. Например, команда show_volumes
запускается при наборе в командной строке show volumes.
Вы можете запустить команду любого расширения из командной строки. Эта функция удобна и очень помогает.
Добавление расширения
В fman можно добавлять расширения. На странице расширений на сайте fman’а, нажмите любое расширение. чтобы загрузить его. Затем полностью скопируйте папку расширения в каталог plugins.

Загрузив расширение Status Bar Extender
, статус бар будет содержать больше полезной информации о текущем каталоге для каждой панели.
Расширения меняют поведение fman.
Например, моё расширение OpenWithEditor
переопределяет внутреннюю команду open_with_editor
.
Внутренняя команда открывает файл в программе по умолчанию для этого типа файла. Моё дополнение переопределяет эту команду, чтобы файл открывался в редакторе, выбранном в моём BitBar плагине currentFiles.1h.rb
, созданном в Руководство по BitBar на Tuts+.
Пишем дополнение
Чтобы создать дополнение, сначала создайте для него папку в каталоге плагинов.
В этом уроке, я хочу создать дополнение, которое позволит мне назначать каталог в качестве каталога проекта и запускать скрипт, как только я захожу в этот каталог, когда другой проект установлен как текущий.
Таким образом, когда я покидаю каталог одного проекта, с которым я работал и перехожу в другой каталог, оно будет запускать скрипт для настройки окружения среды. Я буду создавать это дополнение на macOS, но точно такое же дополнение будет работать и в Windows и на Linux с небольшими изменениями.
Для начала создайте папку ProjectManager в каталоге плагинов. Затем создайте другую папку в этой папке, с названием projectmanager. Название этого каталога должно быть в нижнем регистре и без пробелов.
В этой папке создайте файл __init__.py. В этой папке могут быть и другие файлы, содержащие код на языке python. Когда дополнение загружается, первым делом исполняется этот файл. Поэтому он должен загружать другие файлы, при необходимости.
Добавьте в этот файл следующее:
# # Load the libraries that are used in these commands. # from fman import DirectoryPaneCommand, DirectoryPaneListener, show_alert, load_json, DATA_DIRECTORY, show_prompt import os, stat # # I’m using two globals because it is faster for checking # the directories. I also have an Alfred workflow that makes # use of this information. # PROJECTDIR = os.path.expanduser(“~“) + “/.currentprojectdir” PROJECTSLIST = os.path.expanduser(“~“) + “/.projects”
Этот кот подгружает библиотеки, используемые в этом дополнении. Я вытаскиваю некоторые функции из библиотеки fman
. Вот они:
Библиотека или функция | Описание |
---|---|
DirectoryPaneCommand | Это объект для подкласса для создания команды на уровне каталога. |
DirectoryPaneListener | Это объект для подкласса для создания функции, которая будет прослушивать изменения на панели каталога. |
show_alert | Эта функция покажет предупреждающий диалог с заданным сообщением. |
load_json | Это загружает данные json-файла из каталога User. |
DATA_DIRECTORY | Это каталог для хранения данных fman. |
show_prompt | Это получает от пользователя входящие данные с заданным сообщением. |
Вы можете найти все доступные функции на странице документации fman. На данный момент, это список названия функций и их вводные данные по умолчанию.
После загрузки библиотек, настраиваем две глобальные переменные: PROJECTDIR
и PROJESTSLIST
.
Эти глобальные переменные помогают быстро запустить функцию проверки каталога. Это важно при написании подпрограммы, которая выполняется каждый раз при изменении каталога в fman.
class SetProjectDirectory(DirectoryPaneCommand): # # This directory command is for setting up a new project # directory. It will add to the list of project directories # and set the current project directory to the directory. # def __call__(self): # # Get the directory path. # selected_files = self.pane.get_selected_files() if len(selected_files) >= 1 or (len(selected_files) == 0 and self.get_chosen_files()): if len(selected_files) == 0 and self.get_chosen_files(): selected_files.append(self.get_chosen_files()[0]) dirName = selected_files[0] if os.path.isfile(dirName): # # It’s a file, not a directory. Get the directory # name for this file’s parent directory. # dirName = os.path.dirname(dirName) # # Set the directory obtained as a project directory. # with open(PROJECTDIR, “w”) as f: f.write(dirName) # # Add to the list of projects. Get a name # from the user. # projName, checked = show_prompt(“Name this Project:“) projEntry = projName + “|” + dirName writeappend = ‘w’ if os.path.isfile(PROJECTSLIST): writeappend = ‘a’ with open(PROJECTSLIST,writeappend) as f: f.write(projEntry+“\n”) # # Create the launch script file and open in the # editor. # scriptFile = dirName + “/.startproject” with open(scriptFile, ‘w’) as f: f.write(“#!/bin/sh\n\n”) os.chmod(scriptFile, stat.S_IEXEC|stat.S_IRUSR|stat.S_IWUSR) scriptLoc = load_json(“OpenWithEditor.json”)[“scriptLoc”] if scriptLoc is None: # # Open the file with the TextEdit that is on every Mac. # os.system(“/usr/bin/open -a TextEdit ‘” + scriptFile + “‘“) else: # # They have the OpenWithEditor extension. Use it. # os.system(“‘” + scriptLoc + “’ ‘file’ ‘” + scriptFile + “’ &“) else: # # Technically, this will never be reached. Just here # for completeness. # show_alert(“No directory selected”)
Класс SetProjectDirectory
это подкласс DirectoryPaneCommand
. Метод __call__
вызывается каждый раз, когда запускается set_project_directory
.
Эта функция получает путь текущего каталога, и назначает его в качестве текущего проекта, запрашивает у пользователя название проекта, сохраняет его в файл списка проектов, создаёт файл .startproject
, и открывает его в редакторе по выбору от расширения OpenWithEditor
или TextEdit.
class ClearProjectDirectory(DirectoryPaneCommand): # # This directory command is clearing out the current project. # This is good to do before exiting fman. # def __call__(self): with open(PROJECTDIR,‘w’) as f: f.write(““)
Следующая команда это ClearProjectDirectory. Эта команда очищает файл ~/.currentproject
.
class EditProjectStartScript(DirectoryPaneCommand): # # This directory command is clearing out the current project. # This is good to do before exiting fman. # def __call__(self): # # Get the current project directory. # dirName = “” with open(PROJECTDIR,‘r’) as f: dirName = f.read() if dirName != ““: # # A project directory is set. Edit it’s start file. # scriptFile = dirName + “/.startproject” scriptLoc = load_json(“OpenWithEditor.json”)[“scriptLoc”] if scriptLoc is None: # # Open the file with the TextEdit that is on every Mac. # os.system(“/usr/bin/open -a TextEdit ‘” + scriptFile + “‘“) else: # # They have the OpenWithEditor extension. Use it. # os.system(“‘” + scriptLoc + “’ ‘file’ ‘” + scriptFile + “’ &“)
Команда EditProjectStartScript позволяет вам редактировать скрипт .startproject
для текущего проекта.
Вам не обязательно находится в главном каталоге проекта, чтобы запустить эту команду, но проект должен быть настроен правильно.
class EnteringProjectDirectory(DirectoryPaneListener): # # This is called everytime a directory is changed # in fman. Do a quick check to see if it's a project # directory. If so, if it's not the current project, # set to the current project and run the setup script # for the project. # def on_path_changed(self): # # See if the new directory is a project directory. # newDir = self.pane.get_path() scriptFile = newDir + "/.startproject" if os.path.isfile(scriptFile): # # Get the current project name and see if they # are the same. # projDir = "" with open(PROJECTDIR) as f: projDir = f.read() if projDir != newDir: # # They are different! Set the new project directory # and run the .startproject script. # with open(PROJECTDIR, "w") as f: f.write(newDir) os.system("'" + scriptFile + "'")
Команда EnteringProjectDirectory это главная команда этого дополнения. Все другие команды заставляют эту команду работать.
Так как это подкласс DirectoryPaneListener
, он запускается каждый раз приизменении каталогов. По этой причине, эта процедура должны быть настолько короткой и быстрой, насколько возможно. В противном случае, fman будет очень громоздок в использовании.
Эта команда проверяет зашли ли вы в каталог проекта. Если так, она проверяет отличается ли это от проекта, установленного текущим. И если это так, тогда он настраивает каталог нового проекта и запускает скрипт проекта .startproject
.
Чтобы это протестировать, я добавил этот код в файл .startproject
:
#!/bin/sh echo “d.type = date\nd.label = Example date\nd.default = 2007-05-30 17:00\nd.time = 1” | /Applications/Pashua.app/Contents/MacOS/Pashua -
Оно использует программу Pashua для отображения календаря и часов. Это делает быструю визуальную проверку, чтобы проверить работает ли эта программа.
Следующий пункт — назначение «горячей клавиши» этому дополнению. В корневой каталог этого дополнения добавьте файл Key Bindings.json
:
[ { “keys”: [“shift+s”], “command”: “set_project_directory” }, { “keys”: [“shift+c”], “command”: “clear_project_directory” }, { “keys”: [“shift+e”], “command”: “edit_project_start_script”} ]
Каждому дополнению можно назначить «горячие клавиши». Он загружается перед загрузкой такого же файла из дополнения Users
.
Таким образом, пользователь может переопределить что угодно, настроенное в дополнении. Я назначаю Shift-S на команду set_project_directory
. Назначаю Shift-C на команду clear_project_directory
. И Shift-E на команду edit_project_start_script
.
Если вы установили каталог ProjectManager в качестве каталога проекта, даем ему название Project Manager, при выходе из этого каталога, очищаем проекты с Shift-C или запустив clear_project_directory
в командной строке, а затем снова заходим в каталог.

Вы увидите окошко Pashua, показывающее дату и время. Теперь вы можете создать начальный скрипт, который запустит текстовый редактор для файлов проекта и расположит окна на экране для удобства работы.
Я использую HammerSpoon для создания макетов окон из скрипта. Вы также можете запустить «смотрителя» за каталогом, для пересборки вашего проекта и загрузку его в веб-браузер.
Возможности безграничны.
Вывод
Теперь, когда вы знаете как создавать дополнения для fman, вы можете создать своё собственное.
Существует много способов, которыми вы можете расширить функциональность этого простого дополнения. Использовать fman очень забавно, а также его очень легко дополнить, чтобы получить желаемую функциональность.
Subscribe below and we’ll send you a weekly email summary of all new Computer Skills tutorials. Never miss out on learning about the next big thing.
Update me weeklyEnvato Tuts+ tutorials are translated into other languages by our community members—you can be involved too!
Translate this post