+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Context.sublime-menu b/Context.sublime-menu
deleted file mode 100644
index 7bd4005..0000000
--- a/Context.sublime-menu
+++ /dev/null
@@ -1,5 +0,0 @@
-[
- {
- "command": "fm_create_file_from_selection"
- }
-]
diff --git a/Default.sublime-commands b/Default.sublime-commands
deleted file mode 100644
index 2381e00..0000000
--- a/Default.sublime-commands
+++ /dev/null
@@ -1,92 +0,0 @@
-[
- {
- "caption": "File Manager: New File",
- "command": "fm_create"
- },
- {
- "caption": "File Manager: Move",
- "command": "fm_move"
- },
- {
- "caption": "File Manager: Duplicate",
- "command": "fm_duplicate"
- },
- {
- "caption": "File Manager: Delete",
- "command": "fm_delete"
- },
- {
- "caption": "File Manager: Open Containing Folder…",
- "command": "fm_open_in_explorer",
- },
- {
- "caption": "File Manager: Open In Browser",
- "command": "fm_open_in_browser"
- },
- {
- "caption": "File Manager: Open Terminal",
- "command": "fm_open_terminal"
- },
- {
- "caption": "File Manager: Find In Files",
- "command": "fm_find_in_files"
- },
- {
- "caption": "File Manager: Copy Name",
- "command": "fm_copy",
- "args": {
- "which": "name"
- }
- },
- {
- "caption": "File Manager: Copy Absolute Path",
- "command": "fm_copy",
- "args": {
- "which": "absolute path"
- }
- },
- {
- "caption": "File Manager: Copy Relative Path",
- "command": "fm_copy",
- "args": {
- "which": "relative path"
- }
- },
- {
- "caption": "File Manager: Copy Path From Root",
- "command": "fm_copy",
- "args": {
- "which": "path from root"
- }
- },
- {
- "caption": "File Manager: Create Template",
- "command": "fm_create",
- "args": {
- "paths": ["${packages}/User/.FileManager/"],
- "initial_text": "template."
- }
- },
- {
- "caption": "File Manager: List Templates",
- "command": "fm_create",
- "args": {
- "paths": ["${packages}/User/.FileManager/"],
- "initial_text": "",
- "start_with_browser": true,
- "no_browser_action": true
- }
- },
- {
- "caption": "Preferences: File Manager Settings",
- "command": "edit_settings",
- "args": {
- "base_file": "${packages}/FileManager/FileManager.sublime-settings",
- "default": "// Your settings for FileManager. See the default file to see the different options. \n{\n\t$0\n}\n"
- }
- },
- {
- "caption": "File Manager: Create File From Selection",
- "command": "fm_create_file_from_selection"
- }
-]
diff --git a/Default.sublime-keymap b/Default.sublime-keymap
deleted file mode 100644
index 38339c3..0000000
--- a/Default.sublime-keymap
+++ /dev/null
@@ -1,9 +0,0 @@
-[
- {
- "keys": ["alt+n"],
- "command": "fm_create",
- "context": [
- { "key": "package_setting.FileManager.create_keybinding_enabled" }
- ]
- }
-]
diff --git a/FileManager.py b/FileManager.py
deleted file mode 100644
index 11ce39d..0000000
--- a/FileManager.py
+++ /dev/null
@@ -1,109 +0,0 @@
-# -*- encoding: utf-8 -*-
-import sys
-
-import sublime
-import sublime_plugin
-
-# Clear module cache to force reloading all modules of this package.
-prefix = __package__ + "." # don't clear the base package
-for module_name in [
- module_name
- for module_name in sys.modules
- if module_name.startswith(prefix) and module_name != __name__
-]:
- del sys.modules[module_name]
-prefix = None
-
-from .commands.copy import FmCopyCommand
-from .commands.create import FmCreaterCommand, FmCreateCommand
-from .commands.create_from_selection import FmCreateFileFromSelectionCommand
-from .commands.delete import FmDeleteCommand
-from .commands.duplicate import FmDuplicateCommand
-from .commands.editto import FmEditToTheLeftCommand, FmEditToTheRightCommand
-from .commands.find_in_files import FmFindInFilesCommand
-from .commands.move import FmMoveCommand
-from .commands.open_all import FmOpenAllCommand
-from .commands.open_in_browser import FmOpenInBrowserCommand
-from .commands.open_in_explorer import FmOpenInExplorerCommand
-from .commands.open_terminal import FmOpenTerminalCommand
-from .commands.rename import FmRenameCommand, FmRenamePathCommand
-
-
-def plugin_loaded():
- settings = sublime.load_settings("FileManager.sublime-settings")
- # this use to be a supported setting, but we dropped it. (see #27)
- if settings.get("auto_close_empty_groups") is not None:
- # we could remove the setting automatically, and install the
- # package if it was set to true, but it'd be an extra source
- # of bugs, and it doesn't take that much effort (it's a one
- # time thing, so it doesn't need to be automated)
- sublime.error_message(
- "FileManager\n\n"
- "auto_close_empty_groups is set, but this setting is no longer "
- "supported.\n\n"
- "Auto closing empty groups (in the layout) use to be a feature "
- "of FileManager, but it has now moved to it's own package.\n\n"
- "If you still want this behaviour, you can install "
- "AutoCloseEmptyGroup, it's available on package control.\n\n"
- "To disable this warning, unset the setting "
- "auto_close_empty_groups in FileManager.sublime-settings (search "
- "for Preferences: FileManager Settings in the command palette)"
- )
-
-
-class FmEditReplace(sublime_plugin.TextCommand):
- def run(self, edit, **kwargs):
- kwargs.get("view", self.view).replace(
- edit, sublime.Region(*kwargs["region"]), kwargs["text"]
- )
-
-
-class FmListener(sublime_plugin.EventListener):
- def on_load(self, view):
- settings = view.settings()
- snippet = settings.get("fm_insert_snippet_on_load", None)
- if snippet:
- view.run_command("insert_snippet", {"contents": snippet})
- settings.erase("fm_insert_snippet_on_load")
- if sublime.load_settings("FileManager.sublime-settings").get(
- "save_after_creating"
- ):
- view.run_command("save")
- if settings.get("fm_reveal_in_sidebar"):
- view.window().run_command("reveal_in_side_bar")
-
- def on_text_command(self, view, command, args):
- if (
- command not in ["undo", "unindent"]
- or view.name() != "FileManager::input-for-path"
- ):
- return
-
- settings = view.settings()
-
- if command == "unindent":
- index = settings.get("completions_index")
- settings.set("go_backwards", True)
- view.run_command("insert", {"characters": "\t"})
- return
-
- # command_history: (command, args, times)
- first = view.command_history(0)
- if first[0] != "fm_edit_replace" or first[2] != 1:
- return
-
- second = view.command_history(-1)
- if (second[0] != "reindent") and not (
- second[0] == "insert" and second[1] == {"characters": "\t"}
- ):
- return
-
- settings.set("ran_undo", True)
- view.run_command("undo")
-
- index = settings.get("completions_index")
- if index == 0 or index is None:
- settings.erase("completions")
- settings.erase("completions_index")
- else:
- settings.set("completions_index", index - 1)
diff --git a/FileManager.sublime-settings b/FileManager.sublime-settings
deleted file mode 100644
index 74b3133..0000000
--- a/FileManager.sublime-settings
+++ /dev/null
@@ -1,118 +0,0 @@
-{
-
- // when deleting files/folders, the user will be asked for
- // confirmation, and then the items will be sent to the trash.
- // set to false to remove the confirmation dialog, and send the
- // items to the trash straight away.
- "ask_for_confirmation_on_delete": true,
-
-
- // auto complete with files
- "complete_with_files_too": true,
-
- // only relevant if complete_with_files_too is true
- // choose folder over file if folder and file are available for
- // completion. Null means that it will be selected by alphabetic order
- // valid values: "files", "folders", "alphabetic"
- "pick_first": "folders",
-
- // define if the auto completion case sensitive
- "case_sensitive": false,
-
- // recommended to be a char that cannot be in a file name
- "index_folder_separator": ">",
-
- // which folder to pick for reference by default
- // (create folder from it)
- "default_index": 0,
-
- // valid value
- // false: disable the log
- // "user": display a user friendly path. eg: ~/Desktop/ (working on window)
- // "computer": display a computer friendly path: C:\User\\Desktop\
- "log_in_status_bar": "computer",
-
- // terminals
- // if there is only one, it will directly open it
- // otherwise, it will open a quick panel with all
- // the name listed
- // example for cmder:
-
- // { "name": "Cmder", "cmd": ["C:/cmder/cmder.exe", "/SINGLE", "$cwd"] }
-
- // $cwd will be replaced by the current working directory
-
- "terminals": [
- {
- "name": "CMD",
- "cmd": ["cmd"],
- "platform": "windows"
- },
- {
- "name": "Terminal",
- "cmd": ["open", "-a", "Terminal", "$cwd"],
- "platform": "osx"
- },
- {
- "name": "iTerm",
- "cmd": ["open", "-a", "iTerm", "$cwd"],
- "platform": "osx"
- },
- {
- "name": "GNOME Terminal",
- "cmd": ["gnome-terminal"],
- "platform": "linux"
- }
- ],
-
- // If set to true, all the command that are disabled (in grey)
- // will be hidden
- "menu_without_distraction": true,
-
- // auto refresh the side bar when you run any action that might affect it
- // by default, sublime text would do it by itself, but if this is
- // set to true, then it will be explicitly refreshed
- "explicitly_refresh_sidebar": false,
-
- // if true, each time you create/rename/duplicate etc a file, it will be revealed
- // in the sidebar
- "reveal_in_sidebar": false,
-
- // Save after creating a file (because a snippet can be inserted)
- "save_after_creating": false,
-
- "aliases": {
- "st": "$packages",
- "des": "~/Desktop",
- "here": "$file_path"
- },
-
- // See https://math2001.github.io/FileManager/aliases/#watch-out-for-infinite-loops
- "open_help_on_alias_infinite_loop": true,
-
- // Once again, to improve your speed, if there is commands
- // you never use, you can super easily hide them.
-
- // You can hide/show every command, and it will have no impact
- // on the other ones.
-
- "show_create_command": true,
- "show_copy_command": true,
- "show_delete_command": true,
- "show_duplicate_command": true,
- "show_edit_to_the_left_command": true,
- "show_edit_to_the_right_command": true,
- "show_find_in_files_command": true,
- "show_move_command": true,
- "show_open_in_explorer_command": true,
- "show_open_in_browser_command": true,
- "show_open_terminal_command": true,
- "show_rename_command": true,
- "show_rename_path_command": true,
- "show_create_from_selection_command": true,
- "show_open_all_command": true,
-
- // Set to false to disable the default alt+n key binding
- "create_keybinding_enabled": true
-
-}
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 03fd5c3..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,7 +0,0 @@
-Copyright 2017-2019 Mathieu PATUREL
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/Main.sublime-menu b/Main.sublime-menu
deleted file mode 100644
index c572f53..0000000
--- a/Main.sublime-menu
+++ /dev/null
@@ -1,20 +0,0 @@
-[
- {
- "id": "preferences",
- "children": [
- {
- "id": "package-settings",
- "children": [
- {
- "caption": "FileManager",
- "command": "edit_settings",
- "args": {
- "base_file": "${packages}/FileManager/FileManager.sublime-settings",
- "default": "// Your settings for FileManager. See the default file to see the different options. \n{\n\t$0\n}\n"
- }
- }
- ]
- }
- ]
- }
-]
diff --git a/README.md b/README.md
deleted file mode 100644
index d429f48..0000000
--- a/README.md
+++ /dev/null
@@ -1,83 +0,0 @@
-# File Manager
-
-File Manager is a plugin for Sublime Text that is suppose to replace SideBarEnhancement and AdvancedNewFile.
-
-Why? Because those to plugin basically do the same thing: *They manage files from sublime text*.
-
-With this package, you can create, rename, move, duplicate and delete files or folders. You can also copy there relative/absolute path, or their name.
-
-
-
-- ["Spirit"](#spirit)
- - [The idea is to make you save time, not to propose you features you're never going to use.](#the-idea-is-to-make-you-save-time-not-to-propose-you-features-youre-never-going-to-use)
-- [Docs](#docs)
-- [Installation](#installation)
- - [Using package control](#using-package-control)
- - [Using the command line](#using-the-command-line)
-- [How to open the `README`](#how-to-open-the-readme)
-- [Contributing](#contributing)
-
-
-
-## "Spirit"
-
-#### The idea is to make you save time, not to propose you features you're never going to use.
-
-> This package has as main goal to be 100% optimized.
-
-So, for example, there is an **auto completion** system (based on the folders/files, both, you choose) on every input that is showed by FileManager. Just press tab to cycle through the auto completion.
-
-> There shouldn't be 2 commands when 1 can do the job.
-
-FileManager doesn't have a command `create_new_file` and `create_new_folder`. Just `fm_create`. It opens up an input, and the last character you type in is a `/` (or a `\`), it creates a folder instead of a file.
-
-## Docs
-
-Although they're a fair bit of information in there, the docs are still a work in progress. Here they are: [math2001.github.io/FileManager](https://math2001.github.io/FileManager). **Go have a quick look, you won't regret it** :smile:
-
-## Installation
-
-#### Using package control
-
-1. Open up the command palette: ctrl+shift+p
-2. Search for `Package Control: Install Package`
-3. Search for `FileManager`
-4. Hit enter :wink:
-
-#### Using the command line
-
-If you want to contribute to this package, first thanks, and second, you should download this using `git` so that you can propose your changes.
-
-```bash
-cd "%APPDATA%\Sublime Text 3\Packages" # on Windows
-cd ~/Library/Application\ Support/Sublime\ Text\ 3 # on Mac
-cd ~/.config/sublime-text-3 # on Linux
-
-git clone "https://github.com/math2001/FileManager"
-```
-
-## How to open the [`README`](https://github.com/math2001/FileManager/blob/master/README.md)
-
-To open their README, some of the package add a command in the menus, others in the command palette, or other nowhere. None of those options are really good, especially the last one on ST3 because the packages are compressed. But, fortunately, there is plugin that exists and will **solve this problem for us** (and he has a really cute name, don't you think?): [ReadmePlease](https://packagecontrol.io/packages/ReadmePlease). :tada:
-
-## Contributing
-
-You want to contribute? Great! There's two different things you can contribute
-to:
-
-1. the package itself
-2. the docs
-
-If you want to contribute to the *package*, then you're at the right place.
-Otherwise, please go have a look at [the contributing part of the docs][0]
-
-First, whatever you want to do, please raise an issue. Then, if you feel in a
-hacky mood, go ahead and code it:
-
-- create a branch: `my-feature-name`
-- don't hesitate to change stuff in the `.tasks` file.
-- Push and PR
-
-Note: This plugin is only working on Sublime Text 3.
-
-[0]: https://math2001.github.io/FileManager/contributing/
diff --git a/Side Bar.sublime-menu b/Side Bar.sublime-menu
deleted file mode 100644
index afd0b05..0000000
--- a/Side Bar.sublime-menu
+++ /dev/null
@@ -1,156 +0,0 @@
-[
- {
- "caption": "New…",
- "command": "fm_create",
- "mnemonic": "N",
- "args": {
- "paths": []
- }
- },
- {
- "caption": "Open All",
- "command": "fm_open_all",
- "mnemonic": "A",
- "args": {
- "files": []
- }
- },
- {
- "caption": "Edit to Right",
- "command": "fm_edit_to_the_right",
- "mnemonic": "R",
- "args": {
- "files": []
- }
- },
- {
- "caption": "Edit to Left",
- "command": "fm_edit_to_the_left",
- "mnemonic": "L",
- "args": {
- "files": []
- }
- },
- {
- "caption": "Rename…",
- "mnemonic": "R",
- "command": "fm_rename_path",
- "args": {
- "paths": []
- }
- },
- {
- "caption": "Move…",
- "command": "fm_move",
- "mnemonic": "M",
- "args": {
- "paths": []
- }
- },
- {
- "caption": "Duplicate…",
- "command": "fm_duplicate",
- "mnemonic": "D",
- "args": {
- "paths": []
- }
- },
- {
- "caption": "Delete…",
- "command": "fm_delete",
- "mnemonic": "e",
- "args": {
- "paths": []
- }
- },
- {
- "caption": "-"
- },
- {
- "mnemonic": "C",
- "caption": "Copy…",
- "children": [
- {
- "caption": "Name",
- "command": "fm_copy",
- "args": {
- "which": "name",
- "paths": []
- }
- },
- {
- "caption": "Absolute Path",
- "command": "fm_copy",
- "args": {
- "which": "absolute path",
- "paths": []
- }
- },
- {
- "caption": "Path From Root",
- "command": "fm_copy",
- "args": {
- "which": "path from root",
- "paths": []
- }
- },
- {
- "caption": "Relative Path",
- "command": "fm_copy",
- "args": {
- "which": "relative path",
- "paths": []
- }
- }
- ]
- },
- {
- "caption": "-"
- },
- {
- "caption": "Open in Explorer",
- "command": "fm_open_in_explorer",
- "mnemonic": "O",
- "args": {
- "visible_on_platforms": ["windows", "linux"],
- "paths": []
- }
- },
- {
- "caption": "Open in Finder",
- "command": "fm_open_in_explorer",
- "mnemonic": "O",
- "args": {
- "visible_on_platforms": ["osx"],
- "paths": []
- }
- },
- {
- "mnemonic": "T",
- "caption": "Open Terminal Here",
- "command": "fm_open_terminal",
- "args": {
- "paths": []
- }
- },
- {
- "caption": "Open in Browser",
- "mnemonic": "B",
- "command": "fm_open_in_browser",
- "args": {
- "paths": []
- }
- },
- {
- "caption": "-",
- "id": "folder_commands",
- },
- {
- "mnemonic": "F",
- "caption": "Find in Files",
- "command": "fm_find_in_files",
- "args": {
- "paths": []
- }
- },
-]
diff --git a/Tab Context.sublime-menu b/Tab Context.sublime-menu
deleted file mode 100644
index aa04c58..0000000
--- a/Tab Context.sublime-menu
+++ /dev/null
@@ -1,35 +0,0 @@
-[
- { "caption": "-", "id": "file" },
- { "caption": "Open In Browser", "command": "fm_open_in_browser" },
- { "caption": "-", "id": "file_manager" },
- { "caption": "Rename...", "command": "fm_rename_path" },
- { "caption": "Move...", "command": "fm_move" },
- { "caption": "Duplicate...", "command": "fm_duplicate" },
- { "caption": "Delete", "command": "fm_delete" },
- {
- "caption": "Copy…",
- "mnemonic": "C",
- "children": [
- {
- "caption": "Name",
- "command": "fm_copy",
- "args": { "which": "name" }
- },
- {
- "caption": "Absolute Path",
- "command": "fm_copy",
- "args": { "which": "absolute path" }
- },
- {
- "caption": "Path From Root",
- "command": "fm_copy",
- "args": { "which": "path from root" }
- },
- {
- "caption": "Relative Path",
- "command": "fm_copy",
- "args": { "which": "relative path" }
- }
- ]
- }
-]
diff --git a/about/index.html b/about/index.html
new file mode 100755
index 0000000..afce553
--- /dev/null
+++ b/about/index.html
@@ -0,0 +1,437 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ About - FileManager
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Hello! I'm math2001, and I'm the author of FileManager.
+
I've created this package because I...don't have a really fast computer (pretty slow to be honest), so I'm use to have small tool, but still powerful. Sublime Text is probably the best example (although I wouldn't call it small, but super-fast )
+
So, when I installed SidebarEnhancement, it just didn't fit. There were so many options, I used only about half of them. You couldn't create any nested files (actually, you could, but you'd get an error message poping up). There was no auto completion and it was messy. I just didn't like it.
+
Then AdvancedNewFile came into the game. This one is really cool. It has auto completion (although I discovered when I started creating FileManager ), you can create nested files, folders. But it wasn't included in the Side Bar, which is, in my opinion, a bit silly.
+
So, I decided to mix them together, but I kept in mind that I should add feature that are really useful. And out of this came FileManager.
+
I'm completely open to any suggestions, and I would love to hear what you think of this package or if you enjoy it! So, you can send me a tweet, or simply star the repo!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/assets/images/favicon.ico b/assets/images/favicon.ico
new file mode 100755
index 0000000..e85006a
Binary files /dev/null and b/assets/images/favicon.ico differ
diff --git a/assets/images/icons/bitbucket-670608a71a.svg b/assets/images/icons/bitbucket-670608a71a.svg
new file mode 100755
index 0000000..7d95cb2
--- /dev/null
+++ b/assets/images/icons/bitbucket-670608a71a.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/icons/github-1da075986e.svg b/assets/images/icons/github-1da075986e.svg
new file mode 100755
index 0000000..3cacb2e
--- /dev/null
+++ b/assets/images/icons/github-1da075986e.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/icons/gitlab-5ad3f9f9e5.svg b/assets/images/icons/gitlab-5ad3f9f9e5.svg
new file mode 100755
index 0000000..b036a9b
--- /dev/null
+++ b/assets/images/icons/gitlab-5ad3f9f9e5.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/javascripts/application-2afe21e0b2.js b/assets/javascripts/application-2afe21e0b2.js
new file mode 100755
index 0000000..8100823
--- /dev/null
+++ b/assets/javascripts/application-2afe21e0b2.js
@@ -0,0 +1,58 @@
+var Application=function(t){function e(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return t[r].call(o.exports,o,o.exports,e),o.loaded=!0,o.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){n(1),n(65),n(66),t.exports=n(67)},function(t,e,n){"use strict";n(2),n(22),n(48),n(52),t.exports=n(21).Promise},function(t,e,n){"use strict";var r=n(3),o={};o[n(5)("toStringTag")]="z",o+""!="[object z]"&&n(9)(Object.prototype,"toString",function(){return"[object "+r(this)+"]"},!0)},function(t,e,n){"use strict";var r=n(4),o=n(5)("toStringTag"),i="Arguments"==r(function(){return arguments}()),s=function(t,e){try{return t[e]}catch(t){}};t.exports=function(t){var e,n,a;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=s(e=Object(t),o))?n:i?r(e):"Object"==(a=r(e))&&"function"==typeof e.callee?"Arguments":a}},function(t,e){"use strict";var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e,n){"use strict";var r=n(6)("wks"),o=n(8),i=n(7).Symbol,s="function"==typeof i,a=t.exports=function(t){return r[t]||(r[t]=s&&i[t]||(s?i:o)("Symbol."+t))};a.store=r},function(t,e,n){"use strict";var r=n(7),o="__core-js_shared__",i=r[o]||(r[o]={});t.exports=function(t){return i[t]||(i[t]={})}},function(t,e){"use strict";var n=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(t,e){"use strict";var n=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++n+r).toString(36))}},function(t,e,n){"use strict";var r=n(7),o=n(10),i=n(20),s=n(8)("src"),a="toString",u=Function[a],c=(""+u).split(a);n(21).inspectSource=function(t){return u.call(t)},(t.exports=function(t,e,n,a){var u="function"==typeof n;u&&(i(n,"name")||o(n,"name",e)),t[e]!==n&&(u&&(i(n,s)||o(n,s,t[e]?""+t[e]:c.join(String(e)))),t===r?t[e]=n:a?t[e]?t[e]=n:o(t,e,n):(delete t[e],o(t,e,n)))})(Function.prototype,a,function(){return"function"==typeof this&&this[s]||u.call(this)})},function(t,e,n){"use strict";var r=n(11),o=n(19);t.exports=n(15)?function(t,e,n){return r.f(t,e,o(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){"use strict";var r=n(12),o=n(14),i=n(18),s=Object.defineProperty;e.f=n(15)?Object.defineProperty:function(t,e,n){if(r(t),e=i(e,!0),r(n),o)try{return s(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},function(t,e,n){"use strict";var r=n(13);t.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},function(t,e){"use strict";var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};t.exports=function(t){return"object"===("undefined"==typeof t?"undefined":n(t))?null!==t:"function"==typeof t}},function(t,e,n){"use strict";t.exports=!n(15)&&!n(16)(function(){return 7!=Object.defineProperty(n(17)("div"),"a",{get:function(){return 7}}).a})},function(t,e,n){"use strict";t.exports=!n(16)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,e){"use strict";t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,n){"use strict";var r=n(13),o=n(7).document,i=r(o)&&r(o.createElement);t.exports=function(t){return i?o.createElement(t):{}}},function(t,e,n){"use strict";var r=n(13);t.exports=function(t,e){if(!r(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!r(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,e){"use strict";t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e){"use strict";var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},function(t,e){"use strict";var n=t.exports={version:"2.4.0"};"number"==typeof __e&&(__e=n)},function(t,e,n){"use strict";var r=n(23)(!0);n(26)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,e=this._t,n=this._i;return n>=e.length?{value:void 0,done:!0}:(t=r(e,n),this._i+=t.length,{value:t,done:!1})})},function(t,e,n){"use strict";var r=n(24),o=n(25);t.exports=function(t){return function(e,n){var i,s,a=String(o(e)),u=r(n),c=a.length;return u<0||u>=c?t?"":void 0:(i=a.charCodeAt(u),i<55296||i>56319||u+1===c||(s=a.charCodeAt(u+1))<56320||s>57343?t?a.charAt(u):i:t?a.slice(u,u+2):(i-55296<<10)+(s-56320)+65536)}}},function(t,e){"use strict";var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e){"use strict";t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},function(t,e,n){"use strict";var r=n(27),o=n(28),i=n(9),s=n(10),a=n(20),u=n(31),c=n(32),l=n(45),f=n(46),h=n(5)("iterator"),d=!([].keys&&"next"in[].keys()),p="@@iterator",v="keys",y="values",m=function(){return this};t.exports=function(t,e,n,g,b,_,w){c(n,e,g);var x,S,E,k=function(t){if(!d&&t in P)return P[t];switch(t){case v:return function(){return new n(this,t)};case y:return function(){return new n(this,t)}}return function(){return new n(this,t)}},T=e+" Iterator",O=b==y,C=!1,P=t.prototype,A=P[h]||P[p]||b&&P[b],M=A||k(b),j=b?O?k("entries"):M:void 0,L="Array"==e?P.entries||A:A;if(L&&(E=f(L.call(new t)),E!==Object.prototype&&(l(E,T,!0),r||a(E,h)||s(E,h,m))),O&&A&&A.name!==y&&(C=!0,M=function(){return A.call(this)}),r&&!w||!d&&!C&&P[h]||s(P,h,M),u[e]=M,u[T]=m,b)if(x={values:O?M:k(y),keys:_?M:k(v),entries:j},w)for(S in x)S in P||i(P,S,x[S]);else o(o.P+o.F*(d||C),e,x);return x}},function(t,e){"use strict";t.exports=!1},function(t,e,n){"use strict";var r=n(7),o=n(21),i=n(10),s=n(9),a=n(29),u="prototype",c=function t(e,n,c){var l,f,h,d,p=e&t.F,v=e&t.G,y=e&t.S,m=e&t.P,g=e&t.B,b=v?r:y?r[n]||(r[n]={}):(r[n]||{})[u],_=v?o:o[n]||(o[n]={}),w=_[u]||(_[u]={});v&&(c=n);for(l in c)f=!p&&b&&void 0!==b[l],h=(f?b:c)[l],d=g&&f?a(h,r):m&&"function"==typeof h?a(Function.call,h):h,b&&s(b,l,h,e&t.U),_[l]!=h&&i(_,l,d),m&&w[l]!=h&&(w[l]=h)};r.core=o,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,t.exports=c},function(t,e,n){"use strict";var r=n(30);t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,o){return t.call(e,n,r,o)}}return function(){return t.apply(e,arguments)}}},function(t,e){"use strict";t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,e){"use strict";t.exports={}},function(t,e,n){"use strict";var r=n(33),o=n(19),i=n(45),s={};n(10)(s,n(5)("iterator"),function(){return this}),t.exports=function(t,e,n){t.prototype=r(s,{next:o(1,n)}),i(t,e+" Iterator")}},function(t,e,n){"use strict";var r=n(12),o=n(34),i=n(43),s=n(42)("IE_PROTO"),a=function(){},u="prototype",c=function(){var t,e=n(17)("iframe"),r=i.length,o="<",s=">";for(e.style.display="none",n(44).appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write(o+"script"+s+"document.F=Object"+o+"/script"+s),t.close(),c=t.F;r--;)delete c[u][i[r]];return c()};t.exports=Object.create||function(t,e){var n;return null!==t?(a[u]=r(t),n=new a,a[u]=null,n[s]=t):n=c(),void 0===e?n:o(n,e)}},function(t,e,n){"use strict";var r=n(11),o=n(12),i=n(35);t.exports=n(15)?Object.defineProperties:function(t,e){o(t);for(var n,s=i(e),a=s.length,u=0;a>u;)r.f(t,n=s[u++],e[n]);return t}},function(t,e,n){"use strict";var r=n(36),o=n(43);t.exports=Object.keys||function(t){return r(t,o)}},function(t,e,n){"use strict";var r=n(20),o=n(37),i=n(39)(!1),s=n(42)("IE_PROTO");t.exports=function(t,e){var n,a=o(t),u=0,c=[];for(n in a)n!=s&&r(a,n)&&c.push(n);for(;e.length>u;)r(a,n=e[u++])&&(~i(c,n)||c.push(n));return c}},function(t,e,n){"use strict";var r=n(38),o=n(25);t.exports=function(t){return r(o(t))}},function(t,e,n){"use strict";var r=n(4);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},function(t,e,n){"use strict";var r=n(37),o=n(40),i=n(41);t.exports=function(t){return function(e,n,s){var a,u=r(e),c=o(u.length),l=i(s,c);if(t&&n!=n){for(;c>l;)if(a=u[l++],a!=a)return!0}else for(;c>l;l++)if((t||l in u)&&u[l]===n)return t||l||0;return!t&&-1}}},function(t,e,n){"use strict";var r=n(24),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,e,n){"use strict";var r=n(24),o=Math.max,i=Math.min;t.exports=function(t,e){return t=r(t),t<0?o(t+e,0):i(t,e)}},function(t,e,n){"use strict";var r=n(6)("keys"),o=n(8);t.exports=function(t){return r[t]||(r[t]=o(t))}},function(t,e){"use strict";t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e,n){"use strict";t.exports=n(7).document&&document.documentElement},function(t,e,n){"use strict";var r=n(11).f,o=n(20),i=n(5)("toStringTag");t.exports=function(t,e,n){t&&!o(t=n?t:t.prototype,i)&&r(t,i,{configurable:!0,value:e})}},function(t,e,n){"use strict";var r=n(20),o=n(47),i=n(42)("IE_PROTO"),s=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=o(t),r(t,i)?t[i]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?s:null}},function(t,e,n){"use strict";var r=n(25);t.exports=function(t){return Object(r(t))}},function(t,e,n){"use strict";for(var r=n(49),o=n(9),i=n(7),s=n(10),a=n(31),u=n(5),c=u("iterator"),l=u("toStringTag"),f=a.Array,h=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],d=0;d<5;d++){var p,v=h[d],y=i[v],m=y&&y.prototype;if(m){m[c]||s(m,c,f),m[l]||s(m,l,v),a[v]=f;for(p in r)m[p]||o(m,p,r[p],!0)}}},function(t,e,n){"use strict";var r=n(50),o=n(51),i=n(31),s=n(37);t.exports=n(26)(Array,"Array",function(t,e){this._t=s(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,n=this._i++;return!t||n>=t.length?(this._t=void 0,o(1)):"keys"==e?o(0,n):"values"==e?o(0,t[n]):o(0,[n,t[n]])},"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},function(t,e,n){"use strict";var r=n(5)("unscopables"),o=Array.prototype;void 0==o[r]&&n(10)(o,r,{}),t.exports=function(t){o[r][t]=!0}},function(t,e){"use strict";t.exports=function(t,e){return{value:e,done:!!t}}},function(t,e,n){"use strict";var r,o,i,s=n(27),a=n(7),u=n(29),c=n(3),l=n(28),f=n(13),h=n(30),d=n(53),p=n(54),v=n(58),y=n(59).set,m=n(61)(),g="Promise",b=a.TypeError,_=a.process,w=a[g],_=a.process,x="process"==c(_),S=function(){},E=!!function(){try{var t=w.resolve(1),e=(t.constructor={})[n(5)("species")]=function(t){t(S,S)};return(x||"function"==typeof PromiseRejectionEvent)&&t.then(S)instanceof e}catch(t){}}(),k=function(t,e){return t===e||t===w&&e===i},T=function(t){var e;return!(!f(t)||"function"!=typeof(e=t.then))&&e},O=function(t){return k(w,t)?new C(t):new o(t)},C=o=function(t){var e,n;this.promise=new t(function(t,r){if(void 0!==e||void 0!==n)throw b("Bad Promise constructor");e=t,n=r}),this.resolve=h(e),this.reject=h(n)},P=function(t){try{t()}catch(t){return{error:t}}},A=function(t,e){if(!t._n){t._n=!0;var n=t._c;m(function(){for(var r=t._v,o=1==t._s,i=0,s=function(e){var n,i,s=o?e.ok:e.fail,a=e.resolve,u=e.reject,c=e.domain;try{s?(o||(2==t._h&&L(t),t._h=1),s===!0?n=r:(c&&c.enter(),n=s(r),c&&c.exit()),n===e.promise?u(b("Promise-chain cycle")):(i=T(n))?i.call(n,a,u):a(n)):u(r)}catch(t){u(t)}};n.length>i;)s(n[i++]);t._c=[],t._n=!1,e&&!t._h&&M(t)})}},M=function(t){y.call(a,function(){var e,n,r,o=t._v;if(j(t)&&(e=P(function(){x?_.emit("unhandledRejection",o,t):(n=a.onunhandledrejection)?n({promise:t,reason:o}):(r=a.console)&&r.error&&r.error("Unhandled promise rejection",o)}),t._h=x||j(t)?2:1),t._a=void 0,e)throw e.error})},j=function t(e){if(1==e._h)return!1;for(var n,r=e._a||e._c,o=0;r.length>o;)if(n=r[o++],n.fail||!t(n.promise))return!1;return!0},L=function(t){y.call(a,function(){var e;x?_.emit("rejectionHandled",t):(e=a.onrejectionhandled)&&e({promise:t,reason:t._v})})},F=function(t){var e=this;e._d||(e._d=!0,e=e._w||e,e._v=t,e._s=2,e._a||(e._a=e._c.slice()),A(e,!0))},N=function t(e){var n,r=this;if(!r._d){r._d=!0,r=r._w||r;try{if(r===e)throw b("Promise can't be resolved itself");(n=T(e))?m(function(){var o={_w:r,_d:!1};try{n.call(e,u(t,o,1),u(F,o,1))}catch(t){F.call(o,t)}}):(r._v=e,r._s=1,A(r,!1))}catch(t){F.call({_w:r,_d:!1},t)}}};E||(w=function(t){d(this,w,g,"_h"),h(t),r.call(this);try{t(u(N,this,1),u(F,this,1))}catch(t){F.call(this,t)}},r=function(t){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1},r.prototype=n(62)(w.prototype,{then:function(t,e){var n=O(v(this,w));return n.ok="function"!=typeof t||t,n.fail="function"==typeof e&&e,n.domain=x?_.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&A(this,!1),n.promise},catch:function(t){return this.then(void 0,t)}}),C=function(){var t=new r;this.promise=t,this.resolve=u(N,t,1),this.reject=u(F,t,1)}),l(l.G+l.W+l.F*!E,{Promise:w}),n(45)(w,g),n(63)(g),i=n(21)[g],l(l.S+l.F*!E,g,{reject:function(t){var e=O(this),n=e.reject;return n(t),e.promise}}),l(l.S+l.F*(s||!E),g,{resolve:function(t){if(t instanceof w&&k(t.constructor,this))return t;var e=O(this),n=e.resolve;return n(t),e.promise}}),l(l.S+l.F*!(E&&n(64)(function(t){w.all(t).catch(S)})),g,{all:function(t){var e=this,n=O(e),r=n.resolve,o=n.reject,i=P(function(){var n=[],i=0,s=1;p(t,!1,function(t){var a=i++,u=!1;n.push(void 0),s++,e.resolve(t).then(function(t){u||(u=!0,n[a]=t,--s||r(n))},o)}),--s||r(n)});return i&&o(i.error),n.promise},race:function(t){var e=this,n=O(e),r=n.reject,o=P(function(){p(t,!1,function(t){e.resolve(t).then(n.resolve,r)})});return o&&r(o.error),n.promise}})},function(t,e){"use strict";t.exports=function(t,e,n,r){if(!(t instanceof e)||void 0!==r&&r in t)throw TypeError(n+": incorrect invocation!");return t}},function(t,e,n){"use strict";var r=n(29),o=n(55),i=n(56),s=n(12),a=n(40),u=n(57),c={},l={},f=t.exports=function(t,e,n,f,h){var d,p,v,y,m=h?function(){return t}:u(t),g=r(n,f,e?2:1),b=0;if("function"!=typeof m)throw TypeError(t+" is not iterable!");if(i(m)){for(d=a(t.length);d>b;b++)if(y=e?g(s(p=t[b])[0],p[1]):g(t[b]),y===c||y===l)return y}else for(v=m.call(t);!(p=v.next()).done;)if(y=o(v,g,p.value,e),y===c||y===l)return y};f.BREAK=c,f.RETURN=l},function(t,e,n){"use strict";var r=n(12);t.exports=function(t,e,n,o){try{return o?e(r(n)[0],n[1]):e(n)}catch(e){var i=t.return;throw void 0!==i&&r(i.call(t)),e}}},function(t,e,n){"use strict";var r=n(31),o=n(5)("iterator"),i=Array.prototype;t.exports=function(t){return void 0!==t&&(r.Array===t||i[o]===t)}},function(t,e,n){"use strict";var r=n(3),o=n(5)("iterator"),i=n(31);t.exports=n(21).getIteratorMethod=function(t){if(void 0!=t)return t[o]||t["@@iterator"]||i[r(t)]}},function(t,e,n){"use strict";var r=n(12),o=n(30),i=n(5)("species");t.exports=function(t,e){var n,s=r(t).constructor;return void 0===s||void 0==(n=r(s)[i])?e:o(n)}},function(t,e,n){"use strict";var r,o,i,s=n(29),a=n(60),u=n(44),c=n(17),l=n(7),f=l.process,h=l.setImmediate,d=l.clearImmediate,p=l.MessageChannel,v=0,y={},m="onreadystatechange",g=function(){var t=+this;if(y.hasOwnProperty(t)){var e=y[t];delete y[t],e()}},b=function(t){g.call(t.data)};h&&d||(h=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return y[++v]=function(){a("function"==typeof t?t:Function(t),e)},r(v),v},d=function(t){delete y[t]},"process"==n(4)(f)?r=function(t){f.nextTick(s(g,t,1))}:p?(o=new p,i=o.port2,o.port1.onmessage=b,r=s(i.postMessage,i,1)):l.addEventListener&&"function"==typeof postMessage&&!l.importScripts?(r=function(t){l.postMessage(t+"","*")},l.addEventListener("message",b,!1)):r=m in c("script")?function(t){u.appendChild(c("script"))[m]=function(){u.removeChild(this),g.call(t)}}:function(t){setTimeout(s(g,t,1),0)}),t.exports={set:h,clear:d}},function(t,e){"use strict";t.exports=function(t,e,n){var r=void 0===n;switch(e.length){case 0:return r?t():t.call(n);case 1:return r?t(e[0]):t.call(n,e[0]);case 2:return r?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return r?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return r?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},function(t,e,n){"use strict";var r=n(7),o=n(59).set,i=r.MutationObserver||r.WebKitMutationObserver,s=r.process,a=r.Promise,u="process"==n(4)(s);t.exports=function(){var t,e,n,c=function(){var r,o;for(u&&(r=s.domain)&&r.exit();t;){o=t.fn,t=t.next;try{o()}catch(r){throw t?n():e=void 0,r}}e=void 0,r&&r.enter()};if(u)n=function(){s.nextTick(c)};else if(i){var l=!0,f=document.createTextNode("");new i(c).observe(f,{characterData:!0}),n=function(){f.data=l=!l}}else if(a&&a.resolve){var h=a.resolve();n=function(){h.then(c)}}else n=function(){o.call(r,c)};return function(r){var o={fn:r,next:void 0};e&&(e.next=o),t||(t=o,n()),e=o}}},function(t,e,n){"use strict";var r=n(9);t.exports=function(t,e,n){for(var o in e)r(t,o,e[o],n);return t}},function(t,e,n){"use strict";var r=n(7),o=n(11),i=n(15),s=n(5)("species");t.exports=function(t){var e=r[t];i&&e&&!e[s]&&o.f(e,s,{configurable:!0,get:function(){return this}})}},function(t,e,n){"use strict";var r=n(5)("iterator"),o=!1;try{var i=[7][r]();i.return=function(){o=!0},Array.from(i,function(){throw 2})}catch(t){}t.exports=function(t,e){if(!e&&!o)return!1;var n=!1;try{var i=[7],s=i[r]();s.next=function(){return{done:n=!0}},i[r]=function(){return s},t(i)}catch(t){}return n}},function(t,e){"use strict";try{var n=new window.CustomEvent("test");if(n.preventDefault(),n.defaultPrevented!==!0)throw new Error("Could not prevent default")}catch(t){var r=function(t,e){var n,r;return e=e||{bubbles:!1,cancelable:!1,detail:void 0},n=document.createEvent("CustomEvent"),n.initCustomEvent(t,e.bubbles,e.cancelable,e.detail),r=n.preventDefault,n.preventDefault=function(){r.call(this);try{Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}})}catch(t){this.defaultPrevented=!0}},n};r.prototype=window.Event.prototype,window.CustomEvent=r}},function(t,e){"use strict";!function(t){function e(t){if("string"!=typeof t&&(t=String(t)),/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(t))throw new TypeError("Invalid character in header field name");return t.toLowerCase()}function n(t){return"string"!=typeof t&&(t=String(t)),t}function r(t){var e={next:function(){var e=t.shift();return{done:void 0===e,value:e}}};return m.iterable&&(e[Symbol.iterator]=function(){return e}),e}function o(t){this.map={},t instanceof o?t.forEach(function(t,e){this.append(e,t)},this):t&&Object.getOwnPropertyNames(t).forEach(function(e){this.append(e,t[e])},this)}function i(t){return t.bodyUsed?Promise.reject(new TypeError("Already read")):void(t.bodyUsed=!0)}function s(t){return new Promise(function(e,n){t.onload=function(){e(t.result)},t.onerror=function(){n(t.error)}})}function a(t){var e=new FileReader,n=s(e);return e.readAsArrayBuffer(t),n}function u(t){var e=new FileReader,n=s(e);return e.readAsText(t),n}function c(t){for(var e=new Uint8Array(t),n=new Array(e.length),r=0;r-1?e:t}function d(t,e){e=e||{};var n=e.body;if("string"==typeof t)this.url=t;else{if(t.bodyUsed)throw new TypeError("Already read");this.url=t.url,this.credentials=t.credentials,e.headers||(this.headers=new o(t.headers)),this.method=t.method,this.mode=t.mode,n||null==t._bodyInit||(n=t._bodyInit,t.bodyUsed=!0)}if(this.credentials=e.credentials||this.credentials||"omit",!e.headers&&this.headers||(this.headers=new o(e.headers)),this.method=h(e.method||this.method||"GET"),this.mode=e.mode||this.mode||null,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&n)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(n)}function p(t){var e=new FormData;return t.trim().split("&").forEach(function(t){if(t){var n=t.split("="),r=n.shift().replace(/\+/g," "),o=n.join("=").replace(/\+/g," ");e.append(decodeURIComponent(r),decodeURIComponent(o))}}),e}function v(t){var e=new o;return t.split("\r\n").forEach(function(t){var n=t.split(":"),r=n.shift().trim();if(r){var o=n.join(":").trim();e.append(r,o)}}),e}function y(t,e){e||(e={}),this.type="default",this.status="status"in e?e.status:200,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in e?e.statusText:"OK",this.headers=new o(e.headers),this.url=e.url||"",this._initBody(t)}if(!t.fetch){var m={searchParams:"URLSearchParams"in t,iterable:"Symbol"in t&&"iterator"in Symbol,blob:"FileReader"in t&&"Blob"in t&&function(){try{return new Blob,!0}catch(t){return!1}}(),formData:"FormData"in t,arrayBuffer:"ArrayBuffer"in t};if(m.arrayBuffer)var g=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],b=function(t){return t&&DataView.prototype.isPrototypeOf(t)},_=ArrayBuffer.isView||function(t){return t&&g.indexOf(Object.prototype.toString.call(t))>-1};o.prototype.append=function(t,r){t=e(t),r=n(r);var o=this.map[t];this.map[t]=o?o+","+r:r},o.prototype.delete=function(t){delete this.map[e(t)]},o.prototype.get=function(t){return t=e(t),this.has(t)?this.map[t]:null},o.prototype.has=function(t){return this.map.hasOwnProperty(e(t))},o.prototype.set=function(t,r){this.map[e(t)]=n(r)},o.prototype.forEach=function(t,e){for(var n in this.map)this.map.hasOwnProperty(n)&&t.call(e,this.map[n],n,this)},o.prototype.keys=function(){var t=[];return this.forEach(function(e,n){t.push(n)}),r(t)},o.prototype.values=function(){var t=[];return this.forEach(function(e){t.push(e)}),r(t)},o.prototype.entries=function(){var t=[];return this.forEach(function(e,n){t.push([n,e])}),r(t)},m.iterable&&(o.prototype[Symbol.iterator]=o.prototype.entries);var w=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];d.prototype.clone=function(){return new d(this,{body:this._bodyInit})},f.call(d.prototype),f.call(y.prototype),y.prototype.clone=function(){return new y(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new o(this.headers),url:this.url})},y.error=function(){var t=new y(null,{status:0,statusText:""});return t.type="error",t};var x=[301,302,303,307,308];y.redirect=function(t,e){if(x.indexOf(e)===-1)throw new RangeError("Invalid status code");return new y(null,{status:e,headers:{location:t}})},t.Headers=o,t.Request=d,t.Response=y,t.fetch=function(t,e){return new Promise(function(n,r){var o=new d(t,e),i=new XMLHttpRequest;i.onload=function(){var t={status:i.status,statusText:i.statusText,headers:v(i.getAllResponseHeaders()||"")};t.url="responseURL"in i?i.responseURL:t.headers.get("X-Request-URL");var e="response"in i?i.response:i.responseText;n(new y(e,t))},i.onerror=function(){r(new TypeError("Network request failed"))},i.ontimeout=function(){r(new TypeError("Network request failed"))},i.open(o.method,o.url,!0),"include"===o.credentials&&(i.withCredentials=!0),"responseType"in i&&m.blob&&(i.responseType="blob"),o.headers.forEach(function(t,e){i.setRequestHeader(e,t)}),i.send("undefined"==typeof o._bodyInit?null:o._bodyInit)})},t.fetch.polyfill=!0}}("undefined"!=typeof self?self:void 0)},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var i=function(){function t(t,e){for(var n=0;n=0,a=navigator.userAgent.indexOf("Android")>0&&!s,u=/iP(ad|hone|od)/.test(navigator.userAgent)&&!s,c=u&&/OS 4_\d(_\d)?/.test(navigator.userAgent),l=u&&/OS [6-7]_\d/.test(navigator.userAgent),f=navigator.userAgent.indexOf("BB10")>0;i.prototype.needsClick=function(t){switch(t.nodeName.toLowerCase()){case"button":case"select":case"textarea":if(t.disabled)return!0;break;case"input":if(u&&"file"===t.type||t.disabled)return!0;break;case"label":case"iframe":case"video":return!0}return/\bneedsclick\b/.test(t.className)},i.prototype.needsFocus=function(t){switch(t.nodeName.toLowerCase()){case"textarea":return!0;case"select":return!a;case"input":switch(t.type){case"button":case"checkbox":case"file":case"image":case"radio":case"submit":return!1}return!t.disabled&&!t.readOnly;default:return/\bneedsfocus\b/.test(t.className)}},i.prototype.sendClick=function(t,e){var n,r;document.activeElement&&document.activeElement!==t&&document.activeElement.blur(),r=e.changedTouches[0],n=document.createEvent("MouseEvents"),n.initMouseEvent(this.determineEventType(t),!0,!0,window,1,r.screenX,r.screenY,r.clientX,r.clientY,!1,!1,!1,!1,0,null),n.forwardedTouchEvent=!0,t.dispatchEvent(n)},i.prototype.determineEventType=function(t){return a&&"select"===t.tagName.toLowerCase()?"mousedown":"click"},i.prototype.focus=function(t){var e;u&&t.setSelectionRange&&0!==t.type.indexOf("date")&&"time"!==t.type&&"month"!==t.type?(e=t.value.length,t.setSelectionRange(e,e)):t.focus()},i.prototype.updateScrollParent=function(t){var e,n;if(e=t.fastClickScrollParent,!e||!e.contains(t)){n=t;do{if(n.scrollHeight>n.offsetHeight){e=n,t.fastClickScrollParent=n;break}n=n.parentElement}while(n)}e&&(e.fastClickLastScrollTop=e.scrollTop)},i.prototype.getTargetElementFromEventTarget=function(t){return t.nodeType===Node.TEXT_NODE?t.parentNode:t},i.prototype.onTouchStart=function(t){var e,n,r;if(t.targetTouches.length>1)return!0;if(e=this.getTargetElementFromEventTarget(t.target),n=t.targetTouches[0],u){if(r=window.getSelection(),r.rangeCount&&!r.isCollapsed)return!0;if(!c){if(n.identifier&&n.identifier===this.lastTouchIdentifier)return t.preventDefault(),!1;this.lastTouchIdentifier=n.identifier,this.updateScrollParent(e)}}return this.trackingClick=!0,this.trackingClickStart=t.timeStamp,this.targetElement=e,this.touchStartX=n.pageX,this.touchStartY=n.pageY,t.timeStamp-this.lastClickTimen||Math.abs(e.pageY-this.touchStartY)>n},i.prototype.onTouchMove=function(t){return!this.trackingClick||((this.targetElement!==this.getTargetElementFromEventTarget(t.target)||this.touchHasMoved(t))&&(this.trackingClick=!1,this.targetElement=null),!0)},i.prototype.findControl=function(t){return void 0!==t.control?t.control:t.htmlFor?document.getElementById(t.htmlFor):t.querySelector("button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea")},i.prototype.onTouchEnd=function(t){var e,n,r,o,i,s=this.targetElement;if(!this.trackingClick)return!0;if(t.timeStamp-this.lastClickTimethis.tapTimeout)return!0;if(this.cancelNextClick=!1,this.lastClickTime=t.timeStamp,n=this.trackingClickStart,this.trackingClick=!1,this.trackingClickStart=0,l&&(i=t.changedTouches[0],s=document.elementFromPoint(i.pageX-window.pageXOffset,i.pageY-window.pageYOffset)||s,s.fastClickScrollParent=this.targetElement.fastClickScrollParent),r=s.tagName.toLowerCase(),"label"===r){if(e=this.findControl(s)){if(this.focus(s),a)return!1;s=e}}else if(this.needsFocus(s))return t.timeStamp-n>100||u&&window.top!==window&&"input"===r?(this.targetElement=null,!1):(this.focus(s),this.sendClick(s,t),u&&"select"===r||(this.targetElement=null,t.preventDefault()),!1);return!(!u||c||(o=s.fastClickScrollParent,!o||o.fastClickLastScrollTop===o.scrollTop))||(this.needsClick(s)||(t.preventDefault(),this.sendClick(s,t)),!1)},i.prototype.onTouchCancel=function(){this.trackingClick=!1,this.targetElement=null},i.prototype.onMouse=function(t){return!this.targetElement||(!!t.forwardedTouchEvent||(!t.cancelable||(!(!this.needsClick(this.targetElement)||this.cancelNextClick)||(t.stopImmediatePropagation?t.stopImmediatePropagation():t.propagationStopped=!0,t.stopPropagation(),t.preventDefault(),!1))))},i.prototype.onClick=function(t){var e;return this.trackingClick?(this.targetElement=null,this.trackingClick=!1,!0):"submit"===t.target.type&&0===t.detail||(e=this.onMouse(t),e||(this.targetElement=null),e)},i.prototype.destroy=function(){var t=this.layer;a&&(t.removeEventListener("mouseover",this.onMouse,!0),t.removeEventListener("mousedown",this.onMouse,!0),t.removeEventListener("mouseup",this.onMouse,!0)),t.removeEventListener("click",this.onClick,!0),t.removeEventListener("touchstart",this.onTouchStart,!1),t.removeEventListener("touchmove",this.onTouchMove,!1),t.removeEventListener("touchend",this.onTouchEnd,!1),t.removeEventListener("touchcancel",this.onTouchCancel,!1)},i.notNeeded=function(t){var e,n,r,o;if("undefined"==typeof window.ontouchstart)return!0;if(n=+(/Chrome\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1]){if(!a)return!0;if(e=document.querySelector("meta[name=viewport]")){if(e.content.indexOf("user-scalable=no")!==-1)return!0;if(n>31&&document.documentElement.scrollWidth<=window.outerWidth)return!0}}if(f&&(r=navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/),r[1]>=10&&r[2]>=3&&(e=document.querySelector("meta[name=viewport]")))){if(e.content.indexOf("user-scalable=no")!==-1)return!0;if(document.documentElement.scrollWidth<=window.outerWidth)return!0}return"none"===t.style.msTouchAction||"manipulation"===t.style.touchAction||(o=+(/Firefox\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1],!!(o>=27&&(e=document.querySelector("meta[name=viewport]"),e&&(e.content.indexOf("user-scalable=no")!==-1||document.documentElement.scrollWidth<=window.outerWidth)))||("none"===t.style.touchAction||"manipulation"===t.style.touchAction))},i.attach=function(t,e){return new i(t,e)},"object"===o(n(69))&&n(69)?(r=function(){return i}.call(e,n,e,t),!(void 0!==r&&(t.exports=r))):"undefined"!=typeof t&&t.exports?(t.exports=i.attach,t.exports.FastClick=i):window.FastClick=i}()},function(t,e){(function(e){t.exports=e}).call(e,{})},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var o=n(71),i=r(o),s=n(74),a=r(s),u=n(78),c=r(u),l=n(83),f=r(l),h=n(86),d=r(h);e.default={Event:i.default,Nav:a.default,Search:c.default,Sidebar:f.default,Source:d.default},t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var o=n(72),i=r(o),s=n(73),a=r(s);e.default={Listener:i.default,MatchMedia:a.default},t.exports=e.default},function(t,e){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var n=0;n0&&(this.els_[n-1].dataset.mdState="blur"),this.index_=n;else for(var r=this.index_;r>=0;r--){if(!(this.anchors_[r].offsetTop-80>t)){this.index_=r;break}r>0&&(this.els_[r-1].dataset.mdState="")}this.offset_=t,this.dir_=e}}},{key:"reset",value:function(){Array.prototype.forEach.call(this.els_,function(t){t.dataset.mdState=""}),this.index_=0,this.offset_=window.pageYOffset}}]),t}();e.default=o,t.exports=e.default},function(t,e){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var n=0;nn){for(;" "!==t[n]&&--n>0;);return t.substring(0,n)+"..."}return t}}return a(t,[{key:"update",value:function(t){var e=this;if("focus"!==t.type||this.index_){if("keyup"===t.type){for(;this.list_.firstChild;)this.list_.removeChild(this.list_.firstChild);var n=this.index_.search(t.target.value);n.forEach(function(t){var n=e.data_[t.ref],o=n.location.split("#"),i=s(o,1),a=i[0];a=a.replace(/^(\/?\.{2})+/g,""),e.list_.appendChild(r.createElement("li",{class:"md-search-result__item"},r.createElement("a",{href:n.location,title:n.title,class:"md-search-result__link","data-md-rel":a===document.location.pathname?"anchor":""},r.createElement("article",{class:"md-search-result__article"},r.createElement("h1",{class:"md-search-result__title"},n.title),r.createElement("p",{class:"md-search-result__teaser"},e.truncate_(n.text,140))))))});var o=this.list_.querySelectorAll("[data-md-rel=anchor]");Array.prototype.forEach.call(o,function(t){t.addEventListener("click",function(e){var n=document.querySelector("[data-md-toggle=search]");n.checked&&(n.checked=!1,n.dispatchEvent(new CustomEvent("change"))),e.preventDefault(),setTimeout(function(){document.location.href=t.href},100)})}),this.meta_.textContent=n.length+" search result"+(1!==n.length?"s":"")}}else!function(){var t=function(t){e.index_=(0,c.default)(function(){this.field("title",{boost:10}),this.field("text"),this.ref("location")}),e.data_=t.reduce(function(t,n){return e.index_.add(n),t[n.location]=n,t},{})};setTimeout(function(){return"function"==typeof e.data_?e.data_().then(t):t(e.data_)},250)}()}}]),t}();e.default=l,t.exports=e.default}).call(e,n(81))},function(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default={createElement:function(t,e){var n=document.createElement(t);e&&Array.prototype.forEach.call(Object.keys(e),function(t){n.setAttribute(t,e[t])});for(var r=function t(e){Array.prototype.forEach.call(e,function(e){"string"==typeof e||"number"==typeof e?n.textContent+=e:Array.isArray(e)?t(e):n.appendChild(e)})},o=arguments.length,i=Array(o>2?o-2:0),s=2;sn.idx?n=n.next:(r+=e.val*n.val,e=e.next,n=n.next);return r},i.Vector.prototype.similarity=function(t){return this.dot(t)/(this.magnitude()*t.magnitude())},/*!
+ * lunr.SortedSet
+ * Copyright (C) 2016 Oliver Nightingale
+ */
+i.SortedSet=function(){this.length=0,this.elements=[]},i.SortedSet.load=function(t){var e=new this;return e.elements=t,e.length=t.length,e},i.SortedSet.prototype.add=function(){var t,e;for(t=0;t1;){if(i===t)return o;it&&(n=o),r=n-e,o=e+Math.floor(r/2),i=this.elements[o]}return i===t?o:-1},i.SortedSet.prototype.locationFor=function(t){for(var e=0,n=this.elements.length,r=n-e,o=e+Math.floor(r/2),i=this.elements[o];r>1;)it&&(n=o),r=n-e,o=e+Math.floor(r/2),i=this.elements[o];return i>t?o:io-1||r>s-1)break;a[n]!==u[r]?a[n]u[r]&&r++:(e.add(a[n]),n++,r++)}return e},i.SortedSet.prototype.clone=function(){var t=new i.SortedSet;return t.elements=this.toArray(),t.length=t.elements.length,t},i.SortedSet.prototype.union=function(t){var e,n,r;this.length>=t.length?(e=this,n=t):(e=t,n=this),r=e.clone();for(var o=0,i=n.toArray();o0&&(r=1+Math.log(this.documentStore.length/n)),this._idfCache[e]=r},i.Index.prototype.search=function(t){var e=this.pipeline.run(this.tokenizerFn(t)),n=new i.Vector,r=[],o=this._fields.reduce(function(t,e){return t+e.boost},0),s=e.some(function(t){return this.tokenStore.has(t)},this);if(!s)return[];e.forEach(function(t,e,s){var a=1/s.length*this._fields.length*o,u=this,c=this.tokenStore.expand(t).reduce(function(e,r){var o=u.corpusTokens.indexOf(r),s=u.idf(r),c=1,l=new i.SortedSet;if(r!==t){var f=Math.max(3,r.length-t.length);c=1/Math.log(f)}o>-1&&n.insert(o,a*s*c);for(var h=u.tokenStore.get(r),d=Object.keys(h),p=d.length,v=0;v
=this.offset_?"lock"!==this.el_.dataset.mdState&&(this.el_.dataset.mdState="lock"):"lock"===this.el_.dataset.mdState&&(this.el_.dataset.mdState="")}},{key:"reset",value:function(){this.el_.dataset.mdState="",this.el_.style.height="",this.height_=0}}]),t}();e.default=o,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var o=n(87),i=r(o),s=n(91),a=r(s);e.default={Adapter:i.default,Repository:a.default},t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var o=n(88),i=r(o);e.default={GitHub:i.default},t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){for(var n=0;n1e4?(t/1e3).toFixed(0)+"k":t>1e3?(t/1e3).toFixed(1)+"k":t}},{key:"hash_",value:function(t){var e=0;if(0===t.length)return e;for(var n=0,r=t.length;n1){if(i=t({path:"/"},r.defaults,i),"number"==typeof i.expires){var a=new Date;a.setMilliseconds(a.getMilliseconds()+864e5*i.expires),i.expires=a}try{s=JSON.stringify(o),/^[\{\[]/.test(s)&&(o=s)}catch(t){}return o=n.write?n.write(o,e):encodeURIComponent(String(o)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),e=encodeURIComponent(String(e)),e=e.replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent),e=e.replace(/[\(\)]/g,escape),document.cookie=[e,"=",o,i.expires?"; expires="+i.expires.toUTCString():"",i.path?"; path="+i.path:"",i.domain?"; domain="+i.domain:"",i.secure?"; secure":""].join("")}e||(s={});for(var u=document.cookie?document.cookie.split("; "):[],c=/(%[0-9A-Z]{2})+/g,l=0;l=9,r=t<533&&e.match(/android/gi);return n||r||s}();E?_.addTest("fontface",!1):z('@font-face {font-family:"font";src:url("https://")}',function(e,n){var s=t.getElementById("smodernizr"),r=s.sheet||s.styleSheet,o=r?r.cssRules&&r.cssRules[0]?r.cssRules[0].cssText:r.cssText||"":"",i=/src/i.test(o)&&0===o.indexOf(n.split(" ")[0]);_.addTest("fontface",i)});var j="Moz O ms Webkit",k=x._config.usePrefixes?j.split(" "):[];x._cssomPrefixes=k;var N={elem:a("modernizr")};_._q.push(function(){delete N.elem});var A={style:N.elem.style};_._q.unshift(function(){delete A.style});var R=x._config.usePrefixes?j.toLowerCase().split(" "):[];x._domPrefixes=R,x.testAllProps=v,x.testAllProps=y;var q="CSS"in e&&"supports"in e.CSS,L="supportsCSS"in e;_.addTest("supports",q||L),_.addTest("csstransforms3d",function(){var e=!!y("perspective","1px",!0),t=_._config.usePrefixes;if(e&&(!t||"webkitPerspective"in b.style)){var n,s="#modernizr{width:0;height:0}";_.supports?n="@supports (perspective: 1px)":(n="@media (transform-3d)",t&&(n+=",(-webkit-transform-3d)")),n+="{#modernizr{width:7px;height:18px;margin:0;padding:0;border:0}}",z(s+n,function(t){e=7===t.offsetWidth&&18===t.offsetHeight})}return e}),r(),o(S),delete x.addTest,delete x.addAsyncTest;for(var O=0;O<_._q.length;O++)_._q[O]();e.Modernizr=_}(window,document);
\ No newline at end of file
diff --git a/assets/stylesheets/application-02ce7adcc2.palette.css b/assets/stylesheets/application-02ce7adcc2.palette.css
new file mode 100755
index 0000000..2195a9f
--- /dev/null
+++ b/assets/stylesheets/application-02ce7adcc2.palette.css
@@ -0,0 +1 @@
+button[data-md-color-accent],button[data-md-color-primary]{width:13rem;margin-bottom:.4rem;padding:2.4rem .8rem .4rem;-webkit-transition:background-color .25s,opacity .25s;transition:background-color .25s,opacity .25s;border-radius:.2rem;color:#fff;font-size:1.28rem;text-align:left;cursor:pointer}button[data-md-color-accent]:hover,button[data-md-color-primary]:hover{opacity:.75}button[data-md-color-primary=red]{background-color:#ef5350}[data-md-color-primary=red] .md-typeset a{color:#ef5350}[data-md-color-primary=red] .md-header{background-color:#ef5350}[data-md-color-primary=red] .md-nav__link--active,[data-md-color-primary=red] .md-nav__link:active{color:#ef5350}button[data-md-color-primary=pink]{background-color:#e91e63}[data-md-color-primary=pink] .md-typeset a{color:#e91e63}[data-md-color-primary=pink] .md-header{background-color:#e91e63}[data-md-color-primary=pink] .md-nav__link--active,[data-md-color-primary=pink] .md-nav__link:active{color:#e91e63}button[data-md-color-primary=purple]{background-color:#ab47bc}[data-md-color-primary=purple] .md-typeset a{color:#ab47bc}[data-md-color-primary=purple] .md-header{background-color:#ab47bc}[data-md-color-primary=purple] .md-nav__link--active,[data-md-color-primary=purple] .md-nav__link:active{color:#ab47bc}button[data-md-color-primary=deep-purple]{background-color:#7e57c2}[data-md-color-primary=deep-purple] .md-typeset a{color:#7e57c2}[data-md-color-primary=deep-purple] .md-header{background-color:#7e57c2}[data-md-color-primary=deep-purple] .md-nav__link--active,[data-md-color-primary=deep-purple] .md-nav__link:active{color:#7e57c2}button[data-md-color-primary=indigo]{background-color:#3f51b5}[data-md-color-primary=indigo] .md-typeset a{color:#3f51b5}[data-md-color-primary=indigo] .md-header{background-color:#3f51b5}[data-md-color-primary=indigo] .md-nav__link--active,[data-md-color-primary=indigo] .md-nav__link:active{color:#3f51b5}button[data-md-color-primary=blue]{background-color:#2196f3}[data-md-color-primary=blue] .md-typeset a{color:#2196f3}[data-md-color-primary=blue] .md-header{background-color:#2196f3}[data-md-color-primary=blue] .md-nav__link--active,[data-md-color-primary=blue] .md-nav__link:active{color:#2196f3}button[data-md-color-primary=light-blue]{background-color:#03a9f4}[data-md-color-primary=light-blue] .md-typeset a{color:#03a9f4}[data-md-color-primary=light-blue] .md-header{background-color:#03a9f4}[data-md-color-primary=light-blue] .md-nav__link--active,[data-md-color-primary=light-blue] .md-nav__link:active{color:#03a9f4}button[data-md-color-primary=cyan]{background-color:#00bcd4}[data-md-color-primary=cyan] .md-typeset a{color:#00bcd4}[data-md-color-primary=cyan] .md-header{background-color:#00bcd4}[data-md-color-primary=cyan] .md-nav__link--active,[data-md-color-primary=cyan] .md-nav__link:active{color:#00bcd4}button[data-md-color-primary=teal]{background-color:#009688}[data-md-color-primary=teal] .md-typeset a{color:#009688}[data-md-color-primary=teal] .md-header{background-color:#009688}[data-md-color-primary=teal] .md-nav__link--active,[data-md-color-primary=teal] .md-nav__link:active{color:#009688}button[data-md-color-primary=green]{background-color:#4caf50}[data-md-color-primary=green] .md-typeset a{color:#4caf50}[data-md-color-primary=green] .md-header{background-color:#4caf50}[data-md-color-primary=green] .md-nav__link--active,[data-md-color-primary=green] .md-nav__link:active{color:#4caf50}button[data-md-color-primary=light-green]{background-color:#7cb342}[data-md-color-primary=light-green] .md-typeset a{color:#7cb342}[data-md-color-primary=light-green] .md-header{background-color:#7cb342}[data-md-color-primary=light-green] .md-nav__link--active,[data-md-color-primary=light-green] .md-nav__link:active{color:#7cb342}button[data-md-color-primary=lime]{background-color:#c0ca33}[data-md-color-primary=lime] .md-typeset a{color:#c0ca33}[data-md-color-primary=lime] .md-header{background-color:#c0ca33}[data-md-color-primary=lime] .md-nav__link--active,[data-md-color-primary=lime] .md-nav__link:active{color:#c0ca33}button[data-md-color-primary=yellow]{background-color:#f9a825}[data-md-color-primary=yellow] .md-typeset a{color:#f9a825}[data-md-color-primary=yellow] .md-header{background-color:#f9a825}[data-md-color-primary=yellow] .md-nav__link--active,[data-md-color-primary=yellow] .md-nav__link:active{color:#f9a825}button[data-md-color-primary=amber]{background-color:#ffb300}[data-md-color-primary=amber] .md-typeset a{color:#ffb300}[data-md-color-primary=amber] .md-header{background-color:#ffb300}[data-md-color-primary=amber] .md-nav__link--active,[data-md-color-primary=amber] .md-nav__link:active{color:#ffb300}button[data-md-color-primary=orange]{background-color:#fb8c00}[data-md-color-primary=orange] .md-typeset a{color:#fb8c00}[data-md-color-primary=orange] .md-header{background-color:#fb8c00}[data-md-color-primary=orange] .md-nav__link--active,[data-md-color-primary=orange] .md-nav__link:active{color:#fb8c00}button[data-md-color-primary=deep-orange]{background-color:#ff7043}[data-md-color-primary=deep-orange] .md-typeset a{color:#ff7043}[data-md-color-primary=deep-orange] .md-header{background-color:#ff7043}[data-md-color-primary=deep-orange] .md-nav__link--active,[data-md-color-primary=deep-orange] .md-nav__link:active{color:#ff7043}button[data-md-color-primary=brown]{background-color:#795548}[data-md-color-primary=brown] .md-typeset a{color:#795548}[data-md-color-primary=brown] .md-header{background-color:#795548}[data-md-color-primary=brown] .md-nav__link--active,[data-md-color-primary=brown] .md-nav__link:active{color:#795548}button[data-md-color-primary=grey]{background-color:#757575}[data-md-color-primary=grey] .md-typeset a{color:#757575}[data-md-color-primary=grey] .md-header{background-color:#757575}[data-md-color-primary=grey] .md-nav__link--active,[data-md-color-primary=grey] .md-nav__link:active{color:#757575}button[data-md-color-primary=blue-grey]{background-color:#546e7a}[data-md-color-primary=blue-grey] .md-typeset a{color:#546e7a}[data-md-color-primary=blue-grey] .md-header{background-color:#546e7a}[data-md-color-primary=blue-grey] .md-nav__link--active,[data-md-color-primary=blue-grey] .md-nav__link:active{color:#546e7a}button[data-md-color-accent=red]{background-color:#ff1744}[data-md-color-accent=red] .md-typeset a:active,[data-md-color-accent=red] .md-typeset a:hover{color:#ff1744}[data-md-color-accent=red] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=red] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#ff1744}[data-md-color-accent=red] .md-nav__link:hover,[data-md-color-accent=red] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=red] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=red] .md-typeset [id] .headerlink:focus,[data-md-color-accent=red] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=red] .md-typeset [id]:target .headerlink{color:#ff1744}[data-md-color-accent=red] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff1744}[data-md-color-accent=red] .md-search-result__link:hover{background-color:rgba(255,23,68,.1)}[data-md-color-accent=red] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff1744}button[data-md-color-accent=pink]{background-color:#f50057}[data-md-color-accent=pink] .md-typeset a:active,[data-md-color-accent=pink] .md-typeset a:hover{color:#f50057}[data-md-color-accent=pink] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=pink] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#f50057}[data-md-color-accent=pink] .md-nav__link:hover,[data-md-color-accent=pink] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=pink] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=pink] .md-typeset [id] .headerlink:focus,[data-md-color-accent=pink] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=pink] .md-typeset [id]:target .headerlink{color:#f50057}[data-md-color-accent=pink] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#f50057}[data-md-color-accent=pink] .md-search-result__link:hover{background-color:rgba(245,0,87,.1)}[data-md-color-accent=pink] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#f50057}button[data-md-color-accent=purple]{background-color:#e040fb}[data-md-color-accent=purple] .md-typeset a:active,[data-md-color-accent=purple] .md-typeset a:hover{color:#e040fb}[data-md-color-accent=purple] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=purple] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#e040fb}[data-md-color-accent=purple] .md-nav__link:hover,[data-md-color-accent=purple] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=purple] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=purple] .md-typeset [id] .headerlink:focus,[data-md-color-accent=purple] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=purple] .md-typeset [id]:target .headerlink{color:#e040fb}[data-md-color-accent=purple] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#e040fb}[data-md-color-accent=purple] .md-search-result__link:hover{background-color:rgba(224,64,251,.1)}[data-md-color-accent=purple] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#e040fb}button[data-md-color-accent=deep-purple]{background-color:#7c4dff}[data-md-color-accent=deep-purple] .md-typeset a:active,[data-md-color-accent=deep-purple] .md-typeset a:hover{color:#7c4dff}[data-md-color-accent=deep-purple] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=deep-purple] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#7c4dff}[data-md-color-accent=deep-purple] .md-nav__link:hover,[data-md-color-accent=deep-purple] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=deep-purple] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=deep-purple] .md-typeset [id] .headerlink:focus,[data-md-color-accent=deep-purple] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=deep-purple] .md-typeset [id]:target .headerlink{color:#7c4dff}[data-md-color-accent=deep-purple] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#7c4dff}[data-md-color-accent=deep-purple] .md-search-result__link:hover{background-color:rgba(124,77,255,.1)}[data-md-color-accent=deep-purple] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#7c4dff}button[data-md-color-accent=indigo]{background-color:#536dfe}[data-md-color-accent=indigo] .md-typeset a:active,[data-md-color-accent=indigo] .md-typeset a:hover{color:#536dfe}[data-md-color-accent=indigo] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=indigo] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#536dfe}[data-md-color-accent=indigo] .md-nav__link:hover,[data-md-color-accent=indigo] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=indigo] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=indigo] .md-typeset [id] .headerlink:focus,[data-md-color-accent=indigo] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=indigo] .md-typeset [id]:target .headerlink{color:#536dfe}[data-md-color-accent=indigo] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}[data-md-color-accent=indigo] .md-search-result__link:hover{background-color:rgba(83,109,254,.1)}[data-md-color-accent=indigo] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}button[data-md-color-accent=blue]{background-color:#448aff}[data-md-color-accent=blue] .md-typeset a:active,[data-md-color-accent=blue] .md-typeset a:hover{color:#448aff}[data-md-color-accent=blue] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=blue] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#448aff}[data-md-color-accent=blue] .md-nav__link:hover,[data-md-color-accent=blue] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=blue] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=blue] .md-typeset [id] .headerlink:focus,[data-md-color-accent=blue] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=blue] .md-typeset [id]:target .headerlink{color:#448aff}[data-md-color-accent=blue] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#448aff}[data-md-color-accent=blue] .md-search-result__link:hover{background-color:rgba(68,138,255,.1)}[data-md-color-accent=blue] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#448aff}button[data-md-color-accent=light-blue]{background-color:#0091ea}[data-md-color-accent=light-blue] .md-typeset a:active,[data-md-color-accent=light-blue] .md-typeset a:hover{color:#0091ea}[data-md-color-accent=light-blue] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=light-blue] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#0091ea}[data-md-color-accent=light-blue] .md-nav__link:hover,[data-md-color-accent=light-blue] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=light-blue] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=light-blue] .md-typeset [id] .headerlink:focus,[data-md-color-accent=light-blue] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=light-blue] .md-typeset [id]:target .headerlink{color:#0091ea}[data-md-color-accent=light-blue] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#0091ea}[data-md-color-accent=light-blue] .md-search-result__link:hover{background-color:rgba(0,145,234,.1)}[data-md-color-accent=light-blue] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#0091ea}button[data-md-color-accent=cyan]{background-color:#00b8d4}[data-md-color-accent=cyan] .md-typeset a:active,[data-md-color-accent=cyan] .md-typeset a:hover{color:#00b8d4}[data-md-color-accent=cyan] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=cyan] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#00b8d4}[data-md-color-accent=cyan] .md-nav__link:hover,[data-md-color-accent=cyan] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=cyan] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=cyan] .md-typeset [id] .headerlink:focus,[data-md-color-accent=cyan] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=cyan] .md-typeset [id]:target .headerlink{color:#00b8d4}[data-md-color-accent=cyan] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00b8d4}[data-md-color-accent=cyan] .md-search-result__link:hover{background-color:rgba(0,184,212,.1)}[data-md-color-accent=cyan] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00b8d4}button[data-md-color-accent=teal]{background-color:#00bfa5}[data-md-color-accent=teal] .md-typeset a:active,[data-md-color-accent=teal] .md-typeset a:hover{color:#00bfa5}[data-md-color-accent=teal] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=teal] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#00bfa5}[data-md-color-accent=teal] .md-nav__link:hover,[data-md-color-accent=teal] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=teal] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=teal] .md-typeset [id] .headerlink:focus,[data-md-color-accent=teal] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=teal] .md-typeset [id]:target .headerlink{color:#00bfa5}[data-md-color-accent=teal] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00bfa5}[data-md-color-accent=teal] .md-search-result__link:hover{background-color:rgba(0,191,165,.1)}[data-md-color-accent=teal] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00bfa5}button[data-md-color-accent=green]{background-color:#00c853}[data-md-color-accent=green] .md-typeset a:active,[data-md-color-accent=green] .md-typeset a:hover{color:#00c853}[data-md-color-accent=green] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=green] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#00c853}[data-md-color-accent=green] .md-nav__link:hover,[data-md-color-accent=green] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=green] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=green] .md-typeset [id] .headerlink:focus,[data-md-color-accent=green] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=green] .md-typeset [id]:target .headerlink{color:#00c853}[data-md-color-accent=green] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00c853}[data-md-color-accent=green] .md-search-result__link:hover{background-color:rgba(0,200,83,.1)}[data-md-color-accent=green] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00c853}button[data-md-color-accent=light-green]{background-color:#64dd17}[data-md-color-accent=light-green] .md-typeset a:active,[data-md-color-accent=light-green] .md-typeset a:hover{color:#64dd17}[data-md-color-accent=light-green] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=light-green] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#64dd17}[data-md-color-accent=light-green] .md-nav__link:hover,[data-md-color-accent=light-green] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=light-green] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=light-green] .md-typeset [id] .headerlink:focus,[data-md-color-accent=light-green] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=light-green] .md-typeset [id]:target .headerlink{color:#64dd17}[data-md-color-accent=light-green] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#64dd17}[data-md-color-accent=light-green] .md-search-result__link:hover{background-color:rgba(100,221,23,.1)}[data-md-color-accent=light-green] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#64dd17}button[data-md-color-accent=lime]{background-color:#aeea00}[data-md-color-accent=lime] .md-typeset a:active,[data-md-color-accent=lime] .md-typeset a:hover{color:#aeea00}[data-md-color-accent=lime] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=lime] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#aeea00}[data-md-color-accent=lime] .md-nav__link:hover,[data-md-color-accent=lime] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=lime] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=lime] .md-typeset [id] .headerlink:focus,[data-md-color-accent=lime] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=lime] .md-typeset [id]:target .headerlink{color:#aeea00}[data-md-color-accent=lime] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#aeea00}[data-md-color-accent=lime] .md-search-result__link:hover{background-color:rgba(174,234,0,.1)}[data-md-color-accent=lime] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#aeea00}button[data-md-color-accent=yellow]{background-color:#ffd600}[data-md-color-accent=yellow] .md-typeset a:active,[data-md-color-accent=yellow] .md-typeset a:hover{color:#ffd600}[data-md-color-accent=yellow] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=yellow] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#ffd600}[data-md-color-accent=yellow] .md-nav__link:hover,[data-md-color-accent=yellow] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=yellow] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=yellow] .md-typeset [id] .headerlink:focus,[data-md-color-accent=yellow] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=yellow] .md-typeset [id]:target .headerlink{color:#ffd600}[data-md-color-accent=yellow] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ffd600}[data-md-color-accent=yellow] .md-search-result__link:hover{background-color:rgba(255,214,0,.1)}[data-md-color-accent=yellow] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ffd600}button[data-md-color-accent=amber]{background-color:#ffab00}[data-md-color-accent=amber] .md-typeset a:active,[data-md-color-accent=amber] .md-typeset a:hover{color:#ffab00}[data-md-color-accent=amber] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=amber] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#ffab00}[data-md-color-accent=amber] .md-nav__link:hover,[data-md-color-accent=amber] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=amber] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=amber] .md-typeset [id] .headerlink:focus,[data-md-color-accent=amber] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=amber] .md-typeset [id]:target .headerlink{color:#ffab00}[data-md-color-accent=amber] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ffab00}[data-md-color-accent=amber] .md-search-result__link:hover{background-color:rgba(255,171,0,.1)}[data-md-color-accent=amber] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ffab00}button[data-md-color-accent=orange]{background-color:#ff9100}[data-md-color-accent=orange] .md-typeset a:active,[data-md-color-accent=orange] .md-typeset a:hover{color:#ff9100}[data-md-color-accent=orange] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=orange] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#ff9100}[data-md-color-accent=orange] .md-nav__link:hover,[data-md-color-accent=orange] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=orange] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=orange] .md-typeset [id] .headerlink:focus,[data-md-color-accent=orange] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=orange] .md-typeset [id]:target .headerlink{color:#ff9100}[data-md-color-accent=orange] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff9100}[data-md-color-accent=orange] .md-search-result__link:hover{background-color:rgba(255,145,0,.1)}[data-md-color-accent=orange] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff9100}button[data-md-color-accent=deep-orange]{background-color:#ff6e40}[data-md-color-accent=deep-orange] .md-typeset a:active,[data-md-color-accent=deep-orange] .md-typeset a:hover{color:#ff6e40}[data-md-color-accent=deep-orange] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=deep-orange] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#ff6e40}[data-md-color-accent=deep-orange] .md-nav__link:hover,[data-md-color-accent=deep-orange] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=deep-orange] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=deep-orange] .md-typeset [id] .headerlink:focus,[data-md-color-accent=deep-orange] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=deep-orange] .md-typeset [id]:target .headerlink{color:#ff6e40}[data-md-color-accent=deep-orange] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff6e40}[data-md-color-accent=deep-orange] .md-search-result__link:hover{background-color:rgba(255,110,64,.1)}[data-md-color-accent=deep-orange] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff6e40}@media only screen and (max-width:59.9375em){[data-md-color-primary=red] .md-nav__source{background-color:rgba(190,66,64,.9675)}[data-md-color-primary=pink] .md-nav__source{background-color:rgba(185,24,79,.9675)}[data-md-color-primary=purple] .md-nav__source{background-color:rgba(136,57,150,.9675)}[data-md-color-primary=deep-purple] .md-nav__source{background-color:rgba(100,69,154,.9675)}[data-md-color-primary=indigo] .md-nav__source{background-color:rgba(50,64,144,.9675)}[data-md-color-primary=blue] .md-nav__source{background-color:rgba(26,119,193,.9675)}[data-md-color-primary=light-blue] .md-nav__source{background-color:rgba(2,134,194,.9675)}[data-md-color-primary=cyan] .md-nav__source{background-color:rgba(0,150,169,.9675)}[data-md-color-primary=teal] .md-nav__source{background-color:rgba(0,119,108,.9675)}[data-md-color-primary=green] .md-nav__source{background-color:rgba(60,139,64,.9675)}[data-md-color-primary=light-green] .md-nav__source{background-color:rgba(99,142,53,.9675)}[data-md-color-primary=lime] .md-nav__source{background-color:rgba(153,161,41,.9675)}[data-md-color-primary=yellow] .md-nav__source{background-color:rgba(198,134,29,.9675)}[data-md-color-primary=amber] .md-nav__source{background-color:rgba(203,142,0,.9675)}[data-md-color-primary=orange] .md-nav__source{background-color:rgba(200,111,0,.9675)}[data-md-color-primary=deep-orange] .md-nav__source{background-color:rgba(203,89,53,.9675)}[data-md-color-primary=brown] .md-nav__source{background-color:rgba(96,68,57,.9675)}[data-md-color-primary=grey] .md-nav__source{background-color:rgba(93,93,93,.9675)}[data-md-color-primary=blue-grey] .md-nav__source{background-color:rgba(67,88,97,.9675)}}@media only screen and (max-width:76.1875em){html [data-md-color-primary=red] .md-nav--primary .md-nav__title--site{background-color:#ef5350}html [data-md-color-primary=pink] .md-nav--primary .md-nav__title--site{background-color:#e91e63}html [data-md-color-primary=purple] .md-nav--primary .md-nav__title--site{background-color:#ab47bc}html [data-md-color-primary=deep-purple] .md-nav--primary .md-nav__title--site{background-color:#7e57c2}html [data-md-color-primary=indigo] .md-nav--primary .md-nav__title--site{background-color:#3f51b5}html [data-md-color-primary=blue] .md-nav--primary .md-nav__title--site{background-color:#2196f3}html [data-md-color-primary=light-blue] .md-nav--primary .md-nav__title--site{background-color:#03a9f4}html [data-md-color-primary=cyan] .md-nav--primary .md-nav__title--site{background-color:#00bcd4}html [data-md-color-primary=teal] .md-nav--primary .md-nav__title--site{background-color:#009688}html [data-md-color-primary=green] .md-nav--primary .md-nav__title--site{background-color:#4caf50}html [data-md-color-primary=light-green] .md-nav--primary .md-nav__title--site{background-color:#7cb342}html [data-md-color-primary=lime] .md-nav--primary .md-nav__title--site{background-color:#c0ca33}html [data-md-color-primary=yellow] .md-nav--primary .md-nav__title--site{background-color:#f9a825}html [data-md-color-primary=amber] .md-nav--primary .md-nav__title--site{background-color:#ffb300}html [data-md-color-primary=orange] .md-nav--primary .md-nav__title--site{background-color:#fb8c00}html [data-md-color-primary=deep-orange] .md-nav--primary .md-nav__title--site{background-color:#ff7043}html [data-md-color-primary=brown] .md-nav--primary .md-nav__title--site{background-color:#795548}html [data-md-color-primary=grey] .md-nav--primary .md-nav__title--site{background-color:#757575}html [data-md-color-primary=blue-grey] .md-nav--primary .md-nav__title--site{background-color:#546e7a}}@media only screen and (min-width:60em){[data-md-color-primary=red] .md-nav--secondary{border-left:.4rem solid #ef5350}[data-md-color-primary=pink] .md-nav--secondary{border-left:.4rem solid #e91e63}[data-md-color-primary=purple] .md-nav--secondary{border-left:.4rem solid #ab47bc}[data-md-color-primary=deep-purple] .md-nav--secondary{border-left:.4rem solid #7e57c2}[data-md-color-primary=indigo] .md-nav--secondary{border-left:.4rem solid #3f51b5}[data-md-color-primary=blue] .md-nav--secondary{border-left:.4rem solid #2196f3}[data-md-color-primary=light-blue] .md-nav--secondary{border-left:.4rem solid #03a9f4}[data-md-color-primary=cyan] .md-nav--secondary{border-left:.4rem solid #00bcd4}[data-md-color-primary=teal] .md-nav--secondary{border-left:.4rem solid #009688}[data-md-color-primary=green] .md-nav--secondary{border-left:.4rem solid #4caf50}[data-md-color-primary=light-green] .md-nav--secondary{border-left:.4rem solid #7cb342}[data-md-color-primary=lime] .md-nav--secondary{border-left:.4rem solid #c0ca33}[data-md-color-primary=yellow] .md-nav--secondary{border-left:.4rem solid #f9a825}[data-md-color-primary=amber] .md-nav--secondary{border-left:.4rem solid #ffb300}[data-md-color-primary=orange] .md-nav--secondary{border-left:.4rem solid #fb8c00}[data-md-color-primary=deep-orange] .md-nav--secondary{border-left:.4rem solid #ff7043}[data-md-color-primary=brown] .md-nav--secondary{border-left:.4rem solid #795548}[data-md-color-primary=grey] .md-nav--secondary{border-left:.4rem solid #757575}[data-md-color-primary=blue-grey] .md-nav--secondary{border-left:.4rem solid #546e7a}}
\ No newline at end of file
diff --git a/assets/stylesheets/application-f3ab63f78a.css b/assets/stylesheets/application-f3ab63f78a.css
new file mode 100755
index 0000000..6f3ab67
--- /dev/null
+++ b/assets/stylesheets/application-f3ab63f78a.css
@@ -0,0 +1 @@
+html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}html{-webkit-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none}body{margin:0}hr{overflow:visible;box-sizing:content-box}a{-webkit-text-decoration-skip:objects}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}a:active,a:hover{outline-width:0}small,sub,sup{font-size:80%}sub,sup{position:relative;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}table{border-collapse:collapse;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{padding:0;background:transparent;font-size:inherit}button,input{border:0;outline:0}.admonition:before,.md-icon,.md-nav__button,.md-nav__link:after,.md-nav__title:before,.md-typeset .critic.comment:before,.md-typeset .footnote-backref,.md-typeset .task-list-control .task-list-indicator:before{font-family:Material Icons;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none;white-space:nowrap;speak:none;word-wrap:normal;direction:ltr}.md-content__edit,.md-footer-nav__button,.md-header-nav__button,.md-nav__button,.md-nav__title:before{display:inline-block;margin:.4rem;padding:.8rem;font-size:2.4rem;cursor:pointer}.md-icon--arrow-back:before{content:"arrow_back"}.md-icon--arrow-forward:before{content:"arrow_forward"}.md-icon--menu:before{content:"menu"}.md-icon--search:before{content:"search"}.md-icon--home:before{content:"school"}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body,input{color:rgba(0,0,0,.87);-webkit-font-feature-settings:"kern","onum","liga";font-feature-settings:"kern","onum","liga";font-weight:400}.no-fontface body,.no-fontface input{font-family:Helvetica Neue,Helvetica,Arial,sans-serif}code,kbd,pre{color:rgba(0,0,0,.87);-webkit-font-feature-settings:"kern","onum","liga";font-feature-settings:"kern","onum","liga";font-weight:400}.no-fontface code,.no-fontface kbd,.no-fontface pre{font-family:Courier New,Courier,monospace}.md-typeset{font-size:1.6rem;line-height:1.6;-webkit-print-color-adjust:exact}.md-typeset blockquote,.md-typeset ol,.md-typeset p,.md-typeset ul{margin:1em 0}.md-typeset h1{margin:0 0 4rem;color:rgba(0,0,0,.54);font-size:3.125rem;line-height:1.3}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{margin:4rem 0 1.6rem;font-size:2.5rem;line-height:1.4}.md-typeset h3{margin:3.2rem 0 1.6rem;font-size:2rem;font-weight:400;letter-spacing:-.01em;line-height:1.5}.md-typeset h2+h3{margin-top:1.6rem}.md-typeset h4{font-size:1.6rem}.md-typeset h4,.md-typeset h5,.md-typeset h6{margin:1.6rem 0;font-weight:700;letter-spacing:-.01em}.md-typeset h5,.md-typeset h6{color:rgba(0,0,0,.54);font-size:1.28rem}.md-typeset h5{text-transform:uppercase}.md-typeset hr{margin:1.5em 0;border-bottom:.1rem dotted rgba(0,0,0,.26)}.md-typeset a{color:#3f51b5;word-break:break-word}.md-typeset a,.md-typeset a:before{-webkit-transition:color .125s;transition:color .125s}.md-typeset a:active,.md-typeset a:hover{color:#536dfe}.md-typeset code,.md-typeset pre{background-color:hsla(0,0%,93%,.5);color:#37474f;font-size:85%}.md-typeset code{margin:0 .29412em;padding:.07353em 0;border-radius:.2rem;box-shadow:.29412em 0 0 hsla(0,0%,93%,.5),-.29412em 0 0 hsla(0,0%,93%,.5);word-break:break-word;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset h1 code,.md-typeset h2 code,.md-typeset h3 code,.md-typeset h4 code,.md-typeset h5 code,.md-typeset h6 code{margin:0;background-color:transparent;box-shadow:none}.md-typeset a>code{margin:inherit;padding:inherit;border-radius:none;background-color:inherit;color:inherit;box-shadow:none}.md-typeset pre{margin:1em 0;padding:1rem 1.2rem;border-radius:.2rem;line-height:1.4;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset pre::-webkit-scrollbar{width:.4rem;height:.4rem}.md-typeset pre::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-typeset pre>code{margin:0;background-color:transparent;font-size:inherit;box-shadow:none;-webkit-box-decoration-break:none;box-decoration-break:none}.md-typeset kbd{padding:0 .29412em;border:.1rem solid #c9c9c9;border-radius:.2rem;border-bottom-color:#bcbcbc;background-color:#fcfcfc;color:#555;font-size:85%;box-shadow:0 .1rem 0 #b0b0b0;word-break:break-word}.md-typeset mark{margin:0 .25em;padding:.0625em 0;border-radius:.2rem;background-color:rgba(255,235,59,.5);box-shadow:.25em 0 0 rgba(255,235,59,.5),-.25em 0 0 rgba(255,235,59,.5);word-break:break-word;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset abbr{border-bottom:.1rem dotted rgba(0,0,0,.54);cursor:help}.md-typeset small{opacity:.75}.md-typeset sub,.md-typeset sup{margin-left:.07812em}.md-typeset blockquote{padding-left:1.2rem;border-left:.4rem solid rgba(0,0,0,.26);color:rgba(0,0,0,.54)}.md-typeset ul{list-style-type:disc}.md-typeset ol,.md-typeset ul{margin-left:.625em;padding:0}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em;margin-left:1.25em}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{margin:.5em 0 .5em .625em}.md-typeset iframe,.md-typeset img,.md-typeset svg{max-width:100%}.md-typeset table:not([class]){box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);margin:2em 0;border-radius:.2rem;font-size:1.28rem;overflow:hidden}.no-js .md-typeset table:not([class]){display:inline-block;max-width:100%;margin:.8em 0;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){text-align:left}.md-typeset table:not([class]) th{min-width:10rem;padding:1.2rem 1.6rem;background-color:rgba(0,0,0,.54);color:#fff;vertical-align:top}.md-typeset table:not([class]) td{padding:1.2rem 1.6rem;border-top:.1rem solid rgba(0,0,0,.07);vertical-align:top}.md-typeset table:not([class]) tr:first-child td{border-top:0}.md-typeset table:not([class]) a{word-break:normal}.md-typeset .md-typeset__table{margin:1.6em -1.6rem;overflow-x:auto;-webkit-overflow-scrolling:touch}.md-typeset .md-typeset__table table{display:inline-block;margin:0 1.6rem}html{font-size:62.5%}body,html{height:100%}body{position:relative}hr{display:block;height:.1rem;padding:0;border:0}.md-svg{display:none}.md-grid{max-width:122rem;margin-right:auto;margin-left:auto}.md-container,.md-main{overflow:auto}.md-container{display:table;width:100%;height:100%;table-layout:fixed}.md-main{display:table-row;height:100%}.md-main__inner{margin-top:5.6rem;padding-top:3rem;overflow:auto}.csscalc .md-main__inner{min-height:calc(100% - 2.6rem)}@-moz-document url-prefix(){.csscalc .md-main__inner{min-height:calc(100% - 5.6rem)}}.md-toggle{display:none}.md-overlay{position:fixed;top:0;width:0;height:0;-webkit-transition:width 0s .25s,height 0s .25s,opacity .25s;transition:width 0s .25s,height 0s .25s,opacity .25s;background-color:rgba(0,0,0,.54);opacity:0;z-index:2}.md-flex{display:table}.md-flex__cell{display:table-cell;position:relative;vertical-align:top}.md-flex__cell--shrink{width:0}.md-flex__cell--stretch{display:table;width:100%;table-layout:fixed}.md-flex__ellipsis{display:table-cell;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}@page{margin:25mm}.md-content__inner{margin:2.4rem 1.6rem}.md-content__edit{float:right}.md-header{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);position:fixed;top:0;right:0;left:0;height:5.6rem;-webkit-transition:background-color .25s;transition:background-color .25s;background-color:#3f51b5;color:#fff;z-index:1}.md-header-nav{padding:.4rem}.md-header-nav__button{position:relative;-webkit-transition:opacity .25s;transition:opacity .25s;z-index:1}.md-header-nav__button:hover{opacity:.7}.md-header-nav__button.md-logo img{display:block}.no-js .md-header-nav__button.md-icon--search{display:none}.md-header-nav__title{padding:0 2rem;font-size:1.8rem;line-height:4.8rem}.md-header-nav__parent{color:hsla(0,0%,100%,.7)}.md-header-nav__parent:after{display:inline;color:hsla(0,0%,100%,.3);content:"/"}.md-header-nav__source{display:none}.md-footer-nav{background-color:rgba(0,0,0,.87);color:#fff}.md-footer-nav__inner{padding:.4rem;overflow:auto}.md-footer-nav__link{padding-top:2.8rem;padding-bottom:.8rem;-webkit-transition:opacity .25s;transition:opacity .25s}.md-footer-nav__link:hover{opacity:.7}.md-footer-nav__link--prev{width:25%;float:left}.md-footer-nav__link--next{width:75%;float:right;text-align:right}.md-footer-nav__button{-webkit-transition:background .25s;transition:background .25s}.md-footer-nav__title{position:relative;padding:0 2rem;font-size:1.8rem;line-height:4.8rem}.md-footer-nav__direction{position:absolute;right:0;left:0;margin-top:-2rem;padding:0 2rem;color:hsla(0,0%,100%,.7);font-size:1.5rem}.md-footer-meta{background:rgba(0,0,0,.895)}.md-footer-meta__inner{padding:.4rem;overflow:auto}html .md-footer-meta.md-typeset a{color:hsla(0,0%,100%,.7)}.md-footer-copyright{margin:0 1.2rem;padding:.8rem 0;color:hsla(0,0%,100%,.3);font-size:1.28rem}.md-footer-copyright__highlight{color:hsla(0,0%,100%,.7)}.md-footer-social{margin:0 .8rem;padding:.4rem 0 1.2rem}.md-footer-social__link{display:inline-block;width:3.2rem;height:3.2rem;border:.1rem solid hsla(0,0%,100%,.12);border-radius:100%;color:hsla(0,0%,100%,.7);font-size:1.6rem;text-align:center}.md-footer-social__link:before{line-height:1.9}.md-nav{font-size:1.28rem;line-height:1.3}.md-nav--secondary{-webkit-transition:border-left .25s;transition:border-left .25s;border-left:.4rem solid #3f51b5}.md-nav__title{display:block;padding:1.2rem 1.2rem 0;font-weight:700;text-overflow:ellipsis;overflow:hidden}.md-nav__title:before{display:none;content:"arrow_back"}.md-nav__title .md-nav__button{display:none}.md-nav__list{margin:0;padding:0;list-style:none}.md-nav__item{padding:.625em 1.2rem 0}.md-nav__item:last-child{padding-bottom:1.2rem}.md-nav__item .md-nav__item{padding-right:0}.md-nav__item .md-nav__item:last-child{padding-bottom:0}.md-nav__button img{width:100%;height:auto}.md-nav__link{display:block;-webkit-transition:color .125s;transition:color .125s;text-overflow:ellipsis;cursor:pointer;overflow:hidden}.md-nav__item--nested>.md-nav__link:after{content:"keyboard_arrow_down"}html .md-nav__link[for=toc],html .md-nav__link[for=toc]+.md-nav__link:after,html .md-nav__link[for=toc]~.md-nav{display:none}.md-nav__link[data-md-state=blur]{color:rgba(0,0,0,.54)}.md-nav__link--active,.md-nav__link:active{color:#3f51b5}.md-nav__link:hover{color:#536dfe}.md-nav__source,.no-js .md-search{display:none}.md-search__overlay{display:none;pointer-events:none}.md-search__inner{width:100%}.md-search__form{position:relative}.md-search__input{position:relative;padding:0 1.6rem 0 7.2rem;text-overflow:ellipsis;z-index:1}.md-search__input+.md-search__icon,.md-search__input::-webkit-input-placeholder{color:rgba(0,0,0,.54)}.md-search__input+.md-search__icon,.md-search__input::-moz-placeholder{color:rgba(0,0,0,.54)}.md-search__input+.md-search__icon,.md-search__input:-ms-input-placeholder{color:rgba(0,0,0,.54)}.md-search__input+.md-search__icon,.md-search__input::placeholder{color:rgba(0,0,0,.54)}.md-search__input::-ms-clear{display:none}.md-search__icon{position:absolute;top:.8rem;left:1.2rem;-webkit-transition:color .25s;transition:color .25s;font-size:2.4rem;cursor:pointer;z-index:1}.md-search__icon:before{content:"search"}.md-search__output{position:absolute;width:100%;border-radius:0 0 .2rem .2rem;overflow:hidden}.md-search__scrollwrap{height:100%;background:-webkit-linear-gradient(top,#fff 10%,hsla(0,0%,100%,0)),-webkit-linear-gradient(top,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background:linear-gradient(180deg,#fff 10%,hsla(0,0%,100%,0)),linear-gradient(180deg,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background-attachment:local,scroll;background-color:#fff;background-repeat:no-repeat;background-size:100% 2rem,100% 1rem;box-shadow:inset 0 .1rem 0 rgba(0,0,0,.07);overflow-y:auto;-webkit-overflow-scrolling:touch}.md-search-result__meta{padding:0 1.6rem;background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.54);font-size:1.28rem;line-height:4rem}.md-search-result__list{margin:0;padding:0;border-top:.1rem solid rgba(0,0,0,.07);list-style:none}.md-search-result__item{box-shadow:0 -.1rem 0 rgba(0,0,0,.07)}.md-search-result__link{display:block;padding:0 1.6rem;-webkit-transition:background .25s;transition:background .25s;overflow:auto}.md-search-result__link:hover{background-color:rgba(83,109,254,.1)}.md-search-result__article{margin:1em 0}.md-search-result__title{margin-top:.5em;margin-bottom:0;color:rgba(0,0,0,.87);font-size:1.6rem;font-weight:400;line-height:1.4}.md-search-result__teaser{margin:.5em 0;color:rgba(0,0,0,.54);font-size:1.28rem;line-height:1.4;word-break:break-word}.md-sidebar{position:relative;width:24.2rem;padding:2.4rem 0;float:left;overflow:visible}.md-sidebar[data-md-state=lock]{position:fixed;top:5.6rem;-webkit-backface-visibility:hidden;backface-visibility:hidden}.md-sidebar--secondary{display:none}.md-sidebar__scrollwrap{max-height:100%;margin:0 .4rem;overflow-y:auto}.md-sidebar__scrollwrap::-webkit-scrollbar{width:.4rem;height:.4rem}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}@-webkit-keyframes a{0%{height:0}to{height:1.3rem}}@keyframes a{0%{height:0}to{height:1.3rem}}@-webkit-keyframes b{0%{-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}50%{opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes b{0%{-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}50%{opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}.md-source{display:block;-webkit-transition:opacity .25s;transition:opacity .25s;font-size:1.3rem;line-height:1.2;white-space:nowrap}.md-source:hover{opacity:.7}.md-source:after,.md-source__icon{display:inline-block;height:4.8rem;content:"";vertical-align:middle}.md-source__icon{width:4.8rem}.md-source__icon svg{margin-top:1.2rem;margin-left:1.2rem}.md-source__icon+.md-source__repository{margin-left:-4.4rem;padding-left:4rem}.md-source__repository{display:inline-block;max-width:100%;margin-left:1.2rem;font-weight:700;text-overflow:ellipsis;overflow:hidden;vertical-align:middle}.md-source__facts{margin:0;padding:0;font-size:1.1rem;font-weight:700;list-style-type:none;opacity:.75;overflow:hidden}[data-md-state=done] .md-source__facts{-webkit-animation:a .25s ease-in;animation:a .25s ease-in}.md-source__fact{float:left}[data-md-state=done] .md-source__fact{-webkit-animation:b .4s ease-out;animation:b .4s ease-out}.md-source__fact:before{margin:0 .2rem;content:"\00B7"}.md-source__fact:first-child:before{display:none}.admonition{position:relative;margin:1.5625em 0;padding:.8rem 1.2rem;border-left:3.2rem solid rgba(68,138,255,.4);border-radius:.2rem;background-color:rgba(68,138,255,.15);font-size:1.28rem}.admonition:before{position:absolute;left:-2.6rem;color:#fff;font-size:2rem;content:"edit";vertical-align:-.25em}.admonition :first-child{margin-top:0}.admonition :last-child{margin-bottom:0}.admonition.summary,.admonition.tldr{border-color:rgba(0,176,255,.4);background-color:rgba(0,176,255,.15)}.admonition.summary:before,.admonition.tldr:before{content:"subject"}.admonition.hint,.admonition.important,.admonition.tip{border-color:rgba(0,191,165,.4);background-color:rgba(0,191,165,.15)}.admonition.hint:before,.admonition.important:before,.admonition.tip:before{content:"whatshot"}.admonition.check,.admonition.done,.admonition.success{border-color:rgba(0,230,118,.4);background-color:rgba(0,230,118,.15)}.admonition.check:before,.admonition.done:before,.admonition.success:before{content:"done"}.admonition.attention,.admonition.caution,.admonition.warning{border-color:rgba(255,145,0,.4);background-color:rgba(255,145,0,.15)}.admonition.attention:before,.admonition.caution:before,.admonition.warning:before{content:"warning"}.admonition.fail,.admonition.failure,.admonition.missing{border-color:rgba(255,82,82,.4);background-color:rgba(255,82,82,.15)}.admonition.fail:before,.admonition.failure:before,.admonition.missing:before{content:"clear"}.admonition.danger,.admonition.error{border-color:rgba(255,23,68,.4);background-color:rgba(255,23,68,.15)}.admonition.danger:before,.admonition.error:before{content:"flash_on"}.admonition.bug{border-color:rgba(245,0,87,.4);background-color:rgba(245,0,87,.15)}.admonition.bug:before{content:"bug_report"}.admonition-title{font-weight:700}html .admonition-title{margin-bottom:0}html .admonition-title+*{margin-top:0}.codehilite .o,.codehilite .ow{color:inherit}.codehilite .ge{color:#000}.codehilite .gr{color:#a00}.codehilite .gh{color:#999}.codehilite .go{color:#888}.codehilite .gp{color:#555}.codehilite .gs{color:inherit}.codehilite .gu{color:#aaa}.codehilite .gt{color:#a00}.codehilite .gd{background-color:#fdd}.codehilite .gi{background-color:#dfd}.codehilite .k{color:#3b78e7}.codehilite .kc{color:#a71d5d}.codehilite .kd,.codehilite .kn{color:#3b78e7}.codehilite .kp{color:#a71d5d}.codehilite .kr,.codehilite .kt{color:#3e61a2}.codehilite .c,.codehilite .cm{color:#999}.codehilite .cp{color:#666}.codehilite .c1,.codehilite .ch,.codehilite .cs{color:#999}.codehilite .na,.codehilite .nb{color:#c2185b}.codehilite .bp{color:#3e61a2}.codehilite .nc{color:#c2185b}.codehilite .no{color:#3e61a2}.codehilite .nd,.codehilite .ni{color:#666}.codehilite .ne,.codehilite .nf{color:#c2185b}.codehilite .nl{color:#3b5179}.codehilite .nn{color:#ec407a}.codehilite .nt{color:#3b78e7}.codehilite .nv,.codehilite .vc,.codehilite .vg,.codehilite .vi{color:#3e61a2}.codehilite .nx{color:#ec407a}.codehilite .il,.codehilite .m,.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo{color:#e74c3c}.codehilite .s,.codehilite .sb,.codehilite .sc{color:#0d904f}.codehilite .sd{color:#999}.codehilite .s2{color:#0d904f}.codehilite .se,.codehilite .sh,.codehilite .si,.codehilite .sx{color:#183691}.codehilite .sr{color:#009926}.codehilite .s1,.codehilite .ss{color:#0d904f}.codehilite .err{color:#a61717}.codehilite .w{color:transparent}.codehilite .hll{display:block;margin:0 -1.2rem;padding:0 1.2rem;background-color:rgba(255,235,59,.5)}.md-typeset .codehilite{margin:1em 0;padding:1rem 1.2rem .8rem;border-radius:.2rem;background-color:hsla(0,0%,93%,.5);color:#37474f;line-height:1.4;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset .codehilite::-webkit-scrollbar{width:.4rem;height:.4rem}.md-typeset .codehilite::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-typeset .codehilite::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-typeset .codehilite pre{display:inline-block;min-width:100%;margin:0;padding:0;background-color:transparent;overflow:visible;vertical-align:top}.md-typeset .codehilitetable{display:block;margin:1em 0;border-radius:.2em;font-size:1.6rem;overflow:hidden}.md-typeset .codehilitetable tbody,.md-typeset .codehilitetable td{display:block;padding:0}.md-typeset .codehilitetable tr{display:-webkit-box;display:-ms-flexbox;display:flex}.md-typeset .codehilitetable .codehilite,.md-typeset .codehilitetable .linenodiv{margin:0;border-radius:0}.md-typeset .codehilitetable .linenodiv{padding:1rem 1.2rem .8rem}.md-typeset .codehilitetable .linenodiv,.md-typeset .codehilitetable .linenodiv>pre{height:100%}.md-typeset .codehilitetable .linenos{background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.26);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.md-typeset .codehilitetable .linenos pre{margin:0;padding:0;background-color:transparent;color:inherit;text-align:right}.md-typeset .codehilitetable .code{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden}.md-typeset>.codehilitetable{box-shadow:none}.md-typeset .footnote{color:rgba(0,0,0,.54);font-size:1.28rem}.md-typeset .footnote ol{margin-left:0}.md-typeset .footnote li{-webkit-transition:color .25s;transition:color .25s}.md-typeset .footnote li:before{display:block;height:0}.md-typeset .footnote li:target{color:rgba(0,0,0,.87)}.md-typeset .footnote li:target:before{margin-top:-9rem;padding-top:9rem;pointer-events:none}.md-typeset .footnote li :first-child{margin-top:0}.md-typeset .footnote li:hover .footnote-backref,.md-typeset .footnote li:target .footnote-backref{-webkit-transform:translateX(0);transform:translateX(0);opacity:1}.md-typeset .footnote li:hover .footnote-backref:hover,.md-typeset .footnote li:target .footnote-backref{color:#536dfe}.md-typeset .footnote-backref{display:inline-block;-webkit-transform:translateX(.5rem);transform:translateX(.5rem);-webkit-transition:color .25s,opacity .125s .125s,-webkit-transform .25s .125s;transition:color .25s,opacity .125s .125s,-webkit-transform .25s .125s;transition:transform .25s .125s,color .25s,opacity .125s .125s;transition:transform .25s .125s,color .25s,opacity .125s .125s,-webkit-transform .25s .125s;color:rgba(0,0,0,.26);font-size:0;opacity:0;vertical-align:text-bottom}.md-typeset .footnote-backref:before{font-size:1.6rem;content:"keyboard_return"}.md-typeset .headerlink{display:inline-block;margin-left:1rem;-webkit-transform:translateY(.5rem);transform:translateY(.5rem);-webkit-transition:color .25s,opacity .125s .25s,-webkit-transform .25s .25s;transition:color .25s,opacity .125s .25s,-webkit-transform .25s .25s;transition:transform .25s .25s,color .25s,opacity .125s .25s;transition:transform .25s .25s,color .25s,opacity .125s .25s,-webkit-transform .25s .25s;opacity:0}html body .md-typeset .headerlink{color:rgba(0,0,0,.26)}.md-typeset [id]:before{display:inline-block;content:""}.md-typeset [id]:target:before{margin-top:-9.8rem;padding-top:9.8rem}.md-typeset [id] .headerlink:focus,.md-typeset [id]:hover .headerlink,.md-typeset [id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset [id] .headerlink:focus,.md-typeset [id]:hover .headerlink:hover,.md-typeset [id]:target .headerlink{color:#536dfe}.md-typeset h1[id] .headerlink{display:none}.md-typeset h2[id]:before{display:block;margin-top:-.2rem;padding-top:.2rem}.md-typeset h2[id]:target:before{margin-top:-8.2rem;padding-top:8.2rem}.md-typeset h3[id]:before{display:block;margin-top:-.4rem;padding-top:.4rem}.md-typeset h3[id]:target:before{margin-top:-8.4rem;padding-top:8.4rem}.md-typeset h4[id]:before{display:block;margin-top:-.6rem;padding-top:.6rem}.md-typeset h4[id]:target:before{margin-top:-8.6rem;padding-top:8.6rem}.md-typeset h5[id]:before{display:block;margin-top:-1rem;padding-top:1rem}.md-typeset h5[id]:target:before{margin-top:-9rem;padding-top:9rem}.md-typeset h6[id]:before{display:block;margin-top:-1rem;padding-top:1rem}.md-typeset h6[id]:target:before{margin-top:-9rem;padding-top:9rem}.md-typeset .MJXc-display{margin:.75em 0;padding:.25em 0;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset .MathJax_CHTML{outline:0}.md-typeset .comment.critic,.md-typeset del.critic,.md-typeset ins.critic{margin:0 .25em;padding:.0625em 0;border-radius:.2rem;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset del.critic{background-color:#fdd;box-shadow:.25em 0 0 #fdd,-.25em 0 0 #fdd}.md-typeset ins.critic{background-color:#dfd;box-shadow:.25em 0 0 #dfd,-.25em 0 0 #dfd}.md-typeset .critic.comment{background-color:hsla(0,0%,93%,.5);color:#37474f;box-shadow:.25em 0 0 hsla(0,0%,93%,.5),-.25em 0 0 hsla(0,0%,93%,.5)}.md-typeset .critic.comment:before{padding-right:.125em;color:rgba(0,0,0,.26);content:"chat";vertical-align:-.125em}.md-typeset .critic.block{display:block;margin:1em 0;padding-right:1.6rem;padding-left:1.6rem;box-shadow:none}.md-typeset .critic.block :first-child{margin-top:.5em}.md-typeset .critic.block :last-child{margin-bottom:.5em}.md-typeset .emojione{width:2rem;vertical-align:text-top}.md-typeset code.codehilite{margin:0 .29412em;padding:.07353em 0}.md-typeset .task-list-item{position:relative;list-style-type:none}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em;left:-2em}.md-typeset .task-list-control .task-list-indicator:before{position:absolute;top:.05em;left:-1.25em;color:rgba(0,0,0,.26);font-size:1.5em;content:"check_box_outline_blank";vertical-align:-.25em}.md-typeset .task-list-control [type=checkbox]:checked+.task-list-indicator:before{content:"check_box"}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}@media print{.md-typeset a:after{color:rgba(0,0,0,.54);content:" [" attr(href) "]"}.md-typeset code{box-shadow:none;-webkit-box-decoration-break:initial;box-decoration-break:slice}.md-content__edit,.md-footer,.md-header,.md-sidebar,.md-typeset .headerlink{display:none}}@media only screen and (max-width:44.9375em){.md-typeset pre{margin:1em -1.6rem;padding:1rem 1.6rem;border-radius:0}.codehilite .hll{margin:0 -1.6rem;padding:0 1.6rem}.md-typeset>.codehilite{padding:1rem 1.6rem .8rem}.md-typeset>.codehilite,.md-typeset>.codehilitetable{margin:1em -1.6rem;border-radius:0}.md-typeset>.codehilitetable .codehilite,.md-typeset>.codehilitetable .linenodiv{padding:1rem 1.6rem}.md-typeset>p>.MJXc-display{margin:.75em -1.6rem;padding:.25em 1.6rem}}@media only screen and (min-width:100em){html{font-size:68.75%}}@media only screen and (min-width:125em){html{font-size:75%}}@media only screen and (max-width:59.9375em){body[data-md-state=lock]{overflow:hidden}.ios body[data-md-state=lock] .md-container{display:none}.md-content__edit{margin-right:-.8rem}.md-nav--secondary{border-left:0}html .md-nav__link[for=toc]{display:block;padding-right:4.8rem}html .md-nav__link[for=toc]:after{color:inherit;content:"toc"}html .md-nav__link[for=toc]+.md-nav__link{display:none}html .md-nav__link[for=toc]~.md-nav{display:-webkit-box;display:-ms-flexbox;display:flex}.md-nav__source{display:block;padding:.4rem;background-color:rgba(50,64,144,.9675);color:#fff}.md-search__overlay{display:block;position:absolute;top:.4rem;left:.4rem;width:4rem;height:4rem;-webkit-transform-origin:center;transform-origin:center;-webkit-transition:opacity .2s .2s,-webkit-transform .3s .1s;transition:opacity .2s .2s,-webkit-transform .3s .1s;transition:transform .3s .1s,opacity .2s .2s;transition:transform .3s .1s,opacity .2s .2s,-webkit-transform .3s .1s;border-radius:2rem;background-color:#fff;opacity:0;overflow:hidden;z-index:1}[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transition:opacity .1s,-webkit-transform .4s;transition:opacity .1s,-webkit-transform .4s;transition:transform .4s,opacity .1s;transition:transform .4s,opacity .1s,-webkit-transform .4s;opacity:1}.md-search__inner{position:fixed;top:0;left:100%;height:100%;-webkit-transform:translateX(5%);transform:translateX(5%);-webkit-transition:left 0s .3s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;transition:left 0s .3s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;transition:left 0s .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;transition:left 0s .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;opacity:0;z-index:2}[data-md-toggle=search]:checked~.md-header .md-search__inner{left:0;-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:left 0s 0s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;transition:left 0s 0s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;transition:left 0s 0s,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;transition:left 0s 0s,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;opacity:1}.md-search__input{width:100%;height:5.6rem;font-size:1.8rem}.md-search__icon{top:1.6rem;left:1.6rem}.md-search__icon:before{content:"arrow_back"}.md-search__output{top:5.6rem;bottom:0}}@media only screen and (max-width:76.1875em){[data-md-toggle=drawer]:checked~.md-overlay{width:100%;height:100%;-webkit-transition:width 0s,height 0s,opacity .25s;transition:width 0s,height 0s,opacity .25s;opacity:1}.md-header-nav__button.md-icon--home,.md-header-nav__button.md-logo{display:none}.md-nav--primary,.md-nav--primary .md-nav{display:-webkit-box;display:-ms-flexbox;display:flex;position:absolute;top:0;right:0;left:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%;z-index:1}.md-nav--primary{background-color:#fff}.md-nav--primary .md-nav__toggle~.md-nav{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.4);background-color:#fff}html .md-nav--primary .md-nav__title{position:relative;height:11.2rem;padding:6rem 1.6rem .4rem;background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.54);font-weight:400;line-height:4.8rem;white-space:nowrap;cursor:pointer}html .md-nav--primary .md-nav__title:before{display:block;position:absolute;top:.4rem;left:.4rem;width:4rem;height:4rem;color:rgba(0,0,0,.54)}html .md-nav--primary .md-nav__title~.md-nav__list{background:-webkit-linear-gradient(top,#fff 10%,hsla(0,0%,100%,0)),-webkit-linear-gradient(top,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background:linear-gradient(180deg,#fff 10%,hsla(0,0%,100%,0)),linear-gradient(180deg,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background-attachment:local,scroll;background-color:#fff;background-repeat:no-repeat;background-size:100% 2rem,100% 1rem;box-shadow:inset 0 .1rem 0 rgba(0,0,0,.07)}html .md-nav--primary .md-nav__title~.md-nav__list>.md-nav__item:first-child{border-top:0}html .md-nav--primary .md-nav__title--site{position:relative;background-color:#3f51b5;color:#fff}html .md-nav--primary .md-nav__title--site .md-nav__button{display:block;position:absolute;top:.4rem;left:.4rem;width:6.4rem;height:6.4rem;font-size:4.8rem}html .md-nav--primary .md-nav__title--site:before{display:none}.md-nav--primary .md-nav__list{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow-y:auto}.md-nav--primary .md-nav__item{padding:0;border-top:.1rem solid rgba(0,0,0,.07)}.md-nav--primary .md-nav__item--nested>.md-nav__link{padding-right:4.8rem}.md-nav--primary .md-nav__item--nested>.md-nav__link:after{content:"keyboard_arrow_right"}.md-nav--primary .md-nav__link{position:relative;padding:1.6rem}.md-nav--primary .md-nav__link:after{position:absolute;top:50%;right:1.2rem;margin-top:-1.2rem;color:rgba(0,0,0,.54);font-size:2.4rem}.md-nav--primary .md-nav__link:hover:after{color:inherit}.md-nav--primary .md-nav--secondary .md-nav{position:static}.md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:2.8rem}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:4rem}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:5.2rem}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:6.4rem}.md-nav__toggle~.md-nav{display:none}.csstransforms3d .md-nav__toggle~.md-nav{-webkit-transform:translateX(100%);transform:translateX(100%);-webkit-transition:opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);transition:opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s;transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);opacity:0}.csstransforms3d .md-nav__toggle~.md-nav,.md-nav__toggle:checked~.md-nav{display:-webkit-box;display:-ms-flexbox;display:flex}.csstransforms3d .md-nav__toggle:checked~.md-nav{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);opacity:1}.md-nav .md-nav__item,.md-nav .md-nav__title{font-size:1.6rem;line-height:1.5}.md-sidebar--primary{position:fixed;top:0;left:-24.2rem;width:24.2rem;height:100%;-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);background-color:#fff;z-index:2}.no-csstransforms3d .md-sidebar--primary{display:none}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.4);-webkit-transform:translateX(24.2rem);transform:translateX(24.2rem)}.no-csstransforms3d [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{display:block}.md-sidebar--primary .md-sidebar__scrollwrap{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;margin:0}}@media only screen and (min-width:60em){.md-content{margin-right:24.2rem}.md-header-nav__button.md-icon--search{display:none}.md-header-nav__source{display:block;width:23rem;max-width:23rem;padding-right:1.2rem}.md-search{margin-right:2.8rem;padding:.4rem}.md-search__inner{display:table;position:relative;clear:both}.md-search__form{width:23rem;float:right;-webkit-transition:width .25s cubic-bezier(.1,.7,.1,1);transition:width .25s cubic-bezier(.1,.7,.1,1);border-radius:.2rem}.md-search__input{width:100%;height:4rem;padding-left:4.8rem;-webkit-transition:background-color .25s,color .25s;transition:background-color .25s,color .25s;border-radius:.2rem;background-color:rgba(0,0,0,.26);color:#fff;font-size:1.6rem}.md-search__input+.md-search__icon,.md-search__input::-webkit-input-placeholder{-webkit-transition:color .25s;transition:color .25s;color:#fff}.md-search__input+.md-search__icon,.md-search__input::-moz-placeholder{-webkit-transition:color .25s;transition:color .25s;color:#fff}.md-search__input+.md-search__icon,.md-search__input:-ms-input-placeholder{-webkit-transition:color .25s;transition:color .25s;color:#fff}.md-search__input+.md-search__icon,.md-search__input::placeholder{-webkit-transition:color .25s;transition:color .25s;color:#fff}.md-search__input:hover{background-color:hsla(0,0%,100%,.12)}[data-md-toggle=search]:checked~.md-header .md-search__input{border-radius:.2rem .2rem 0 0;background-color:#fff;color:rgba(0,0,0,.87);text-overflow:none}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-webkit-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-moz-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input:-ms-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:rgba(0,0,0,.54)}.md-search__output{top:4rem;-webkit-transition:opacity .4s;transition:opacity .4s;opacity:0}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.4);opacity:1}.md-search__scrollwrap{max-height:0}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap::-webkit-scrollbar{width:.4rem;height:.4rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-search-result__link,.md-search-result__meta{padding-left:4.8rem}.md-sidebar--secondary{display:block;float:right}.md-sidebar--secondary[data-md-state=lock]{margin-left:100%;-webkit-transform:translate(-100%);transform:translate(-100%)}}@media only screen and (min-width:76.25em){.md-content{margin-left:24.2rem;overflow:auto}.md-content__inner{margin:2.4rem}.md-content__inner :last-child{margin-bottom:0}.md-header-nav__button.md-icon--menu{display:none}.md-nav[data-md-state=animate]{-webkit-transition:max-height .25s cubic-bezier(.86,0,.07,1);transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav__toggle~.md-nav{max-height:0;overflow:hidden}.md-nav[data-md-state=expand],.md-nav__toggle:checked~.md-nav{max-height:100%}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--nested>.md-nav__link:after{display:inline-block;-webkit-transform-origin:.45em .45em;transform-origin:.45em .45em;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;vertical-align:-.125em}.js .md-nav__item--nested>.md-nav__link:after{-webkit-transition:-webkit-transform .4s;transition:-webkit-transform .4s;transition:transform .4s;transition:transform .4s,-webkit-transform .4s}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link:after{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.md-search__scrollwrap,[data-md-toggle=search]:checked~.md-header .md-search__form{width:68.8rem}.md-sidebar__inner{border-right:.1rem solid rgba(0,0,0,.07)}}@media only screen and (max-width:29.9375em){.md-footer-nav__link--prev .md-footer-nav__title,.md-header-nav__parent{display:none}[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(45);transform:scale(45)}}@media only screen and (min-width:30em){.md-footer-nav__link{width:50%}}@media only screen and (min-width:45em){.md-footer-copyright{max-width:75%;float:left}.md-footer-social{padding:1.2rem 0;float:right}}@media only screen and (min-width:30em) and (max-width:44.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(60);transform:scale(60)}}@media only screen and (min-width:45em) and (max-width:59.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(75);transform:scale(75)}}@media only screen and (min-width:60em) and (max-width:76.1875em){.md-search__scrollwrap,[data-md-toggle=search]:checked~.md-header .md-search__form{width:46.8rem}}@media only screen and (min-width:60em) and (min-width:76.25em){.md-sidebar--secondary[data-md-state=lock]{margin-left:122rem}}
\ No newline at end of file
diff --git a/commands/__init__.py b/commands/__init__.py
deleted file mode 100644
index 6368a01..0000000
--- a/commands/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# -*- encoding: utf-8 -*-
-
-""" Seperate the commands because I'm sick of this huge file """
diff --git a/commands/copy.py b/commands/copy.py
deleted file mode 100644
index 7a9d215..0000000
--- a/commands/copy.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# -*- encoding: utf-8 -*-
-import os
-
-import sublime
-
-from .fmcommand import FmWindowCommand
-
-
-class FmCopyCommand(FmWindowCommand):
- def run(self, which, paths=None):
- text = []
- folders = self.window.folders()
-
- for path in paths or [self.window.active_view().file_name()]:
- if which == "name":
- text.append(os.path.basename(path))
- elif which == "absolute path":
- text.append(os.path.abspath(path))
- elif which == "relative path":
- for folder in folders:
- if folder in path:
- text.append(os.path.relpath(path, folder))
- break
- elif which == "path from root":
- for folder in folders:
- if folder in path:
- norm_path = os.path.relpath(path, folder)
- text.append("/" + norm_path.replace(os.path.sep, "/"))
- break
-
- sublime.set_clipboard("\n".join(text))
diff --git a/commands/create.py b/commands/create.py
deleted file mode 100644
index b016afd..0000000
--- a/commands/create.py
+++ /dev/null
@@ -1,123 +0,0 @@
-# -*- encoding: utf-8 -*-
-import os
-
-import sublime
-
-from ..libs.input_for_path import InputForPath
-from ..libs.sublimefunctions import (
- get_template,
- refresh_sidebar,
- transform_aliases,
-)
-from ..libs.pathhelper import user_friendly
-from .fmcommand import FmWindowCommand
-
-
-class FmCreaterCommand(FmWindowCommand):
- """Create folder(s)/files that might be required and the
- final ones if it doesn't exists. Finaly, opens the file"""
-
- def run(self, abspath, input_path):
- input_path = user_friendly(input_path)
- if input_path[-1] == "/":
- return os.makedirs(abspath, exist_ok=True)
- if not os.path.isfile(abspath):
- os.makedirs(os.path.dirname(abspath), exist_ok=True)
- with open(abspath, "w"):
- pass
- template = get_template(abspath)
- else:
- template = None
-
- settings = self.window.open_file(abspath).settings()
- if template:
- settings.set("fm_insert_snippet_on_load", template)
-
- refresh_sidebar(settings, self.window)
-
- if self.settings.get("reveal_in_sidebar"):
- settings.set("fm_reveal_in_sidebar", True)
- sublime.set_timeout(
- lambda: self.window.run_command("reveal_in_side_bar"), 500
- )
-
-
-class FmCreateCommand(FmWindowCommand):
- def run(
- self,
- paths=None,
- initial_text="",
- start_with_browser=False,
- no_browser_action=False,
- ):
- view = self.window.active_view()
-
- self.index_folder_separator = self.settings.get("index_folder_" + "separator")
- self.default_index = self.settings.get("default_index")
-
- self.folders = self.window.folders()
-
- self.know_where_to_create_from = paths is not None
-
- if paths is not None:
- # creating from the sidebar
- create_from = paths[0].replace("${packages}", sublime.packages_path())
-
- create_from = transform_aliases(self.window, create_from)
-
- # you can right-click on a file, and run `New...`
- if os.path.isfile(create_from):
- create_from = os.path.dirname(create_from)
- elif self.folders:
- # it is going to be interactive, so it'll be
- # understood from the input itself
- create_from = None
- elif view.file_name() is not None:
- create_from = os.path.dirname(view.file_name())
- self.know_where_to_create_from = True
- else:
- # from home
- create_from = "~"
-
- self.input = InputForPath(
- caption="New: ",
- initial_text=initial_text,
- on_done=self.on_done,
- on_change=self.on_change,
- on_cancel=None,
- create_from=create_from,
- with_files=self.settings.get("complete_with_files_too"),
- pick_first=self.settings.get("pick_first"),
- case_sensitive=self.settings.get("case_sensitive"),
- log_in_status_bar=self.settings.get("log_in_status_bar"),
- log_template="Creating at {0}",
- start_with_browser=start_with_browser,
- no_browser_action=no_browser_action,
- )
-
- def on_change(self, input_path, path_to_create_choosed_from_browsing):
- if path_to_create_choosed_from_browsing:
- # The user has browsed, we let InputForPath select the path
- return
- if self.know_where_to_create_from:
- return
- elif self.folders:
- splited_input = input_path.split(self.index_folder_separator, 1)
- if len(splited_input) == 1:
- index = self.default_index
- else:
- try:
- index = int(splited_input[0])
- except ValueError:
- return None, input_path
-
- return self.folders[index], splited_input[-1]
- return "~", input_path
-
- def is_enabled(self, paths=None):
- return paths is None or len(paths) == 1
-
- def on_done(self, abspath, input_path):
- self.window.run_command(
- "fm_creater", {"abspath": abspath, "input_path": input_path}
- )
diff --git a/commands/create_from_selection.py b/commands/create_from_selection.py
deleted file mode 100644
index 58182bb..0000000
--- a/commands/create_from_selection.py
+++ /dev/null
@@ -1,152 +0,0 @@
-# -*- encoding: utf-8 -*-
-import os
-from re import compile as re_comp
-
-import sublime
-import sublime_plugin
-
-from ..libs.pathhelper import computer_friendly, user_friendly
-
-""" This command has been inspired at 90% by the open_url_context command
-AND the vintage open_file_under_selection. Thanks John!"""
-
-
-def is_legal_path_char(c):
- # XXX make this platform-specific?
- return c not in ' \n"|*<>{}[]()'
-
-
-def move_until(view, stop_char, increment, start):
- char = view.substr(start)
- while is_legal_path_char(char) and start >= 0:
- start += increment
- char = view.substr(start)
- return start
-
-
-class FmCreateFileFromSelectionCommand(sublime_plugin.TextCommand):
- CONTEXT_MAX_LENGTH = 50
- MATCH_SOURCE_ATTR = re_comp(r"(src|href) *= *$")
- MATCH_JS_REQUIRE = re_comp(r"require\(\s*$")
- MATCH_RUBY_REQUIRE = re_comp(r"require_relative\s*\(?\s*$")
-
- @property
- def settings(cls):
- try:
- return cls.settings_
- except AttributeError:
- cls.settings_ = sublime.load_settings("FileManager.sublime-settings")
- return cls.settings_
-
- def run(self, edit, event):
- base_path, input_path = self.get_path(event)
- abspath = computer_friendly(os.path.join(base_path, input_path))
- sublime.run_command(
- "fm_creater", {"abspath": abspath, "input_path": input_path}
- )
-
- def want_event(self):
- return True
-
- def get_path(self, event, for_context_menu=False):
- """
- @return (base_path: str, relative_path: str)
- """
- file_name = None
- region = self.view.sel()[0]
- if not region.empty():
- file_name = self.view.substr(region)
- if "\n" in file_name:
- return
- else:
- syntax = self.view.settings().get("syntax").lower()
- call_pos = self.view.window_to_text((event["x"], event["y"]))
- current_line = self.view.line(call_pos)
- if "html" in syntax:
- region = self.view.extract_scope(call_pos)
- text = self.view.substr(sublime.Region(0, self.view.size()))
- text = text[: region.begin()]
- if self.MATCH_SOURCE_ATTR.search(text):
- file_name = self.view.substr(region)[:-1]
- # removes the " at the end, I guess this is due to the
- # PHP syntax definition
- else:
- return
- elif "python" in syntax:
- current_line = self.view.substr(current_line)
- if current_line.startswith("from ."):
- current_line = current_line[6:]
- index = current_line.find(" import")
- if index < 0:
- return
- current_line = current_line[:index].replace(".", "/")
- if current_line.startswith("/"):
- current_line = ".." + current_line
- file_name = current_line + ".py"
- elif current_line.startswith("import "):
- file_name = current_line[7:].replace(".", "/") + ".py"
- else:
- return
- elif "php" in syntax:
- current_line = self.view.substr(current_line)
- if not (
- current_line.startswith("include ")
- or current_line.startswith("require ")
- ):
- return
- file_name = self.view.substr(self.view.extract_scope(call_pos))
- elif "javascript" in syntax:
- # for now, it only supports require
- region = self.view.extract_scope(call_pos)
- text = self.view.substr(sublime.Region(0, self.view.size()))
- text = text[: region.begin()]
- if self.MATCH_JS_REQUIRE.search(text) is None:
- return
- # [1:-1] removes the quotes
- file_name = self.view.substr(region)[1:-1]
- if not file_name.endswith(".js"):
- file_name += ".js"
- elif "ruby" in syntax:
- region = self.view.extract_scope(call_pos)
- text = self.view.substr(sublime.Region(0, self.view.size()))
- text = text[: region.begin()]
- if self.MATCH_RUBY_REQUIRE.search(text) is None:
- return
- # [1:-1] removes the quotes
- file_name = self.view.substr(region)[1:-1]
- if not file_name.endswith(".rb"):
- file_name += ".rb"
- else:
- # unknown syntax
- return
-
- if file_name[0] in ('"', "'"):
- file_name = file_name[1:]
- if file_name[-1] in ('"', "'"):
- file_name = file_name[:-1]
-
- return os.path.dirname(self.view.file_name()), file_name
-
- def description(self, event):
- base, file_name = self.get_path(event, True)
- keyword = "Open" if os.path.isfile(os.path.join(base, file_name)) else "Create"
- while file_name.startswith("../"):
- file_name = file_name[3:]
- base = os.path.dirname(base)
- base, file_name = user_friendly(base), user_friendly(file_name)
-
- if len(base) + len(file_name) > self.CONTEXT_MAX_LENGTH:
- path = base[: self.CONTEXT_MAX_LENGTH - len(file_name) - 4]
- path += ".../" + file_name
- else:
- path = base + "/" + file_name
- return keyword + " " + path
-
- def is_visible(self, event=None):
- if event is None:
- return False
- return (
- self.settings.get("show_create_from_selection_command") is True
- and self.view.file_name() is not None
- and self.get_path(event) is not None
- )
diff --git a/commands/delete.py b/commands/delete.py
deleted file mode 100644
index 5981a8c..0000000
--- a/commands/delete.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# -*- encoding: utf-8 -*-
-import os
-
-import sublime
-
-from ..libs.sublimefunctions import refresh_sidebar
-from ..libs.send2trash import send2trash
-from .fmcommand import FmWindowCommand
-
-
-class FmDeleteCommand(FmWindowCommand):
- def run(self, paths=None):
- self.paths = paths or [self.window.active_view().file_name()]
-
- if self.settings.get("ask_for_confirmation_on_delete"):
- paths_to_display = [
- [
- "Confirm",
- "Send {0} items to trash".format(len(self.paths))
- if len(self.paths) > 1
- else "Send item to trash",
- ],
- [
- "Cancel All",
- "Select an individual item to remove it from the deletion list",
- ],
- ]
- paths_to_display.extend(
- [os.path.basename(path), path] for path in self.paths
- )
-
- self.window.show_quick_panel(paths_to_display, self.delete)
-
- else:
- # index 0 is like clicking on the first option of the panel
- # ie. confirming the deletion
- self.delete(index=0)
-
- def delete(self, index):
- if index == 0:
- for path in self.paths:
- for window in sublime.windows():
- view = window.find_open_file(path)
- while view is not None:
- view.set_scratch(True)
- view.close()
- view = window.find_open_file(path)
-
- try:
- send2trash(path)
- except OSError as e:
- sublime.error_message("Unable to send to trash: {}".format(e))
- raise OSError("Unable to send {0!r} to trash: {1}".format(path, e))
-
- refresh_sidebar(self.settings, self.window)
-
- elif index > 1:
- self.paths.pop(index - 2)
- if self.paths:
- self.run(self.paths)
diff --git a/commands/duplicate.py b/commands/duplicate.py
deleted file mode 100644
index 911828e..0000000
--- a/commands/duplicate.py
+++ /dev/null
@@ -1,106 +0,0 @@
-# -*- encoding: utf-8 -*-
-import os
-import shutil
-
-import sublime
-
-from ..libs.input_for_path import InputForPath
-from ..libs.sublimefunctions import refresh_sidebar, yes_no_cancel_panel
-from ..libs.pathhelper import user_friendly
-from ..libs.send2trash import send2trash
-from .fmcommand import FmWindowCommand
-
-
-class FmDuplicateCommand(FmWindowCommand):
- def run(self, paths=None):
- if paths is None:
- self.origin = self.window.active_view().file_name()
- else:
- self.origin = paths[0]
-
- initial_path = user_friendly(self.origin)
-
- self.input = InputForPath(
- caption="Duplicate to: ",
- initial_text=initial_path,
- on_done=self.duplicate,
- on_change=None,
- on_cancel=None,
- create_from="",
- with_files=False,
- pick_first=self.settings.get("pick_first"),
- case_sensitive=self.settings.get("case_sensitive"),
- log_in_status_bar=self.settings.get("log_in_status_bar"),
- log_template="Duplicating at {0}",
- )
-
- head = len(os.path.dirname(initial_path)) + 1
- filename = len(os.path.splitext(os.path.basename(initial_path))[0])
- self.input.input.view.selection.clear()
- self.input.input.view.selection.add(sublime.Region(head, head + filename))
-
- def duplicate(self, dst, input_path):
- user_friendly_path = user_friendly(dst)
-
- if os.path.abspath(self.origin) == os.path.abspath(dst):
- sublime.error_message("Destination is the same with the source.")
- return
-
- # remove right trailing slashes, because os.path.dirname('foo/bar/')
- # returns foo/bar rather foo/
- dst = dst.rstrip("/")
-
- os.makedirs(os.path.dirname(dst), exist_ok=True)
-
- if os.path.isdir(self.origin):
- if not os.path.exists(dst):
- shutil.copytree(self.origin, dst)
- else:
- sublime.error_message("This path already exists!")
- raise ValueError(
- "Cannot move the directory {0!r} because it already exists "
- "{1!r}".format(self.origin, dst)
- )
- else:
- if not os.path.exists(dst):
- shutil.copy2(self.origin, dst)
- self.window.open_file(dst)
- else:
-
- def overwrite():
- try:
- send2trash(dst)
- except OSError as e:
- sublime.error_message("Unable to send to trash: {}".format(e))
- raise OSError(
- "Unable to send to the trash the item {0}".format(e)
- )
-
- shutil.copy2(self.origin, dst)
- self.window.open_file(dst)
-
- def open_file():
- return self.window.open_file(dst)
-
- yes_no_cancel_panel(
- message=[
- "This file already exists. Overwrite?",
- user_friendly_path,
- ],
- yes=overwrite,
- no=open_file,
- cancel=None,
- yes_text=[
- "Yes. Overwrite",
- user_friendly_path,
- "will be sent " "to the trash, and then written",
- ],
- no_text=["Just open the target file", user_friendly_path],
- cancel_text=["No, don't do anything"],
- )
-
- refresh_sidebar(self.settings, self.window)
- return
-
- def is_enabled(self, paths=None):
- return paths is None or len(paths) == 1
diff --git a/commands/editto.py b/commands/editto.py
deleted file mode 100644
index 9048f49..0000000
--- a/commands/editto.py
+++ /dev/null
@@ -1,38 +0,0 @@
-# -*- encoding: utf-8 -*-
-from .fmcommand import FmWindowCommand
-
-
-class FmEditToTheRightCommand(FmWindowCommand):
- def run(self, files=None):
- self.window.set_layout(
- {
- "cols": [0.0, 0.5, 1.0],
- "rows": [0.0, 1.0],
- "cells": [[0, 0, 1, 1], [1, 0, 2, 1]],
- }
- )
- for file in files or [self.window.active_view().file_name()]:
- self.window.set_view_index(self.window.open_file(file), 1, 0)
-
- self.window.focus_group(1)
-
- def is_enabled(self, files=None):
- return (files is None or len(files) >= 1) and self.window.active_group() != 1
-
-
-class FmEditToTheLeftCommand(FmWindowCommand):
- def run(self, files=None):
- self.window.set_layout(
- {
- "cols": [0.0, 0.5, 1.0],
- "rows": [0.0, 1.0],
- "cells": [[0, 0, 1, 1], [1, 0, 2, 1]],
- }
- )
- for file in files or [self.window.active_view().file_name()]:
- self.window.set_view_index(self.window.open_file(file), 0, 0)
-
- self.window.focus_group(0)
-
- def is_enabled(self, files=None):
- return (files is None or len(files) >= 1) and self.window.active_group() != 0
diff --git a/commands/find_in_files.py b/commands/find_in_files.py
deleted file mode 100644
index d18083d..0000000
--- a/commands/find_in_files.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# -*- encoding: utf-8 -*-
-import os
-
-from .fmcommand import FmWindowCommand
-
-
-class FmFindInFilesCommand(FmWindowCommand):
- def run(self, paths=None):
- valid_paths = set()
- for path in paths or self.windows.active_view().file_name():
- if os.path.isfile(path):
- valid_paths.add(os.path.dirname(path))
- else:
- valid_paths.add(path)
-
- self.window.run_command(
- "show_panel", {"panel": "find_in_files", "where": ", ".join(valid_paths)}
- )
diff --git a/commands/fmcommand.py b/commands/fmcommand.py
deleted file mode 100644
index 7514ecd..0000000
--- a/commands/fmcommand.py
+++ /dev/null
@@ -1,37 +0,0 @@
-# -*- encoding: utf-8 -*-
-import sublime
-import sublime_plugin
-
-
-class FmWindowCommand(sublime_plugin.WindowCommand):
- @property
- def settings(cls):
- try:
- return cls.settings_
- except AttributeError:
- cls.settings_ = sublime.load_settings("FileManager.sublime-settings")
- return cls.settings_
-
- def is_visible(self, *args, **kwargs):
- name = "show_{}_command".format(self.name().replace("fm_", ""))
- show = self.settings.get(name)
- if show is None:
- # this should never happen, this is an error
- # we could nag the user to get him to report that issue,
- # but that's going to make this plugin really painful to use
- # So, I just print something to the console, and hope someone
- # sees and reports it
- print(
- "FileManager: No setting available for the command {!r}. This is an internal error, please report it".format(
- type(self).__name__
- )
- )
- show = True
-
- return bool(
- show
- and (
- not self.settings.get("menu_without_distraction")
- or self.is_enabled(*args, **kwargs)
- )
- )
diff --git a/commands/index.html b/commands/index.html
new file mode 100755
index 0000000..c06206c
--- /dev/null
+++ b/commands/index.html
@@ -0,0 +1,1121 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Commands - FileManager
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
All the input that are created from File Manager have an auto completions system. If you want to
+learn more about about it, here's the page dedicated to it
If you try to create a file that already exists, it will simply open it.
+
+
Note
+
This is a trick that I realised I was using very often! It's even better when you use
+aliases
+
+
But what happens if you try to create a folder that already exists? Well it's going to show up
+a quick panel with every folders and every files listed. If you pick a file, it will open it. If
+you pick a folder, it will reopen the browser listing all the items of this folder.
+
There is two more options. The first one is .., to go up of one folder, and the other one is:
+Create form here. If you pick this option, it will simply reopen the input panel from your
+position in the browser.
+
+
So, again, this is just theory. Read on discover the different commands that uses those features
+(and, of course, add their own )
Right click on a file/folder in the side bar and choose New¶
+
+
With this option, you will create from where you click. If it was a file, you will create from
+its containing folder.
+
You should see an input at the bottom of sublime text. You can type a file name or a path, and it
+will create it for you. You can use what I call user friendly path
0>file.py Creates from the first folder, starting from the top. Here the prefix is useless,
+because it's the default value (you could have just typed file.py)
+
1>file.py Creates from the second folder, starting from the top
+
-1>file.py Creates from the first folder, starting from the bottom
+
+
You get the idea.
+
+
Note
+
Watch out, they're "code lists", which means that they start from 0. 0 is the first one,
+1 is the second, 2 is the third, etc...
I personally don't like typing the >, because I have to move my hand a looooong way . So,
+I added an option to change it. For my part, I chose a space. The only "problem" is that if I have
+the following structure:
And that I want to create a file in the folder 1 python, I'm going to type something line this
+1 python/afile.py. But, it's going select in samples. So, you would have to explicitly say
+that you want to create from the first folder, so: 0 1 python/afile.py would work.
+
But, it's not that much of a big deal, because you rarely get a folder starting with a number and
+then a space, and as you saw, the solution is really simple.
+
Why isn't > a problem too? On Windows at least, you can not have a file are a folder that has
+> in it.
+
So, if you want to change the symbol, add this to your settings user
+(it can be, of course, whatever you want):
You can specify templates so that when you create a new file, the content will be the content of
+your template. For more information, see the page dedicated to the templates
If you put a slash in your name, it will automatically create a sub-folders to it, and then move
+the file. For example, if you try to rename a file like this: hello/world.py and your file is
+called something.py, it will create the folder hello (if it doesn't already exists) and then
+rename something.py.
+
+
Tip
+
If your name is ../hello.py, it will move your file one folder above.
You can move several items at a time. If they aren't in the same folder, the path shown in the
+input will be the common path they have. Once you'll move them, they'll be in every cases in
+the same folder.
+
To move a file, you're oblige to use the browser, because you have to choose an existing folder, so
+it will automatically pop up. But if you have a look, instead of having [cmd]: Create from here,
+you have [cmd]: move here. As you probably guessed, you have to select this option to move your
+file/folder
As its name says, this command allows you to create a file from text. For example, in html, if
+you right click on the value of an src or href attribute, an option will appear called
+Create <the path to you file> (it will be shorten if it's too long). You don't even need to
+select anything.
+
If you do select something, then it will propose you to create the file using the path you've
+selected.
+
Here's an example:
+
+
Font: Droid Sans Mono; Theme: Boxy; Color Scheme: Boxy Yesterday
+
In every cases, the file will be created from the current file (so this command does not appear
+if you're file is not saved on the disk).
+
+
Note
+
This automatic selection only works, for now, in the following languages:
+
+
html
+
python
+
php
+
javascript
+
ruby
+
+
If you'd like to see an other language supported, feel free to submit a [new issue][], or even
+to create it yourself. Please make sure you read the contribution-guide before doing so.
This command opens up the selected file in the default browser. You can run it from the command
+palette: File Manager: Open In Browser, it'll open the current file. You can also run it from the
+Side Bar: it'll open the selected file(s).
+
It also kind of overwrites the default Open in browser option in the context menu (in fact, it
+hides default command, and shows the FileManager's command). Now, you might be wondering:
+
+
Why do an other command, while an other one exists?
+
+
Well, this one is better . Here's how: it takes into account a global settingurl
+
An example's a great way to explain how it works (in MyProject.sublime-project):
Now, when you're going to open a file that is in the the folder C:/wamp/www/MyAwesomeWebsite/,
+it'll simply replace this part with the url value (here http://localhost/MyAwesomeWebsite/)
It opens up the terminal in the selected folder (or the folder of the current file if you open it
+from the command palette). You can configure what's happening in your FileManager's settings
+(Preferences → Packages Settings → FileManager).
+
You can add a setting called terminals. Here's the format:
In the cmd key, you have one variable: $cwd. It'll be replaced by the current working dir
+(the folder from which the command will be run).
+
The platform is used to limit allow the terminal to work only one specific platform(s). If it is
+omitted, it'll work on every platform. The valid values are windows, linux and osx.
+
+
Tip
+
You can limit a terminal to work on multiple platform by seperating them with a space, like so:
+windows osx
+
+
So, for example, on Windows, here's what you could do:
If you're on Mac, it might be a bit harder. Why? Because I don't have a Mac, so I cannot try to see
+if what I'm going to tell you is actually working. Here's what I found:
+
open -a Terminal should open a new terminal. So, here's the config I'd recommend using:
This command simply opens the selected item(s) in your file explorer (or finder if you're on mac).
+It'll open the current file if it's run from the command palette.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/commands/move.py b/commands/move.py
deleted file mode 100644
index abe6130..0000000
--- a/commands/move.py
+++ /dev/null
@@ -1,56 +0,0 @@
-# -*- encoding: utf-8 -*-
-import os
-
-import sublime
-
-from ..libs.input_for_path import InputForPath
-from ..libs.pathhelper import commonpath, user_friendly
-from ..libs.sublimefunctions import refresh_sidebar
-from .fmcommand import FmWindowCommand
-
-
-class FmMoveCommand(FmWindowCommand):
- def run(self, paths=None):
- self.origins = paths or [self.window.active_view().file_name()]
-
- if len(self.origins) > 1:
- initial_text = commonpath(self.origins)
- else:
- initial_text = os.path.dirname(self.origins[0])
- initial_text = user_friendly(initial_text) + "/"
-
- InputForPath(
- caption="Move to",
- initial_text=initial_text,
- on_done=self.move,
- on_change=None,
- on_cancel=None,
- create_from="",
- with_files=self.settings.get("complete_with_files_too"),
- pick_first=self.settings.get("pick_first"),
- case_sensitive=self.settings.get("case_sensitive"),
- log_in_status_bar=self.settings.get("log_in_status_bar"),
- log_template="Moving at {0}",
- browser_action={"title": "Move here", "func": self.move},
- browser_index=0,
- )
-
- def move(self, path, input_path):
- os.makedirs(path, exist_ok=True)
- for origin in self.origins:
- view = self.window.find_open_file(origin)
- new_name = os.path.join(path, os.path.basename(origin))
- try:
- os.rename(origin, new_name)
- except Exception as e:
- sublime.error_message(
- "An error occured while moving the file " "{}".format(e)
- )
- raise OSError(
- "An error occured while moving the file {0!r} "
- "to {1!r}".format(origin, new_name)
- )
- if view:
- view.retarget(new_name)
-
- refresh_sidebar(self.settings, self.window)
diff --git a/commands/open_all.py b/commands/open_all.py
deleted file mode 100644
index 1be0847..0000000
--- a/commands/open_all.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# -*- encoding: utf-8 -*-
-from .fmcommand import FmWindowCommand
-
-
-class FmOpenAllCommand(FmWindowCommand):
- def run(self, files=[]):
- for file in files:
- self.window.open_file(file)
-
- def is_enabled(self, files=[]):
- return len(files) > 1
diff --git a/commands/open_in_browser.py b/commands/open_in_browser.py
deleted file mode 100644
index 794f9ef..0000000
--- a/commands/open_in_browser.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# -*- encoding: utf-8 -*-
-import os
-
-import sublime
-
-from .fmcommand import FmWindowCommand
-
-
-class FmOpenInBrowserCommand(FmWindowCommand):
- def run(self, paths=None, *args, **kwargs):
- folders = self.window.folders()
-
- view = self.window.active_view()
- url = view.settings().get("url")
- if url is not None:
- url = url.strip("/")
-
- for path in paths or [view.file_name()]:
- if url is None:
- self.open_url("file:///" + path)
- else:
- for folder in folders:
- if folder in path:
- if os.path.splitext(os.path.basename(path))[0] == "index":
- path = os.path.dirname(path)
- self.open_url(url + path.replace(folder, ""))
- break
- else:
- self.open_url("file:///" + path)
-
- def open_url(self, url):
- sublime.run_command("open_url", {"url": url})
diff --git a/commands/open_in_explorer.py b/commands/open_in_explorer.py
deleted file mode 100644
index b7eae74..0000000
--- a/commands/open_in_explorer.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# -*- encoding: utf-8 -*-
-import os
-
-import sublime
-from .fmcommand import FmWindowCommand
-
-
-class FmOpenInExplorerCommand(FmWindowCommand):
- def run(self, paths=None):
- # visible_on_platforms is just used by is_visible
- for path in paths or [self.window.active_view().file_name()]:
- if os.path.isdir(path):
- self.window.run_command("open_dir", {"dir": path})
- else:
- dirname, basename = os.path.split(path)
- self.window.run_command(
- "open_dir",
- {"dir": dirname, "file": basename},
- )
-
- def is_visible(self, visible_on_platforms=None, paths=None):
- return super().is_visible() and (
- visible_on_platforms is None or sublime.platform() in visible_on_platforms
- )
diff --git a/commands/open_terminal.py b/commands/open_terminal.py
deleted file mode 100644
index 9245140..0000000
--- a/commands/open_terminal.py
+++ /dev/null
@@ -1,63 +0,0 @@
-# -*- encoding: utf-8 -*-
-import os
-import subprocess
-
-import sublime
-
-from ..libs.pathhelper import user_friendly
-from .fmcommand import FmWindowCommand
-
-
-class FmOpenTerminalCommand(FmWindowCommand):
- def run(self, paths=None):
- current_platform = sublime.platform()
- self.terminals = [
- terminal
- for terminal in self.settings.get("terminals")
- if self.is_available(terminal, current_platform)
- ]
-
- if paths is not None:
- cwd = paths[0]
- elif self.window.folders() != []:
- cwd = self.window.folders()[0]
- else:
- cwd = self.window.active_view().file_name()
-
- def open_terminal_callback(index):
- if index == -1:
- return
- self.open_terminal(
- self.terminals[index]["cmd"], cwd, self.terminals[index]["name"]
- )
-
- if len(self.terminals) == 1:
- open_terminal_callback(0)
- else:
- self.window.show_quick_panel(
- [term_infos["name"] for term_infos in self.terminals],
- open_terminal_callback,
- )
-
- def is_enabled(self, paths=None):
- return paths is None or len(paths) == 1
-
- def is_available(self, terminal, current_platform):
- try:
- terminal["platform"]
- except KeyError:
- return True
- if not isinstance(terminal["platform"], str):
- return False
-
- platforms = terminal["platform"].lower().split(" ")
- return current_platform in platforms
-
- def open_terminal(self, cmd, cwd, name):
- if os.path.isfile(cwd):
- cwd = os.path.dirname(cwd)
-
- for j, bit in enumerate(cmd):
- cmd[j] = bit.replace("$cwd", cwd)
- sublime.status_message('Opening "{0}" at {1}'.format(name, user_friendly(cwd)))
- return subprocess.Popen(cmd, cwd=cwd)
diff --git a/commands/rename.py b/commands/rename.py
deleted file mode 100644
index 65ee815..0000000
--- a/commands/rename.py
+++ /dev/null
@@ -1,111 +0,0 @@
-# -*- encoding: utf-8 -*-
-import os
-import uuid
-
-import sublime
-
-from ..libs.input_for_path import InputForPath
-from ..libs.pathhelper import user_friendly
-from ..libs.sublimefunctions import yes_no_cancel_panel, refresh_sidebar
-from ..libs.send2trash import send2trash
-from .fmcommand import FmWindowCommand
-
-
-class FmRenamePathCommand(FmWindowCommand):
- def run(self, paths=None):
- self.window.run_command(
- "rename_path", {"paths": paths or [self.window.active_view().file_name()]}
- )
-
-
-class FmRenameCommand(FmWindowCommand):
- def run(self, paths=None):
- print(
- "fm_rename has been deprecated. It doesn't provide any more useful feature "
- "than the default command. You should use rename_path (for a "
- "file or a folder) or rename_file (for a file) instead."
- )
- sublime.status_message("fm_rename has been deprecated (see console)")
-
- if paths is None:
- self.origin = self.window.active_view().file_name()
- else:
- self.origin = paths[0]
-
- filename, ext = os.path.splitext(os.path.basename(self.origin))
-
- self.input = InputForPath(
- caption="Rename to: ",
- initial_text="{0}{1}".format(filename, ext),
- on_done=self.rename,
- on_change=None,
- on_cancel=None,
- create_from=os.path.dirname(self.origin),
- with_files=self.settings.get("complete_with_files_too"),
- pick_first=self.settings.get("pick_first"),
- case_sensitive=self.settings.get("case_sensitive"),
- log_in_status_bar=self.settings.get("log_in_status_bar"),
- log_template="Renaming to {0}",
- )
- self.input.input.view.selection.clear()
- self.input.input.view.selection.add(sublime.Region(0, len(filename)))
-
- def rename(self, dst, input_dst):
- def is_windows_same_filesystem_name():
- return (
- sublime.platform() == "windows" and self.origin.lower() == dst.lower()
- )
-
- def rename():
- dst_dir = os.path.dirname(dst)
- os.makedirs(dst_dir, exist_ok=True)
-
- if is_windows_same_filesystem_name() and self.origin != dst:
- dst_tmp = os.path.join(dst_dir, str(uuid.uuid4()))
- os.rename(self.origin, dst_tmp)
- os.rename(dst_tmp, dst)
- else:
- os.rename(self.origin, dst)
-
- view = self.window.find_open_file(self.origin)
- if view:
- view.retarget(dst)
-
- if os.path.exists(dst) and not is_windows_same_filesystem_name():
-
- def open_file(self):
- return self.window.open_file(dst)
-
- def overwrite():
- try:
- send2trash(dst)
- except OSError as e:
- sublime.error_message("Unable to send to trash: {}".format(e))
- raise OSError(
- "Unable to send the item {0!r} to the trash! Error {1!r}".format(
- dst, e
- )
- )
-
- rename()
-
- user_friendly_path = user_friendly(dst)
- return yes_no_cancel_panel(
- message=["This file already exists. Overwrite?", user_friendly_path],
- yes=overwrite,
- no=open_file,
- cancel=None,
- yes_text=[
- "Yes. Overwrite",
- user_friendly_path,
- "will be sent to the trash, and then written",
- ],
- no_text=["Just open the target file", user_friendly_path],
- cancel_text=["No, don't do anything"],
- )
-
- rename()
- refresh_sidebar(self.settings, self.window)
-
- def is_enabled(self, paths=None):
- return paths is None or len(paths) == 1
diff --git a/contributing/index.html b/contributing/index.html
new file mode 100755
index 0000000..eb5b3b8
--- /dev/null
+++ b/contributing/index.html
@@ -0,0 +1,631 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contributing - FileManager
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
If you want to contribute to the documentation, you're at the right place.
+Otherwise, you should have a look at the readme
+
The documentation is written using mkdocs. So, if you want to just fix a typo for example, you
+might not need to download everything, just edit the corresponding markdown file (it's really
+simple), and if you're a bit careful, it should be all right. But as soon as you start making some
+bigger changes, please do the following to have a preview to know how it's going to look like.
+
Whichever option you chose, you first need to fork this repo.
+
+
Note
+
You can just raise an issue on the GitHub issue tracker to request a fix in the docs,
+it's up to you
To keep this doc enjoyable to edit, here are the conventions that it has to respect:
+
+
keep the line length under 100 chars (\n included). I advice you to add this to your project
+settings: rulers: [99]. Tables are the only exception. URLs are not, because you can specify
+them at the bottom of the file — more info
+
prefer files link instead of URL link. You can do this: [mylink](relative/path/to/file.md)
+Mkdocs will convert it to the valid URL for you
+
use !!! block with avidity! Na, not that much, but don't hesitate to use them, it brings
+rhythm to the doc, which make it more enjoyable to read. — more info
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dependencies.json b/dependencies.json
deleted file mode 100644
index a3d2355..0000000
--- a/dependencies.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "*": {
- "*": [
- "package_setting_context"
- ]
- }
-}
diff --git a/docs/about.md b/docs/about.md
deleted file mode 100644
index 3a71b72..0000000
--- a/docs/about.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# About FileManager
-
-Hello! I'm math2001, and I'm the author of FileManager.
-
-I've created this package because I...don't have a really fast computer (pretty slow to be honest), so I'm use to have small tool, but still powerful. Sublime Text is probably the best example (although I wouldn't call it small, but super-fast :wink:)
-
-So, when I installed SidebarEnhancement, it just didn't fit. There were so many options, I used only about half of them. You couldn't create any nested files (actually, you could, but you'd get an error message poping up). There was no auto completion and it was messy. I just didn't like it.
-
-Then AdvancedNewFile came into the game. This one is really cool. It has auto completion (although I discovered when I started creating FileManager :laughing:), you can create nested files, folders. But it wasn't included in the Side Bar, which is, in my opinion, a bit silly.
-
-So, I decided to mix them together, but I kept in mind that I should add feature that are *really* useful. And out of this came **FileManager**.
-
-I'm completely open to any suggestions, and I would love to hear what *you* think of this package or if you enjoy it! So, you can [send me a tweet][tweet-me], or simply star the repo!
-
-[tweet-me]: https://twitter.com/_math2001
diff --git a/docs/commands.md b/docs/commands.md
deleted file mode 100644
index 14dcb05..0000000
--- a/docs/commands.md
+++ /dev/null
@@ -1,370 +0,0 @@
-This page will list every command available and explain what they do with *every single* options.
-
-## Common features
-
-Because FileManager uses an API, you'll always get those following feature in every input panel
-that is shown by FileManager.
-
-### The Auto Completion system
-
-All the input that are created from File Manager have an auto completions system. If you want to
-learn more about about it, [here's the page dedicated to it](references/auto-completion.md)
-
-### The log in the status bar
-
-As you probably noticed, when you create a file, there is in the side bar a message, like this
-
-`Creating at `
-
-!!! note
- Of course, the the `Creating` will change if you're moving, renaming, duplicating etc.
-
-And the path is in a *computer friendly form* ([more info](references/type-of-path.md)), but you
-can change it so that it is in a *user friendly form*.
-
-```json
-"log_in_status_bar": "user"
-```
-
-The valid values are `"computer"`, `"user"` and `false`
-
-If it is set to `false`, it will be disabled (there will be no log in the status bar)
-
-### The "browser"
-
-If you try to create a file that already exists, it will simply open it.
-
-!!! note
- This is a trick that I realised I was using very often! It's even better when you use
- [aliases](references/aliases.md)
-
-But what happens if you try to create a **folder** that already exists? Well it's going to show up
-a quick panel with every folders and every files listed. If you pick a file, it will open it. If
-you pick a folder, it will reopen the browser listing all the items of this folder.
-
-There is two more options. The first one is `..`, to go up of one folder, and the other one is:
-`Create form here`. If you pick this option, it will simply reopen the input panel from your
-position in the browser.
-
-
-
-So, again, this is just theory. Read on discover the different commands that uses those features
-(and, of course, add their own :wink:)
-
-****
-
-## Create
-
-Command: `fm_create`
-
-You can access it from 2 different ways:
-
-### Right click on a file/folder in the side bar and choose `New`
-
-
-
-With this option, you will create *from where you click*. If it was a file, you will create from
-its *containing folder*.
-
-You should see an input at the bottom of sublime text. You can type a file name or a path, and it
-will create it for you. You can use what I call [user friendly path](references/type-of-path.md)
-
-#### Example
-
-`folder/file.py`
-
-If `folder` does not exists, then it will create it for you.
-If `file.py` exists, it will open it, otherwise it will create it, and then open it.
-
-Note: To create an empty folder, append `/` at the end of name. Otherwise, it will create only file.
-for folder - `folder/`
-for file - `file.py` or `folder/file.py`
-
-### With a shortcut `alt+n`
-
-
-
-When you use a shortcut, the plugin does not explicitly know from where you want to create. Here's
-how it **guesses**:
-
-1. If there is some folders open in Sublime Text, it will create from the top one
-2. Otherwise, if there is file open, it will create from its containing folder
-3. Finally, it will choose `~` . You can change this fall back by adding to your settings the key
-`path_fallback` with the path you want
-
-> If there is some folders open in Sublime Text, it will create from the top one
-
-If you want to select which folder you want to create from, you can just add this prefix: `nb>`
-
-#### Example
-
-- `0>file.py` Creates from the first folder, starting from the top. Here the prefix is useless,
-because it's the default value (you could have just typed `file.py`)
-- `1>file.py` Creates from the second folder, starting from the top
-- `-1>file.py` Creates from the first folder, starting from the **bottom**
-
-You get the idea.
-
-!!! note
- Watch out, they're "code lists", which means that they start from `0`. `0` is the first one,
- `1` is the second, `2` is the third, etc...
-
-### Changing the symbol (`>`)
-
-I personally don't like typing the `>`, because I have to move my hand a looooong way :smile:. So,
-I added an option to change it. For my part, I chose a space. The only "problem" is that if I have
-the following structure:
-
-```
-test/
- 1 python/
-samples/
- hello/
- index.html
-```
-
-And that I want to create a file in the folder `1 python`, I'm going to type something line this
-`1 python/afile.py`. But, it's going select in `samples`. **So**, you would have to explicitly say
-that you want to create from the first folder, so: `0 1 python/afile.py` would work.
-
-But, it's not that much of a big deal, because you rarely get a folder starting with a number and
-then a space, and as you saw, the solution is really simple.
-
-Why isn't `>` a problem too? On Windows at least, you can **not** have a file are a folder that has
-`>` in it.
-
-So, if you want to change the symbol, add this to your settings user
-(it can be, of course, whatever you want):
-
-```json
-"index_folder_separator": " "
-```
-
-### Changing the default index
-
-As I said earlier, the default index is `0`. You can change this by adding this to your settings
-
-```json
-"default_index": 1
-```
-
-### Templates
-
-You can specify templates so that when you create a new file, the content will be the content of
-your template. For more information, see [the page dedicated to the templates](references/templates.md)
-
-## Rename
-
-Command: `fm_rename`
-
-You can only rename **1** file at a time.
-
-If you put a slash in your name, it will automatically create a sub-folders to it, and then move
-the file. For example, if you try to rename a file like this: `hello/world.py` and your file is
-called `something.py`, it will create the folder `hello` (if it doesn't already exists) and then
-rename `something.py`.
-
-!!! tip
- If your name is `../hello.py`, it will move your file one folder above.
-
-## Move
-
-Command: `fm_move`
-
-You can move several items at a time. If they aren't in the same folder, the path shown in the
-input will be the common path they have. Once you'll move them, **they'll be in every cases in
-the same folder**.
-
-To move a file, you're oblige to use the browser, because you have to choose an existing folder, so
-it will automatically pop up. But if you have a look, instead of having `[cmd]: Create from here`,
-you have `[cmd]: move here`. As you probably guessed, you have to select this option to move your
-file/folder
-
-## Duplicate
-
-Command: `fm_duplicate`
-
-You can duplicate folders and files, but, once again, one at a time.
-
-!!! note
- If you're duplicating a folder, you *must* create a new folder.
-
-## Delete
-
-Command: `fm_delete`
-
-File Manager doesn't delete permanently your files/folders, it only throws them to the trash.
-
-!!! note
- When other commands needs to overwrite a file or a folders, they throw them to the trash
- *before* and then simply write.
-
-## Create from selection
-
-Command: `fm_create_from_selection`
-
-As its name says, this command allows you to create a file from text. For example, in `html`, if
-you right click on the value of an `src` or `href` attribute, an option will appear called
-`Create ` (it will be shorten if it's too long). You don't even need to
-select anything.
-
-If you do select something, then it will propose you to create the file using the path you've
-selected.
-
-Here's an example:
-
-
-
-*Font: Droid Sans Mono; Theme: Boxy; Color Scheme: Boxy Yesterday*
-
-In every cases, the file will be created *from* the current file (so this command does not appear
-if you're file is not saved on the disk).
-
-!!! note
- This automatic selection only works, for now, in the following languages:
-
- - html
- - python
- - php
- - javascript
- - ruby
-
- If you'd like to see an other language supported, feel free to submit a [new issue][], or even
- to create it yourself. Please make sure you read the [contribution-guide][] before doing so.
-
-## Open in browser
-
-Command: `fm_open_in_browser`
-
-This command opens up the selected file in the default browser. You can run it from the command
-palette: `File Manager: Open In Browser`, it'll open the current file. You can also run it from the
-Side Bar: it'll open the selected file(s).
-
-It also kind of *overwrites* the default `Open in browser` option in the context menu (in fact, it
-hides default command, and shows the FileManager's command). Now, you might be wondering:
-
-> Why do an other command, while an other one exists?
-
-Well, this one is better :smile:. Here's how: *it takes into account a global setting* `url`
-
-An example's a great way to explain how it works (in `MyProject.sublime-project`):
-
-```json
-{
- "folders": [
- {
- "path": "C:/wamp/www/MyAwesomeWebsite/"
- }
- ],
- "settings": {
- "url": "http://localhost/MyAwesomeWebsite/"
- }
-}
-```
-
-Now, when you're going to open a file that is in the the folder `C:/wamp/www/MyAwesomeWebsite/`,
-it'll simply replace this part with the `url` value (here `http://localhost/MyAwesomeWebsite/`)
-
-#### Examples
-
-- `C:/wamp/www/MyAwesomeWebsite/index.html` → `http://localhost/MyAwesomeWebsite/` (it's clever,
-it removes the `index.html`)
-- `C:/wamp/www/MyAwesomeWebsite/index.php` → `http://localhost/MyAwesomeWebsite/`
-- `C:/wamp/www/MyAwesomeWebsite/sub-folder/file.php` →
-`http://localhost/MyAwesomeWebsite/sub-folder/file.php`
-
-## Open Terminal Here
-
-Command: `fm_open_terminal`
-
-It opens up the terminal in the selected folder (or the folder of the current file if you open it
-from the command palette). You can configure what's happening in your FileManager's settings
-(*Preferences → Packages Settings → FileManager*).
-
-You can add a setting called `terminals`. Here's the format:
-
-```json
-{
- "terminals": [
- {
- "name": "terminal name",
- "cmd": ["the", "command", "to", "open"],
- "platform": "first second"
- },
- {
- "name": "An other Terminal",
- "cmd": ["terminal", "--new_tab", "$cwd"]
- }
- ]
-}
-```
-
-In the `cmd` key, you have one variable: `$cwd`. It'll be replaced by the *current working dir*
-(the folder from which the command will be run).
-
-The `platform` is used to limit allow the terminal to work only one specific platform(s). If it is
-omitted, it'll work on every platform. The valid values are `windows`, `linux` and `osx`.
-
-!!! tip
- You can limit a terminal to work on multiple platform by seperating them with a space, like so:
- `windows osx`
-
-
-### Windows example
-
-```json
-{
- "terminals": [
- {
- "name": "Cmder",
- "cmd": ["C:/cmder/cmder.exe", "/SINGLE", "$cwd"],
- "platform": "windows"
- },
- {
- "name": "CMD",
- "cmd": ["cmd"],
- "platform": "windows"
- }
- ]
-}
-```
-
-If you don't know what [Cmder](http://cmder.net) is, you might want to have a look (for Windows
-user). [Hyper](https://hyper.is) is also pretty cool, since it's a web based terminal.
-
-### MacOS example
-
-```json
-{
- "terminals": [
- {
- "name": "iTerm",
- "platform": "osx",
- "cmd": ["open", "-a", "iTerm", "$cwd"]
- },
- {
- "name": "Terminal",
- "platform": "osx",
- "cmd": ["open", "-a", "Terminal", "$cwd"]
- }
- ]
-}
-```
-
-If it does, doesn't and you have a solution, or needs improvement, please let me know by
-[raising an issue][new-issue].
-
-!!! Tip
- If none of these works for you, and you don't know how to configure this, you can always use
- Will Bond's package [Terminal][] and [hide this option (open terminal here)](references/settings.md)
-
-## Open In Explorer
-
-Command: `fm_open_in_explorer`
-
-This command simply opens the selected item(s) in your file explorer (or finder if you're on mac).
-It'll open the current file if it's run from the command palette.
-
-[new-issue]: https://github.com/math2001/FileManager/issues/new
-[contribution-guide]: https://github.com/math2001/FileManager#contributing
-[Terminal]: https://packagecontrol.io/packages/Terminal
diff --git a/docs/contributing.md b/docs/contributing.md
deleted file mode 100644
index 42ca869..0000000
--- a/docs/contributing.md
+++ /dev/null
@@ -1,132 +0,0 @@
-You want to contribute to this package? Great!
-
-If you want to contribute to the documentation, you're at the right place.
-Otherwise, you should have a look at [the readme][0]
-
-The documentation is written using [mkdocs][]. So, if you want to just fix a typo for example, you
-might not need to download everything, just edit the corresponding markdown file (it's *really*
-simple), and if you're a bit careful, it should be all right. But as soon as you start making some
-bigger changes, please do the following to have a preview to know how it's going to look like.
-
-Whichever option you chose, you first need to fork this repo.
-
-!!! note
- You can just raise an issue on the [GitHub issue tracker][issues] to request a fix in the docs,
- it's up to you
-
-## Install `mkdocs`
-
-So, you want to make big changes? Or you just want to have the beautiful material theme on your
-computer :smile:
-
-So, here's how to get going:
-
-!!! note
- You'll need Python installed on your system. It works with both `2` and `3`.
-
-```sh
-$ git clone
-$ cd FileManager
-$ virtualenv venv
-$ source venv/bin/activate # Windows: .\venv\Scripts\activate.bat
-$ pip install -r requirements.txt
-```
-
-> I don't have pip!
-
-Quickly, pip is a package manager for python. You can install it by saving this script:
-[get-pip.py][get-pip] and running it like so
-
-```sh
-$ python get-pip.py
-```
-
-> I don't have virtualenv!
-
-Well, you can install it by using `pip` like so:
-
-```sh
-$ pip install virtualenv
-```
-
-Once you have this installed, you have access to the command `mkdocs`.
-
-## Make your changes!
-
-Now, you need to create a new branch, with the "name" of what your adding. For
-example:
-
-```sh
-$ git checkout -b improve-fm-create-explanation
-```
-
-Make your changes. You can preview them in your browser by running:
-
-```sh
-$ mkdocs serve
-```
-
-Now, commit your changes, and push them. In this case, it'd be:
-
-```sh
-$ git push origin improve-fm-create-explanation
-```
-
-And then, just send a pull request :wink:
-
-!!! note
- If you're creating a new page, you'll need to add it the `mkdocs.yml` `pages` object.
-
- ```yaml
- pages:
- - pagename: page/path.md
- ```
-
-## Convention
-
-To keep this doc enjoyable to edit, here are the conventions that it has to respect:
-
-- keep the line length under 100 chars (`\n` included). I advice you to add this to your project
-settings: `rulers: [99]`. Tables are the only exception. URLs are not, because you can specify
-them at the bottom of the file — [more info][md-cheat-sheet]
-- prefer *files* link instead of *URL* link. You can do this: `[my link](relative/path/to/file.md)`
-Mkdocs will convert it to the valid URL for you
-- use `!!!` block with avidity! Na, not *that* much, but don't hesitate to use them, it brings
-rhythm to the doc, which make it more enjoyable to read. — [more info][admonition]
-- use fenced code block: ``` — [more info][codehilite]
-
-!!! warning
- Those convention haven't been respected since the beginning.
-
-### Recommended `.sublime-project` file
-
-```json
-{
- "folders":
- [
- {
- "path": "C:\\Users\\math\\AppData\\Roaming\\Sublime Text 3\\Packages\\FileManager",
- "folder_exclude_patterns": [".sublime", "FMCommands", "messages", "send2trash", "site",
- "tests"],
- "file_exclude_patterns": ["messages.json", "*.py"]
- }
- ],
- "settings":
- {
- "save_on_focus_lost": false,
- "spell_check": true,
- "rulers": [99]
- }
-}
-
-```
-
-[0]: https://github.com/math2001/FileManager#contributing
-[1]: http://www.mkdocs.org/#installation
-[get-pip]: https://bootstrap.pypa.io/get-pip.py
-[mkdocs]: http://www.mkdocs.org/
-[admonition]: http://squidfunk.github.io/mkdocs-material/extensions/admonition/#usage
-[md-cheat-sheet]: https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#links
-[code-hilite]: http://squidfunk.github.io/mkdocs-material/extensions/codehilite/#usage
-[issues]: https://github.com/math2001/FileManager/issues
-[codehilite]: http://squidfunk.github.io/mkdocs-material/extensions/codehilite/#usage
diff --git a/docs/getting-started.md b/docs/getting-started.md
deleted file mode 100644
index ed91e4e..0000000
--- a/docs/getting-started.md
+++ /dev/null
@@ -1,72 +0,0 @@
-## Installation
-
-### Using Package Control
-
-You can really easily install FileManager by using [Package Control][pck-con].
-
-If it's not already, you need to [install it][install-pck-con] first.
-
-!!! note
- If you're using the latest build of Sublime Text 3, you can just do
- *Tools → Install Package Control…*
-
-- Open up the command palette (ctrl+shift+p)
-- Search up `Package Control: Install Package` (might take a few seconds)
-- In the panel that just showed up, search for `FileManager`
-
-Done! You have now access to every single features of FileManager! :wink:
-
-### Using `git`
-
-```sh
-$ cd "%APPDATA%\Sublime Text 3\Packages" # on Windows
-$ cd ~/Library/Application\ Support/Sublime\ Text\ 3 # on Mac
-$ cd ~/.config/sublime-text-3 # on Linux
-
-$ git clone "https://github.com/math2001/FileManager"
-```
-
-> So, which one do I pick?!
-
-I depends of what you want to do. If you want to just use FileManager, pick the first solution,
-you'll get every update automatically. But if you want to contribute, then choose the second
-solution.
-
-## Usage
-
-Here's a few tips that should get you started:
-
-### Create
-
-Press alt+n to create a file relative to the current opened folder, or, if there is
-none, the current view, or finally `C:/Users/` (`~` for the purists) if no view's
-open
-
-### Use the auto completion
-
-Press tab to go through the auto completion (and shift+tab to go
-backwards)
-
-### Use the aliases
-
-Create and use some [aliases](references/aliases.md)! You already have plenty! For example, you
-have `$packages`. Try it out!
-
-### Use the "browser"
-
-Try to create (alt+n) a folder that *already* exists. You'll see, you're computer will
-dance the samba! Na, just kidding, but really, give it a go!
-
-### Bye bye menus!
-
-All the command are available from the command palette! `rename`, `move`, `duplicate`, etc
-
-!!! tip
- Always prefer the command palette to the menus. You'll be *much* faster. You can even
- [add your own items][]!
-
-Here's the next step: all about every FileManager's [commands](commands.md)
-
-[add your own items]: http://docs.sublimetext.info/en/latest/extensibility/command_palette.html
-[pck-con]: https://packagecontrol.io/
-[install-pck-con]: https://packagecontrol.io/installation
diff --git a/docs/index.md b/docs/index.md
deleted file mode 100644
index 2d95002..0000000
--- a/docs/index.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# Welcome to FileManager's Documentation!
-
-
-
-FileManager is a plugin for [Sublime Text 3][st3] that helps you manage your files and folders
-*from* Sublime Text.
-
-Let's [get started](getting-started.md)!
-
-!!! warning
- This documentation is still a work in progress, but you can find a significant amount of
- information!
-
-[st3]: http://sublimetext.com/
diff --git a/docs/license.md b/docs/license.md
deleted file mode 100644
index d431368..0000000
--- a/docs/license.md
+++ /dev/null
@@ -1,13 +0,0 @@
-This project is published under MIT license.
-
-> The MIT License is a permissive license that is short and to the point. It lets people do anything they want with your code as long as they provide attribution back to you and don’t hold you liable.
->
-> — *from [choosealicense.com](http://choosealicense.com), by [GitHub](https://github.com)*
-
-Copyright 2017 Mathieu PATUREL
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/docs/references/aliases.md b/docs/references/aliases.md
deleted file mode 100644
index b038024..0000000
--- a/docs/references/aliases.md
+++ /dev/null
@@ -1,200 +0,0 @@
-## Why should you use aliases?
-
-For example, if you'd like to create file in the Sublime Text `Packages` directory, on Windows,
-you'd have to type `~/AppData/Roaming/Sublime Text 3/Packages` and then, the name/path of your
-file. Because you have access to those aliases
-
-| Alias Name | Value (changes, that's the good part :wink:) |
-|---------------------|-------------------------------------------------------------------------------------------------------|
-| `project_extension` | `sublime-project` |
-| `project_name` | `FileManagerDocs.sublime-project` |
-| `file_name` | `Aliases.md` |
-| `packages` | `C:\Users\math\AppData\Roaming\Sublime Text 3\Packages` |
-| `project_base_name` | `FileManagerDocs` |
-| `file_base_name` | `Aliases` |
-| `file` | `C:\Users\math\AppData\Roaming\Sublime Text 3\Packages\FileManagerDocs\wiki\Aliases.md` |
-| `folder` | `C:\Users\math\AppData\Roaming\Sublime Text 3\Packages\FileManagerDocs` |
-| `file_extension` | `md` |
-| `project_path` | `C:\Users\math\AppData\Roaming\Sublime Text 3\Packages\User\Projects` |
-| `file_path` | `C:\Users\math\AppData\Roaming\Sublime Text 3\Packages\FileManagerDocs\wiki` |
-| `project` | `C:\Users\math\AppData\Roaming\Sublime Text 3\Packages\User\Projects\FileManagerDocs.sublime-project` |
-| `platform` | `Windows` |
-
-You can just type `$packages` and it's the *exact* same. Sounds good? Then keep reading
-
-!!! note
- The values are the ones I get when, as you can see, I'm editing this page (`Aliases.md`),
- I'm on Windows, the project name is `FileManagerDocs.sublime-project` etc...
-
-So, the table above shows all the aliases you have access to by default when you use any input
-shown by FileManager.
-
-When you want to use those prefixes, you have to prefix them with a `$`, like so: `$packages`,
-`$project_base_name`, etc.
-
-## Usage
-
-!!! note
- This variable system is exactly the same as the *snippets* variables. So, if you already know
- how to use them, then you can skip this part. Otherwise, then keep reading, what are you
- waiting for? :laughing:
-
-
-As I just said earlier, every aliases have to be prefixed by a `$`. But you can also wrap the
-alias' name with some `{curly braces}`, with the `$`, like so: `${my var}`.
-
-When should you use curly braces? When there is character in the alias name that aren't normally
-allowed (such as spaces).
-
-```
-string: "Hello $var!"
-aliases:
- - "var": "world"
-
-result: "Hello world!"
-
-string: "Hello ${my var}!"
-aliases:
- - "my var": "world"
-
-result: "Hello world!"
-```
-
-### What if I try to use an alias that doesn't exists?
-
-The default value of every aliases are an empty string `''`. So, it will be replaced by an empty
-string.
-
-```
-string: "Hello ${world}"
-aliases:
- - "something": "a value"
-
-result: "Hello "
-
-```
-
-### Changing the default value
-
-If you want to change the default value, in case the alias is not defined, you can do it like so:
-`${my var:default value}`
-
-```
-string: "${my undefined var:my default value} and some text"
-aliases:
-result: "my default value and some text"
-
-string: "${my undefined var:my default value} and some text"
-aliases:
- - "my undefined var": "hello"
-result: "hello and some text"
-```
-
-### Escaping
-
-> What if I want to use a **literal** `$`?
-
-Just prefix it by an other `$`!
-
-```
-string: "Hello $$var"
-aliases:
- - var: "it doesn't matter"
-result: "Hello $$var"
-```
-
-!!! note
- the function `sublime.expand_variables` escape the `$` using a backslash (`\`). So, for the
- snippets, you'd have to escape with a `\`. The problem is that FileManager auto replaces the
- backslash by forward slashes (because of Windows), and because `$` can be in a file name,
- there's no way to tell if it's an escaped dollar sign, or a path.
-
-### Nesting
-
-You can nest them, like so: `${var1:${var2:default}}`.
-
-### Regex and format string: substitutions
-
-This part is, just as nesting, and default values, probably not of any use *for FileManager*.
-I just wanted to mention it because it's useful for the snippets. You can find more info about it
-on [the community powered unofficial documentation][undocs-snippet]
-
-## Real example
-
-For example, if you run the `fm_create` command (alt+n):
-
-```
-$packages/FileManager/FMcommands
-```
-
-It will open the ["browser"](../commands.md#the-browser) listing all the commands of FileManager,
-(because each of them are in a separated file).
-
-## Custom aliases
-
-This is the good part. In your [settings](settings.md), you can specify an option: `aliases`. It
-has to be an object.
-
-```json
-"aliases": {
- "name": "value (with other $aliases if you want to)"
-}
-```
-
-!!! warning
- In the name, **do not specify the prefixing `$`**. It won't work otherwise.
-
-In your alias' value, you can use other aliases. And those aliases can use others, etc... It's
-recursive, there's no limit (almost).
-
-
-```js
-"aliases": {
- "st": "$packages", // because being lazy is the first quality of a programmer ;)
- "stu": "$st/User",
-}
-```
-
-You see? It's fairly simple, but it saves (at least for me) a fair bit of time! (because I love
-having a look at the plugins code, okay, but I'm sure you'll find a use too!)
-
-### Watch out for infinite loops!
-
-Because aliases can "call" each other, it can make an infinite loop... And you don't want this.
-
-#### An example of infinite loop
-
-```json
-"aliases": {
- "first": "include $second",
- "second": "include $first"
-}
-```
-
-As you can see, they're going to call each other over and over again. So, an error message will pop
-up, telling you that there's been an infinite loop, and you need to check your aliases. It will
-also open your default browser right here. If you want to disable this last behaviour, add this to
-your [settings](settings.md):
-
-```json
-"open_help_on_alias_infinite_loop": false,
-```
-
-!!! note
- The limit is `100`. If there is more than 100 recursions, it will stop, and show up the error
- message, as explained earlier.
-
-
-Watch out for the viscous ones! This one is fairly simple, there's only 2 steps.
-But here's a not-so-well-intentioned one:
-
-```json
-"aliases": {
- "first": "include $second",
- "second": "hello $third",
- "third": "show $forth",
- "forth": "loop $first"
-}
-```
-
-[undocs-snippet]: http://docs.sublimetext.info/en/latest/extensibility/snippets.html#substitutions
diff --git a/docs/references/auto-completion.md b/docs/references/auto-completion.md
deleted file mode 100644
index 74efaca..0000000
--- a/docs/references/auto-completion.md
+++ /dev/null
@@ -1,42 +0,0 @@
-All the input that are created from File Manager has an auto completions system. There is few things that you can change, but let's start with the beginning.
-
-Say you have the following structure:
-
-```
-root/
- img/
- favicon.png
-
- styles/
- stylus/
- main.styl
- css/
- main.css
-
- scripts/
- coffee/
- main.coffee
- js/
- main.js
-
- index.html
-```
-
-If you want to create a new script, you're going to have to type `scripts/coffee/mynewscript.coffee`. But, if you just type `sc` and then press tab, you'll see that `scripts/` automatically replace the `sc`, and you can type `co` press tab, `coffee` will replace the `co`. I say replace because it is case **insensitive**. If you type `ST`, it will replace it by `styles` (in lower case).
-
-Here's a little gif to show you:
-
-
-
-!!! note
- You might be wondering why I don't need to type the `>` after the index. It simply because I
- changed this symbol to a space: ` `. You can do this by change the settings
- `index_folder_separator`. Here's where [it's documented][index_folder_separator]
-
-### Options
-
-- `case_sensitive`: defines if the completion case sensitive. (default to `false`)
-- `complete_with_files_too`: If you want the auto completion to use complete with files too (default to `true`)
-- `pick_first`: only relevant if `complete_with_files_too` is `true`. Define what to choose first if at least one folder and one file are available for completion. The valid values: `files`, `folders` or `null`. (default to `folders`)
-
-[index_folder_separator]: http://127.0.0.1:8000/commands/#changing-the-symbol
diff --git a/docs/references/settings.md b/docs/references/settings.md
deleted file mode 100644
index cf95ae0..0000000
--- a/docs/references/settings.md
+++ /dev/null
@@ -1,69 +0,0 @@
-When, in this documentation, I'm talking about settings *in general*, I'm talking about FileManager's settings.
-
-## Quick reminder
-
-There's two "type" of settings.
-
-#### 1: The global settings. Here's the hierarchy:
-
-> Below, you can see the order in which Sublime Text would process a hypothetical hierarchy of settings for Python files on Windows:
->
-> 1. Packages/Default/Preferences.sublime-settings
-> 2. Packages/Default/Preferences (Windows).sublime-settings
-> 3. Packages/AnyOtherPackage/Preferences.sublime-settings
-> 4. Packages/AnyOtherPackage/Preferences (Windows).sublime-settings
-> 5. Packages/User/Preferences.sublime-settings
-> 6. Settings from the current project
-> 7. Packages/Python/Python.sublime-settings
-> 8. Packages/Python/Python (Windows).sublime-settings
-> 9. Packages/User/Python.sublime-settings
-> 10. Session data for the current file
-> 11. Auto-adjusted settings
-
-> *– from [the unofficial docs](http://docs.sublimetext.info/en/latest/customization/settings.html#the-settings-hierarchy) (Thanks a lot)*
-
-#### 2: The packages settings.
-
-They don't affect anything, except ... the plugin. They have 2 files, with the same name: one in the package folder, the other in you `User` directory. This is the case for FileManager. And this file is called ... `FileManager.sublime-settings`. So, the file in the package directory is the default one, and the one in the user directory **overwrites** them.
-
-### So, which one are you talking about then?
-
-The second one.
-
-### How do I edit them?
-
-There's a few different ways:
-
-- `Preferences -> Packages Settings -> FileManager`
-- Open the command palette (ctrl+shift+p), and find `Preferences: File Manager Settings`
-
-The file on the left is the default one (don't edit it, just look at it), and the one on the right is yours, have fun with it!
-
-### An example to make sure you understand...
-
-> In your [settings](settings.md), you can specify an option: `aliases`. It has to be an object.
-
-
- In this part, I meant...
- The FileManager's settings (the second one)
-
-
-****
-
-## A few useful settings
-
-This section is going to show you different settings that aren't specific to any command, that's
-why they have they're own.
-
-- `explicitly_refresh_sidebar` Each time you run a command that affects any file, if this option
-is set to true, FileManager will refresh the sidebar for you. Note that you can do this by running
-`Project: Refresh Folders` in the command palette.
-- `menu_without_distraction` When a FileManager's command is not enabled, it will still appear in
-the sidebar's context menu, except if you set this option to `true`.
-- `show_*_command` Each FileManager's command has a settings starting with `show_`, the command
-name without the `fm_` and finishing by `_command`. If set to `false`, this command
-will *always* be hidden (in the command palette, and the context menus)
-
-!!! note
- To know the command name of a FileManager's command, just refer to the
- [command page](../commands.md) page. It's mentioned below each main title.
diff --git a/docs/references/templates.md b/docs/references/templates.md
deleted file mode 100644
index 1ea1e8e..0000000
--- a/docs/references/templates.md
+++ /dev/null
@@ -1,47 +0,0 @@
-## What is this?
-
-When you create a new file, a template is inserted. For now, FileManager chooses which template it should insert using the extension. If you're trying to create a `.py` file, it will look for a template that has the extension `.py`.
-
-You're probably a bit confused right now, so let's clarify this.
-
-#### `${packages}/User/.FileManager/template.*`
-
-You're template are stored in the `.FileManager` folder, inside your Sublime Text `User` directory. If you have a look, it should be empty.
-
-A template will be a file called `template.` plus the extension you want it to be active with.
-
-So, for example, if you create a file called `template.py` inside the the `.FileManager` directory with this content:
-
-```python
-# -*- encoding: utf-8 -*-
-
-# this is my template
-```
-
-Each time you're going to create a new python file (with the extension `.py`), this content will be inserted as soon as it is opened.
-
-Now, some of you might wondering: *why don't FileManager write the file with the right content, and **then** open it?*. Well, this the good part.
-
-#### Your template is in fact... **snippets**!
-
-Yes, they're in fact snippets! If you don't know how to use them, I strongly recommend having a look at [the unofficial documentation about snippets](http://docs.sublimetext.info/en/latest/extensibility/snippets.html).
-
-## Create/edit templates from Sublime Text
-
-You can create and edit your templates from Sublime Text.
-
-#### Create
-
-Open up the command palette, and in there, you should be able to find `File Manager: Create Template`.
-
-If you pick this option, an input will appear with the text `template.`. Add the extension that you want, and it will create the template (if it already exists, it will simply open it)
-
-Now, just edit the file, and you're done! Your template has been edited.
-
-#### List
-
-Open up the command palette, and in there, you should be able to find `File Manager: List Templates`.
-
-It will open up the browser that you can get in the [create](Commands#create-fm_create) command, listing all your templates. Just pick one to edit it.
-
-Here you go! Hope you enjoy it! If you do, please let others people know about it!
diff --git a/docs/references/type-of-path.md b/docs/references/type-of-path.md
deleted file mode 100644
index 1bd17e1..0000000
--- a/docs/references/type-of-path.md
+++ /dev/null
@@ -1,11 +0,0 @@
-On window, paths looks bad, and are not agreeable to type. On, Linux, it's different. So, user friendly path are path that are inspired by Linux. Computer friendly path are path that are valid for a computer, depending on the OS.
-
-# Example on window
-
-| Friendly form | Computer form |
-|----------------------|---------------------------------------|
-| `~/folder/file.txt` | `C:\Users\\folder\file.txt` |
-| `C:\Users\math\here` | `C:\Users\math\here` |
-
-
-You'd like to use aliases? Have a look at the [aliases page](Aliases) then!
diff --git a/getting-started/index.html b/getting-started/index.html
new file mode 100755
index 0000000..e11db47
--- /dev/null
+++ b/getting-started/index.html
@@ -0,0 +1,657 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Getting stated - FileManager
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
$ cd"%APPDATA%\Sublime Text 3\Packages"# on Windows
+$ cd ~/Library/Application\ Support/Sublime\ Text\ 3# on Mac
+$ cd ~/.config/sublime-text-3 # on Linux
+
+$ git clone "https://github.com/math2001/FileManager"
+
+
+
+
+
So, which one do I pick?!
+
+
I depends of what you want to do. If you want to just use FileManager, pick the first solution,
+you'll get every update automatically. But if you want to contribute, then choose the second
+solution.
Press alt+n to create a file relative to the current opened folder, or, if there is
+none, the current view, or finally C:/Users/<your username> (~ for the purists) if no view's
+open
This documentation is still a work in progress, but you can find a significant amount of
+information!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libs/input_for_path.py b/libs/input_for_path.py
deleted file mode 100644
index d3dc72d..0000000
--- a/libs/input_for_path.py
+++ /dev/null
@@ -1,382 +0,0 @@
-import os
-
-import sublime
-
-from .pathhelper import computer_friendly, user_friendly
-from .sublimefunctions import sm, transform_aliases
-
-
-def set_status(view, key, value):
- if view:
- view.set_status(key, value)
- else:
- sm(value)
-
-
-def get_entire_text(view):
- return view.substr(sublime.Region(0, view.size()))
-
-
-def StdClass(name="Unknown"):
- # add the str() function because of the unicode in Python 2
- return type(str(name).title(), (), {})
-
-
-class InputForPath(object):
- STATUS_KEY = "input_for_path"
-
- def __init__(
- self,
- caption,
- initial_text,
- on_done,
- on_change,
- on_cancel,
- create_from,
- with_files,
- pick_first,
- case_sensitive,
- log_in_status_bar,
- log_template,
- browser_action={},
- start_with_browser=False,
- no_browser_action=False,
- browser_index=None,
- ):
- self.user_on_done = on_done
- self.user_on_change = on_change
- self.user_on_cancel = on_cancel
- self.caption = caption
- self.initial_text = initial_text
- self.log_template = log_template
- self.browser_action = browser_action
- self.no_browser_action = no_browser_action
- self.browser_index = browser_index
-
- self.create_from = create_from
- if self.create_from:
- self.create_from = computer_friendly(self.create_from)
- if not os.path.isdir(self.create_from):
- if os.path.exists(self.create_from):
- sublime.error_message(
- "This path exists, but doesn't seem to be a directory. "
- " Please report this (see link in the console)"
- )
- raise ValueError(
- "This path exists, but doesn't seem to be a directory. "
- "Here's the path {0}. Please report this bug here: "
- "https://github.com/math2001/FileManager/issues".format(
- self.create_from
- )
- )
- sublime.error_message(
- "The path `create_from` should exists. {0!r} does not "
- " exists.".format(self.create_from)
- )
- raise ValueError(
- "The path create from does not exists ({0!r})".format(
- self.create_from
- )
- )
-
- self.browser = StdClass("Browser")
- self.browser.path = self.create_from
- self.browser.items = []
-
- self.with_files = with_files
- self.pick_first = pick_first
- self.case_sensitive = case_sensitive
-
- self.path_to_create_choosed_from_browsing = False
-
- self.window = sublime.active_window()
- self.view = self.window.active_view()
-
- self.log_in_status_bar = log_in_status_bar
-
- if start_with_browser:
- self.browsing_on_done()
- else:
- self.create_input()
-
- def create_input(self):
- self.prev_input_path = None
-
- self.input = StdClass("input")
- self.input.view = self.window.show_input_panel(
- self.caption,
- self.initial_text,
- self.input_on_done,
- self.input_on_change,
- self.input_on_cancel,
- )
- self.input.view.set_name("FileManager::input-for-path")
- self.input.settings = self.input.view.settings()
- self.input.settings.set("tab_completion", False)
-
- def __get_completion_for(
- self, abspath, with_files, pick_first, case_sensitive, can_add_slash
- ):
- """Return a string and list: the prefix, and the list
- of available completion in the right order"""
-
- def sort_in_two_list(items, key):
- first, second = [], []
- for item in items:
- first_list, item = key(item)
- if first_list:
- first.append(item)
- else:
- second.append(item)
- return first, second
-
- abspath = computer_friendly(abspath)
-
- if abspath.endswith(os.path.sep):
- prefix = ""
- load_items_from = abspath
- else:
- load_items_from = os.path.dirname(abspath)
- prefix = os.path.basename(abspath)
-
- items = sorted(os.listdir(load_items_from))
- items_with_right_prefix = []
-
- if not case_sensitive:
- prefix = prefix.lower()
-
- for i, item in enumerate(items):
- if not case_sensitive:
- item = item.lower()
- if item.startswith(prefix):
- # I add items[i] because it's case is never changed
- items_with_right_prefix.append(
- [items[i], os.path.isdir(os.path.join(load_items_from, items[i]))]
- )
-
- folders, files = sort_in_two_list(
- items_with_right_prefix, lambda item: [item[1], item[0]]
- )
- if can_add_slash:
- folders = [folder + "/" for folder in folders]
-
- if with_files:
- if pick_first == "folders":
- return prefix, folders + files
- elif pick_first == "files":
- return prefix, files + folders
- elif pick_first == "alphabetic":
- return prefix, sorted(files + folders)
- else:
- sublime.error_message(
- "The keyword {0!r} to define the order of completions is "
- "not valid. See the default settings.".format(pick_first)
- )
- raise ValueError(
- "The keyword {0!r} to define the order of completions is "
- "not valid. See the default settings.".format(pick_first)
- )
- else:
- return prefix, folders
-
- def input_on_change(self, input_path):
- self.input_path = user_friendly(input_path)
-
- self.input_path = transform_aliases(self.window, self.input_path)
- # get changed inputs and create_from from the on_change user function
- if self.user_on_change:
- new_values = self.user_on_change(
- self.input_path, self.path_to_create_choosed_from_browsing
- )
- if new_values is not None:
- create_from, self.input_path = new_values
- if create_from is not None:
- self.create_from = computer_friendly(create_from)
-
- def reset_settings():
- self.input.settings.erase("completions")
- self.input.settings.erase("completions_index")
-
- def replace_with_completion(completions, index, prefix=None):
- # replace the previous completion
- # with the new one (completions[index+1])
- region = [self.input.view.sel()[0].begin()]
- # -1 because of the \t
- region.append(
- region[0]
- - len(prefix if prefix is not None else completions[index])
- - 1
- )
- if self.input.settings.get("go_backwards") is True:
- index -= 1
- self.input.settings.erase("go_backwards")
- else:
- index += 1
- self.input.settings.set("completions_index", index)
- # Running fm_edit_replace will trigger this function
- # and because it is not going to find any \t
- # it's going to erase the settings
- # Adding this will prevent this behaviour
- self.input.settings.set("just_completed", True)
- self.input.view.run_command(
- "fm_edit_replace", {"region": region, "text": completions[index]}
- )
- self.prev_input_path = self.input.view.substr(
- sublime.Region(0, self.input.view.size())
- )
-
- if self.log_in_status_bar:
- path = computer_friendly(
- os.path.normpath(
- os.path.join(self.create_from, computer_friendly(self.input_path))
- )
- )
- if self.input_path != "" and self.input_path[-1] == "/":
- path += os.path.sep
- if self.log_in_status_bar == "user":
- path = user_friendly(path)
- set_status(self.view, self.STATUS_KEY, self.log_template.format(path))
-
- if not hasattr(self.input, "settings"):
- return
-
- if self.input.settings.get("ran_undo", False) is True:
- return self.input.settings.erase("ran_undo")
-
- completions = self.input.settings.get("completions", None)
- index = self.input.settings.get("completions_index", None)
-
- if index == 0 and len(completions) == 1:
- reset_settings()
- return
-
- if completions is not None and index is not None:
- # check if the user typed something after the completion
- text = input_path
- if text[-1] == "\t":
- text = text[:-1]
- if not text.endswith(tuple(completions)):
- return reset_settings()
- if "\t" in input_path:
- # there is still some completions available
- if len(completions) - 1 > index:
- return replace_with_completion(completions, index)
- if "\t" in input_path:
- before, after = self.input_path.split("\t", 1)
- prefix, completions = self.__get_completion_for(
- abspath=computer_friendly(os.path.join(self.create_from, before)),
- with_files=self.with_files,
- pick_first=self.pick_first,
- case_sensitive=self.case_sensitive,
- can_add_slash=after == "" or after[0] != "/",
- )
-
- if not completions:
- return
-
- self.input.settings.set("completions", completions)
- self.input.settings.set("completions_index", -1)
-
- replace_with_completion(completions, -1, prefix)
-
- def input_on_done(self, input_path):
- if self.log_in_status_bar:
- set_status(self.view, self.STATUS_KEY, "")
- # use the one returned by the on change function
- input_path = self.input_path
- computer_path = computer_friendly(os.path.join(self.create_from, input_path))
- # open browser
- if os.path.isdir(computer_path):
- self.browser.path = computer_path
- return self.browsing_on_done()
- else:
- self.user_on_done(computer_path, input_path)
-
- def input_on_cancel(self):
- active_view = self.window.active_view()
- if active_view.file_name() in [
- os.path.join(self.browser.path, item) for item in self.browser.items
- ]:
- active_view.close()
- set_status(self.view, self.STATUS_KEY, "")
- if self.user_on_cancel:
- self.user_on_cancel()
-
- def open_in_transient(self, index):
- if self.no_browser_action is False and index < 2:
- return
- if not os.path.isfile(
- os.path.join(self.browser.path, self.browser.items[index])
- ):
- return
- self.window.open_file(
- os.path.join(self.browser.path, self.browser.items[index]),
- sublime.TRANSIENT,
- )
-
- def browsing_on_done(self, index=None):
- if index == -1:
- return self.input_on_cancel()
-
- if self.no_browser_action is False and index == 0:
- # create from the position in the browser
- self.create_from = self.browser.path
- self.path_to_create_choosed_from_browsing = True
- if self.browser_action.get("func", None) is None:
- return self.create_input()
- else:
- return self.browser_action["func"](self.create_from, None)
- elif (self.no_browser_action is True and index == 0) or (
- index == 1 and self.no_browser_action is False
- ):
- self.browser.path = os.path.normpath(os.path.join(self.browser.path, ".."))
- elif index is not None:
- self.browser.path = os.path.join(
- self.browser.path, self.browser.items[index]
- )
-
- if os.path.isfile(self.browser.path):
- set_status(self.view, self.STATUS_KEY, "")
- return self.window.open_file(self.browser.path)
-
- folders, files = [], []
- for item in os.listdir(self.browser.path):
- if os.path.isdir(os.path.join(self.browser.path, item)):
- folders.append(item + "/")
- else:
- files.append(item)
-
- if self.no_browser_action:
- self.browser.items = ["[cmd] .."] + folders + files
- elif self.browser_action.get("title", None) is not None:
- self.browser.items = (
- ["[cmd] " + self.browser_action["title"], "[cmd] .."] + folders + files
- )
- else:
- self.browser.items = (
- ["[cmd] Create from here", "[cmd] .."] + folders + files
- )
-
- set_status(
- self.view,
- self.STATUS_KEY,
- "Browsing at: {0}".format(user_friendly(self.browser.path)),
- )
- if self.browser_index is not None:
- index = self.browser_index
- elif self.no_browser_action:
- index = 0
- elif len(folders) + len(files) == 0:
- # browser actions are enabled, but there just aren't any folder or
- # files
- index = 0
- else:
- index = 2
-
- self.window.show_quick_panel(
- self.browser.items,
- self.browsing_on_done,
- sublime.KEEP_OPEN_ON_FOCUS_LOST,
- index,
- self.open_in_transient,
- )
diff --git a/libs/pathhelper.py b/libs/pathhelper.py
deleted file mode 100644
index 434b58d..0000000
--- a/libs/pathhelper.py
+++ /dev/null
@@ -1,66 +0,0 @@
-import genericpath
-import os
-
-
-def user_friendly(path):
- path = computer_friendly(path)
- return path.replace(os.path.expanduser("~"), "~").replace(os.path.sep, "/")
-
-
-def computer_friendly(path):
- """Also makes sure the path is valid"""
- if "~" in path:
- path = path[path.rfind("~") :]
- if ":" in path:
- path = path[path.rfind(":") - 1 :]
- path = path.replace("~", os.path.expanduser("~"))
- path = path.replace("/", os.path.sep)
- return path
-
-
-def commonpath(paths):
- """Given a sequence of path names, returns the longest common sub-path."""
-
- if not paths:
- raise ValueError("commonpath() arg is an empty sequence")
-
- sep = os.sep
- altsep = "/"
- curdir = "."
-
- try:
- drivesplits = [
- os.path.splitdrive(p.replace(altsep, sep).lower()) for p in paths
- ]
- split_paths = [p.split(sep) for d, p in drivesplits]
-
- try:
- (isabs,) = set(p[:1] == sep for d, p in drivesplits)
- except ValueError:
- raise ValueError("Can't mix absolute and relative paths")
-
- # Check that all drive letters or UNC paths match. The check is made
- # only now otherwise type errors for mixing strings and bytes would not
- # be caught.
- if len(set(d for d, p in drivesplits)) != 1:
- raise ValueError("Paths don't have the same drive")
-
- drive, path = os.path.splitdrive(paths[0].replace(altsep, sep))
- common = path.split(sep)
- common = [c for c in common if c and c != curdir]
-
- split_paths = [[c for c in s if c and c != curdir] for s in split_paths]
- s1 = min(split_paths)
- s2 = max(split_paths)
- for i, c in enumerate(s1):
- if c != s2[i]:
- common = common[:i]
- break
- else:
- common = common[: len(s1)]
-
- prefix = drive + sep if isabs else drive
- return prefix + sep.join(common)
- except (TypeError, AttributeError):
- genericpath._check_arg_types("commonpath", *paths)
- raise
diff --git a/libs/send2trash/LICENSE b/libs/send2trash/LICENSE
deleted file mode 100644
index 8e4eb81..0000000
--- a/libs/send2trash/LICENSE
+++ /dev/null
@@ -1,10 +0,0 @@
-Copyright (c) 2017, Virgil Dupras
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- * Neither the name of Hardcoded Software Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/libs/send2trash/__init__.py b/libs/send2trash/__init__.py
deleted file mode 100644
index 3a8c884..0000000
--- a/libs/send2trash/__init__.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright 2013 Hardcoded Software (http://www.hardcoded.net)
-
-# This software is licensed under the "BSD" License as described in the "LICENSE" file,
-# which should be included with this package. The terms are also available at
-# http://www.hardcoded.net/licenses/bsd_license
-
-import sys
-
-from .exceptions import TrashPermissionError
-
-if sys.platform == 'darwin':
- from .plat_osx import send2trash
-elif sys.platform == 'win32':
- from .plat_win import send2trash
-else:
- try:
- # If we can use gio, let's use it
- from .plat_gio import send2trash
- except ImportError:
- # Oh well, let's fallback to our own Freedesktop trash implementation
- from .plat_other import send2trash
diff --git a/libs/send2trash/compat.py b/libs/send2trash/compat.py
deleted file mode 100644
index 8092d0a..0000000
--- a/libs/send2trash/compat.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2017 Virgil Dupras
-
-# This software is licensed under the "BSD" License as described in the "LICENSE" file,
-# which should be included with this package. The terms are also available at
-# http://www.hardcoded.net/licenses/bsd_license
-
-import sys
-import os
-
-PY3 = sys.version_info[0] >= 3
-if PY3:
- text_type = str
- binary_type = bytes
- if os.supports_bytes_environ:
- # environb will be unset under Windows, but then again we're not supposed to use it.
- environb = os.environb
-else:
- text_type = unicode
- binary_type = str
- environb = os.environ
diff --git a/libs/send2trash/exceptions.py b/libs/send2trash/exceptions.py
deleted file mode 100644
index 4132a6d..0000000
--- a/libs/send2trash/exceptions.py
+++ /dev/null
@@ -1,25 +0,0 @@
-import errno
-from .compat import PY3
-
-if PY3:
- _permission_error = PermissionError
-else:
- _permission_error = OSError
-
-class TrashPermissionError(_permission_error):
- """A permission error specific to a trash directory.
-
- Raising this error indicates that permissions prevent us efficiently
- trashing a file, although we might still have permission to delete it.
- This is *not* used when permissions prevent removing the file itself:
- that will be raised as a regular PermissionError (OSError on Python 2).
-
- Application code that catches this may try to simply delete the file,
- or prompt the user to decide, or (on Freedesktop platforms), move it to
- 'home trash' as a fallback. This last option probably involves copying the
- data between partitions, devices, or network drives, so we don't do it as
- a fallback.
- """
- def __init__(self, filename):
- _permission_error.__init__(self, errno.EACCES, "Permission denied",
- filename)
diff --git a/libs/send2trash/plat_osx.py b/libs/send2trash/plat_osx.py
deleted file mode 100644
index 4ac830e..0000000
--- a/libs/send2trash/plat_osx.py
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 2017 Virgil Dupras
-
-# This software is licensed under the "BSD" License as described in the "LICENSE" file,
-# which should be included with this package. The terms are also available at
-# http://www.hardcoded.net/licenses/bsd_license
-
-from __future__ import unicode_literals
-
-from ctypes import cdll, byref, Structure, c_char, c_char_p
-from ctypes.util import find_library
-
-from .compat import binary_type
-
-Foundation = cdll.LoadLibrary(find_library('Foundation'))
-CoreServices = cdll.LoadLibrary(find_library('CoreServices'))
-
-GetMacOSStatusCommentString = Foundation.GetMacOSStatusCommentString
-GetMacOSStatusCommentString.restype = c_char_p
-FSPathMakeRefWithOptions = CoreServices.FSPathMakeRefWithOptions
-FSMoveObjectToTrashSync = CoreServices.FSMoveObjectToTrashSync
-
-kFSPathMakeRefDefaultOptions = 0
-kFSPathMakeRefDoNotFollowLeafSymlink = 0x01
-
-kFSFileOperationDefaultOptions = 0
-kFSFileOperationOverwrite = 0x01
-kFSFileOperationSkipSourcePermissionErrors = 0x02
-kFSFileOperationDoNotMoveAcrossVolumes = 0x04
-kFSFileOperationSkipPreflight = 0x08
-
-class FSRef(Structure):
- _fields_ = [('hidden', c_char * 80)]
-
-def check_op_result(op_result):
- if op_result:
- msg = GetMacOSStatusCommentString(op_result).decode('utf-8')
- raise OSError(msg)
-
-def send2trash(path):
- if not isinstance(path, binary_type):
- path = path.encode('utf-8')
- fp = FSRef()
- opts = kFSPathMakeRefDoNotFollowLeafSymlink
- op_result = FSPathMakeRefWithOptions(path, opts, byref(fp), None)
- check_op_result(op_result)
- opts = kFSFileOperationDefaultOptions
- op_result = FSMoveObjectToTrashSync(byref(fp), None, opts)
- check_op_result(op_result)
diff --git a/libs/send2trash/plat_other.py b/libs/send2trash/plat_other.py
deleted file mode 100644
index 624eb99..0000000
--- a/libs/send2trash/plat_other.py
+++ /dev/null
@@ -1,192 +0,0 @@
-# Copyright 2017 Virgil Dupras
-
-# This software is licensed under the "BSD" License as described in the "LICENSE" file,
-# which should be included with this package. The terms are also available at
-# http://www.hardcoded.net/licenses/bsd_license
-
-# This is a reimplementation of plat_other.py with reference to the
-# freedesktop.org trash specification:
-# [1] http://www.freedesktop.org/wiki/Specifications/trash-spec
-# [2] http://www.ramendik.ru/docs/trashspec.html
-# See also:
-# [3] http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
-#
-# For external volumes this implementation will raise an exception if it can't
-# find or create the user's trash directory.
-
-from __future__ import unicode_literals
-
-import errno
-import sys
-import os
-import os.path as op
-from datetime import datetime
-import stat
-try:
- from urllib.parse import quote
-except ImportError:
- # Python 2
- from urllib import quote
-
-from .compat import text_type, environb
-from .exceptions import TrashPermissionError
-
-try:
- fsencode = os.fsencode # Python 3
- fsdecode = os.fsdecode
-except AttributeError:
- def fsencode(u): # Python 2
- return u.encode(sys.getfilesystemencoding())
- def fsdecode(b):
- return b.decode(sys.getfilesystemencoding())
- # The Python 3 versions are a bit smarter, handling surrogate escapes,
- # but these should work in most cases.
-
-FILES_DIR = b'files'
-INFO_DIR = b'info'
-INFO_SUFFIX = b'.trashinfo'
-
-# Default of ~/.local/share [3]
-XDG_DATA_HOME = op.expanduser(environb.get(b'XDG_DATA_HOME', b'~/.local/share'))
-HOMETRASH_B = op.join(XDG_DATA_HOME, b'Trash')
-HOMETRASH = fsdecode(HOMETRASH_B)
-
-uid = os.getuid()
-TOPDIR_TRASH = b'.Trash'
-TOPDIR_FALLBACK = b'.Trash-' + text_type(uid).encode('ascii')
-
-def is_parent(parent, path):
- path = op.realpath(path) # In case it's a symlink
- if isinstance(path, text_type):
- path = fsencode(path)
- parent = op.realpath(parent)
- if isinstance(parent, text_type):
- parent = fsencode(parent)
- return path.startswith(parent)
-
-def format_date(date):
- return date.strftime("%Y-%m-%dT%H:%M:%S")
-
-def info_for(src, topdir):
- # ...it MUST not include a ".." directory, and for files not "under" that
- # directory, absolute pathnames must be used. [2]
- if topdir is None or not is_parent(topdir, src):
- src = op.abspath(src)
- else:
- src = op.relpath(src, topdir)
-
- info = "[Trash Info]\n"
- info += "Path=" + quote(src) + "\n"
- info += "DeletionDate=" + format_date(datetime.now()) + "\n"
- return info
-
-def check_create(dir):
- # use 0700 for paths [3]
- if not op.exists(dir):
- os.makedirs(dir, 0o700)
-
-def trash_move(src, dst, topdir=None):
- filename = op.basename(src)
- filespath = op.join(dst, FILES_DIR)
- infopath = op.join(dst, INFO_DIR)
- base_name, ext = op.splitext(filename)
-
- counter = 0
- destname = filename
- while op.exists(op.join(filespath, destname)) or op.exists(op.join(infopath, destname + INFO_SUFFIX)):
- counter += 1
- destname = base_name + b' ' + text_type(counter).encode('ascii') + ext
-
- check_create(filespath)
- check_create(infopath)
-
- os.rename(src, op.join(filespath, destname))
- f = open(op.join(infopath, destname + INFO_SUFFIX), 'w')
- f.write(info_for(src, topdir))
- f.close()
-
-def find_mount_point(path):
- # Even if something's wrong, "/" is a mount point, so the loop will exit.
- # Use realpath in case it's a symlink
- path = op.realpath(path) # Required to avoid infinite loop
- while not op.ismount(path):
- path = op.split(path)[0]
- return path
-
-def find_ext_volume_global_trash(volume_root):
- # from [2] Trash directories (1) check for a .Trash dir with the right
- # permissions set.
- trash_dir = op.join(volume_root, TOPDIR_TRASH)
- if not op.exists(trash_dir):
- return None
-
- mode = os.lstat(trash_dir).st_mode
- # vol/.Trash must be a directory, cannot be a symlink, and must have the
- # sticky bit set.
- if not op.isdir(trash_dir) or op.islink(trash_dir) or not (mode & stat.S_ISVTX):
- return None
-
- trash_dir = op.join(trash_dir, text_type(uid).encode('ascii'))
- try:
- check_create(trash_dir)
- except OSError:
- return None
- return trash_dir
-
-def find_ext_volume_fallback_trash(volume_root):
- # from [2] Trash directories (1) create a .Trash-$uid dir.
- trash_dir = op.join(volume_root, TOPDIR_FALLBACK)
- # Try to make the directory, if we lack permission, raise TrashPermissionError
- try:
- check_create(trash_dir)
- except OSError as e:
- if e.errno == errno.EACCES:
- raise TrashPermissionError(e.filename)
- raise
- return trash_dir
-
-def find_ext_volume_trash(volume_root):
- trash_dir = find_ext_volume_global_trash(volume_root)
- if trash_dir is None:
- trash_dir = find_ext_volume_fallback_trash(volume_root)
- return trash_dir
-
-# Pull this out so it's easy to stub (to avoid stubbing lstat itself)
-def get_dev(path):
- return os.lstat(path).st_dev
-
-def send2trash(path):
- if isinstance(path, text_type):
- path_b = fsencode(path)
- elif isinstance(path, bytes):
- path_b = path
- elif hasattr(path, '__fspath__'):
- # Python 3.6 PathLike protocol
- return send2trash(path.__fspath__())
- else:
- raise TypeError('str, bytes or PathLike expected, not %r' % type(path))
-
- if not op.exists(path_b):
- raise OSError("File not found: %s" % path)
- # ...should check whether the user has the necessary permissions to delete
- # it, before starting the trashing operation itself. [2]
- if not os.access(path_b, os.W_OK):
- raise OSError("Permission denied: %s" % path)
- # if the file to be trashed is on the same device as HOMETRASH we
- # want to move it there.
- path_dev = get_dev(path_b)
-
- # If XDG_DATA_HOME or HOMETRASH do not yet exist we need to stat the
- # home directory, and these paths will be created further on if needed.
- trash_dev = get_dev(op.expanduser(b'~'))
-
- if path_dev == trash_dev:
- topdir = XDG_DATA_HOME
- dest_trash = HOMETRASH_B
- else:
- topdir = find_mount_point(path_b)
- trash_dev = get_dev(topdir)
- if trash_dev != path_dev:
- raise OSError("Couldn't find mount point for %s" % path)
- dest_trash = find_ext_volume_trash(topdir)
- trash_move(path_b, dest_trash, topdir)
diff --git a/libs/send2trash/plat_win.py b/libs/send2trash/plat_win.py
deleted file mode 100644
index 5e50801..0000000
--- a/libs/send2trash/plat_win.py
+++ /dev/null
@@ -1,86 +0,0 @@
-# Copyright 2017 Virgil Dupras
-
-# This software is licensed under the "BSD" License as described in the "LICENSE" file,
-# which should be included with this package. The terms are also available at
-# http://www.hardcoded.net/licenses/bsd_license
-
-from __future__ import unicode_literals
-
-from ctypes import (windll, Structure, byref, c_uint,
- create_unicode_buffer, addressof)
-from ctypes.wintypes import HWND, UINT, LPCWSTR, BOOL
-import os.path as op
-
-from .compat import text_type
-
-kernel32 = windll.kernel32
-GetShortPathNameW = kernel32.GetShortPathNameW
-
-shell32 = windll.shell32
-SHFileOperationW = shell32.SHFileOperationW
-
-
-class SHFILEOPSTRUCTW(Structure):
- _fields_ = [
- ("hwnd", HWND),
- ("wFunc", UINT),
- ("pFrom", LPCWSTR),
- ("pTo", LPCWSTR),
- ("fFlags", c_uint),
- ("fAnyOperationsAborted", BOOL),
- ("hNameMappings", c_uint),
- ("lpszProgressTitle", LPCWSTR),
- ]
-
-
-FO_MOVE = 1
-FO_COPY = 2
-FO_DELETE = 3
-FO_RENAME = 4
-
-FOF_MULTIDESTFILES = 1
-FOF_SILENT = 4
-FOF_NOCONFIRMATION = 16
-FOF_ALLOWUNDO = 64
-FOF_NOERRORUI = 1024
-
-
-def get_short_path_name(long_name):
- if not long_name.startswith('\\\\?\\'):
- long_name = '\\\\?\\' + long_name
- buf_size = GetShortPathNameW(long_name, None, 0)
- output = create_unicode_buffer(buf_size)
- GetShortPathNameW(long_name, output, buf_size)
- return output.value[4:] # Remove '\\?\' for SHFileOperationW
-
-
-def send2trash(path):
- if not isinstance(path, text_type):
- path = text_type(path, 'mbcs')
- if not op.isabs(path):
- path = op.abspath(path)
- path = get_short_path_name(path)
- fileop = SHFILEOPSTRUCTW()
- fileop.hwnd = 0
- fileop.wFunc = FO_DELETE
- # FIX: https://github.com/hsoft/send2trash/issues/17
- # Starting in python 3.6.3 it is no longer possible to use:
- # LPCWSTR(path + '\0') directly as embedded null characters are no longer
- # allowed in strings
- # Workaround
- # - create buffer of c_wchar[] (LPCWSTR is based on this type)
- # - buffer is two c_wchar characters longer (double null terminator)
- # - cast the address of the buffer to a LPCWSTR
- # NOTE: based on how python allocates memory for these types they should
- # always be zero, if this is ever not true we can go back to explicitly
- # setting the last two characters to null using buffer[index] = '\0'.
- buffer = create_unicode_buffer(path, len(path)+2)
- fileop.pFrom = LPCWSTR(addressof(buffer))
- fileop.pTo = None
- fileop.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT
- fileop.fAnyOperationsAborted = 0
- fileop.hNameMappings = 0
- fileop.lpszProgressTitle = None
- result = SHFileOperationW(byref(fileop))
- if result:
- raise WindowsError(None, None, path, result)
diff --git a/libs/sublimefunctions.py b/libs/sublimefunctions.py
deleted file mode 100644
index e67739b..0000000
--- a/libs/sublimefunctions.py
+++ /dev/null
@@ -1,137 +0,0 @@
-import os
-
-import sublime
-
-TEMPLATE_FOLDER = None
-
-
-def md(*t, **kwargs):
- sublime.message_dialog(kwargs.get("sep", "\n").join([str(el) for el in t]))
-
-
-def sm(*t, **kwargs):
- sublime.status_message(kwargs.get("sep", " ").join([str(el) for el in t]))
-
-
-def em(*t, **kwargs):
- sublime.error_message(kwargs.get("sep", " ").join([str(el) for el in t]))
-
-
-def isST3():
- return int(sublime.version()) > 3000
-
-
-def get_settings():
- return sublime.load_settings("FileManager.sublime-settings")
-
-
-def refresh_sidebar(settings=None, window=None):
- if window is None:
- window = sublime.active_window()
- if settings is None:
- settings = window.active_view().settings()
- if settings.get("explicitly_refresh_sidebar") is True:
- window.run_command("refresh_folder_list")
-
-
-def get_template(created_file):
- """Return the right template for the create file"""
- global TEMPLATE_FOLDER
-
- if TEMPLATE_FOLDER is None:
- TEMPLATE_FOLDER = os.path.join(sublime.packages_path(), "User", ".FileManager")
- os.makedirs(TEMPLATE_FOLDER, exist_ok=True)
-
- template_files = os.listdir(TEMPLATE_FOLDER)
- for item in template_files:
- if (
- os.path.splitext(item)[0] == "template"
- and os.path.splitext(item)[1] == os.path.splitext(created_file)[1]
- ):
- with open(os.path.join(TEMPLATE_FOLDER, item)) as fp:
- return fp.read()
- return ""
-
-
-def yes_no_cancel_panel(
- message,
- yes,
- no,
- cancel,
- yes_text="Yes",
- no_text="No",
- cancel_text="Cancel",
- **kwargs
-):
- loc = locals()
- if isinstance(message, list):
- message.append("Do not select this item")
- else:
- message = [message, "Do not select this item"]
- items = [message, yes_text, no_text, cancel_text]
-
- def get_max(item):
- return len(item)
-
- maxi = len(max(items, key=get_max))
- for i, item in enumerate(items):
- while len(items[i]) < maxi:
- items[i].append("")
-
- def on_done(index):
- if index in [-1, 3] and cancel:
- return cancel(*kwargs.get("args", []), **kwargs.get("kwargs", {}))
- elif index == 1 and yes:
- return yes(*kwargs.get("args", []), **kwargs.get("kwargs", {}))
- elif index == 2 and no:
- return no(*kwargs.get("args", []), **kwargs.get("kwargs", {}))
- elif index == 0:
- return yes_no_cancel_panel(**loc)
-
- window = sublime.active_window()
- window.show_quick_panel(items, on_done, 0, 1)
-
-
-def transform_aliases(window, string):
- """Transform aliases using the settings and the default variables
- It's recursive, so you can use aliases *in* your aliases' values
- """
-
- vars = window.extract_variables()
- vars.update(get_settings().get("aliases"))
-
- def has_unescaped_dollar(string):
- start = 0
- while True:
- index = string.find("$", start)
- if index < 0:
- return False
- elif string[index - 1] == "\\":
- start = index + 1
- else:
- return True
-
- string = string.replace("$$", "\\$")
-
- inifinite_loop_counter = 0
- while has_unescaped_dollar(string):
- inifinite_loop_counter += 1
- if inifinite_loop_counter > 100:
- sublime.error_message(
- "Infinite loop: you better check your "
- "aliases, they're calling each other "
- "over and over again."
- )
- if get_settings().get("open_help_on_alias_infinite_loop", True) is True:
- sublime.run_command(
- "open_url",
- {
- "url": "https://github.com/math2001/ "
- "FileManager/wiki/Aliases "
- "#watch-out-for-infinite-loops"
- },
- )
- return string
- string = sublime.expand_variables(string, vars)
-
- return string
diff --git a/license/index.html b/license/index.html
new file mode 100755
index 0000000..273382b
--- /dev/null
+++ b/license/index.html
@@ -0,0 +1,449 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ License - FileManager
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
The MIT License is a permissive license that is short and to the point. It lets people do anything they want with your code as long as they provide attribution back to you and don’t hold you liable.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/messages.json b/messages.json
deleted file mode 100644
index ef56f9e..0000000
--- a/messages.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "install": "messages/install.txt"
-}
diff --git a/messages/1.4.5.txt b/messages/1.4.5.txt
deleted file mode 100644
index aab20be..0000000
--- a/messages/1.4.5.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-______ _ _ ___ ___
-| ___(_) | | \/ |
-| |_ _| | ___| . . | __ _ _ __ __ _ __ _ ___ _ __
-| _| | | |/ _ \ |\/| |/ _` | '_ \ / _` |/ _` |/ _ \ '__|
-| | | | | __/ | | | (_| | | | | (_| | (_| | __/ |
-\_| |_|_|\___\_| |_/\__,_|_| |_|\__,_|\__, |\___|_|
- __/ |
- |___/
-
-Support the 'platform' key for terminals in your settings. Have a look at the
-documentation for more information:
-
-https://math2001.github.io/FileManager/commands/#open-terminal-here
-
-That's it!
diff --git a/messages/install.txt b/messages/install.txt
deleted file mode 100644
index 4942a49..0000000
--- a/messages/install.txt
+++ /dev/null
@@ -1,69 +0,0 @@
-______ _ _ ___ ___
-| ___(_) | | \/ |
-| |_ _| | ___| . . | __ _ _ __ __ _ __ _ ___ _ __
-| _| | | |/ _ \ |\/| |/ _` | '_ \ / _` |/ _` |/ _ \ '__|
-| | | | | __/ | | | (_| | | | | (_| | (_| | __/ |
-\_| |_|_|\___\_| |_/\__,_|_| |_|\__,_|\__, |\___|_|
- __/ |
- |___/
-
-Thanks for installing FileManger! I hope you'll like using it!
-
-Presentation:
-~~~~~~~~~~~~~
-
-FileManager is a package that propose you different *optimized* commands for
-managing your files from Sublime Text, such as creating, opening, renaming,
-moving, duplicating, etc...
-
-First, you can have a look around at the options it added to your sidebar's
-context menu and the command palette, but you really should have a look at the
-GitHub's wiki really get 100% of FileManager.
-
-Quick Start Tips:
-~~~~~~~~~~~~~~~~~
-
-- When you're creating something (pressed alt+n for example), if your path ends
-up with a '/', it'll create a folder instead of a file.
-- Try to create a folder that already exists ;)
-- Have a quick look in here: 'Preferences → Packages Settings → FileManager'
-
-Say thanks:
-~~~~~~~~~~~
-
-Just letting me know you're enjoying this package's a great way to say thanks!
-
-To do so, you can star the GitHub repository, or send me a tweet
-(@_math2001)
-
-Troubles?
-~~~~~~~~~
-
-If you have any trouble with FileManager, don't hesitate to let me know by
-raising an issue here:
-
-https://github.com/math2001/FileManager/issues
-
-Credits:
-~~~~~~~~
-
-The ASCII FileManager has been generated using the ASCII Decorator.
-
-https://github.com/viisual/ASCII-Decorator
-
-Tip of the day: You can bind commands to modifiers-free key combination:
-
- {
- "keys": ["-", ">"],
- "command": "insert_snippet",
- "args": {
- "contents": "→ "
- }
- }
-
-Once set, each time you'll type '->', it'll insert this '→ '
-
-If you don't know how to set up shortcuts, don't worry, it's
-explained here:
-
-http://docs.sublimetext.info/en/latest/reference/key_bindings.html
diff --git a/mkdocs.yml b/mkdocs.yml
deleted file mode 100644
index cbcf5ec..0000000
--- a/mkdocs.yml
+++ /dev/null
@@ -1,49 +0,0 @@
-site_name: FileManager
-theme: material
-repo_name: math2001/FileManager
-repo_url: https://github.com/math2001/FileManager
-site_description: Sublime Text 3 Plugin FileManager's documentation
-site_author: math2001
-
-pages:
- - Home: index.md
- - Getting stated: getting-started.md
- - Commands: commands.md
- - References:
- - Auto Completion: references/auto-completion.md
- - Settings: references/settings.md
- - Templates: references/templates.md
- - Type of path: references/type-of-path.md
- - Aliases: references/aliases.md
- - Contributing: contributing.md
- - License: license.md
- - About: about.md
-
-markdown_extensions:
- - toc(permalink=true)
- - pymdownx.arithmatex
- - pymdownx.betterem(smart_enable=all)
- - pymdownx.caret
- - pymdownx.critic
- - pymdownx.emoji:
- emoji_generator: !!python/name:pymdownx.emoji.to_svg
- - pymdownx.inlinehilite
- - pymdownx.magiclink
- - pymdownx.mark
- - pymdownx.smartsymbols
- - pymdownx.superfences
- - pymdownx.tasklist(custom_checkbox=true)
- - pymdownx.tilde
- - admonition
- - codehilite
-
-extra:
- logo: imgs/FileManager-opposite.svg
- palette:
- primary: red
- accent: Deep Orange
- social:
- - type: github
- link: https://github.com/math2001
- - type: twitter
- link: https://twitter.com/_math2001
diff --git a/mkdocs/js/lunr.min.js b/mkdocs/js/lunr.min.js
new file mode 100755
index 0000000..b0198df
--- /dev/null
+++ b/mkdocs/js/lunr.min.js
@@ -0,0 +1,7 @@
+/**
+ * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 0.7.0
+ * Copyright (C) 2016 Oliver Nightingale
+ * MIT Licensed
+ * @license
+ */
+!function(){var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.7.0",t.utils={},t.utils.warn=function(t){return function(e){t.console&&console.warn&&console.warn(e)}}(this),t.utils.asString=function(t){return void 0===t||null===t?"":t.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var t=Array.prototype.slice.call(arguments),e=t.pop(),n=t;if("function"!=typeof e)throw new TypeError("last argument must be a function");n.forEach(function(t){this.hasHandler(t)||(this.events[t]=[]),this.events[t].push(e)},this)},t.EventEmitter.prototype.removeListener=function(t,e){if(this.hasHandler(t)){var n=this.events[t].indexOf(e);this.events[t].splice(n,1),this.events[t].length||delete this.events[t]}},t.EventEmitter.prototype.emit=function(t){if(this.hasHandler(t)){var e=Array.prototype.slice.call(arguments,1);this.events[t].forEach(function(t){t.apply(void 0,e)})}},t.EventEmitter.prototype.hasHandler=function(t){return t in this.events},t.tokenizer=function(e){return arguments.length&&null!=e&&void 0!=e?Array.isArray(e)?e.map(function(e){return t.utils.asString(e).toLowerCase()}):e.toString().trim().toLowerCase().split(t.tokenizer.seperator):[]},t.tokenizer.seperator=/[\s\-]+/,t.tokenizer.load=function(t){var e=this.registeredFunctions[t];if(!e)throw new Error("Cannot load un-registered function: "+t);return e},t.tokenizer.label="default",t.tokenizer.registeredFunctions={"default":t.tokenizer},t.tokenizer.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing tokenizer: "+n),e.label=n,this.registeredFunctions[n]=e},t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.registeredFunctions[e];if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");this._stack.splice(i,0,n)},t.Pipeline.prototype.remove=function(t){var e=this._stack.indexOf(t);-1!=e&&this._stack.splice(e,1)},t.Pipeline.prototype.run=function(t){for(var e=[],n=t.length,i=this._stack.length,r=0;n>r;r++){for(var o=t[r],s=0;i>s&&(o=this._stack[s](o,r,t),void 0!==o&&""!==o);s++);void 0!==o&&""!==o&&e.push(o)}return e},t.Pipeline.prototype.reset=function(){this._stack=[]},t.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Vector=function(){this._magnitude=null,this.list=void 0,this.length=0},t.Vector.Node=function(t,e,n){this.idx=t,this.val=e,this.next=n},t.Vector.prototype.insert=function(e,n){this._magnitude=void 0;var i=this.list;if(!i)return this.list=new t.Vector.Node(e,n,i),this.length++;if(en.idx?n=n.next:(i+=e.val*n.val,e=e.next,n=n.next);return i},t.Vector.prototype.similarity=function(t){return this.dot(t)/(this.magnitude()*t.magnitude())},t.SortedSet=function(){this.length=0,this.elements=[]},t.SortedSet.load=function(t){var e=new this;return e.elements=t,e.length=t.length,e},t.SortedSet.prototype.add=function(){var t,e;for(t=0;t1;){if(o===t)return r;t>o&&(e=r),o>t&&(n=r),i=n-e,r=e+Math.floor(i/2),o=this.elements[r]}return o===t?r:-1},t.SortedSet.prototype.locationFor=function(t){for(var e=0,n=this.elements.length,i=n-e,r=e+Math.floor(i/2),o=this.elements[r];i>1;)t>o&&(e=r),o>t&&(n=r),i=n-e,r=e+Math.floor(i/2),o=this.elements[r];return o>t?r:t>o?r+1:void 0},t.SortedSet.prototype.intersect=function(e){for(var n=new t.SortedSet,i=0,r=0,o=this.length,s=e.length,a=this.elements,h=e.elements;;){if(i>o-1||r>s-1)break;a[i]!==h[r]?a[i]h[r]&&r++:(n.add(a[i]),i++,r++)}return n},t.SortedSet.prototype.clone=function(){var e=new t.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},t.SortedSet.prototype.union=function(t){var e,n,i;this.length>=t.length?(e=this,n=t):(e=t,n=this),i=e.clone();for(var r=0,o=n.toArray();rp;p++)c[p]===a&&d++;h+=d/f*l.boost}}this.tokenStore.add(a,{ref:o,tf:h})}n&&this.eventEmitter.emit("add",e,this)},t.Index.prototype.remove=function(t,e){var n=t[this._ref],e=void 0===e?!0:e;if(this.documentStore.has(n)){var i=this.documentStore.get(n);this.documentStore.remove(n),i.forEach(function(t){this.tokenStore.remove(t,n)},this),e&&this.eventEmitter.emit("remove",t,this)}},t.Index.prototype.update=function(t,e){var e=void 0===e?!0:e;this.remove(t,!1),this.add(t,!1),e&&this.eventEmitter.emit("update",t,this)},t.Index.prototype.idf=function(t){var e="@"+t;if(Object.prototype.hasOwnProperty.call(this._idfCache,e))return this._idfCache[e];var n=this.tokenStore.count(t),i=1;return n>0&&(i=1+Math.log(this.documentStore.length/n)),this._idfCache[e]=i},t.Index.prototype.search=function(e){var n=this.pipeline.run(this.tokenizerFn(e)),i=new t.Vector,r=[],o=this._fields.reduce(function(t,e){return t+e.boost},0),s=n.some(function(t){return this.tokenStore.has(t)},this);if(!s)return[];n.forEach(function(e,n,s){var a=1/s.length*this._fields.length*o,h=this,u=this.tokenStore.expand(e).reduce(function(n,r){var o=h.corpusTokens.indexOf(r),s=h.idf(r),u=1,l=new t.SortedSet;if(r!==e){var c=Math.max(3,r.length-e.length);u=1/Math.log(c)}o>-1&&i.insert(o,a*s*u);for(var f=h.tokenStore.get(r),d=Object.keys(f),p=d.length,v=0;p>v;v++)l.add(f[d[v]].ref);return n.union(l)},new t.SortedSet);r.push(u)},this);var a=r.reduce(function(t,e){return t.intersect(e)});return a.map(function(t){return{ref:t,score:i.similarity(this.documentVector(t))}},this).sort(function(t,e){return e.score-t.score})},t.Index.prototype.documentVector=function(e){for(var n=this.documentStore.get(e),i=n.length,r=new t.Vector,o=0;i>o;o++){var s=n.elements[o],a=this.tokenStore.get(s)[e].tf,h=this.idf(s);r.insert(this.corpusTokens.indexOf(s),a*h)}return r},t.Index.prototype.toJSON=function(){return{version:t.version,fields:this._fields,ref:this._ref,tokenizer:this.tokenizerFn.label,documentStore:this.documentStore.toJSON(),tokenStore:this.tokenStore.toJSON(),corpusTokens:this.corpusTokens.toJSON(),pipeline:this.pipeline.toJSON()}},t.Index.prototype.use=function(t){var e=Array.prototype.slice.call(arguments,1);e.unshift(this),t.apply(this,e)},t.Store=function(){this.store={},this.length=0},t.Store.load=function(e){var n=new this;return n.length=e.length,n.store=Object.keys(e.store).reduce(function(n,i){return n[i]=t.SortedSet.load(e.store[i]),n},{}),n},t.Store.prototype.set=function(t,e){this.has(t)||this.length++,this.store[t]=e},t.Store.prototype.get=function(t){return this.store[t]},t.Store.prototype.has=function(t){return t in this.store},t.Store.prototype.remove=function(t){this.has(t)&&(delete this.store[t],this.length--)},t.Store.prototype.toJSON=function(){return{store:this.store,length:this.length}},t.stemmer=function(){var t={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},e={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",r=n+"[^aeiouy]*",o=i+"[aeiou]*",s="^("+r+")?"+o+r,a="^("+r+")?"+o+r+"("+o+")?$",h="^("+r+")?"+o+r+o+r,u="^("+r+")?"+i,l=new RegExp(s),c=new RegExp(h),f=new RegExp(a),d=new RegExp(u),p=/^(.+?)(ss|i)es$/,v=/^(.+?)([^s])s$/,g=/^(.+?)eed$/,m=/^(.+?)(ed|ing)$/,y=/.$/,S=/(at|bl|iz)$/,w=new RegExp("([^aeiouylsz])\\1$"),k=new RegExp("^"+r+i+"[^aeiouwxy]$"),x=/^(.+?[^aeiou])y$/,b=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,E=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,F=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,_=/^(.+?)(s|t)(ion)$/,z=/^(.+?)e$/,O=/ll$/,P=new RegExp("^"+r+i+"[^aeiouwxy]$"),T=function(n){var i,r,o,s,a,h,u;if(n.length<3)return n;if(o=n.substr(0,1),"y"==o&&(n=o.toUpperCase()+n.substr(1)),s=p,a=v,s.test(n)?n=n.replace(s,"$1$2"):a.test(n)&&(n=n.replace(a,"$1$2")),s=g,a=m,s.test(n)){var T=s.exec(n);s=l,s.test(T[1])&&(s=y,n=n.replace(s,""))}else if(a.test(n)){var T=a.exec(n);i=T[1],a=d,a.test(i)&&(n=i,a=S,h=w,u=k,a.test(n)?n+="e":h.test(n)?(s=y,n=n.replace(s,"")):u.test(n)&&(n+="e"))}if(s=x,s.test(n)){var T=s.exec(n);i=T[1],n=i+"i"}if(s=b,s.test(n)){var T=s.exec(n);i=T[1],r=T[2],s=l,s.test(i)&&(n=i+t[r])}if(s=E,s.test(n)){var T=s.exec(n);i=T[1],r=T[2],s=l,s.test(i)&&(n=i+e[r])}if(s=F,a=_,s.test(n)){var T=s.exec(n);i=T[1],s=c,s.test(i)&&(n=i)}else if(a.test(n)){var T=a.exec(n);i=T[1]+T[2],a=c,a.test(i)&&(n=i)}if(s=z,s.test(n)){var T=s.exec(n);i=T[1],s=c,a=f,h=P,(s.test(i)||a.test(i)&&!h.test(i))&&(n=i)}return s=O,a=c,s.test(n)&&a.test(n)&&(s=y,n=n.replace(s,"")),"y"==o&&(n=o.toLowerCase()+n.substr(1)),n};return T}(),t.Pipeline.registerFunction(t.stemmer,"stemmer"),t.generateStopWordFilter=function(t){var e=t.reduce(function(t,e){return t[e]=e,t},{});return function(t){return t&&e[t]!==t?t:void 0}},t.stopWordFilter=t.generateStopWordFilter(["a","able","about","across","after","all","almost","also","am","among","an","and","any","are","as","at","be","because","been","but","by","can","cannot","could","dear","did","do","does","either","else","ever","every","for","from","get","got","had","has","have","he","her","hers","him","his","how","however","i","if","in","into","is","it","its","just","least","let","like","likely","may","me","might","most","must","my","neither","no","nor","not","of","off","often","on","only","or","other","our","own","rather","said","say","says","she","should","since","so","some","than","that","the","their","them","then","there","these","they","this","tis","to","too","twas","us","wants","was","we","were","what","when","where","which","while","who","whom","why","will","with","would","yet","you","your"]),t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter"),t.trimmer=function(t){return t.replace(/^\W+/,"").replace(/\W+$/,"")},t.Pipeline.registerFunction(t.trimmer,"trimmer"),t.TokenStore=function(){this.root={docs:{}},this.length=0},t.TokenStore.load=function(t){var e=new this;return e.root=t.root,e.length=t.length,e},t.TokenStore.prototype.add=function(t,e,n){var n=n||this.root,i=t.charAt(0),r=t.slice(1);return i in n||(n[i]={docs:{}}),0===r.length?(n[i].docs[e.ref]=e,void(this.length+=1)):this.add(r,e,n[i])},t.TokenStore.prototype.has=function(t){if(!t)return!1;for(var e=this.root,n=0;n":">",'"':""","'":"'","/":"/"};function escapeHtml(string){return String(string).replace(/[&<>"'\/]/g,function(s){return entityMap[s]})}var whiteRe=/\s*/;var spaceRe=/\s+/;var equalsRe=/\s*=/;var curlyRe=/\s*\}/;var tagRe=/#|\^|\/|>|\{|&|=|!/;function parseTemplate(template,tags){if(!template)return[];var sections=[];var tokens=[];var spaces=[];var hasTag=false;var nonSpace=false;function stripSpace(){if(hasTag&&!nonSpace){while(spaces.length)delete tokens[spaces.pop()]}else{spaces=[]}hasTag=false;nonSpace=false}var openingTagRe,closingTagRe,closingCurlyRe;function compileTags(tags){if(typeof tags==="string")tags=tags.split(spaceRe,2);if(!isArray(tags)||tags.length!==2)throw new Error("Invalid tags: "+tags);openingTagRe=new RegExp(escapeRegExp(tags[0])+"\\s*");closingTagRe=new RegExp("\\s*"+escapeRegExp(tags[1]));closingCurlyRe=new RegExp("\\s*"+escapeRegExp("}"+tags[1]))}compileTags(tags||mustache.tags);var scanner=new Scanner(template);var start,type,value,chr,token,openSection;while(!scanner.eos()){start=scanner.pos;value=scanner.scanUntil(openingTagRe);if(value){for(var i=0,valueLength=value.length;i0?sections[sections.length-1][4]:nestedTokens;break;default:collector.push(token)}}return nestedTokens}function Scanner(string){this.string=string;this.tail=string;this.pos=0}Scanner.prototype.eos=function(){return this.tail===""};Scanner.prototype.scan=function(re){var match=this.tail.match(re);if(!match||match.index!==0)return"";var string=match[0];this.tail=this.tail.substring(string.length);this.pos+=string.length;return string};Scanner.prototype.scanUntil=function(re){var index=this.tail.search(re),match;switch(index){case-1:match=this.tail;this.tail="";break;case 0:match="";break;default:match=this.tail.substring(0,index);this.tail=this.tail.substring(index)}this.pos+=match.length;return match};function Context(view,parentContext){this.view=view;this.cache={".":this.view};this.parent=parentContext}Context.prototype.push=function(view){return new Context(view,this)};Context.prototype.lookup=function(name){var cache=this.cache;var value;if(name in cache){value=cache[name]}else{var context=this,names,index,lookupHit=false;while(context){if(name.indexOf(".")>0){value=context.view;names=name.split(".");index=0;while(value!=null&&index")value=this._renderPartial(token,context,partials,originalTemplate);else if(symbol==="&")value=this._unescapedValue(token,context);else if(symbol==="name")value=this._escapedValue(token,context);else if(symbol==="text")value=this._rawValue(token);if(value!==undefined)buffer+=value}return buffer};Writer.prototype._renderSection=function(token,context,partials,originalTemplate){var self=this;var buffer="";var value=context.lookup(token[1]);function subRender(template){return self.render(template,context,partials)}if(!value)return;if(isArray(value)){for(var j=0,valueLength=value.length;jthis.depCount&&!this.defined){if(G(l)){if(this.events.error&&this.map.isDefine||g.onError!==ca)try{f=i.execCb(c,l,b,f)}catch(d){a=d}else f=i.execCb(c,l,b,f);this.map.isDefine&&void 0===f&&((b=this.module)?f=b.exports:this.usingExports&&
+(f=this.exports));if(a)return a.requireMap=this.map,a.requireModules=this.map.isDefine?[this.map.id]:null,a.requireType=this.map.isDefine?"define":"require",w(this.error=a)}else f=l;this.exports=f;if(this.map.isDefine&&!this.ignore&&(r[c]=f,g.onResourceLoad))g.onResourceLoad(i,this.map,this.depMaps);y(c);this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}else this.fetch()}},callPlugin:function(){var a=
+this.map,b=a.id,d=p(a.prefix);this.depMaps.push(d);q(d,"defined",u(this,function(f){var l,d;d=m(aa,this.map.id);var e=this.map.name,P=this.map.parentMap?this.map.parentMap.name:null,n=i.makeRequire(a.parentMap,{enableBuildCallback:!0});if(this.map.unnormalized){if(f.normalize&&(e=f.normalize(e,function(a){return c(a,P,!0)})||""),f=p(a.prefix+"!"+e,this.map.parentMap),q(f,"defined",u(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),d=m(h,f.id)){this.depMaps.push(f);
+if(this.events.error)d.on("error",u(this,function(a){this.emit("error",a)}));d.enable()}}else d?(this.map.url=i.nameToUrl(d),this.load()):(l=u(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),l.error=u(this,function(a){this.inited=!0;this.error=a;a.requireModules=[b];B(h,function(a){0===a.map.id.indexOf(b+"_unnormalized")&&y(a.map.id)});w(a)}),l.fromText=u(this,function(f,c){var d=a.name,e=p(d),P=M;c&&(f=c);P&&(M=!1);s(e);t(j.config,b)&&(j.config[d]=j.config[b]);try{g.exec(f)}catch(h){return w(C("fromtexteval",
+"fromText eval for "+b+" failed: "+h,h,[b]))}P&&(M=!0);this.depMaps.push(e);i.completeLoad(d);n([d],l)}),f.load(a.name,n,l,j))}));i.enable(d,this);this.pluginMaps[d.id]=d},enable:function(){V[this.map.id]=this;this.enabling=this.enabled=!0;v(this.depMaps,u(this,function(a,b){var c,f;if("string"===typeof a){a=p(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=m(L,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;q(a,"defined",u(this,function(a){this.defineDep(b,
+a);this.check()}));this.errback?q(a,"error",u(this,this.errback)):this.events.error&&q(a,"error",u(this,function(a){this.emit("error",a)}))}c=a.id;f=h[c];!t(L,c)&&(f&&!f.enabled)&&i.enable(a,this)}));B(this.pluginMaps,u(this,function(a){var b=m(h,a.id);b&&!b.enabled&&i.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c=this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){v(this.events[a],function(a){a(b)});"error"===a&&delete this.events[a]}};i={config:j,contextName:b,
+registry:h,defined:r,urlFetched:S,defQueue:A,Module:Z,makeModuleMap:p,nextTick:g.nextTick,onError:w,configure:function(a){a.baseUrl&&"/"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+="/");var b=j.shim,c={paths:!0,bundles:!0,config:!0,map:!0};B(a,function(a,b){c[b]?(j[b]||(j[b]={}),U(j[b],a,!0,!0)):j[b]=a});a.bundles&&B(a.bundles,function(a,b){v(a,function(a){a!==b&&(aa[a]=b)})});a.shim&&(B(a.shim,function(a,c){H(a)&&(a={deps:a});if((a.exports||a.init)&&!a.exportsFn)a.exportsFn=i.makeShimExports(a);
+b[c]=a}),j.shim=b);a.packages&&v(a.packages,function(a){var b,a="string"===typeof a?{name:a}:a;b=a.name;a.location&&(j.paths[b]=a.location);j.pkgs[b]=a.name+"/"+(a.main||"main").replace(ia,"").replace(Q,"")});B(h,function(a,b){!a.inited&&!a.map.unnormalized&&(a.map=p(b))});if(a.deps||a.callback)i.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b;a.init&&(b=a.init.apply(ba,arguments));return b||a.exports&&da(a.exports)}},makeRequire:function(a,e){function j(c,d,m){var n,
+q;e.enableBuildCallback&&(d&&G(d))&&(d.__requireJsBuild=!0);if("string"===typeof c){if(G(d))return w(C("requireargs","Invalid require call"),m);if(a&&t(L,c))return L[c](h[a.id]);if(g.get)return g.get(i,c,a,j);n=p(c,a,!1,!0);n=n.id;return!t(r,n)?w(C("notloaded",'Module name "'+n+'" has not been loaded yet for context: '+b+(a?"":". Use require([])"))):r[n]}J();i.nextTick(function(){J();q=s(p(null,a));q.skipMap=e.skipMap;q.init(c,d,m,{enabled:!0});D()});return j}e=e||{};U(j,{isBrowser:z,toUrl:function(b){var d,
+e=b.lastIndexOf("."),k=b.split("/")[0];if(-1!==e&&(!("."===k||".."===k)||1e.attachEvent.toString().indexOf("[native code"))&&
+!Y?(M=!0,e.attachEvent("onreadystatechange",b.onScriptLoad)):(e.addEventListener("load",b.onScriptLoad,!1),e.addEventListener("error",b.onScriptError,!1)),e.src=d,J=e,D?y.insertBefore(e,D):y.appendChild(e),J=null,e;if(ea)try{importScripts(d),b.completeLoad(c)}catch(m){b.onError(C("importscripts","importScripts failed for "+c+" at "+d,m,[c]))}};z&&!q.skipDataMain&&T(document.getElementsByTagName("script"),function(b){y||(y=b.parentNode);if(I=b.getAttribute("data-main"))return s=I,q.baseUrl||(E=s.split("/"),
+s=E.pop(),O=E.length?E.join("/")+"/":"./",q.baseUrl=O),s=s.replace(Q,""),g.jsExtRegExp.test(s)&&(s=I),q.deps=q.deps?q.deps.concat(s):[s],!0});define=function(b,c,d){var e,g;"string"!==typeof b&&(d=c,c=b,b=null);H(c)||(d=c,c=null);!c&&G(d)&&(c=[],d.length&&(d.toString().replace(ka,"").replace(la,function(b,d){c.push(d)}),c=(1===d.length?["require"]:["require","exports","module"]).concat(c)));if(M){if(!(e=J))N&&"interactive"===N.readyState||T(document.getElementsByTagName("script"),function(b){if("interactive"===
+b.readyState)return N=b}),e=N;e&&(b||(b=e.getAttribute("data-requiremodule")),g=F[e.getAttribute("data-requirecontext")])}(g?g.defQueue:R).push([b,c,d])};define.amd={jQuery:!0};g.exec=function(b){return eval(b)};g(q)}})(this);
diff --git a/mkdocs/js/search-results-template.mustache b/mkdocs/js/search-results-template.mustache
new file mode 100755
index 0000000..a8b3862
--- /dev/null
+++ b/mkdocs/js/search-results-template.mustache
@@ -0,0 +1,4 @@
+
+
+
diff --git a/mkdocs/js/search.js b/mkdocs/js/search.js
new file mode 100755
index 0000000..d5c8661
--- /dev/null
+++ b/mkdocs/js/search.js
@@ -0,0 +1,88 @@
+require([
+ base_url + '/mkdocs/js/mustache.min.js',
+ base_url + '/mkdocs/js/lunr.min.js',
+ 'text!search-results-template.mustache',
+ 'text!../search_index.json',
+], function (Mustache, lunr, results_template, data) {
+ "use strict";
+
+ function getSearchTerm()
+ {
+ var sPageURL = window.location.search.substring(1);
+ var sURLVariables = sPageURL.split('&');
+ for (var i = 0; i < sURLVariables.length; i++)
+ {
+ var sParameterName = sURLVariables[i].split('=');
+ if (sParameterName[0] == 'q')
+ {
+ return decodeURIComponent(sParameterName[1].replace(/\+/g, '%20'));
+ }
+ }
+ }
+
+ var index = lunr(function () {
+ this.field('title', {boost: 10});
+ this.field('text');
+ this.ref('location');
+ });
+
+ data = JSON.parse(data);
+ var documents = {};
+
+ for (var i=0; i < data.docs.length; i++){
+ var doc = data.docs[i];
+ doc.location = base_url + doc.location;
+ index.add(doc);
+ documents[doc.location] = doc;
+ }
+
+ var search = function(){
+
+ var query = document.getElementById('mkdocs-search-query').value;
+ var search_results = document.getElementById("mkdocs-search-results");
+ while (search_results.firstChild) {
+ search_results.removeChild(search_results.firstChild);
+ }
+
+ if(query === ''){
+ return;
+ }
+
+ var results = index.search(query);
+
+ if (results.length > 0){
+ for (var i=0; i < results.length; i++){
+ var result = results[i];
+ doc = documents[result.ref];
+ doc.base_url = base_url;
+ doc.summary = doc.text.substring(0, 200);
+ var html = Mustache.to_html(results_template, doc);
+ search_results.insertAdjacentHTML('beforeend', html);
+ }
+ } else {
+ search_results.insertAdjacentHTML('beforeend', "
No results found
");
+ }
+
+ if(jQuery){
+ /*
+ * We currently only automatically hide bootstrap models. This
+ * requires jQuery to work.
+ */
+ jQuery('#mkdocs_search_modal a').click(function(){
+ jQuery('#mkdocs_search_modal').modal('hide');
+ });
+ }
+
+ };
+
+ var search_input = document.getElementById('mkdocs-search-query');
+
+ var term = getSearchTerm();
+ if (term){
+ search_input.value = term;
+ search();
+ }
+
+ search_input.addEventListener("keyup", search);
+
+});
diff --git a/mkdocs/js/text.js b/mkdocs/js/text.js
new file mode 100755
index 0000000..17921b6
--- /dev/null
+++ b/mkdocs/js/text.js
@@ -0,0 +1,390 @@
+/**
+ * @license RequireJS text 2.0.12 Copyright (c) 2010-2014, The Dojo Foundation All Rights Reserved.
+ * Available via the MIT or new BSD license.
+ * see: http://github.com/requirejs/text for details
+ */
+/*jslint regexp: true */
+/*global require, XMLHttpRequest, ActiveXObject,
+ define, window, process, Packages,
+ java, location, Components, FileUtils */
+
+define(['module'], function (module) {
+ 'use strict';
+
+ var text, fs, Cc, Ci, xpcIsWindows,
+ progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'],
+ xmlRegExp = /^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,
+ bodyRegExp = /]*>\s*([\s\S]+)\s*<\/body>/im,
+ hasLocation = typeof location !== 'undefined' && location.href,
+ defaultProtocol = hasLocation && location.protocol && location.protocol.replace(/\:/, ''),
+ defaultHostName = hasLocation && location.hostname,
+ defaultPort = hasLocation && (location.port || undefined),
+ buildMap = {},
+ masterConfig = (module.config && module.config()) || {};
+
+ text = {
+ version: '2.0.12',
+
+ strip: function (content) {
+ //Strips declarations so that external SVG and XML
+ //documents can be added to a document without worry. Also, if the string
+ //is an HTML document, only the part inside the body tag is returned.
+ if (content) {
+ content = content.replace(xmlRegExp, "");
+ var matches = content.match(bodyRegExp);
+ if (matches) {
+ content = matches[1];
+ }
+ } else {
+ content = "";
+ }
+ return content;
+ },
+
+ jsEscape: function (content) {
+ return content.replace(/(['\\])/g, '\\$1')
+ .replace(/[\f]/g, "\\f")
+ .replace(/[\b]/g, "\\b")
+ .replace(/[\n]/g, "\\n")
+ .replace(/[\t]/g, "\\t")
+ .replace(/[\r]/g, "\\r")
+ .replace(/[\u2028]/g, "\\u2028")
+ .replace(/[\u2029]/g, "\\u2029");
+ },
+
+ createXhr: masterConfig.createXhr || function () {
+ //Would love to dump the ActiveX crap in here. Need IE 6 to die first.
+ var xhr, i, progId;
+ if (typeof XMLHttpRequest !== "undefined") {
+ return new XMLHttpRequest();
+ } else if (typeof ActiveXObject !== "undefined") {
+ for (i = 0; i < 3; i += 1) {
+ progId = progIds[i];
+ try {
+ xhr = new ActiveXObject(progId);
+ } catch (e) {}
+
+ if (xhr) {
+ progIds = [progId]; // so faster next time
+ break;
+ }
+ }
+ }
+
+ return xhr;
+ },
+
+ /**
+ * Parses a resource name into its component parts. Resource names
+ * look like: module/name.ext!strip, where the !strip part is
+ * optional.
+ * @param {String} name the resource name
+ * @returns {Object} with properties "moduleName", "ext" and "strip"
+ * where strip is a boolean.
+ */
+ parseName: function (name) {
+ var modName, ext, temp,
+ strip = false,
+ index = name.indexOf("."),
+ isRelative = name.indexOf('./') === 0 ||
+ name.indexOf('../') === 0;
+
+ if (index !== -1 && (!isRelative || index > 1)) {
+ modName = name.substring(0, index);
+ ext = name.substring(index + 1, name.length);
+ } else {
+ modName = name;
+ }
+
+ temp = ext || modName;
+ index = temp.indexOf("!");
+ if (index !== -1) {
+ //Pull off the strip arg.
+ strip = temp.substring(index + 1) === "strip";
+ temp = temp.substring(0, index);
+ if (ext) {
+ ext = temp;
+ } else {
+ modName = temp;
+ }
+ }
+
+ return {
+ moduleName: modName,
+ ext: ext,
+ strip: strip
+ };
+ },
+
+ xdRegExp: /^((\w+)\:)?\/\/([^\/\\]+)/,
+
+ /**
+ * Is an URL on another domain. Only works for browser use, returns
+ * false in non-browser environments. Only used to know if an
+ * optimized .js version of a text resource should be loaded
+ * instead.
+ * @param {String} url
+ * @returns Boolean
+ */
+ useXhr: function (url, protocol, hostname, port) {
+ var uProtocol, uHostName, uPort,
+ match = text.xdRegExp.exec(url);
+ if (!match) {
+ return true;
+ }
+ uProtocol = match[2];
+ uHostName = match[3];
+
+ uHostName = uHostName.split(':');
+ uPort = uHostName[1];
+ uHostName = uHostName[0];
+
+ return (!uProtocol || uProtocol === protocol) &&
+ (!uHostName || uHostName.toLowerCase() === hostname.toLowerCase()) &&
+ ((!uPort && !uHostName) || uPort === port);
+ },
+
+ finishLoad: function (name, strip, content, onLoad) {
+ content = strip ? text.strip(content) : content;
+ if (masterConfig.isBuild) {
+ buildMap[name] = content;
+ }
+ onLoad(content);
+ },
+
+ load: function (name, req, onLoad, config) {
+ //Name has format: some.module.filext!strip
+ //The strip part is optional.
+ //if strip is present, then that means only get the string contents
+ //inside a body tag in an HTML string. For XML/SVG content it means
+ //removing the declarations so the content can be inserted
+ //into the current doc without problems.
+
+ // Do not bother with the work if a build and text will
+ // not be inlined.
+ if (config && config.isBuild && !config.inlineText) {
+ onLoad();
+ return;
+ }
+
+ masterConfig.isBuild = config && config.isBuild;
+
+ var parsed = text.parseName(name),
+ nonStripName = parsed.moduleName +
+ (parsed.ext ? '.' + parsed.ext : ''),
+ url = req.toUrl(nonStripName),
+ useXhr = (masterConfig.useXhr) ||
+ text.useXhr;
+
+ // Do not load if it is an empty: url
+ if (url.indexOf('empty:') === 0) {
+ onLoad();
+ return;
+ }
+
+ //Load the text. Use XHR if possible and in a browser.
+ if (!hasLocation || useXhr(url, defaultProtocol, defaultHostName, defaultPort)) {
+ text.get(url, function (content) {
+ text.finishLoad(name, parsed.strip, content, onLoad);
+ }, function (err) {
+ if (onLoad.error) {
+ onLoad.error(err);
+ }
+ });
+ } else {
+ //Need to fetch the resource across domains. Assume
+ //the resource has been optimized into a JS module. Fetch
+ //by the module name + extension, but do not include the
+ //!strip part to avoid file system issues.
+ req([nonStripName], function (content) {
+ text.finishLoad(parsed.moduleName + '.' + parsed.ext,
+ parsed.strip, content, onLoad);
+ });
+ }
+ },
+
+ write: function (pluginName, moduleName, write, config) {
+ if (buildMap.hasOwnProperty(moduleName)) {
+ var content = text.jsEscape(buildMap[moduleName]);
+ write.asModule(pluginName + "!" + moduleName,
+ "define(function () { return '" +
+ content +
+ "';});\n");
+ }
+ },
+
+ writeFile: function (pluginName, moduleName, req, write, config) {
+ var parsed = text.parseName(moduleName),
+ extPart = parsed.ext ? '.' + parsed.ext : '',
+ nonStripName = parsed.moduleName + extPart,
+ //Use a '.js' file name so that it indicates it is a
+ //script that can be loaded across domains.
+ fileName = req.toUrl(parsed.moduleName + extPart) + '.js';
+
+ //Leverage own load() method to load plugin value, but only
+ //write out values that do not have the strip argument,
+ //to avoid any potential issues with ! in file names.
+ text.load(nonStripName, req, function (value) {
+ //Use own write() method to construct full module value.
+ //But need to create shell that translates writeFile's
+ //write() to the right interface.
+ var textWrite = function (contents) {
+ return write(fileName, contents);
+ };
+ textWrite.asModule = function (moduleName, contents) {
+ return write.asModule(moduleName, fileName, contents);
+ };
+
+ text.write(pluginName, nonStripName, textWrite, config);
+ }, config);
+ }
+ };
+
+ if (masterConfig.env === 'node' || (!masterConfig.env &&
+ typeof process !== "undefined" &&
+ process.versions &&
+ !!process.versions.node &&
+ !process.versions['node-webkit'])) {
+ //Using special require.nodeRequire, something added by r.js.
+ fs = require.nodeRequire('fs');
+
+ text.get = function (url, callback, errback) {
+ try {
+ var file = fs.readFileSync(url, 'utf8');
+ //Remove BOM (Byte Mark Order) from utf8 files if it is there.
+ if (file.indexOf('\uFEFF') === 0) {
+ file = file.substring(1);
+ }
+ callback(file);
+ } catch (e) {
+ if (errback) {
+ errback(e);
+ }
+ }
+ };
+ } else if (masterConfig.env === 'xhr' || (!masterConfig.env &&
+ text.createXhr())) {
+ text.get = function (url, callback, errback, headers) {
+ var xhr = text.createXhr(), header;
+ xhr.open('GET', url, true);
+
+ //Allow plugins direct access to xhr headers
+ if (headers) {
+ for (header in headers) {
+ if (headers.hasOwnProperty(header)) {
+ xhr.setRequestHeader(header.toLowerCase(), headers[header]);
+ }
+ }
+ }
+
+ //Allow overrides specified in config
+ if (masterConfig.onXhr) {
+ masterConfig.onXhr(xhr, url);
+ }
+
+ xhr.onreadystatechange = function (evt) {
+ var status, err;
+ //Do not explicitly handle errors, those should be
+ //visible via console output in the browser.
+ if (xhr.readyState === 4) {
+ status = xhr.status || 0;
+ if (status > 399 && status < 600) {
+ //An http 4xx or 5xx error. Signal an error.
+ err = new Error(url + ' HTTP status: ' + status);
+ err.xhr = xhr;
+ if (errback) {
+ errback(err);
+ }
+ } else {
+ callback(xhr.responseText);
+ }
+
+ if (masterConfig.onXhrComplete) {
+ masterConfig.onXhrComplete(xhr, url);
+ }
+ }
+ };
+ xhr.send(null);
+ };
+ } else if (masterConfig.env === 'rhino' || (!masterConfig.env &&
+ typeof Packages !== 'undefined' && typeof java !== 'undefined')) {
+ //Why Java, why is this so awkward?
+ text.get = function (url, callback) {
+ var stringBuffer, line,
+ encoding = "utf-8",
+ file = new java.io.File(url),
+ lineSeparator = java.lang.System.getProperty("line.separator"),
+ input = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(file), encoding)),
+ content = '';
+ try {
+ stringBuffer = new java.lang.StringBuffer();
+ line = input.readLine();
+
+ // Byte Order Mark (BOM) - The Unicode Standard, version 3.0, page 324
+ // http://www.unicode.org/faq/utf_bom.html
+
+ // Note that when we use utf-8, the BOM should appear as "EF BB BF", but it doesn't due to this bug in the JDK:
+ // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4508058
+ if (line && line.length() && line.charAt(0) === 0xfeff) {
+ // Eat the BOM, since we've already found the encoding on this file,
+ // and we plan to concatenating this buffer with others; the BOM should
+ // only appear at the top of a file.
+ line = line.substring(1);
+ }
+
+ if (line !== null) {
+ stringBuffer.append(line);
+ }
+
+ while ((line = input.readLine()) !== null) {
+ stringBuffer.append(lineSeparator);
+ stringBuffer.append(line);
+ }
+ //Make sure we return a JavaScript string and not a Java string.
+ content = String(stringBuffer.toString()); //String
+ } finally {
+ input.close();
+ }
+ callback(content);
+ };
+ } else if (masterConfig.env === 'xpconnect' || (!masterConfig.env &&
+ typeof Components !== 'undefined' && Components.classes &&
+ Components.interfaces)) {
+ //Avert your gaze!
+ Cc = Components.classes;
+ Ci = Components.interfaces;
+ Components.utils['import']('resource://gre/modules/FileUtils.jsm');
+ xpcIsWindows = ('@mozilla.org/windows-registry-key;1' in Cc);
+
+ text.get = function (url, callback) {
+ var inStream, convertStream, fileObj,
+ readData = {};
+
+ if (xpcIsWindows) {
+ url = url.replace(/\//g, '\\');
+ }
+
+ fileObj = new FileUtils.File(url);
+
+ //XPCOM, you so crazy
+ try {
+ inStream = Cc['@mozilla.org/network/file-input-stream;1']
+ .createInstance(Ci.nsIFileInputStream);
+ inStream.init(fileObj, 1, 0, false);
+
+ convertStream = Cc['@mozilla.org/intl/converter-input-stream;1']
+ .createInstance(Ci.nsIConverterInputStream);
+ convertStream.init(inStream, "utf-8", inStream.available(),
+ Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER);
+
+ convertStream.readString(inStream.available(), readData);
+ convertStream.close();
+ inStream.close();
+ callback(readData.value);
+ } catch (e) {
+ throw new Error((fileObj && fileObj.path || '') + ': ' + e);
+ }
+ };
+ }
+ return text;
+});
diff --git a/mkdocs/search_index.json b/mkdocs/search_index.json
new file mode 100755
index 0000000..f5787f4
--- /dev/null
+++ b/mkdocs/search_index.json
@@ -0,0 +1,374 @@
+{
+ "docs": [
+ {
+ "location": "/",
+ "text": "Welcome to FileManager's Documentation!\n\n\n\n\nFileManager is a plugin for \nSublime Text 3\n that helps you manage your files and folders\n\nfrom\n Sublime Text.\n\n\nLet's \nget started\n!\n\n\n\n\nWarning\n\n\nThis documentation is still a work in progress, but you can find a significant amount of\ninformation!",
+ "title": "Home"
+ },
+ {
+ "location": "/#welcome-to-filemanagers-documentation",
+ "text": "FileManager is a plugin for Sublime Text 3 that helps you manage your files and folders from Sublime Text. Let's get started ! Warning This documentation is still a work in progress, but you can find a significant amount of\ninformation!",
+ "title": "Welcome to FileManager's Documentation!"
+ },
+ {
+ "location": "/getting-started/",
+ "text": "Installation\n\n\nUsing Package Control\n\n\nYou can really easily install FileManager by using \nPackage Control\n.\n\n\nIf it's not already, you need to \ninstall it\n first.\n\n\n\n\nNote\n\n\nIf you're using the latest build of Sublime Text 3, you can just do\n\nTools \u2192 Install Package Control\u2026\n\n\n\n\n\n\nOpen up the command palette (\nctrl+shift+p\n)\n\n\nSearch up \nPackage Control: Install Package\n (might take a few seconds)\n\n\nIn the panel that just showed up, search for \nFileManager\n\n\n\n\nDone! You have now access to every single features of FileManager! \n\n\nUsing \ngit\n\n\n$ \ncd\n \n%APPDATA%\\Sublime Text 3\\Packages\n \n# on Windows\n\n$ \ncd\n ~/Library/Application\n\\ \nSupport/Sublime\n\\ \nText\n\\ \n3\n \n# on Mac\n\n$ \ncd\n ~/.config/sublime-text-3 \n# on Linux\n\n\n$ git clone \nhttps://github.com/math2001/FileManager\n\n\n\n\n\n\n\n\nSo, which one do I pick?!\n\n\n\n\nI depends of what you want to do. If you want to just use FileManager, pick the first solution,\nyou'll get every update automatically. But if you want to contribute, then choose the second\nsolution.\n\n\nUsage\n\n\nHere's a few tips that should get you started:\n\n\nCreate\n\n\nPress \nalt+n\n to create a file relative to the current opened folder, or, if there is\nnone, the current view, or finally \nC:/Users/\nyour username\n (\n~\n for the purists) if no view's\nopen\n\n\nUse the auto completion\n\n\nPress \ntab\n to go through the auto completion (and \nshift+tab\n to go\nbackwards)\n\n\nUse the aliases\n\n\nCreate and use some \naliases\n! You already have plenty! For example, you\nhave \n$packages\n. Try it out!\n\n\nUse the \"browser\"\n\n\nTry to create (\nalt+n\n) a folder that \nalready\n exists. You'll see, you're computer will\ndance the samba! Na, just kidding, but really, give it a go!\n\n\nBye bye menus!\n\n\nAll the command are available from the command palette! \nrename\n, \nmove\n, \nduplicate\n, etc\n\n\n\n\nTip\n\n\nAlways prefer the command palette to the menus. You'll be \nmuch\n faster. You can even\n\nadd your own items\n!\n\n\n\n\nHere's the next step: all about every FileManager's \ncommands",
+ "title": "Getting stated"
+ },
+ {
+ "location": "/getting-started/#installation",
+ "text": "",
+ "title": "Installation"
+ },
+ {
+ "location": "/getting-started/#using-package-control",
+ "text": "You can really easily install FileManager by using Package Control . If it's not already, you need to install it first. Note If you're using the latest build of Sublime Text 3, you can just do Tools \u2192 Install Package Control\u2026 Open up the command palette ( ctrl+shift+p ) Search up Package Control: Install Package (might take a few seconds) In the panel that just showed up, search for FileManager Done! You have now access to every single features of FileManager!",
+ "title": "Using Package Control"
+ },
+ {
+ "location": "/getting-started/#using-git",
+ "text": "$ cd %APPDATA%\\Sublime Text 3\\Packages # on Windows \n$ cd ~/Library/Application \\ Support/Sublime \\ Text \\ 3 # on Mac \n$ cd ~/.config/sublime-text-3 # on Linux \n\n$ git clone https://github.com/math2001/FileManager So, which one do I pick?! I depends of what you want to do. If you want to just use FileManager, pick the first solution,\nyou'll get every update automatically. But if you want to contribute, then choose the second\nsolution.",
+ "title": "Using git"
+ },
+ {
+ "location": "/getting-started/#usage",
+ "text": "Here's a few tips that should get you started:",
+ "title": "Usage"
+ },
+ {
+ "location": "/getting-started/#create",
+ "text": "Press alt+n to create a file relative to the current opened folder, or, if there is\nnone, the current view, or finally C:/Users/ your username ( ~ for the purists) if no view's\nopen",
+ "title": "Create"
+ },
+ {
+ "location": "/getting-started/#use-the-auto-completion",
+ "text": "Press tab to go through the auto completion (and shift+tab to go\nbackwards)",
+ "title": "Use the auto completion"
+ },
+ {
+ "location": "/getting-started/#use-the-aliases",
+ "text": "Create and use some aliases ! You already have plenty! For example, you\nhave $packages . Try it out!",
+ "title": "Use the aliases"
+ },
+ {
+ "location": "/getting-started/#use-the-browser",
+ "text": "Try to create ( alt+n ) a folder that already exists. You'll see, you're computer will\ndance the samba! Na, just kidding, but really, give it a go!",
+ "title": "Use the \"browser\""
+ },
+ {
+ "location": "/getting-started/#bye-bye-menus",
+ "text": "All the command are available from the command palette! rename , move , duplicate , etc Tip Always prefer the command palette to the menus. You'll be much faster. You can even add your own items ! Here's the next step: all about every FileManager's commands",
+ "title": "Bye bye menus!"
+ },
+ {
+ "location": "/commands/",
+ "text": "This page will list every command available and explain what they do with \nevery single\n options.\n\n\nCommon features\n\n\nBecause FileManager uses an API, you'll always get those following feature in every input panel\nthat is shown by FileManager.\n\n\nThe Auto Completion system\n\n\nAll the input that are created from File Manager have an auto completions system. If you want to\nlearn more about about it, \nhere's the page dedicated to it\n\n\nThe log in the status bar\n\n\nAs you probably noticed, when you create a file, there is in the side bar a message, like this\n\n\nCreating at \npath\n\n\n\n\nNote\n\n\nOf course, the the \nCreating\n will change if you're moving, renaming, duplicating etc.\n\n\n\n\nAnd the path is in a \ncomputer friendly form\n (\nmore info\n), but you\ncan change it so that it is in a \nuser friendly form\n.\n\n\nlog_in_status_bar\n:\n \nuser\n\n\n\n\n\n\nThe valid values are \ncomputer\n, \nuser\n and \nfalse\n\n\nIf it is set to \nfalse\n, it will be disabled (there will be no log in the status bar)\n\n\nThe \"browser\"\n\n\nIf you try to create a file that already exists, it will simply open it.\n\n\n\n\nNote\n\n\nThis is a trick that I realised I was using very often! It's even better when you use\n\naliases\n\n\n\n\nBut what happens if you try to create a \nfolder\n that already exists? Well it's going to show up\na quick panel with every folders and every files listed. If you pick a file, it will open it. If\nyou pick a folder, it will reopen the browser listing all the items of this folder.\n\n\nThere is two more options. The first one is \n..\n, to go up of one folder, and the other one is:\n\nCreate form here\n. If you pick this option, it will simply reopen the input panel from your\nposition in the browser.\n\n\n\n\nSo, again, this is just theory. Read on discover the different commands that uses those features\n(and, of course, add their own \n)\n\n\n\n\nCreate\n\n\nCommand: \nfm_create\n\n\nYou can access it from 2 different ways:\n\n\nRight click on a file/folder in the side bar and choose \nNew\n\n\n\n\nWith this option, you will create \nfrom where you click\n. If it was a file, you will create from\nits \ncontaining folder\n.\n\n\nYou should see an input at the bottom of sublime text. You can type a file name or a path, and it\nwill create it for you. You can use what I call \nuser friendly path\n\n\nExample\n\n\nfolder/file.py\n\n\nIf \nfolder\n does not exists, then it will create it for you.\nIf \nfile.py\n exists, it will open it, otherwise it will create it, and then open it.\n\n\nWith a shortcut \nalt+n\n\n\n\n\nWhen you use a shortcut, the plugin does not explicitly know from where you want to create. Here's\nhow it \nguesses\n:\n\n\n\n\nIf there is some folders open in Sublime Text, it will create from the top one\n\n\nOtherwise, if there is file open, it will create from its containing folder\n\n\nFinally, it will choose \n~\n . You can change this fall back by adding to your settings the key\n\npath_fallback\n with the path you want\n\n\n\n\n\n\nIf there is some folders open in Sublime Text, it will create from the top one\n\n\n\n\nIf you want to select which folder you want to create from, you can just add this prefix: \nnb\n\n\nExample\n\n\n\n\n0\nfile.py\n Creates from the first folder, starting from the top. Here the prefix is useless,\nbecause it's the default value (you could have just typed \nfile.py\n)\n\n\n1\nfile.py\n Creates from the second folder, starting from the top\n\n\n-1\nfile.py\n Creates from the first folder, starting from the \nbottom\n\n\n\n\nYou get the idea.\n\n\n\n\nNote\n\n\nWatch out, they're \"code lists\", which means that they start from \n0\n. \n0\n is the first one,\n\n1\n is the second, \n2\n is the third, etc...\n\n\n\n\nChanging the symbol (\n)\n\n\nI personally don't like typing the \n, because I have to move my hand a looooong way \n. So,\nI added an option to change it. For my part, I chose a space. The only \"problem\" is that if I have\nthe following structure:\n\n\ntest/\n 1 python/\nsamples/\n hello/\n index.html\n\n\n\n\n\nAnd that I want to create a file in the folder \n1 python\n, I'm going to type something line this\n\n1 python/afile.py\n. But, it's going select in \nsamples\n. \nSo\n, you would have to explicitly say\nthat you want to create from the first folder, so: \n0 1 python/afile.py\n would work.\n\n\nBut, it's not that much of a big deal, because you rarely get a folder starting with a number and\nthen a space, and as you saw, the solution is really simple.\n\n\nWhy isn't \n a problem too? On Windows at least, you can \nnot\n have a file are a folder that has\n\n in it.\n\n\nSo, if you want to change the symbol, add this to your settings user\n(it can be, of course, whatever you want):\n\n\nindex_folder_separator\n:\n \n \n\n\n\n\n\n\nChanging the default index\n\n\nAs I said earlier, the default index is \n0\n. You can change this by adding this to your settings\n\n\ndefault_index\n:\n \n1\n\n\n\n\n\n\nTemplates\n\n\nYou can specify templates so that when you create a new file, the content will be the content of\nyour template. For more information, see \nthe page dedicated to the templates\n\n\nRename\n\n\nCommand: \nfm_rename\n\n\nYou can only rename \n1\n file at a time.\n\n\nIf you put a slash in your name, it will automatically create a sub-folders to it, and then move\nthe file. For example, if you try to rename a file like this: \nhello/world.py\n and your file is\ncalled \nsomething.py\n, it will create the folder \nhello\n (if it doesn't already exists) and then\nrename \nsomething.py\n.\n\n\n\n\nTip\n\n\nIf your name is \n../hello.py\n, it will move your file one folder above.\n\n\n\n\nMove\n\n\nCommand: \nfm_move\n\n\nYou can move several items at a time. If they aren't in the same folder, the path shown in the\ninput will be the common path they have. Once you'll move them, \nthey'll be in every cases in\nthe same folder\n.\n\n\nTo move a file, you're oblige to use the browser, because you have to choose an existing folder, so\nit will automatically pop up. But if you have a look, instead of having \n[cmd]: Create from here\n,\nyou have \n[cmd]: move here\n. As you probably guessed, you have to select this option to move your\nfile/folder\n\n\nDuplicate\n\n\nCommand: \nfm_duplicate\n\n\nYou can duplicate folders and files, but, once again, one at a time.\n\n\n\n\nNote\n\n\nIf you're duplicating a folder, you \nmust\n create a new folder.\n\n\n\n\nDelete\n\n\nCommand: \nfm_delete\n\n\nFile Manager doesn't delete permanently your files/folders, it only throws them to the trash.\n\n\n\n\nNote\n\n\nWhen other commands needs to overwrite a file or a folders, they throw them to the trash\n\nbefore\n and then simply write.\n\n\n\n\nCreate from selection\n\n\nCommand: \nfm_create_from_selection\n\n\nAs its name says, this command allows you to create a file from text. For example, in \nhtml\n, if\nyou right click on the value of an \nsrc\n or \nhref\n attribute, an option will appear called\n\nCreate \nthe path to you file\n (it will be shorten if it's too long). You don't even need to\nselect anything.\n\n\nIf you do select something, then it will propose you to create the file using the path you've\nselected.\n\n\nHere's an example:\n\n\n\n\nFont: Droid Sans Mono; Theme: Boxy; Color Scheme: Boxy Yesterday\n\n\nIn every cases, the file will be created \nfrom\n the current file (so this command does not appear\nif you're file is not saved on the disk).\n\n\n\n\nNote\n\n\nThis automatic selection only works, for now, in the following languages:\n\n\n\n\nhtml\n\n\npython\n\n\nphp\n\n\njavascript\n\n\nruby\n\n\n\n\nIf you'd like to see an other language supported, feel free to submit a [new issue][], or even\nto create it yourself. Please make sure you read the \ncontribution-guide\n before doing so.\n\n\n\n\nOpen in browser\n\n\nCommand: \nfm_open_in_browser\n\n\nThis command opens up the selected file in the default browser. You can run it from the command\npalette: \nFile Manager: Open In Browser\n, it'll open the current file. You can also run it from the\nSide Bar: it'll open the selected file(s).\n\n\nIt also kind of \noverwrites\n the default \nOpen in browser\n option in the context menu (in fact, it\nhides default command, and shows the FileManager's command). Now, you might be wondering:\n\n\n\n\nWhy do an other command, while an other one exists?\n\n\n\n\nWell, this one is better \n. Here's how: \nit takes into account a global setting\n \nurl\n\n\nAn example's a great way to explain how it works (in \nMyProject.sublime-project\n):\n\n\n{\n\n \nfolders\n:\n \n[\n\n \n{\n\n \npath\n:\n \nC:/wamp/www/MyAwesomeWebsite/\n\n \n}\n\n \n],\n\n \nsettings\n:\n \n{\n\n \nurl\n:\n \nhttp://localhost/MyAwesomeWebsite/\n\n \n}\n\n\n}\n\n\n\n\n\n\nNow, when you're going to open a file that is in the the folder \nC:/wamp/www/MyAwesomeWebsite/\n,\nit'll simply replace this part with the \nurl\n value (here \nhttp://localhost/MyAwesomeWebsite/\n)\n\n\nExamples\n\n\n\n\nC:/wamp/www/MyAwesomeWebsite/index.html\n \u2192 \nhttp://localhost/MyAwesomeWebsite/\n (it's clever,\nit removes the \nindex.html\n)\n\n\nC:/wamp/www/MyAwesomeWebsite/index.php\n \u2192 \nhttp://localhost/MyAwesomeWebsite/\n\n\nC:/wamp/www/MyAwesomeWebsite/sub-folder/file.php\n \u2192\n\nhttp://localhost/MyAwesomeWebsite/sub-folder/file.php\n\n\n\n\nOpen Terminal Here\n\n\nCommand: \nfm_open_terminal\n\n\nIt opens up the terminal in the selected folder (or the folder of the current file if you open it\nfrom the command palette). You can configure what's happening in your FileManager's settings\n(\nPreferences \u2192 Packages Settings \u2192 FileManager\n).\n\n\nYou can add a setting called \nterminals\n. Here's the format:\n\n\n{\n\n \nterminals\n:\n \n[\n\n \n{\n\n \nname\n:\n \nterminal name\n,\n\n \ncmd\n:\n \n[\nthe\n,\n \ncommand\n,\n \nto\n,\n \nopen\n],\n\n \nplatform\n:\n \nfirst second\n\n \n},\n\n \n{\n\n \nname\n:\n \nAn other Terminal\n,\n\n \ncmd\n:\n \n[\nterminal\n,\n \n--new_tab\n,\n \n$cwd\n]\n\n \n}\n\n \n]\n\n\n}\n\n\n\n\n\n\nIn the \ncmd\n key, you have one variable: \n$cwd\n. It'll be replaced by the \ncurrent working dir\n\n(the folder from which the command will be run).\n\n\nThe \nplatform\n is used to limit allow the terminal to work only one specific platform(s). If it is\nomitted, it'll work on every platform. The valid values are \nwindows\n, \nlinux\n and \nosx\n.\n\n\n\n\nTip\n\n\nYou can limit a terminal to work on multiple platform by seperating them with a space, like so:\n\nwindows osx\n\n\n\n\nSo, for example, on Windows, here's what you could do:\n\n\n{\n\n \nterminals\n:\n \n[\n\n \n{\n\n \nname\n:\n \nCmder\n,\n\n \ncmd\n:\n \n[\nC:/cmder/cmder.exe\n,\n \n/SINGLE\n,\n \n$cwd\n],\n\n \nplatform\n:\n \nwindows\n\n \n},\n\n \n{\n\n \nname\n:\n \nCMD\n,\n\n \ncmd\n:\n \n[\ncmd\n],\n\n \nplatform\n:\n \nwindows\n\n \n}\n\n \n]\n\n\n}\n\n\n\n\n\n\nIf you don't know what \nCmder\n is, you might want to have a look (for Windows\nuser). \nHyper\n is also pretty cool, since it's a web based terminal.\n\n\nOn other platform\n\n\nIf you're on Mac, it might be a bit harder. Why? Because I don't have a Mac, so I cannot try to see\nif what I'm going to tell you is \nactually\n working. Here's what I found:\n\n\nopen -a Terminal\n should open a new terminal. So, here's the config I'd recommend using:\n\n\n{\n\n \nterminals\n:\n \n[\n\n \n{\n\n \nname\n:\n \nTerminal\n,\n\n \ncmd\n:\n \n[\nopen\n,\n \n-a\n,\n \nTerminal\n],\n\n \nplatform\n:\n \nosx\n\n \n}\n\n \n]\n\n\n}\n\n\n\n\n\n\nIf it does, doesn't and you have a solution, or needs improvement, please let me know by\n\nraising an issue\n.\n\n\n\n\nTip\n\n\nIf none of these works for you, and you don't know how to configure this, you can always use\nWill Bond's package \nTerminal\n and \nhide this option (open terminal here)\n\n\n\n\nOpen In Explorer\n\n\nCommand: \nfm_open_in_explorer\n\n\nThis command simply opens the selected item(s) in your file explorer (or finder if you're on mac).\nIt'll open the current file if it's run from the command palette.",
+ "title": "Commands"
+ },
+ {
+ "location": "/commands/#common-features",
+ "text": "Because FileManager uses an API, you'll always get those following feature in every input panel\nthat is shown by FileManager.",
+ "title": "Common features"
+ },
+ {
+ "location": "/commands/#the-auto-completion-system",
+ "text": "All the input that are created from File Manager have an auto completions system. If you want to\nlearn more about about it, here's the page dedicated to it",
+ "title": "The Auto Completion system"
+ },
+ {
+ "location": "/commands/#the-log-in-the-status-bar",
+ "text": "As you probably noticed, when you create a file, there is in the side bar a message, like this Creating at path Note Of course, the the Creating will change if you're moving, renaming, duplicating etc. And the path is in a computer friendly form ( more info ), but you\ncan change it so that it is in a user friendly form . log_in_status_bar : user The valid values are computer , user and false If it is set to false , it will be disabled (there will be no log in the status bar)",
+ "title": "The log in the status bar"
+ },
+ {
+ "location": "/commands/#the-browser",
+ "text": "If you try to create a file that already exists, it will simply open it. Note This is a trick that I realised I was using very often! It's even better when you use aliases But what happens if you try to create a folder that already exists? Well it's going to show up\na quick panel with every folders and every files listed. If you pick a file, it will open it. If\nyou pick a folder, it will reopen the browser listing all the items of this folder. There is two more options. The first one is .. , to go up of one folder, and the other one is: Create form here . If you pick this option, it will simply reopen the input panel from your\nposition in the browser. So, again, this is just theory. Read on discover the different commands that uses those features\n(and, of course, add their own )",
+ "title": "The \"browser\""
+ },
+ {
+ "location": "/commands/#create",
+ "text": "Command: fm_create You can access it from 2 different ways:",
+ "title": "Create"
+ },
+ {
+ "location": "/commands/#right-click-on-a-filefolder-in-the-side-bar-and-choose-new",
+ "text": "With this option, you will create from where you click . If it was a file, you will create from\nits containing folder . You should see an input at the bottom of sublime text. You can type a file name or a path, and it\nwill create it for you. You can use what I call user friendly path",
+ "title": "Right click on a file/folder in the side bar and choose New"
+ },
+ {
+ "location": "/commands/#example",
+ "text": "folder/file.py If folder does not exists, then it will create it for you.\nIf file.py exists, it will open it, otherwise it will create it, and then open it.",
+ "title": "Example"
+ },
+ {
+ "location": "/commands/#with-a-shortcut-altn",
+ "text": "When you use a shortcut, the plugin does not explicitly know from where you want to create. Here's\nhow it guesses : If there is some folders open in Sublime Text, it will create from the top one Otherwise, if there is file open, it will create from its containing folder Finally, it will choose ~ . You can change this fall back by adding to your settings the key path_fallback with the path you want If there is some folders open in Sublime Text, it will create from the top one If you want to select which folder you want to create from, you can just add this prefix: nb",
+ "title": "With a shortcut alt+n"
+ },
+ {
+ "location": "/commands/#example_1",
+ "text": "0 file.py Creates from the first folder, starting from the top. Here the prefix is useless,\nbecause it's the default value (you could have just typed file.py ) 1 file.py Creates from the second folder, starting from the top -1 file.py Creates from the first folder, starting from the bottom You get the idea. Note Watch out, they're \"code lists\", which means that they start from 0 . 0 is the first one, 1 is the second, 2 is the third, etc...",
+ "title": "Example"
+ },
+ {
+ "location": "/commands/#changing-the-symbol",
+ "text": "I personally don't like typing the , because I have to move my hand a looooong way . So,\nI added an option to change it. For my part, I chose a space. The only \"problem\" is that if I have\nthe following structure: test/\n 1 python/\nsamples/\n hello/\n index.html And that I want to create a file in the folder 1 python , I'm going to type something line this 1 python/afile.py . But, it's going select in samples . So , you would have to explicitly say\nthat you want to create from the first folder, so: 0 1 python/afile.py would work. But, it's not that much of a big deal, because you rarely get a folder starting with a number and\nthen a space, and as you saw, the solution is really simple. Why isn't a problem too? On Windows at least, you can not have a file are a folder that has in it. So, if you want to change the symbol, add this to your settings user\n(it can be, of course, whatever you want): index_folder_separator :",
+ "title": "Changing the symbol (>)"
+ },
+ {
+ "location": "/commands/#changing-the-default-index",
+ "text": "As I said earlier, the default index is 0 . You can change this by adding this to your settings default_index : 1",
+ "title": "Changing the default index"
+ },
+ {
+ "location": "/commands/#templates",
+ "text": "You can specify templates so that when you create a new file, the content will be the content of\nyour template. For more information, see the page dedicated to the templates",
+ "title": "Templates"
+ },
+ {
+ "location": "/commands/#rename",
+ "text": "Command: fm_rename You can only rename 1 file at a time. If you put a slash in your name, it will automatically create a sub-folders to it, and then move\nthe file. For example, if you try to rename a file like this: hello/world.py and your file is\ncalled something.py , it will create the folder hello (if it doesn't already exists) and then\nrename something.py . Tip If your name is ../hello.py , it will move your file one folder above.",
+ "title": "Rename"
+ },
+ {
+ "location": "/commands/#move",
+ "text": "Command: fm_move You can move several items at a time. If they aren't in the same folder, the path shown in the\ninput will be the common path they have. Once you'll move them, they'll be in every cases in\nthe same folder . To move a file, you're oblige to use the browser, because you have to choose an existing folder, so\nit will automatically pop up. But if you have a look, instead of having [cmd]: Create from here ,\nyou have [cmd]: move here . As you probably guessed, you have to select this option to move your\nfile/folder",
+ "title": "Move"
+ },
+ {
+ "location": "/commands/#duplicate",
+ "text": "Command: fm_duplicate You can duplicate folders and files, but, once again, one at a time. Note If you're duplicating a folder, you must create a new folder.",
+ "title": "Duplicate"
+ },
+ {
+ "location": "/commands/#delete",
+ "text": "Command: fm_delete File Manager doesn't delete permanently your files/folders, it only throws them to the trash. Note When other commands needs to overwrite a file or a folders, they throw them to the trash before and then simply write.",
+ "title": "Delete"
+ },
+ {
+ "location": "/commands/#create-from-selection",
+ "text": "Command: fm_create_from_selection As its name says, this command allows you to create a file from text. For example, in html , if\nyou right click on the value of an src or href attribute, an option will appear called Create the path to you file (it will be shorten if it's too long). You don't even need to\nselect anything. If you do select something, then it will propose you to create the file using the path you've\nselected. Here's an example: Font: Droid Sans Mono; Theme: Boxy; Color Scheme: Boxy Yesterday In every cases, the file will be created from the current file (so this command does not appear\nif you're file is not saved on the disk). Note This automatic selection only works, for now, in the following languages: html python php javascript ruby If you'd like to see an other language supported, feel free to submit a [new issue][], or even\nto create it yourself. Please make sure you read the contribution-guide before doing so.",
+ "title": "Create from selection"
+ },
+ {
+ "location": "/commands/#open-in-browser",
+ "text": "Command: fm_open_in_browser This command opens up the selected file in the default browser. You can run it from the command\npalette: File Manager: Open In Browser , it'll open the current file. You can also run it from the\nSide Bar: it'll open the selected file(s). It also kind of overwrites the default Open in browser option in the context menu (in fact, it\nhides default command, and shows the FileManager's command). Now, you might be wondering: Why do an other command, while an other one exists? Well, this one is better . Here's how: it takes into account a global setting url An example's a great way to explain how it works (in MyProject.sublime-project ): { \n folders : [ \n { \n path : C:/wamp/www/MyAwesomeWebsite/ \n } \n ], \n settings : { \n url : http://localhost/MyAwesomeWebsite/ \n } } Now, when you're going to open a file that is in the the folder C:/wamp/www/MyAwesomeWebsite/ ,\nit'll simply replace this part with the url value (here http://localhost/MyAwesomeWebsite/ )",
+ "title": "Open in browser"
+ },
+ {
+ "location": "/commands/#examples",
+ "text": "C:/wamp/www/MyAwesomeWebsite/index.html \u2192 http://localhost/MyAwesomeWebsite/ (it's clever,\nit removes the index.html ) C:/wamp/www/MyAwesomeWebsite/index.php \u2192 http://localhost/MyAwesomeWebsite/ C:/wamp/www/MyAwesomeWebsite/sub-folder/file.php \u2192 http://localhost/MyAwesomeWebsite/sub-folder/file.php",
+ "title": "Examples"
+ },
+ {
+ "location": "/commands/#open-terminal-here",
+ "text": "Command: fm_open_terminal It opens up the terminal in the selected folder (or the folder of the current file if you open it\nfrom the command palette). You can configure what's happening in your FileManager's settings\n( Preferences \u2192 Packages Settings \u2192 FileManager ). You can add a setting called terminals . Here's the format: { \n terminals : [ \n { \n name : terminal name , \n cmd : [ the , command , to , open ], \n platform : first second \n }, \n { \n name : An other Terminal , \n cmd : [ terminal , --new_tab , $cwd ] \n } \n ] } In the cmd key, you have one variable: $cwd . It'll be replaced by the current working dir \n(the folder from which the command will be run). The platform is used to limit allow the terminal to work only one specific platform(s). If it is\nomitted, it'll work on every platform. The valid values are windows , linux and osx . Tip You can limit a terminal to work on multiple platform by seperating them with a space, like so: windows osx So, for example, on Windows, here's what you could do: { \n terminals : [ \n { \n name : Cmder , \n cmd : [ C:/cmder/cmder.exe , /SINGLE , $cwd ], \n platform : windows \n }, \n { \n name : CMD , \n cmd : [ cmd ], \n platform : windows \n } \n ] } If you don't know what Cmder is, you might want to have a look (for Windows\nuser). Hyper is also pretty cool, since it's a web based terminal.",
+ "title": "Open Terminal Here"
+ },
+ {
+ "location": "/commands/#on-other-platform",
+ "text": "If you're on Mac, it might be a bit harder. Why? Because I don't have a Mac, so I cannot try to see\nif what I'm going to tell you is actually working. Here's what I found: open -a Terminal should open a new terminal. So, here's the config I'd recommend using: { \n terminals : [ \n { \n name : Terminal , \n cmd : [ open , -a , Terminal ], \n platform : osx \n } \n ] } If it does, doesn't and you have a solution, or needs improvement, please let me know by raising an issue . Tip If none of these works for you, and you don't know how to configure this, you can always use\nWill Bond's package Terminal and hide this option (open terminal here)",
+ "title": "On other platform"
+ },
+ {
+ "location": "/commands/#open-in-explorer",
+ "text": "Command: fm_open_in_explorer This command simply opens the selected item(s) in your file explorer (or finder if you're on mac).\nIt'll open the current file if it's run from the command palette.",
+ "title": "Open In Explorer"
+ },
+ {
+ "location": "/references/auto-completion/",
+ "text": "All the input that are created from File Manager has an auto completions system. There is few things that you can change, but let's start with the beginning.\n\n\nSay you have the following structure:\n\n\nroot/\n img/\n favicon.png\n\n styles/\n stylus/\n main.styl\n css/\n main.css\n\n scripts/\n coffee/\n main.coffee\n js/\n main.js\n\n index.html\n\n\n\n\n\nIf you want to create a new script, you're going to have to type \nscripts/coffee/mynewscript.coffee\n. But, if you just type \nsc\n and then press \ntab\n, you'll see that \nscripts/\n automatically replace the \nsc\n, and you can type \nco\n press \ntab\n, \ncoffee\n will replace the \nco\n. I say \nreplace\n because it is case \ninsensitive\n. If you type \nST\n, it will replace it by \nstyles\n (in lower case).\n\n\nHere's a little gif to show you:\n\n\n\n\n\n\nNote\n\n\nYou might be wondering why I don't need to type the \n after the index. It simply because I\nchanged this symbol to a space: \n. You can do this by change the settings\n\nindex_folder_separator\n. Here's where \nit's documented\n\n\n\n\nOptions\n\n\n\n\ncase_sensitive\n: defines if the completion case sensitive. (default to \nfalse\n)\n\n\ncomplete_with_files_too\n: If you want the auto completion to use complete with files too (default to \ntrue\n)\n\n\npick_first\n: only relevant if \ncomplete_with_files_too\n is \ntrue\n. Define what to choose first if at least one folder and one file are available for completion. The valid values: \nfiles\n, \nfolders\n or \nnull\n. (default to \nfolders\n)",
+ "title": "Auto Completion"
+ },
+ {
+ "location": "/references/auto-completion/#options",
+ "text": "case_sensitive : defines if the completion case sensitive. (default to false ) complete_with_files_too : If you want the auto completion to use complete with files too (default to true ) pick_first : only relevant if complete_with_files_too is true . Define what to choose first if at least one folder and one file are available for completion. The valid values: files , folders or null . (default to folders )",
+ "title": "Options"
+ },
+ {
+ "location": "/references/settings/",
+ "text": "When, in this documentation, I'm talking about settings \nin general\n, I'm talking about FileManager's settings.\n\n\nQuick reminder\n\n\nThere's two \"type\" of settings.\n\n\n1: The global settings. Here's the hierarchy:\n\n\n\n\nBelow, you can see the order in which Sublime Text would process a hypothetical hierarchy of settings for Python files on Windows:\n\n\n\n\nPackages/Default/Preferences.sublime-settings\n\n\nPackages/Default/Preferences (Windows).sublime-settings\n\n\nPackages/AnyOtherPackage/Preferences.sublime-settings\n\n\nPackages/AnyOtherPackage/Preferences (Windows).sublime-settings\n\n\nPackages/User/Preferences.sublime-settings\n\n\nSettings from the current project\n\n\nPackages/Python/Python.sublime-settings\n\n\nPackages/Python/Python (Windows).sublime-settings\n\n\nPackages/User/Python.sublime-settings\n\n\nSession data for the current file\n\n\nAuto-adjusted settings\n\n\n\n\n\u2013 from \nthe unofficial docs\n (Thanks a lot)\n\n\n\n\n2: The packages settings.\n\n\nThey don't affect anything, except ... the plugin. They have 2 files, with the same name: one in the package folder, the other in you \nUser\n directory. This is the case for FileManager. And this file is called ... \nFileManager.sublime-settings\n. So, the file in the package directory is the default one, and the one in the user directory \noverwrites\n them.\n\n\nSo, which one are you talking about then?\n\n\nThe second one.\n\n\nHow do I edit them?\n\n\nThere's a few different ways:\n\n\n\n\nPreferences -\n Packages Settings -\n FileManager\n\n\nOpen the command palette (\nctrl+shift+p\n), and find \nPreferences\n:\n \nFile\n \nManager\n \nSettings\n\n\n\n\nThe file on the left is the default one (don't edit it, just look at it), and the one on the right is yours, have fun with it!\n\n\nAn example to make sure you understand...\n\n\n\n\nIn your \nsettings\n, you can specify an option: \naliases\n. It has to be an object.\n\n\n\n\n\n \nIn this part, I meant...\n\n The FileManager's settings (the second one)\n\n\n\n\n\nA few useful settings\n\n\nThis section is going to show you different settings that aren't specific to any command, that's\nwhy they have they're own.\n\n\n\n\nexplicitly_refresh_sidebar\n Each time you run a command that affects any file, if this option\nis set to true, FileManager will refresh the sidebar for you. Note that you can do this by running\n\nProject\n:\n \nRefresh\n \nFolders\n in the command palette.\n\n\nmenu_without_dirstraction\n When a FileManager's command is not enabled, it will still appear in\nthe sidebar's context menu, except if you set this option to \ntrue\n.\n\n\nshow_*_command\n Each FileManager's command has a settings starting with \nshow_\n, the command\nname without the \nfm_\n and finishing by \n_command\n. If set to \nfalse\n, this command\nwill \nalways\n be hidden (in the command palette, and the context menus)\n\n\n\n\n\n\nNote\n\n\nTo know the command name of a FileManager's command, just refer to the\n\ncommand page\n page. It's mentioned below each main title.",
+ "title": "Settings"
+ },
+ {
+ "location": "/references/settings/#quick-reminder",
+ "text": "There's two \"type\" of settings.",
+ "title": "Quick reminder"
+ },
+ {
+ "location": "/references/settings/#1-the-global-settings-heres-the-hierarchy",
+ "text": "Below, you can see the order in which Sublime Text would process a hypothetical hierarchy of settings for Python files on Windows: Packages/Default/Preferences.sublime-settings Packages/Default/Preferences (Windows).sublime-settings Packages/AnyOtherPackage/Preferences.sublime-settings Packages/AnyOtherPackage/Preferences (Windows).sublime-settings Packages/User/Preferences.sublime-settings Settings from the current project Packages/Python/Python.sublime-settings Packages/Python/Python (Windows).sublime-settings Packages/User/Python.sublime-settings Session data for the current file Auto-adjusted settings \u2013 from the unofficial docs (Thanks a lot)",
+ "title": "1: The global settings. Here's the hierarchy:"
+ },
+ {
+ "location": "/references/settings/#2-the-packages-settings",
+ "text": "They don't affect anything, except ... the plugin. They have 2 files, with the same name: one in the package folder, the other in you User directory. This is the case for FileManager. And this file is called ... FileManager.sublime-settings . So, the file in the package directory is the default one, and the one in the user directory overwrites them.",
+ "title": "2: The packages settings."
+ },
+ {
+ "location": "/references/settings/#so-which-one-are-you-talking-about-then",
+ "text": "The second one.",
+ "title": "So, which one are you talking about then?"
+ },
+ {
+ "location": "/references/settings/#how-do-i-edit-them",
+ "text": "There's a few different ways: Preferences - Packages Settings - FileManager Open the command palette ( ctrl+shift+p ), and find Preferences : File Manager Settings The file on the left is the default one (don't edit it, just look at it), and the one on the right is yours, have fun with it!",
+ "title": "How do I edit them?"
+ },
+ {
+ "location": "/references/settings/#an-example-to-make-sure-you-understand",
+ "text": "In your settings , you can specify an option: aliases . It has to be an object. \n In this part, I meant... \n The FileManager's settings (the second one)",
+ "title": "An example to make sure you understand..."
+ },
+ {
+ "location": "/references/settings/#a-few-useful-settings",
+ "text": "This section is going to show you different settings that aren't specific to any command, that's\nwhy they have they're own. explicitly_refresh_sidebar Each time you run a command that affects any file, if this option\nis set to true, FileManager will refresh the sidebar for you. Note that you can do this by running Project : Refresh Folders in the command palette. menu_without_dirstraction When a FileManager's command is not enabled, it will still appear in\nthe sidebar's context menu, except if you set this option to true . show_*_command Each FileManager's command has a settings starting with show_ , the command\nname without the fm_ and finishing by _command . If set to false , this command\nwill always be hidden (in the command palette, and the context menus) Note To know the command name of a FileManager's command, just refer to the command page page. It's mentioned below each main title.",
+ "title": "A few useful settings"
+ },
+ {
+ "location": "/references/templates/",
+ "text": "What is this?\n\n\nWhen you create a new file, a template is inserted. For now, FileManager chooses which template it should insert using the extension. If you're trying to create a \n.py\n file, it will look for a template that has the extension \n.py\n.\n\n\nYou're probably a bit confused right now, so let's clarify this.\n\n\n${\npackages\n}\n/User/.FileManager/template.*\n\n\nYou're template are stored in the \n.FileManager\n folder, inside your Sublime Text \nUser\n directory. If you have a look, it should be empty.\n\n\nA template will be a file called \ntemplate.\n plus the extension you want it to be active with.\n\n\nSo, for example, if you create a file called \ntemplate.py\n inside the the \n.FileManager\n directory with this content:\n\n\n# -*- encoding: utf-8 -*-\n\n\n\n# this is my template\n\n\n\n\n\n\nEach time you're going to create a new python file (with the extension \n.py\n), this content will be inserted as soon as it is opened.\n\n\nNow, some of you might wondering: \nwhy don't FileManager write the file with the right content, and \nthen\n open it?\n. Well, this the good part.\n\n\nYour template is in fact... \nsnippets\n!\n\n\nYes, they're in fact snippets! If you don't know how to use them, I strongly recommend having a look at \nthe unofficial documentation about snippets\n.\n\n\nCreate/edit templates from Sublime Text\n\n\nYou can create and edit your templates from Sublime Text.\n\n\nCreate\n\n\nOpen up the command palette, and in there, you should be able to find \nFile Manager: Create Template\n.\n\n\nIf you pick this option, an input will appear with the text \ntemplate.\n. Add the extension that you want, and it will create the template (if it already exists, it will simply open it)\n\n\nNow, just edit the file, and you're done! Your template has been edited.\n\n\nList\n\n\nOpen up the command palette, and in there, you should be able to find \nFile Manager: List Templates\n.\n\n\nIt will open up the browser that you can get in the \ncreate\n command, listing all your templates. Just pick one to edit it.\n\n\nHere you go! Hope you enjoy it! If you do, please let others people know about it!",
+ "title": "Templates"
+ },
+ {
+ "location": "/references/templates/#what-is-this",
+ "text": "When you create a new file, a template is inserted. For now, FileManager chooses which template it should insert using the extension. If you're trying to create a .py file, it will look for a template that has the extension .py . You're probably a bit confused right now, so let's clarify this.",
+ "title": "What is this?"
+ },
+ {
+ "location": "/references/templates/#packagesuserfilemanagertemplate",
+ "text": "You're template are stored in the .FileManager folder, inside your Sublime Text User directory. If you have a look, it should be empty. A template will be a file called template. plus the extension you want it to be active with. So, for example, if you create a file called template.py inside the the .FileManager directory with this content: # -*- encoding: utf-8 -*- # this is my template Each time you're going to create a new python file (with the extension .py ), this content will be inserted as soon as it is opened. Now, some of you might wondering: why don't FileManager write the file with the right content, and then open it? . Well, this the good part.",
+ "title": "${packages}/User/.FileManager/template.*"
+ },
+ {
+ "location": "/references/templates/#your-template-is-in-fact-snippets",
+ "text": "Yes, they're in fact snippets! If you don't know how to use them, I strongly recommend having a look at the unofficial documentation about snippets .",
+ "title": "Your template is in fact... snippets!"
+ },
+ {
+ "location": "/references/templates/#createedit-templates-from-sublime-text",
+ "text": "You can create and edit your templates from Sublime Text.",
+ "title": "Create/edit templates from Sublime Text"
+ },
+ {
+ "location": "/references/templates/#create",
+ "text": "Open up the command palette, and in there, you should be able to find File Manager: Create Template . If you pick this option, an input will appear with the text template. . Add the extension that you want, and it will create the template (if it already exists, it will simply open it) Now, just edit the file, and you're done! Your template has been edited.",
+ "title": "Create"
+ },
+ {
+ "location": "/references/templates/#list",
+ "text": "Open up the command palette, and in there, you should be able to find File Manager: List Templates . It will open up the browser that you can get in the create command, listing all your templates. Just pick one to edit it. Here you go! Hope you enjoy it! If you do, please let others people know about it!",
+ "title": "List"
+ },
+ {
+ "location": "/references/type-of-path/",
+ "text": "On window, paths looks bad, and are not agreeable to type. On, Linux, it's different. So, user friendly path are path that are inspired by Linux. Computer friendly path are path that are valid for a computer, depending on the OS.\n\n\nExample on window\n\n\n\n\n\n\n\n\nFriendly form\n\n\nComputer form\n\n\n\n\n\n\n\n\n\n\n~/folder/file.txt\n\n\nC:\\Users\\\nusername\n\\folder\\file.txt\n\n\n\n\n\n\nC:\\Users\\math\\here\n\n\nC:\\Users\\math\\here\n\n\n\n\n\n\n\n\nYou'd like to use aliases? Have a look at the \naliases page\n then!",
+ "title": "Type of path"
+ },
+ {
+ "location": "/references/type-of-path/#example-on-window",
+ "text": "Friendly form Computer form ~/folder/file.txt C:\\Users\\ username \\folder\\file.txt C:\\Users\\math\\here C:\\Users\\math\\here You'd like to use aliases? Have a look at the aliases page then!",
+ "title": "Example on window"
+ },
+ {
+ "location": "/references/aliases/",
+ "text": "Why should you use aliases?\n\n\nFor example, if you'd like to create file in the Sublime Text \nPackages\n directory, on Windows,\nyou'd have to type \n~/AppData/Roaming/Sublime Text 3/Packages\n and then, the name/path of your\nfile. Because you have access to those aliases\n\n\n\n\n\n\n\n\nAlias Name\n\n\nValue (changes, that's the good part \n)\n\n\n\n\n\n\n\n\n\n\nproject_extension\n\n\nsublime-project\n\n\n\n\n\n\nproject_name\n\n\nFileManagerDocs.sublime-project\n\n\n\n\n\n\nfile_name\n\n\nAliases.md\n\n\n\n\n\n\npackages\n\n\nC:\\Users\\math\\AppData\\Roaming\\Sublime Text 3\\Packages\n\n\n\n\n\n\nproject_base_name\n\n\nFileManagerDocs\n\n\n\n\n\n\nfile_base_name\n\n\nAliases\n\n\n\n\n\n\nfile\n\n\nC:\\Users\\math\\AppData\\Roaming\\Sublime Text 3\\Packages\\FileManagerDocs\\wiki\\Aliases.md\n\n\n\n\n\n\nfolder\n\n\nC:\\Users\\math\\AppData\\Roaming\\Sublime Text 3\\Packages\\FileManagerDocs\n\n\n\n\n\n\nfile_extension\n\n\nmd\n\n\n\n\n\n\nproject_path\n\n\nC:\\Users\\math\\AppData\\Roaming\\Sublime Text 3\\Packages\\User\\Projects\n\n\n\n\n\n\nfile_path\n\n\nC:\\Users\\math\\AppData\\Roaming\\Sublime Text 3\\Packages\\FileManagerDocs\\wiki\n\n\n\n\n\n\nproject\n\n\nC:\\Users\\math\\AppData\\Roaming\\Sublime Text 3\\Packages\\User\\Projects\\FileManagerDocs.sublime-project\n\n\n\n\n\n\nplatform\n\n\nWindows\n\n\n\n\n\n\n\n\nYou can just type \n$packages\n and it's the \nexact\n same. Sounds good? Then keep reading\n\n\n\n\nNote\n\n\nThe values are the ones I get when, as you can see, I'm editing this page (\nAliases.md\n), \nI'm on Windows, the project name is \nFileManagerDocs.sublime-project\n etc...\n\n\n\n\nSo, the table above shows all the aliases you have access to by default when you use any input\nshown by FileManager.\n\n\nWhen you want to use those prefixes, you have to prefix them with a \n$\n, like so: \n$packages\n, \n\n$project_base_name\n, etc.\n\n\nUsage\n\n\n\n\nNote\n\n\nThis variable system is exactly the same as the \nsnippets\n variables. So, if you already know\nhow to use them, then you can skip this part. Otherwise, then keep reading, what are you\nwaiting for? \n\n\n\n\nAs I just said earlier, every aliases have to be prefixed by a \n$\n. But you can also wrap the\nalias' name with some \n{curly braces}\n, with the \n$\n, like so: \n${\nmy\n \nvar\n}\n. \n\n\nWhen should you use curly braces? When there is character in the alias name that aren't normally\nallowed (such as spaces).\n\n\nstring: \nHello \n$var\n!\n\naliases: \n - \nvar\n: \nworld\n\n\nresult: \nHello world!\n\n\nstring: \nHello \n${\nmy\n \nvar\n}\n!\n\naliases: \n - \nmy var\n: \nworld\n\n\nresult: \nHello world!\n\n\n\n\n\n\nWhat if I try to use an alias that doesn't exists?\n\n\nThe default value of every aliases are an empty string \n. So, it will be replaced by an empty\nstring.\n\n\nstring: \nHello \n${\nworld\n}\n\naliases: \n - \nsomething\n: \na value\n\n\nresult: \nHello \n\n\n\n\n\n\nChanging the default value\n\n\nIf you want to change the default value, in case the alias is not defined, you can do it like so:\n\n${\nmy\n \nvar\n:\ndefault\n \nvalue\n}\n\n\nstring: \n${\nmy\n \nundefined\n \nvar\n:\nmy\n \ndefault\n \nvalue\n}\n and some text\n\naliases: \nempty\n\nresult: \nmy default value and some text\n\n\nstring: \n${\nmy\n \nundefined\n \nvar\n:\nmy\n \ndefault\n \nvalue\n}\n and some text\n\naliases: \n - \nmy undefined var\n: \nhello\n\nresult: \nhello and some text\n\n\n\n\n\n\nEscaping\n\n\n\n\nWhat if I want to use a \nliteral\n \n$\n?\n\n\n\n\nJust prefix it by an other \n$\n!\n\n\nstring: \nHello $$var\n\naliases:\n - var: \nit doesn\nt matter\n\nresult: \nHello $$var\n\n\n\n\n\n\n\n\nNote\n\n\nthe function \nsublime.expand_variables\n escape the \n$\n using a backslash (\n\\\n). So, for the\nsnippets, you'd have to escape with a \n\\\n. The problem is that FileManager auto replaces the \nbackslash by forward slashes (because of Windows), and because \n$\n can be in a file name, \nthere's no way to tell if it's an escaped dollar sign, or a path.\n\n\n\n\nNesting\n\n\nYou can nest them, like so: \n${\nvar1\n:\n$\n{\nvar2\n:\ndefault\n}\n}\n.\n\n\nRegex and format string: substitutions\n\n\nThis part is, just as nesting, and default values, probably not of any use \nfor FileManager\n.\nI just wanted to mention it because it's useful for the snippets. You can find more info about it \non \nthe community powered unofficial documentation\n\n\nReal example\n\n\nFor example, if you run the \nfm_create\n command (\nalt+n\n):\n\n\n$packages/FileManager/FMcommands\n\n\n\n\n\nIt will open the \n\"browser\"\n listing all the commands of FileManager,\n(because each of them are in a separated file).\n\n\nCustom aliases\n\n\nThis is the good part. In your \nsettings\n, you can specify an option: \naliases\n. It\nhas to be an object.\n\n\naliases\n:\n \n{\n\n \nname\n:\n \nvalue (with other $aliases if you want to)\n\n\n}\n\n\n\n\n\n\n\n\nWarning\n\n\nIn the name, \ndo not specify the prefixing \n$\n. It won't work otherwise.\n\n\n\n\nIn your alias' value, you can use other aliases. And those aliases can use others, etc... It's\nrecursive, there's no limit (almost). \n\n\naliases\n:\n \n{\n\n \nst\n:\n \n$packages\n,\n \n// because being lazy is the first quality of a programmer ;)\n\n \nstu\n:\n \n$st/User\n,\n\n\n}\n\n\n\n\n\n\nYou see? It's fairly simple, but it saves (at least for me) a fair bit of time! (because I love\nhaving a look at the plugins code, okay, but I'm sure you'll find a use too!)\n\n\nWatch out for infinite loops!\n\n\nBecause aliases can \"call\" each other, it can make an infinite loop... And you don't want this.\n\n\nAn example of infinite loop\n\n\naliases\n:\n \n{\n\n \nfirst\n:\n \ninclude $second\n,\n\n \nsecond\n:\n \ninclude $first\n\n\n}\n\n\n\n\n\n\nAs you can see, they're going to call each other over and over again. So, an error message will pop\nup, telling you that there's been an infinite loop, and you need to check your aliases. It will\nalso open your default browser right here. If you want to disable this last behaviour, add this to\nyour \nsettings\n:\n\n\nopen_help_on_alias_infinite_loop\n:\n \nfalse\n,\n\n\n\n\n\n\n\n\nNote\n\n\nThe limit is \n100\n. If there is more than 100 recursions, it will stop, and show up the error\nmessage, as explained earlier.\n\n\n\n\nWatch out for the viscous ones! This one is fairly simple, there's only 2 steps. \nBut here's a not-so-well-intentioned one:\n\n\naliases\n:\n \n{\n\n \nfirst\n:\n \ninclude $second\n,\n\n \nsecond\n:\n \nhello $third\n,\n\n \nthird\n:\n \nshow $forth\n,\n\n \nforth\n:\n \nloop $first\n\n\n}",
+ "title": "Aliases"
+ },
+ {
+ "location": "/references/aliases/#why-should-you-use-aliases",
+ "text": "For example, if you'd like to create file in the Sublime Text Packages directory, on Windows,\nyou'd have to type ~/AppData/Roaming/Sublime Text 3/Packages and then, the name/path of your\nfile. Because you have access to those aliases Alias Name Value (changes, that's the good part ) project_extension sublime-project project_name FileManagerDocs.sublime-project file_name Aliases.md packages C:\\Users\\math\\AppData\\Roaming\\Sublime Text 3\\Packages project_base_name FileManagerDocs file_base_name Aliases file C:\\Users\\math\\AppData\\Roaming\\Sublime Text 3\\Packages\\FileManagerDocs\\wiki\\Aliases.md folder C:\\Users\\math\\AppData\\Roaming\\Sublime Text 3\\Packages\\FileManagerDocs file_extension md project_path C:\\Users\\math\\AppData\\Roaming\\Sublime Text 3\\Packages\\User\\Projects file_path C:\\Users\\math\\AppData\\Roaming\\Sublime Text 3\\Packages\\FileManagerDocs\\wiki project C:\\Users\\math\\AppData\\Roaming\\Sublime Text 3\\Packages\\User\\Projects\\FileManagerDocs.sublime-project platform Windows You can just type $packages and it's the exact same. Sounds good? Then keep reading Note The values are the ones I get when, as you can see, I'm editing this page ( Aliases.md ), \nI'm on Windows, the project name is FileManagerDocs.sublime-project etc... So, the table above shows all the aliases you have access to by default when you use any input\nshown by FileManager. When you want to use those prefixes, you have to prefix them with a $ , like so: $packages , $project_base_name , etc.",
+ "title": "Why should you use aliases?"
+ },
+ {
+ "location": "/references/aliases/#usage",
+ "text": "Note This variable system is exactly the same as the snippets variables. So, if you already know\nhow to use them, then you can skip this part. Otherwise, then keep reading, what are you\nwaiting for? As I just said earlier, every aliases have to be prefixed by a $ . But you can also wrap the\nalias' name with some {curly braces} , with the $ , like so: ${ my var } . When should you use curly braces? When there is character in the alias name that aren't normally\nallowed (such as spaces). string: Hello $var ! \naliases: \n - var : world \n\nresult: Hello world! \n\nstring: Hello ${ my var } ! \naliases: \n - my var : world \n\nresult: Hello world!",
+ "title": "Usage"
+ },
+ {
+ "location": "/references/aliases/#what-if-i-try-to-use-an-alias-that-doesnt-exists",
+ "text": "The default value of every aliases are an empty string . So, it will be replaced by an empty\nstring. string: Hello ${ world } \naliases: \n - something : a value \n\nresult: Hello",
+ "title": "What if I try to use an alias that doesn't exists?"
+ },
+ {
+ "location": "/references/aliases/#changing-the-default-value",
+ "text": "If you want to change the default value, in case the alias is not defined, you can do it like so: ${ my var : default value } string: ${ my undefined var : my default value } and some text \naliases: empty \nresult: my default value and some text \n\nstring: ${ my undefined var : my default value } and some text \naliases: \n - my undefined var : hello \nresult: hello and some text",
+ "title": "Changing the default value"
+ },
+ {
+ "location": "/references/aliases/#escaping",
+ "text": "What if I want to use a literal $ ? Just prefix it by an other $ ! string: Hello $$var \naliases:\n - var: it doesn t matter \nresult: Hello $$var Note the function sublime.expand_variables escape the $ using a backslash ( \\ ). So, for the\nsnippets, you'd have to escape with a \\ . The problem is that FileManager auto replaces the \nbackslash by forward slashes (because of Windows), and because $ can be in a file name, \nthere's no way to tell if it's an escaped dollar sign, or a path.",
+ "title": "Escaping"
+ },
+ {
+ "location": "/references/aliases/#nesting",
+ "text": "You can nest them, like so: ${ var1 : $ { var2 : default } } .",
+ "title": "Nesting"
+ },
+ {
+ "location": "/references/aliases/#regex-and-format-string-substitutions",
+ "text": "This part is, just as nesting, and default values, probably not of any use for FileManager .\nI just wanted to mention it because it's useful for the snippets. You can find more info about it \non the community powered unofficial documentation",
+ "title": "Regex and format string: substitutions"
+ },
+ {
+ "location": "/references/aliases/#real-example",
+ "text": "For example, if you run the fm_create command ( alt+n ): $packages/FileManager/FMcommands It will open the \"browser\" listing all the commands of FileManager,\n(because each of them are in a separated file).",
+ "title": "Real example"
+ },
+ {
+ "location": "/references/aliases/#custom-aliases",
+ "text": "This is the good part. In your settings , you can specify an option: aliases . It\nhas to be an object. aliases : { \n name : value (with other $aliases if you want to) } Warning In the name, do not specify the prefixing $ . It won't work otherwise. In your alias' value, you can use other aliases. And those aliases can use others, etc... It's\nrecursive, there's no limit (almost). aliases : { \n st : $packages , // because being lazy is the first quality of a programmer ;) \n stu : $st/User , } You see? It's fairly simple, but it saves (at least for me) a fair bit of time! (because I love\nhaving a look at the plugins code, okay, but I'm sure you'll find a use too!)",
+ "title": "Custom aliases"
+ },
+ {
+ "location": "/references/aliases/#watch-out-for-infinite-loops",
+ "text": "Because aliases can \"call\" each other, it can make an infinite loop... And you don't want this.",
+ "title": "Watch out for infinite loops!"
+ },
+ {
+ "location": "/references/aliases/#an-example-of-infinite-loop",
+ "text": "aliases : { \n first : include $second , \n second : include $first } As you can see, they're going to call each other over and over again. So, an error message will pop\nup, telling you that there's been an infinite loop, and you need to check your aliases. It will\nalso open your default browser right here. If you want to disable this last behaviour, add this to\nyour settings : open_help_on_alias_infinite_loop : false , Note The limit is 100 . If there is more than 100 recursions, it will stop, and show up the error\nmessage, as explained earlier. Watch out for the viscous ones! This one is fairly simple, there's only 2 steps. \nBut here's a not-so-well-intentioned one: aliases : { \n first : include $second , \n second : hello $third , \n third : show $forth , \n forth : loop $first }",
+ "title": "An example of infinite loop"
+ },
+ {
+ "location": "/contributing/",
+ "text": "You want to contribute to this package? Great!\n\n\nIf you want to contribute to the documentation, you're at the right place.\nOtherwise, you should have a look at \nthe readme\n\n\nThe documentation is written using \nmkdocs\n. So, if you want to just fix a typo for example, you\nmight not need to download everything, just edit the corresponding markdown file (it's \nreally\n\nsimple), and if you're a bit careful, it should be all right. But as soon as you start making some\nbigger changes, please do the following to have a preview to know how it's going to look like.\n\n\nWhichever option you chose, you first need to fork this repo.\n\n\n\n\nNote\n\n\nYou can just raise an issue on the \nGitHub issue tracker\n to request a fix in the docs,\nit's up to you\n\n\n\n\nInstall \nmkdocs\n\n\nSo, you want to make big changes? Or you just want to have the beautiful material theme on your\ncomputer \n\n\nSo, here's how to get going:\n\n\n\n\nNote\n\n\nYou'll need Python installed on your system. It works with both \n2\n and \n3\n.\n\n\n\n\n$ git clone \nyour_fork\n\n$ \ncd\n FileManager\n$ virtualenv venv\n$ \nsource\n venv/bin/activate \n# Windows: .\\venv\\Scripts\\activate.bat\n\n$ pip install -r requirements.txt\n\n\n\n\n\n\n\nI don't have pip!\n\n\n\n\nQuickly, pip is a package manager for python. You can install it by saving this script:\n\nget-pip.py\n and running it like so\n\n\n$ python get-pip.py\n\n\n\n\n\n\n\nI don't have virtualenv!\n\n\n\n\nWell, you can install it by using \npip\n like so:\n\n\n$ pip install virtualenv\n\n\n\n\n\nOnce you have this installed, you have access to the command \nmkdocs\n.\n\n\nMake your changes!\n\n\nNow, you need to create a new branch, with the \"name\" of what your adding. For\nexample:\n\n\n$ git checkout -b improve-fm-create-explanation\n\n\n\n\n\nMake your changes. You can preview them in your browser by running:\n\n\n$ mkdocs serve\n\n\n\n\n\nNow, commit your changes, and push them. In this case, it'd be:\n\n\n$ git push origin improve-fm-create-explanation\n\n\n\n\n\nAnd then, just send a pull request \n\n\n\n\nNote\n\n\nIf you're creating a new page, you'll need to add it the \nmkdocs.yml\n \npages\n object.\n\n\npages\n:\n\n \n-\n \npagename\n:\n \npage/path.md\n\n\n\n\n\n\n\n\nConvention\n\n\nTo keep this doc enjoyable to edit, here are the conventions that it has to respect:\n\n\n\n\nkeep the line length under 100 chars (\n\\n\n included). I advice you to add this to your project\nsettings: \nrulers: [99]\n. Tables are the only exception. URLs are not, because you can specify\nthem at the bottom of the file \u2014 \nmore info\n\n\nprefer \nfiles\n link instead of \nURL\n link. You can do this: \n[\nmy\n \nlink\n](\nrelative\n/\npath\n/\nto\n/\nfile\n.\nmd\n)\n\nMkdocs will convert it to the valid URL for you\n\n\nuse \n!!!\n block with avidity! Na, not \nthat\n much, but don't hesitate to use them, it brings\nrhythm to the doc, which make it more enjoyable to read. \u2014 \nmore info\n\n\nuse fenced code block: \n```\n \u2014 \nmore info\n\n\n\n\n\n\nWarning\n\n\nThose convention haven't been respected since the beginning.\n\n\n\n\nRecommended \n.sublime-project\n file\n\n\n{\n\n \nfolders\n:\n\n \n[\n\n \n{\n\n \npath\n:\n \nC:\\\\Users\\\\math\\\\AppData\\\\Roaming\\\\Sublime Text 3\\\\Packages\\\\FileManager\n,\n\n \nfolder_exclude_patterns\n:\n \n[\n.sublime\n,\n \nFMCommands\n,\n \nmessages\n,\n \nsend2trash\n,\n \nsite\n,\n\n \ntests\n],\n\n \nfile_exclude_patterns\n:\n \n[\nmessages.json\n,\n \n*.py\n]\n\n \n}\n\n \n],\n\n \nsettings\n:\n\n \n{\n\n \nsave_on_focus_lost\n:\n \nfalse\n,\n\n \nspell_check\n:\n \ntrue\n,\n\n \nrulers\n:\n \n[\n99\n]\n\n \n}\n\n\n}",
+ "title": "Contributing"
+ },
+ {
+ "location": "/contributing/#install-mkdocs",
+ "text": "So, you want to make big changes? Or you just want to have the beautiful material theme on your\ncomputer So, here's how to get going: Note You'll need Python installed on your system. It works with both 2 and 3 . $ git clone your_fork \n$ cd FileManager\n$ virtualenv venv\n$ source venv/bin/activate # Windows: .\\venv\\Scripts\\activate.bat \n$ pip install -r requirements.txt I don't have pip! Quickly, pip is a package manager for python. You can install it by saving this script: get-pip.py and running it like so $ python get-pip.py I don't have virtualenv! Well, you can install it by using pip like so: $ pip install virtualenv Once you have this installed, you have access to the command mkdocs .",
+ "title": "Install mkdocs"
+ },
+ {
+ "location": "/contributing/#make-your-changes",
+ "text": "Now, you need to create a new branch, with the \"name\" of what your adding. For\nexample: $ git checkout -b improve-fm-create-explanation Make your changes. You can preview them in your browser by running: $ mkdocs serve Now, commit your changes, and push them. In this case, it'd be: $ git push origin improve-fm-create-explanation And then, just send a pull request Note If you're creating a new page, you'll need to add it the mkdocs.yml pages object. pages : \n - pagename : page/path.md",
+ "title": "Make your changes!"
+ },
+ {
+ "location": "/contributing/#convention",
+ "text": "To keep this doc enjoyable to edit, here are the conventions that it has to respect: keep the line length under 100 chars ( \\n included). I advice you to add this to your project\nsettings: rulers: [99] . Tables are the only exception. URLs are not, because you can specify\nthem at the bottom of the file \u2014 more info prefer files link instead of URL link. You can do this: [ my link ]( relative / path / to / file . md ) \nMkdocs will convert it to the valid URL for you use !!! block with avidity! Na, not that much, but don't hesitate to use them, it brings\nrhythm to the doc, which make it more enjoyable to read. \u2014 more info use fenced code block: ``` \u2014 more info Warning Those convention haven't been respected since the beginning.",
+ "title": "Convention"
+ },
+ {
+ "location": "/contributing/#recommended-sublime-project-file",
+ "text": "{ \n folders : \n [ \n { \n path : C:\\\\Users\\\\math\\\\AppData\\\\Roaming\\\\Sublime Text 3\\\\Packages\\\\FileManager , \n folder_exclude_patterns : [ .sublime , FMCommands , messages , send2trash , site , \n tests ], \n file_exclude_patterns : [ messages.json , *.py ] \n } \n ], \n settings : \n { \n save_on_focus_lost : false , \n spell_check : true , \n rulers : [ 99 ] \n } }",
+ "title": "Recommended .sublime-project file"
+ },
+ {
+ "location": "/license/",
+ "text": "This project is published under MIT license.\n\n\n\n\nThe MIT License is a permissive license that is short and to the point. It lets people do anything they want with your code as long as they provide attribution back to you and don\u2019t hold you liable.\n\n\n\u2014 \nfrom \nchoosealicense.com\n, by \nGitHub\n\n\n\n\nCopyright 2017 Mathieu PATUREL\n\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.",
+ "title": "License"
+ },
+ {
+ "location": "/about/",
+ "text": "About FileManager\n\n\nHello! I'm math2001, and I'm the author of FileManager.\n\n\nI've created this package because I...don't have a really fast computer (pretty slow to be honest), so I'm use to have small tool, but still powerful. Sublime Text is probably the best example (although I wouldn't call it small, but super-fast \n)\n\n\nSo, when I installed SidebarEnhancement, it just didn't fit. There were so many options, I used only about half of them. You couldn't create any nested files (actually, you could, but you'd get an error message poping up). There was no auto completion and it was messy. I just didn't like it.\n\n\nThen AdvancedNewFile came into the game. This one is really cool. It has auto completion (although I discovered when I started creating FileManager \n), you can create nested files, folders. But it wasn't included in the Side Bar, which is, in my opinion, a bit silly.\n\n\nSo, I decided to mix them together, but I kept in mind that I should add feature that are \nreally\n useful. And out of this came \nFileManager\n.\n\n\nI'm completely open to any suggestions, and I would love to hear what \nyou\n think of this package or if you enjoy it! So, you can \nsend me a tweet\n, or simply star the repo!",
+ "title": "About"
+ },
+ {
+ "location": "/about/#about-filemanager",
+ "text": "Hello! I'm math2001, and I'm the author of FileManager. I've created this package because I...don't have a really fast computer (pretty slow to be honest), so I'm use to have small tool, but still powerful. Sublime Text is probably the best example (although I wouldn't call it small, but super-fast ) So, when I installed SidebarEnhancement, it just didn't fit. There were so many options, I used only about half of them. You couldn't create any nested files (actually, you could, but you'd get an error message poping up). There was no auto completion and it was messy. I just didn't like it. Then AdvancedNewFile came into the game. This one is really cool. It has auto completion (although I discovered when I started creating FileManager ), you can create nested files, folders. But it wasn't included in the Side Bar, which is, in my opinion, a bit silly. So, I decided to mix them together, but I kept in mind that I should add feature that are really useful. And out of this came FileManager . I'm completely open to any suggestions, and I would love to hear what you think of this package or if you enjoy it! So, you can send me a tweet , or simply star the repo!",
+ "title": "About FileManager"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/prevent_default.py b/prevent_default.py
deleted file mode 100644
index d7d4dce..0000000
--- a/prevent_default.py
+++ /dev/null
@@ -1,68 +0,0 @@
-import sublime_plugin
-from Default.side_bar import RenamePathCommand
-
-
-class NewFileAtCommand(sublime_plugin.WindowCommand):
- def is_visible(self):
- return False
-
- def is_enabled(self):
- return False
-
-
-class DeleteFileCommand(sublime_plugin.WindowCommand):
- def is_visible(self):
- return False
-
- def is_enabled(self):
- return False
-
-
-class NewFolderCommand(sublime_plugin.WindowCommand):
- def is_visible(self):
- return False
-
- def is_enabled(self):
- return False
-
-
-class DeleteFolderCommand(sublime_plugin.WindowCommand):
- def is_visible(self):
- return False
-
- def is_enabled(self):
- return False
-
-
-class RenamePathCommand(RenamePathCommand):
- def is_visible(self):
- return False
-
-
-class FindInFolderCommand(sublime_plugin.WindowCommand):
- def is_visible(self):
- return False
-
- def is_enabled(self):
- return False
-
-
-class OpenContainingFolderCommand(sublime_plugin.WindowCommand):
- def is_visible(self):
- return False
-
- def is_enabled(self):
- return False
-
-
-class OpenInBrowserCommand(sublime_plugin.TextCommand):
- def is_visible(self):
- return False
-
- def is_enabled(self):
- return False
-
-
-class CopyPathCommand(sublime_plugin.TextCommand):
- def is_visible(self):
- return False
diff --git a/references/aliases/index.html b/references/aliases/index.html
new file mode 100755
index 0000000..52cc00e
--- /dev/null
+++ b/references/aliases/index.html
@@ -0,0 +1,863 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Aliases - FileManager
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
For example, if you'd like to create file in the Sublime Text Packages directory, on Windows,
+you'd have to type ~/AppData/Roaming/Sublime Text 3/Packages and then, the name/path of your
+file. Because you have access to those aliases
+
+
+
+
Alias Name
+
Value (changes, that's the good part )
+
+
+
+
+
project_extension
+
sublime-project
+
+
+
project_name
+
FileManagerDocs.sublime-project
+
+
+
file_name
+
Aliases.md
+
+
+
packages
+
C:\Users\math\AppData\Roaming\Sublime Text 3\Packages
+
+
+
project_base_name
+
FileManagerDocs
+
+
+
file_base_name
+
Aliases
+
+
+
file
+
C:\Users\math\AppData\Roaming\Sublime Text 3\Packages\FileManagerDocs\wiki\Aliases.md
+
+
+
folder
+
C:\Users\math\AppData\Roaming\Sublime Text 3\Packages\FileManagerDocs
+
+
+
file_extension
+
md
+
+
+
project_path
+
C:\Users\math\AppData\Roaming\Sublime Text 3\Packages\User\Projects
+
+
+
file_path
+
C:\Users\math\AppData\Roaming\Sublime Text 3\Packages\FileManagerDocs\wiki
+
+
+
project
+
C:\Users\math\AppData\Roaming\Sublime Text 3\Packages\User\Projects\FileManagerDocs.sublime-project
+
+
+
platform
+
Windows
+
+
+
+
You can just type $packages and it's the exact same. Sounds good? Then keep reading
+
+
Note
+
The values are the ones I get when, as you can see, I'm editing this page (Aliases.md),
+I'm on Windows, the project name is FileManagerDocs.sublime-project etc...
+
+
So, the table above shows all the aliases you have access to by default when you use any input
+shown by FileManager.
+
When you want to use those prefixes, you have to prefix them with a $, like so: $packages,
+$project_base_name, etc.
This variable system is exactly the same as the snippets variables. So, if you already know
+how to use them, then you can skip this part. Otherwise, then keep reading, what are you
+waiting for?
+
+
As I just said earlier, every aliases have to be prefixed by a $. But you can also wrap the
+alias' name with some {curly braces}, with the $, like so: ${myvar}.
+
When should you use curly braces? When there is character in the alias name that aren't normally
+allowed (such as spaces).
If you want to change the default value, in case the alias is not defined, you can do it like so:
+${myvar:defaultvalue}
+
string: "${myundefinedvar:mydefaultvalue} and some text"
+aliases: <empty>
+result: "my default value and some text"
+
+string: "${myundefinedvar:mydefaultvalue} and some text"
+aliases:
+ - "my undefined var": "hello"
+result: "hello and some text"
+
the function sublime.expand_variables escape the $ using a backslash (\). So, for the
+snippets, you'd have to escape with a \. The problem is that FileManager auto replaces the
+backslash by forward slashes (because of Windows), and because $ can be in a file name,
+there's no way to tell if it's an escaped dollar sign, or a path.
This part is, just as nesting, and default values, probably not of any use for FileManager.
+I just wanted to mention it because it's useful for the snippets. You can find more info about it
+on the community powered unofficial documentation
This is the good part. In your settings, you can specify an option: aliases. It
+has to be an object.
+
"aliases":{
+ "name":"value (with other $aliases if you want to)"
+}
+
+
+
+
+
Warning
+
In the name, do not specify the prefixing $. It won't work otherwise.
+
+
In your alias' value, you can use other aliases. And those aliases can use others, etc... It's
+recursive, there's no limit (almost).
+
"aliases":{
+ "st":"$packages",// because being lazy is the first quality of a programmer ;)
+ "stu":"$st/User",
+}
+
+
+
+
You see? It's fairly simple, but it saves (at least for me) a fair bit of time! (because I love
+having a look at the plugins code, okay, but I'm sure you'll find a use too!)
As you can see, they're going to call each other over and over again. So, an error message will pop
+up, telling you that there's been an infinite loop, and you need to check your aliases. It will
+also open your default browser right here. If you want to disable this last behaviour, add this to
+your settings:
+
"open_help_on_alias_infinite_loop":false,
+
+
+
+
+
Note
+
The limit is 100. If there is more than 100 recursions, it will stop, and show up the error
+message, as explained earlier.
+
+
Watch out for the viscous ones! This one is fairly simple, there's only 2 steps.
+But here's a not-so-well-intentioned one:
All the input that are created from File Manager has an auto completions system. There is few things that you can change, but let's start with the beginning.
If you want to create a new script, you're going to have to type scripts/coffee/mynewscript.coffee. But, if you just type sc and then press tab, you'll see that scripts/ automatically replace the sc, and you can type co press tab, coffee will replace the co. I say replace because it is case insensitive. If you type ST, it will replace it by styles (in lower case).
+
Here's a little gif to show you:
+
+
+
Note
+
You might be wondering why I don't need to type the > after the index. It simply because I
+changed this symbol to a space: . You can do this by change the settings
+index_folder_separator. Here's where it's documented
case_sensitive: defines if the completion case sensitive. (default to false)
+
complete_with_files_too: If you want the auto completion to use complete with files too (default to true)
+
pick_first: only relevant if complete_with_files_too is true. Define what to choose first if at least one folder and one file are available for completion. The valid values: files, folders or null. (default to folders)
They don't affect anything, except ... the plugin. They have 2 files, with the same name: one in the package folder, the other in you User directory. This is the case for FileManager. And this file is called ... FileManager.sublime-settings. So, the file in the package directory is the default one, and the one in the user directory overwrites them.
This section is going to show you different settings that aren't specific to any command, that's
+why they have they're own.
+
+
explicitly_refresh_sidebar Each time you run a command that affects any file, if this option
+is set to true, FileManager will refresh the sidebar for you. Note that you can do this by running
+Project:RefreshFolders in the command palette.
+
menu_without_dirstraction When a FileManager's command is not enabled, it will still appear in
+the sidebar's context menu, except if you set this option to true.
+
show_*_command Each FileManager's command has a settings starting with show_, the command
+name without the fm_ and finishing by _command. If set to false, this command
+will always be hidden (in the command palette, and the context menus)
+
+
+
Note
+
To know the command name of a FileManager's command, just refer to the
+command page page. It's mentioned below each main title.
When you create a new file, a template is inserted. For now, FileManager chooses which template it should insert using the extension. If you're trying to create a .py file, it will look for a template that has the extension .py.
+
You're probably a bit confused right now, so let's clarify this.
Open up the command palette, and in there, you should be able to find File Manager: Create Template.
+
If you pick this option, an input will appear with the text template.. Add the extension that you want, and it will create the template (if it already exists, it will simply open it)
+
Now, just edit the file, and you're done! Your template has been edited.
On window, paths looks bad, and are not agreeable to type. On, Linux, it's different. So, user friendly path are path that are inspired by Linux. Computer friendly path are path that are valid for a computer, depending on the OS.