From 94c7b9d74a884c2bc240eac6208c8ae9f5cabe3c Mon Sep 17 00:00:00 2001 From: guillermooo Date: Mon, 28 May 2012 17:43:37 +0200 Subject: [PATCH 01/79] minor changes --- source/extensibility/plugins.rst | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/source/extensibility/plugins.rst b/source/extensibility/plugins.rst index 35c54a9..07fd254 100644 --- a/source/extensibility/plugins.rst +++ b/source/extensibility/plugins.rst @@ -7,7 +7,7 @@ Plugins More information on the Python API. :doc:`Plugins Reference <../reference/plugins>` - More information about plugins. + More information about plugins. Sublime Text 2 is programmable with Python scripts. Plugins reuse existing @@ -61,7 +61,7 @@ Analyzing Your First Plugin The plugin created in the previous section should look roughly like this:: import sublime, sublime_plugin - + class ExampleCommand(sublime_plugin.TextCommand): def run(self, edit): self.view.insert(edit, 0, "Hello, World!") @@ -128,11 +128,14 @@ Window commands operate at the window level. This doesn't mean that you cannot manipulate views from window commands, but rather that you don't need views to exist in order for window commands to be available. For instance, the built-in command ``new_file`` is defined as a ``WindowCommand`` so it works too when no -view is open. Requiring a view to exisit in that case wouln't make sense. +view is open. Requiring a view to exisit in that case wouldn't make sense. Window command instances have a ``.window`` attribute pointing to the window instance that created them. +The ``.run()`` method of a window command does not need to take any required +arguments. + Text Commands ------------- @@ -142,6 +145,9 @@ in order to be available. View command instances have a ``.view`` attribute pointing to the view instance that created them. +The ``.run()`` method of a text command needs to take an ``edit`` instance as +a first positional argument. + Text Commands and the ``edit`` Object ------------------------------------- @@ -168,20 +174,20 @@ plugins go, this a very bad one. :: import sublime, sublime_plugin - + from xml.etree import ElementTree as ET from urllib import urlopen - + GOOGLE_AC = r"http://google.com/complete/search?output=toolbar&q=%s" - + class GoogleAutocomplete(sublime_plugin.EventListener): def on_query_completions(self, view, prefix, locations): elements = ET.parse( urlopen(GOOGLE_AC % prefix) ).getroot().findall("./CompleteSuggestion/suggestion") - + sugs = [(x.attrib["data"],) * 2 for x in elements] - + return sugs .. note:: From 72840c7ca2758c09085b37648dde9f54b724eedf Mon Sep 17 00:00:00 2001 From: guillermooo Date: Mon, 28 May 2012 18:12:29 +0200 Subject: [PATCH 02/79] expanded plugin reference topic --- source/reference/plugins.rst | 52 +++++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/source/reference/plugins.rst b/source/reference/plugins.rst index 9c05dee..82dd28e 100644 --- a/source/reference/plugins.rst +++ b/source/reference/plugins.rst @@ -14,11 +14,14 @@ Where to Store Plugins Sublime Text 2 will look for plugins in these places: -* ``Package`` +* ``Packages`` * ``Packages/`` Any plugin nested deeper in ``Packages`` won't be loaded. +All plugins should live inside a directory of their own and not directly +under ``Packages``. + Conventions for Command Names ***************************** @@ -31,7 +34,7 @@ However, Sublime Text 2 transforms the class name from ``CamelCasedPhrases`` to and ``AnotherExampleCommand`` would turn into ``another_example``. For class definition names, use ``CamelCasedPhrasesCommand``; -to call a command from the API, use the transformed name (``camel_cased_phrases``). +to call a command from the API, use the normalized name (``camel_cased_phrases``). Types of Commadns @@ -50,7 +53,8 @@ Shared Traits for Commands -------------------------- All commands must implement a ``.run()`` method. -All commands can receive and arbitrarily long number of keyword arguments. +All commands can receive and arbitrarily long number of keyword arguments, +but they must be valid JSON types. How to Call Commands from the API @@ -64,6 +68,14 @@ to ``command_name``. :: window.run_command("echo", {"Tempus": "Irreparabile", "Fugit": "."}) + Command Arguments + ***************** + + All user-provided arguments to commands must be valid JSON types. Only + Sublime Text can pass other types of arguments to commands (such as edit + objects, view instances, etc.). + + Text Commands and the ``edit`` Object ************************************* @@ -91,3 +103,37 @@ Any subclass of ``EventListener`` will be able to respond to events. unresponsive, especially in events triggered frequently, like ``on_modified`` and ``on_selection_modified``. Be careful of how much work is done in those and do not implement events you don't need, even if they just ``pass``. + + +Python and the Standard Library +******************************* + +Sublime Text ships with a trimmed down standard library. Notable missing +modules are the *gtk* and *sqlite3* modules. + + +Automatic Plugin Reload +*********************** + +Sublime Text will automatically reload top-level Python modules from packages +as they change (perhaps because you are editing a *.py* file). Note that +Python subpackages won't be reloaded; this can lead to confusion while +developing plugins. Generally, it's best to restart Sublime Text when you +change plugin files so all changes take effect. + + +Multithreading +************** + +Only the ``.set_timeout()`` function is safe to call from different threads. + + +Plugin vs Sublime Package +************************* + +Packages are directories inside the *Packages* folder containing plugins and +possibly other resources. Plugins are simply user-created commands or features +by means of Python files. + +*.sublime-package* files are zipped files meant to be unpacked to a folder +under *Packages* so they too become an additional package. From 12da05415cbb6512084b6beac5f4c483cc66579e Mon Sep 17 00:00:00 2001 From: guillermooo Date: Wed, 30 May 2012 19:40:53 +0200 Subject: [PATCH 03/79] add terms to glossary --- source/reference/plugins.rst | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/source/reference/plugins.rst b/source/reference/plugins.rst index 82dd28e..3c535b7 100644 --- a/source/reference/plugins.rst +++ b/source/reference/plugins.rst @@ -37,7 +37,7 @@ For class definition names, use ``CamelCasedPhrasesCommand``; to call a command from the API, use the normalized name (``camel_cased_phrases``). -Types of Commadns +Types of Commands ***************** * ``sublime_plugin.ApplicationCommand`` @@ -45,9 +45,9 @@ Types of Commadns * ``sublime_plugin.TextCommand`` * ``sublime_plugin.EventListener`` -Window command instances have a ``.window`` attribute pointing to the window -instance that created them. Similarly, view command instances have a ``.view`` -attribute. +Instances of ``WindowCommand`` have a ``.window`` attribute pointing to the +window instance that created them. Similarly, instances of ``TextCommand `` +have a ``.view`` attribute. Shared Traits for Commands -------------------------- @@ -60,7 +60,7 @@ but they must be valid JSON types. How to Call Commands from the API ********************************* -Use a reference to a ``View``, a ``Window`` or ``sublime`` depending on +Use a reference to a ``View`` or a ``Window``, or ``sublime`` depending on the type of command, and call ``object.run_command('command_name')``. In addition, you can pass a dictionary where keys are names of parameters to ``command_name``. :: @@ -95,7 +95,8 @@ As well as grouping modifications, you can use edit objects for grouping changes Responding to Events ******************** -Any subclass of ``EventListener`` will be able to respond to events. +Any subclass of ``EventListener`` will be able to respond to events. You cannot +make a class derive from both ``EventListener`` and any other type of commands. .. sidebar:: A Word of Warning about ``EventListener`` @@ -109,7 +110,7 @@ Python and the Standard Library ******************************* Sublime Text ships with a trimmed down standard library. Notable missing -modules are the *gtk* and *sqlite3* modules. +modules are the *gtk*, *multiprocessing* and *sqlite3* modules. Automatic Plugin Reload @@ -118,22 +119,11 @@ Automatic Plugin Reload Sublime Text will automatically reload top-level Python modules from packages as they change (perhaps because you are editing a *.py* file). Note that Python subpackages won't be reloaded; this can lead to confusion while -developing plugins. Generally, it's best to restart Sublime Text when you -change plugin files so all changes take effect. +developing plugins. Generally, it's best to restart Sublime Text after you've +made changes to plugin files so all changes take effect. Multithreading ************** Only the ``.set_timeout()`` function is safe to call from different threads. - - -Plugin vs Sublime Package -************************* - -Packages are directories inside the *Packages* folder containing plugins and -possibly other resources. Plugins are simply user-created commands or features -by means of Python files. - -*.sublime-package* files are zipped files meant to be unpacked to a folder -under *Packages* so they too become an additional package. From 48ea16cca862603ed86c7a2cf033f80ca0cb97ca Mon Sep 17 00:00:00 2001 From: guillermooo Date: Wed, 30 May 2012 19:42:07 +0200 Subject: [PATCH 04/79] add terms to glossary --- source/glossary/glossary.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/source/glossary/glossary.rst b/source/glossary/glossary.rst index bdaafb1..d0604c4 100644 --- a/source/glossary/glossary.rst +++ b/source/glossary/glossary.rst @@ -13,3 +13,15 @@ Glossary view Graphical display of a buffer. Multiple views can show the same buffer. + + plugin + A feature impemented in Python. It can consist of a single command + or multiple commands. It can be contained in one *.py* file or many + *.py* files. + + package + This term in ambiguous in the context of Sublime Text, because it can + refer to a Python package (unlikely), a directory inside ``Packages`` + or a *.sublime-package* file. Most of the time, it means a directory + inside ``Packages`` containing resources that belong together to build + a new feature or provide support for a programming or markup language. From 664c1cae59572341022a0bc2f38ecda7d9b1a07d Mon Sep 17 00:00:00 2001 From: guillermooo Date: Wed, 30 May 2012 19:49:23 +0200 Subject: [PATCH 05/79] fix typos --- source/extensibility/plugins.rst | 2 +- source/reference/plugins.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/extensibility/plugins.rst b/source/extensibility/plugins.rst index 07fd254..24fdd65 100644 --- a/source/extensibility/plugins.rst +++ b/source/extensibility/plugins.rst @@ -128,7 +128,7 @@ Window commands operate at the window level. This doesn't mean that you cannot manipulate views from window commands, but rather that you don't need views to exist in order for window commands to be available. For instance, the built-in command ``new_file`` is defined as a ``WindowCommand`` so it works too when no -view is open. Requiring a view to exisit in that case wouldn't make sense. +view is open. Requiring a view to exist in that case wouldn't make sense. Window command instances have a ``.window`` attribute pointing to the window instance that created them. diff --git a/source/reference/plugins.rst b/source/reference/plugins.rst index 3c535b7..b964694 100644 --- a/source/reference/plugins.rst +++ b/source/reference/plugins.rst @@ -96,7 +96,7 @@ Responding to Events ******************** Any subclass of ``EventListener`` will be able to respond to events. You cannot -make a class derive from both ``EventListener`` and any other type of commands. +make a class derive from both ``EventListener`` and any other type of command. .. sidebar:: A Word of Warning about ``EventListener`` From 8ec759477a1b5085807467183730ca5839f7f6a8 Mon Sep 17 00:00:00 2001 From: guillermooo Date: Wed, 30 May 2012 19:55:59 +0200 Subject: [PATCH 06/79] less pedantry --- source/extensibility/plugins.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/extensibility/plugins.rst b/source/extensibility/plugins.rst index 24fdd65..3d0f8b7 100644 --- a/source/extensibility/plugins.rst +++ b/source/extensibility/plugins.rst @@ -191,8 +191,8 @@ plugins go, this a very bad one. return sugs .. note:: - Please make sure you don't keep this plugin around after trying it. It will - interefere with the autocompletions look-up chain. + Make sure you don't keep this plugin around after trying it or it will + interefere with the autocompletion system. Learning the API From 742f0f935f6fe9642556ae0d1946f697092927db Mon Sep 17 00:00:00 2001 From: guillermooo Date: Wed, 30 May 2012 19:57:38 +0200 Subject: [PATCH 07/79] less words --- source/extensibility/plugins.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/extensibility/plugins.rst b/source/extensibility/plugins.rst index 3d0f8b7..51f1b1e 100644 --- a/source/extensibility/plugins.rst +++ b/source/extensibility/plugins.rst @@ -198,9 +198,9 @@ plugins go, this a very bad one. Learning the API **************** -In order to create plugins, you need to get acquainted with the Python API -Sublime Text 2 exposes, and the available commands. Documentation on both is -scarce at the time of this writing, but you can read existing code and learn -from it too. In particular, the ``Packages/Default`` folder contains many -examples of undocumented commands and API calls. +In order to create plugins, you need to get acquainted with the Sublime Text +API and the available commands. Documentation on both is scarce at the time of +this writing, but you can read existing code and learn from it too. In +particular, the ``Packages/Default`` folder contains many examples of +undocumented commands and API calls. From bc0d71d88f8f84cba2302ffbbac21314a229ec87 Mon Sep 17 00:00:00 2001 From: guillermooo Date: Wed, 30 May 2012 20:00:53 +0200 Subject: [PATCH 08/79] fix markup --- source/reference/plugins.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/reference/plugins.rst b/source/reference/plugins.rst index b964694..cc1fa9b 100644 --- a/source/reference/plugins.rst +++ b/source/reference/plugins.rst @@ -46,7 +46,7 @@ Types of Commands * ``sublime_plugin.EventListener`` Instances of ``WindowCommand`` have a ``.window`` attribute pointing to the -window instance that created them. Similarly, instances of ``TextCommand `` +window instance that created them. Similarly, instances of ``TextCommand`` have a ``.view`` attribute. Shared Traits for Commands From a8926753e28ed904413873ea73d00f94353ed6f7 Mon Sep 17 00:00:00 2001 From: rsperberg Date: Tue, 5 Jun 2012 12:15:27 -0300 Subject: [PATCH 09/79] Added keyboard command to show scope --- source/reference/keyboard_shortcuts_win.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/reference/keyboard_shortcuts_win.rst b/source/reference/keyboard_shortcuts_win.rst index 194f95c..c27aae8 100644 --- a/source/reference/keyboard_shortcuts_win.rst +++ b/source/reference/keyboard_shortcuts_win.rst @@ -82,6 +82,8 @@ General +-----------------+-----------------------------------------------------------+ | Ctrl + KB | Toggle side bar | +-----------------+-----------------------------------------------------------+ +| Ctrl + ⇧ + Alt + P | Show scope in status bar | ++-----------------+-----------------------------------------------------------+ Find/Replace ------------------------ From d090eeec4f2ee5c1e6e487ec55adb04494aa2123 Mon Sep 17 00:00:00 2001 From: rsperberg Date: Tue, 5 Jun 2012 12:18:29 -0300 Subject: [PATCH 10/79] Correct the table markup for added shortcut for showing scope --- source/reference/keyboard_shortcuts_win.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/reference/keyboard_shortcuts_win.rst b/source/reference/keyboard_shortcuts_win.rst index c27aae8..d1364e5 100644 --- a/source/reference/keyboard_shortcuts_win.rst +++ b/source/reference/keyboard_shortcuts_win.rst @@ -81,9 +81,9 @@ General | Ctrl + ⇧ + P | Command prompt | +-----------------+-----------------------------------------------------------+ | Ctrl + KB | Toggle side bar | -+-----------------+-----------------------------------------------------------+ ++-----------------------+-----------------------------------------------------+ | Ctrl + ⇧ + Alt + P | Show scope in status bar | -+-----------------+-----------------------------------------------------------+ ++-----------------------+-----------------------------------------------------+ Find/Replace ------------------------ From fa371c259a2bedf92b5fc2820232e4dd5a0edca3 Mon Sep 17 00:00:00 2001 From: rsperberg Date: Tue, 5 Jun 2012 12:21:05 -0300 Subject: [PATCH 11/79] Correct the table markup for added shortcut for showing scope --- source/reference/keyboard_shortcuts_win.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/reference/keyboard_shortcuts_win.rst b/source/reference/keyboard_shortcuts_win.rst index d1364e5..cc0fa18 100644 --- a/source/reference/keyboard_shortcuts_win.rst +++ b/source/reference/keyboard_shortcuts_win.rst @@ -75,12 +75,12 @@ Navigation/Goto Anywhere General ------------------------ -+-----------------+-----------------------------------------------------------+ -| Keypress | Command | -+=================+===========================================================+ -| Ctrl + ⇧ + P | Command prompt | -+-----------------+-----------------------------------------------------------+ -| Ctrl + KB | Toggle side bar | ++-----------------------+-----------------------------------------------------+ +| Keypress | Command | ++=======================+=====================================================+ +| Ctrl + ⇧ + P | Command prompt | ++-----------------------+-----------------------------------------------------+ +| Ctrl + KB | Toggle side bar | +-----------------------+-----------------------------------------------------+ | Ctrl + ⇧ + Alt + P | Show scope in status bar | +-----------------------+-----------------------------------------------------+ From 85582b24c7c8d9bd6089941240a826ae22eb7f03 Mon Sep 17 00:00:00 2001 From: rsperberg Date: Tue, 5 Jun 2012 12:24:07 -0300 Subject: [PATCH 12/79] Add shortcut for showing scope --- source/reference/keyboard_shortcuts_osx.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/reference/keyboard_shortcuts_osx.rst b/source/reference/keyboard_shortcuts_osx.rst index dc3c8b1..d4e3925 100644 --- a/source/reference/keyboard_shortcuts_osx.rst +++ b/source/reference/keyboard_shortcuts_osx.rst @@ -82,6 +82,8 @@ General +-----------------+-----------------------------------------------------------+ | ⌘ + K, ⌘ + B | Toggle side bar | +-----------------+-----------------------------------------------------------+ +| Ctrl + ⇧ + P | Show scope in status bar | ++-----------------+-----------------------------------------------------------+ Find/Replace ------------------------ From 071e022bf6272af29182d67ad00decca5fa08f48 Mon Sep 17 00:00:00 2001 From: rsperberg Date: Tue, 5 Jun 2012 12:34:40 -0300 Subject: [PATCH 13/79] Changed 'Ctrl' to '^' in shortcut for showing scope --- source/reference/keyboard_shortcuts_osx.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/reference/keyboard_shortcuts_osx.rst b/source/reference/keyboard_shortcuts_osx.rst index d4e3925..42962e9 100644 --- a/source/reference/keyboard_shortcuts_osx.rst +++ b/source/reference/keyboard_shortcuts_osx.rst @@ -82,7 +82,7 @@ General +-----------------+-----------------------------------------------------------+ | ⌘ + K, ⌘ + B | Toggle side bar | +-----------------+-----------------------------------------------------------+ -| Ctrl + ⇧ + P | Show scope in status bar | +| ⌃ + ⇧ + P | Show scope in status bar | +-----------------+-----------------------------------------------------------+ Find/Replace From 811e5d561fbfa9a778b58a2660bc858aa0afddea Mon Sep 17 00:00:00 2001 From: guillermooo Date: Fri, 8 Jun 2012 23:00:13 +0200 Subject: [PATCH 14/79] update info about sublime commands and make formatting changes --- source/extensibility/plugins.rst | 6 ++-- source/reference/plugins.rst | 54 +++++++++++++++++++++----------- 2 files changed, 38 insertions(+), 22 deletions(-) diff --git a/source/extensibility/plugins.rst b/source/extensibility/plugins.rst index 51f1b1e..fff055d 100644 --- a/source/extensibility/plugins.rst +++ b/source/extensibility/plugins.rst @@ -116,10 +116,8 @@ they can receive and arbitrarily long number of keyword parameters. Application Commands -------------------- -Application commands derive from ``sublime_plugin.ApplicationCommand``. Due to -the status of the API at the time of this writing, we won't discuss application -commands any further at the moment. - +Application commands derive from ``sublime_plugin.ApplicationCommand`` and +can be executed with ``sublime.run_command()``. Window Commands --------------- diff --git a/source/reference/plugins.rst b/source/reference/plugins.rst index cc1fa9b..2045d38 100644 --- a/source/reference/plugins.rst +++ b/source/reference/plugins.rst @@ -7,7 +7,8 @@ Plugins More information on the Python API. -Plugins are Python scripts implementing ``*Command`` classes from ``sublime_plugin``. +Plugins are Python scripts implementing ``*Command`` classes from +``sublime_plugin``. Where to Store Plugins ********************** @@ -26,15 +27,15 @@ under ``Packages``. Conventions for Command Names ***************************** -Sublime Text 2 command class names are suffixed by convention with ``Command`` and -written as ``CamelCasedPhrases``. +Sublime Text 2 command class names are suffixed by convention with ``Command`` +and written as ``CamelCasedPhrases``. -However, Sublime Text 2 transforms the class name from ``CamelCasedPhrases`` to -``camel_cased_phrases``. So ``ExampleCommand`` would turn into ``example`` +However, Sublime Text 2 transforms the class name from ``CamelCasedPhrases`` +to ``camel_cased_phrases``. So ``ExampleCommand`` would turn into ``example`` and ``AnotherExampleCommand`` would turn into ``another_example``. -For class definition names, use ``CamelCasedPhrasesCommand``; -to call a command from the API, use the normalized name (``camel_cased_phrases``). +For class definition names, use ``CamelCasedPhrasesCommand``; to call a +command from the API, use the normalized name (``camel_cased_phrases``). Types of Commands @@ -79,31 +80,48 @@ to ``command_name``. :: Text Commands and the ``edit`` Object ************************************* -The two API functions of interest are ``view.begin_edit()``, which takes an optional command name and an optional dictionary of arguments, and ``view.end_edit()``, which finishes the edit. +The two API functions of interest are ``view.begin_edit()``, which takes an +optional command name and an optional dictionary of arguments, and +``view.end_edit()``, which finishes the edit. -All actions done within an edit are grouped as a single undo action. Callbacks such as ``on_modified()`` and ``on_selection_modified()`` are called when the edit is finished. +All actions done within an edit are grouped as a single undo action. Callbacks +such as ``on_modified()`` and ``on_selection_modified()`` are called when the +edit is finished. -It's important to call ``view.end_edit()`` after each ``view.begin_edit()``, otherwise the buffer will be in an inconsistent state. An attempt will be made to fix it automatically if the edit object gets collected, but that often doesn't happen when you expect, and will result in a warning printed to the console. In other words, you should always bracket an edit in a ``try..finally`` block. +It's important to call ``view.end_edit()`` after each ``view.begin_edit()``, +otherwise the buffer will be in an inconsistent state. An attempt will be made +to fix it automatically if the edit object gets collected, but that often +doesn't happen when you expect, and will result in a warning printed to the +console. In other words, you should always bracket an edit in a +``try..finally`` block. -The command name passed to ``begin_edit()`` is used for repeat, macro recording, and for describing the action when undoing/redoing it. If you're making an edit outside of a ``TextCommand``, you should almost never supply a command name. +The command name passed to ``begin_edit()`` is used for repeat, macro +recording, and for describing the action when undoing/redoing it. If you're +making an edit outside of a ``TextCommand``, you should almost never supply a +command name. -If you have created an edit object, and call a function that creates another one, that's fine: the edit is only considered finished when the outermost call to ``end_edit()`` runs. +If you have created an edit object, and call a function that creates another +one, that's fine: the edit is only considered finished when the outermost call +to ``end_edit()`` runs. -As well as grouping modifications, you can use edit objects for grouping changes to the selection, so they're undone in a single step. +As well as grouping modifications, you can use edit objects for grouping +changes to the selection, so they're undone in a single step. Responding to Events ******************** -Any subclass of ``EventListener`` will be able to respond to events. You cannot -make a class derive from both ``EventListener`` and any other type of command. +Any subclass of ``EventListener`` will be able to respond to events. You +cannot make a class derive from both ``EventListener`` and any other type of +command. .. sidebar:: A Word of Warning about ``EventListener`` Expensive operations in event listeners can cause Sublime Text 2 to become - unresponsive, especially in events triggered frequently, like ``on_modified`` - and ``on_selection_modified``. Be careful of how much work is done in those - and do not implement events you don't need, even if they just ``pass``. + unresponsive, especially in events triggered frequently, like + ``on_modified`` and ``on_selection_modified``. Be careful of how much work + is done in those and do not implement events you don't need, even if they + just ``pass``. Python and the Standard Library From 9816459412da738836f61eb62a0b7edaec41883e Mon Sep 17 00:00:00 2001 From: guillermooo Date: Mon, 11 Jun 2012 09:55:18 +0200 Subject: [PATCH 15/79] add info about variants --- source/reference/build_systems.rst | 45 ++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/source/reference/build_systems.rst b/source/reference/build_systems.rst index 23a5162..5720bec 100644 --- a/source/reference/build_systems.rst +++ b/source/reference/build_systems.rst @@ -102,6 +102,16 @@ Options Use this option to add directories to :const:`PATH` without having to modify your system's settings. +``variants`` + Optional. A list of dictionaries of options to override the main build + system's options. Variant ``name``s will appear in the Command Palette for + easy access if the build system's selector matches for the active file. + +``name`` + **Only valid inside a variant** (see ``variants``). Identifies variant + build systems. If ``name`` is *Run*, the variant will show up under the + **Tools | Build System** menu and be bound to *Ctrl + Shift + B*. + Capturing Error Output with ``file_regex`` ------------------------------------------ @@ -134,8 +144,39 @@ platform-specific data in the build system. Here's an example:: } } -In this case, ``ant`` will be executed for every platform except Windows, where -``ant.bat`` will be used instead. +In this case, ``ant`` will be executed for every platform except Windows, +where ``ant.bat`` will be used instead. + +Variants +-------- + +Here's a contrived example of a build system with variants:: + + { + "selector": "source.python", + "cmd": ["date"], + + "variants": [ + + { "cmd": ["ls -l *.py"], + "name": "List Python Files", + "shell": true + }, + + { "cmd": ["wc", "$file"], + "name": "Word Count (current file)" + }, + + { "cmd": ["python", "-u", "$file"], + "name": "Run" + } + ] + } + + +Given this settings, *Ctrl + B* would run the *date* command, *Crtl + Shift + +B* would run the Python interpreter and the remaining variants would appear +in the Command Palette whenever the build system was active. Variables From f893f53a9bcffeda2e19e5acc4353cec4dcb0a9a Mon Sep 17 00:00:00 2001 From: guillermooo Date: Mon, 11 Jun 2012 14:34:09 +0200 Subject: [PATCH 16/79] formatting changes --- source/extensibility/syntaxdefs.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/extensibility/syntaxdefs.rst b/source/extensibility/syntaxdefs.rst index 0e54823..62d36c6 100644 --- a/source/extensibility/syntaxdefs.rst +++ b/source/extensibility/syntaxdefs.rst @@ -1,5 +1,5 @@ Syntax Definitions -================= +================== Syntax definitions make Sublime Text aware of programming and markup languages. Most noticeably, they work together with colors to provide syntax highlighting. @@ -144,8 +144,8 @@ To create a new syntax definition, follow these steps: You should now see a file like this:: { "name": "Syntax Name", - "scopeName": "source.syntax_name", - "fileTypes": [""], + "scopeName": "source.syntax_name", + "fileTypes": [""], "patterns": [ ], "uuid": "ca03e751-04ef-4330-9a6b-9b99aae1c418" From 5693f280aff9845eaba3bbf0e6df403aa7fd9c5f Mon Sep 17 00:00:00 2001 From: guillermooo Date: Mon, 11 Jun 2012 14:34:33 +0200 Subject: [PATCH 17/79] add info about variants in build systems --- source/reference/build_systems.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/reference/build_systems.rst b/source/reference/build_systems.rst index 5720bec..9de0f71 100644 --- a/source/reference/build_systems.rst +++ b/source/reference/build_systems.rst @@ -174,7 +174,7 @@ Here's a contrived example of a build system with variants:: } -Given this settings, *Ctrl + B* would run the *date* command, *Crtl + Shift + +Given these settings, *Ctrl + B* would run the *date* command, *Crtl + Shift + B* would run the Python interpreter and the remaining variants would appear in the Command Palette whenever the build system was active. From 1c2478f4e205511f69bc563e054751cfc414a49c Mon Sep 17 00:00:00 2001 From: guillermooo Date: Mon, 11 Jun 2012 14:34:49 +0200 Subject: [PATCH 18/79] add information about commands --- source/reference/commands.rst | 31 +++++++++++++++++++++++++++++++ source/reference/reference.rst | 1 + 2 files changed, 32 insertions(+) create mode 100644 source/reference/commands.rst diff --git a/source/reference/commands.rst b/source/reference/commands.rst new file mode 100644 index 0000000..a4bde74 --- /dev/null +++ b/source/reference/commands.rst @@ -0,0 +1,31 @@ +Commands +******** + +Overview +======== + +This list of commands is a work in progress. + + +Gotchas +======= + + +Some commands taking paths as parameters support snippet-like syntax, while +others don't. The first kind of command would take a parameter like +``{$packages}/SomeDir/SomeFile.Ext`` whereas the second kind of command would +take a parameter like ``Packages/SomeDir/SomeFile.Ext``. + + +Commands +======== + +**build** + Runs a build system. + + *variant* [String]: Optional. The name of the variant to be run. + +**run_macro_file** + Runs a *.sublime-macro* file. + + *file* [String]: Path to the macro file. diff --git a/source/reference/reference.rst b/source/reference/reference.rst index 9321adc..0527736 100644 --- a/source/reference/reference.rst +++ b/source/reference/reference.rst @@ -18,5 +18,6 @@ the general index. completions plugins api + commands keyboard_shortcuts_win keyboard_shortcuts_osx From 64717c652481f4cf017cfecc9e7e532d2aa18137 Mon Sep 17 00:00:00 2001 From: guillermooo Date: Mon, 11 Jun 2012 14:42:44 +0200 Subject: [PATCH 19/79] add .hgignore file --- .hgignore | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .hgignore diff --git a/.hgignore b/.hgignore new file mode 100644 index 0000000..2ab664b --- /dev/null +++ b/.hgignore @@ -0,0 +1,8 @@ +syntax: glob + +*.pyc + +build/ + +*.sublime-workspace +*.sublime-project From 7ca53de4743ee1996a61ece2ed803d25625d3cab Mon Sep 17 00:00:00 2001 From: guillermooo Date: Mon, 11 Jun 2012 16:09:30 +0200 Subject: [PATCH 20/79] add a few commands --- source/reference/commands.rst | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/source/reference/commands.rst b/source/reference/commands.rst index a4bde74..319f7de 100644 --- a/source/reference/commands.rst +++ b/source/reference/commands.rst @@ -23,9 +23,32 @@ Commands **build** Runs a build system. - *variant* [String]: Optional. The name of the variant to be run. + - **variant** [String]: Optional. The name of the variant to be run. **run_macro_file** Runs a *.sublime-macro* file. - *file* [String]: Path to the macro file. + - **file** [String]: Path to the macro file. + +**insert_snippet** + Inserts a snippet from a string or *.sublime-snippet* file. + + - **contents** [String]: Snippet as a string to be inserted. + - **name** [String]: Path to the *.sublime-snippet* file to be inserted. + +**insert** + Inserts a string. + + - **characters** [String]: String to be inserted. + +**move** + Advances the caret by predefined units. + + - **by** [Enum]: Values: characters, words, word_ends, subwords, subword_ends, lines, pages. + - **forward** [Bool]: Whether to advance or reverse in the buffer. + +**move_to** + Advances the caret to predefined locations. + + - **to** [Enum]: Values: bol, eol, bof, eof, brackets. + - **extend**: Whether to extend the selection. Default to ``false``. From d523fcc1b61ec88c03ab9d7e9ffb1bd2ea2a949e Mon Sep 17 00:00:00 2001 From: guillermooo Date: Mon, 11 Jun 2012 16:29:55 +0200 Subject: [PATCH 21/79] fix mistakes --- source/reference/commands.rst | 10 +++++----- source/reference/plugins.rst | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/source/reference/commands.rst b/source/reference/commands.rst index 319f7de..400aa1a 100644 --- a/source/reference/commands.rst +++ b/source/reference/commands.rst @@ -13,8 +13,8 @@ Gotchas Some commands taking paths as parameters support snippet-like syntax, while others don't. The first kind of command would take a parameter like -``{$packages}/SomeDir/SomeFile.Ext`` whereas the second kind of command would -take a parameter like ``Packages/SomeDir/SomeFile.Ext``. +*${packages}/SomeDir/SomeFile.Ext* whereas the second kind of command would +take a parameter like *Packages/SomeDir/SomeFile.Ext*. Commands @@ -44,11 +44,11 @@ Commands **move** Advances the caret by predefined units. - - **by** [Enum]: Values: characters, words, word_ends, subwords, subword_ends, lines, pages. + - **by** [Enum]: Values: *characters*, *words*, *word_ends*, *subwords*, *subword_ends*, *lines*, *pages*. - **forward** [Bool]: Whether to advance or reverse in the buffer. **move_to** Advances the caret to predefined locations. - - **to** [Enum]: Values: bol, eol, bof, eof, brackets. - - **extend**: Whether to extend the selection. Default to ``false``. + - **to** [Enum]: Values: *bol*, *eol*, *bof*, *eof*, *brackets*. + - **extend** [Bool]: Whether to extend the selection. Defaults to ``false``. diff --git a/source/reference/plugins.rst b/source/reference/plugins.rst index 2045d38..d86eddc 100644 --- a/source/reference/plugins.rst +++ b/source/reference/plugins.rst @@ -128,7 +128,7 @@ Python and the Standard Library ******************************* Sublime Text ships with a trimmed down standard library. Notable missing -modules are the *gtk*, *multiprocessing* and *sqlite3* modules. +modules are the *Tkinter*, *multiprocessing* and *sqlite3* modules. Automatic Plugin Reload From fb7cb20dccd4e7d69532edbde711369aad301031 Mon Sep 17 00:00:00 2001 From: guillermooo Date: Tue, 12 Jun 2012 19:12:46 +0200 Subject: [PATCH 22/79] add glossary terms --- source/glossary/glossary.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source/glossary/glossary.rst b/source/glossary/glossary.rst index d0604c4..b6fef4f 100644 --- a/source/glossary/glossary.rst +++ b/source/glossary/glossary.rst @@ -25,3 +25,9 @@ Glossary or a *.sublime-package* file. Most of the time, it means a directory inside ``Packages`` containing resources that belong together to build a new feature or provide support for a programming or markup language. + + panel + An input/output widget such as a search panel or the output panel. + + overlay panel + An input widget of a special kind. Goto Anything is and overlay panel. From 5a4deaef66ae5a33454320fb83365cb178153914 Mon Sep 17 00:00:00 2001 From: guillermooo Date: Tue, 12 Jun 2012 19:12:57 +0200 Subject: [PATCH 23/79] add more commands --- source/extensibility/commands.rst | 9 +- source/reference/commands.rst | 342 +++++++++++++++++++++++++++++- 2 files changed, 341 insertions(+), 10 deletions(-) diff --git a/source/extensibility/commands.rst b/source/extensibility/commands.rst index e19aa43..8914c49 100644 --- a/source/extensibility/commands.rst +++ b/source/extensibility/commands.rst @@ -26,9 +26,8 @@ be JSON types. Here's a few examples of commands run from the Python console:: view.run_command('insert_snippet', {"contents": "<$SELECTION>"}) view.window().run_command("prompt_select_project") -Command Reference -***************** -Currently there isn't a convenient way of looking up command names and valid -arguments for them. You can, however, search for many of them inside the -``Default`` package. +.. seealso:: + + :doc:`Reference for commands <../reference/commands>` + Command reference. diff --git a/source/reference/commands.rst b/source/reference/commands.rst index 400aa1a..b358d79 100644 --- a/source/reference/commands.rst +++ b/source/reference/commands.rst @@ -7,15 +7,19 @@ Overview This list of commands is a work in progress. -Gotchas -======= - +About Paths in Command Arguments +================================ Some commands taking paths as parameters support snippet-like syntax, while -others don't. The first kind of command would take a parameter like -*${packages}/SomeDir/SomeFile.Ext* whereas the second kind of command would +others don't. A command of the first kind would take a parameter like +*${packages}/SomeDir/SomeFile.Ext* whereas a command of the second kind would take a parameter like *Packages/SomeDir/SomeFile.Ext*. +Generally, newer commands support the snippet-like syntax. + +Often, relative paths in arguments to commands are assumed to start at the +``Data`` directory. + Commands ======== @@ -52,3 +56,331 @@ Commands - **to** [Enum]: Values: *bol*, *eol*, *bof*, *eof*, *brackets*. - **extend** [Bool]: Whether to extend the selection. Defaults to ``false``. + + **new_window** + Opens a new window. + + **close_window** + Closes the active window. + + **switch_file** + Switches between two files with the same name and different extensions. + + - **extensions** [[String]]: Extensions for which switching will be enabled. + + **close** + Closes the active view. + + **close_file** + Closes the active view and, under certain circumsances, the whole application. + + **toggle_sidebar** + Shows or hides the sidebar. + + **toggle_full_screen** + Toggles full screen mode on/off. + + **toggle_distraction_free** + Toggles distraction free mode on/off. + + **left_delete** + Deletes the character right before the caret. + + **right_delete** + Deletes the character right after the caret. + + **undo** + Undoes the latest action. + + **redo** + Reapplies the latest undone action. + + **redo_or_repeat** + Performs the latest action again. + + **soft_undo** + Undoes each action stepping through granular edits. + + **soft_redo** + Redoes each action stepping through granular edits. + + **cut** + Removes the selected text and sends it to the system clipboard. + + **copy** + Sends the selected text to to the system clipboard. + + **paste** + Inserts the clipboard contents after the caret. + + **paste_and_indent** + Inserts the clipboard contents after the caret and indents contextually. + + **select_lines** + Adds a line to the current selection. + + - **forward** [Bool]: Whether to add the next or previous line. Defaults to + ``true``. + + **scroll_lines** + Scroll lines in the view. + + - **amount** [Float]: Positive values scroll lines down and negative values scroll lines up. + + **prev_view** + Switch to the previous view. + + **next_view** + Switch to the next view. + + **next_view_in_stack** + Switch to the view that was active most recently. + + **previous_view_in_stack** + Switch to the view that was active before the view that was active most + recently. I don't think this is very clear. + + **select_all** + Select the whole view contents. + + **split_selection_into_lines** + Unsurprisingly, it splits the selection into lines. + + **single_selection** + Collapses multiple selections into a single selection. + + **clear_fields** + Exhausts snippet fields to prevent further cycling through them. + + **hide_panel** + Hides the active panel. + + - **cancel** [Bool]: XXX + + **hide_overlay** + Hides the active overlay. + + **hide_auto_complete** + Hides the auto complete list. + + **insert_best_completion** + Inserts the best completion that can be inferred from the current context. + + - **default** [String]: String to insert failing a best completion. + + **replace_completion_with_next_completion** + Weird stuff. + + **reindent** + Documenting some commands is such a waste of time. + + **indent** + Awesome. + + **next_field** + Advances the caret to the text snippet field in the current cycle. + + **commit_completion** + Inserts the currently selected item in the auto complete list. + + **unindent** + Does what it says. + + **prev_field** + Moves the caret to the previous snippet field in the current cycle. + + **toggle_overwrite** + Toggles overwriting on/off. + + **expand_selection** + Extends the selection until predifined limits. + + - **to** [Enum]: line XXX must be more XXX + + **find_under_expand** + Adds a new selection region based on the current selection or the current + word. + + **close_tag** + Surrounds the current innert text with the appropiate tag. + + **toggle_record_macro** + Starts or stops the macro recorder. + + **run_macro** + Runs the macro stored in the macro buffer. + + **show_overlay** + Shows an overlay. + + - **overlay** [Enum]: Values: goto, command_palette + - **show_files** [Bool]: Optimize overlay display for showing files. + + **show_panel** + Shows a panel. + + - **panel** [Enum]: Values: incremental_find, find, replace, find_in_files, console + - **reverse** [Bool]: Whether to search backwards in the buffer. + - **toggle** [Bool]: xXX + + **find_next** + Find the text occurrence of the current search term. + + **find_prev** + Find the previous occurrence of the current search term. + + **find_under** + Find the next occurrence of the current selection or the current word. + + **find_under_prev** + Find the previous occurrence of the current selection or the current word. + + **find_all_under** + Find all occurrences of the current selection or the current word. + + **slurp_find_string** + XXX + + **slurp_replace_string** + XXX + + **next_result** + Find next captured result. + + **prev_result** + Find next captured result. + + **toggle_setting** + Toggles the value of a boolean setting. + + - **setting** [String]: The name of the setting to be toggled. + + **next_misspelling** + Find the next misspelling + + **prev_misspelling** + Find the previous misspelling. + + **swap_line_down** + Swaps the current line with the line below it. + + **swap_line_up** + Swaps the current line with the line above it. + + **toggle_comment** + Comments or uncomments the active regions. + + - **block** [Bool]: Whether to use a block comment. + + **join_lines** + Join the current line with the next one. + + **duplicate_line** + Duplicates the current line. + + **auto_complete** + Opens the auto comeplete list. + + **replace_completion_with_auto_complete** + Sure. + + **show_scope_name** + Shows the name for the caret's scope. + + **exec** + Runs an external process asynchronously. + + XXX Document all options. + + **transpose** + Make stuff dance. + + **sort_lines** + Sorts lines. + + - **case_sensitive** [Bool]: Whether the sort should be case sensitive. + + **set_layout** + XXX + + **focus_group** + XXX + + **move_to_group** + XXX + + **select_by_index** + XXX + + **next_bookmark** + XXX + + **prev_bookmark** + XXX + + **toggle_bookmark** + XXX + + **clear_bookmarks** + XXXX + + **select_all_bookmarks** + XXX + + **wrap_lines** + XXX + + **upper_case** + XXX + + **lower_case** + XXX + + **set_mark** + XXX + + **select_to_mark** + XXX + + **delete_to_mark** + XXX + + **swap_with_mark** + XXX + + **yank** + XXX + + **show_at_center** + XXX + + **increase_font_size** + XXX + + **decrease_font_size** + XXX + + **fold** + XXX + + **unfold** + XXX + + **fold_by_level** + XXX + + **context_menu** + Shows the context menu. + + +.. Some regex-related and search-related commands missing. they don's seem to +.. be too useful. + + + + + + + + + From 537eb9a631778efe23bf76895dba80a0b1a7315b Mon Sep 17 00:00:00 2001 From: guillermooo Date: Tue, 12 Jun 2012 19:37:27 +0200 Subject: [PATCH 24/79] fix gramm3r and nonsense --- source/glossary/glossary.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/glossary/glossary.rst b/source/glossary/glossary.rst index b6fef4f..8a10617 100644 --- a/source/glossary/glossary.rst +++ b/source/glossary/glossary.rst @@ -29,5 +29,5 @@ Glossary panel An input/output widget such as a search panel or the output panel. - overlay panel - An input widget of a special kind. Goto Anything is and overlay panel. + overlay + An input widget of a special kind. Goto Anything is an overlay. From d057fab6363e6a0f7ff6c569001175fa8b079e68 Mon Sep 17 00:00:00 2001 From: guillermooo Date: Tue, 12 Jun 2012 19:56:10 +0200 Subject: [PATCH 25/79] assorted fixes --- source/reference/commands.rst | 53 ++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/source/reference/commands.rst b/source/reference/commands.rst index b358d79..80ef0ed 100644 --- a/source/reference/commands.rst +++ b/source/reference/commands.rst @@ -66,22 +66,23 @@ Commands **switch_file** Switches between two files with the same name and different extensions. - - **extensions** [[String]]: Extensions for which switching will be enabled. + - **extensions** [[String]]: Extensions (without leading dot) for which switching will be enabled. **close** Closes the active view. **close_file** Closes the active view and, under certain circumsances, the whole application. + XXX Sounds kinda wrong. **toggle_sidebar** Shows or hides the sidebar. **toggle_full_screen** - Toggles full screen mode on/off. + Toggles full screen mode on or off. **toggle_distraction_free** - Toggles distraction free mode on/off. + Toggles distraction free mode on or off. **left_delete** Deletes the character right before the caret. @@ -105,7 +106,8 @@ Commands Redoes each action stepping through granular edits. **cut** - Removes the selected text and sends it to the system clipboard. + Removes the selected text and sends it to the system clipboard. Put + differently, it cuts. **copy** Sends the selected text to to the system clipboard. @@ -120,7 +122,7 @@ Commands Adds a line to the current selection. - **forward** [Bool]: Whether to add the next or previous line. Defaults to - ``true``. + ``true``. **scroll_lines** Scroll lines in the view. @@ -134,14 +136,14 @@ Commands Switch to the next view. **next_view_in_stack** - Switch to the view that was active most recently. + Switch to the most recently active view. **previous_view_in_stack** Switch to the view that was active before the view that was active most recently. I don't think this is very clear. **select_all** - Select the whole view contents. + Select the view's content. **split_selection_into_lines** Unsurprisingly, it splits the selection into lines. @@ -150,7 +152,7 @@ Commands Collapses multiple selections into a single selection. **clear_fields** - Exhausts snippet fields to prevent further cycling through them. + Breaks out of the active snippet field cycle. **hide_panel** Hides the active panel. @@ -181,7 +183,8 @@ Commands Advances the caret to the text snippet field in the current cycle. **commit_completion** - Inserts the currently selected item in the auto complete list. + Inserts into the buffer the item that's currently selected in the auto + complete list. **unindent** Does what it says. @@ -190,19 +193,19 @@ Commands Moves the caret to the previous snippet field in the current cycle. **toggle_overwrite** - Toggles overwriting on/off. + Toggles overwriting on or off. **expand_selection** Extends the selection until predifined limits. - - **to** [Enum]: line XXX must be more XXX + - **to** [Enum]: line XXX there must be more of these XXX **find_under_expand** - Adds a new selection region based on the current selection or the current - word. + Adds a new selection based on the current selection or expands the + selection to the current word. **close_tag** - Surrounds the current innert text with the appropiate tag. + Surrounds the current inner text with the appropiate tags. **toggle_record_macro** Starts or stops the macro recorder. @@ -214,7 +217,7 @@ Commands Shows an overlay. - **overlay** [Enum]: Values: goto, command_palette - - **show_files** [Bool]: Optimize overlay display for showing files. + - **show_files** [Bool]: Optimize overlay display for displaying paths. **show_panel** Shows a panel. @@ -224,7 +227,7 @@ Commands - **toggle** [Bool]: xXX **find_next** - Find the text occurrence of the current search term. + Find the next occurrence of the current search term. **find_prev** Find the previous occurrence of the current search term. @@ -245,10 +248,10 @@ Commands XXX **next_result** - Find next captured result. + Advance to the next captured result. **prev_result** - Find next captured result. + Move to the previous captured result. **toggle_setting** Toggles the value of a boolean setting. @@ -256,24 +259,24 @@ Commands - **setting** [String]: The name of the setting to be toggled. **next_misspelling** - Find the next misspelling + Advance to the next misspelling **prev_misspelling** - Find the previous misspelling. + Move to the previous misspelling. **swap_line_down** - Swaps the current line with the line below it. + Swaps the current line with the line below. **swap_line_up** - Swaps the current line with the line above it. + Swaps the current line with the line above. **toggle_comment** - Comments or uncomments the active regions. + Comments or uncomments the active lines. - **block** [Bool]: Whether to use a block comment. **join_lines** - Join the current line with the next one. + Joins the current line with the next one. **duplicate_line** Duplicates the current line. @@ -293,7 +296,7 @@ Commands XXX Document all options. **transpose** - Make stuff dance. + Makes stuff dance. **sort_lines** Sorts lines. From 28be32f10b9c031e807b8f302af2048ec43d8f9a Mon Sep 17 00:00:00 2001 From: guillermooo Date: Tue, 19 Jun 2012 22:59:31 +0200 Subject: [PATCH 26/79] a few edits --- source/reference/build_systems.rst | 5 +- source/reference/commands.rst | 452 +++++++++++++++-------------- 2 files changed, 230 insertions(+), 227 deletions(-) diff --git a/source/reference/build_systems.rst b/source/reference/build_systems.rst index 9de0f71..20a7077 100644 --- a/source/reference/build_systems.rst +++ b/source/reference/build_systems.rst @@ -178,9 +178,10 @@ Given these settings, *Ctrl + B* would run the *date* command, *Crtl + Shift + B* would run the Python interpreter and the remaining variants would appear in the Command Palette whenever the build system was active. +.. _build-system-variables: -Variables -********* +Build System Variables +********************** Build systems expand the following variables in *.sublime-build* files: diff --git a/source/reference/commands.rst b/source/reference/commands.rst index 80ef0ed..dd992c0 100644 --- a/source/reference/commands.rst +++ b/source/reference/commands.rst @@ -4,22 +4,30 @@ Commands Overview ======== +.. named actions, used everywhere, take json arguments This list of commands is a work in progress. About Paths in Command Arguments ================================ -Some commands taking paths as parameters support snippet-like syntax, while -others don't. A command of the first kind would take a parameter like -*${packages}/SomeDir/SomeFile.Ext* whereas a command of the second kind would -take a parameter like *Packages/SomeDir/SomeFile.Ext*. +Some commands take paths as parameters. Among these, some support snippet-like +syntax, while others don't. A command of the first kind would take a parameter +like *${packages}/SomeDir/SomeFile.Ext* whereas a command of the second kind +would take a parameter like *Packages/SomeDir/SomeFile.Ext*. Generally, newer commands support the snippet-like syntax. Often, relative paths in arguments to commands are assumed to start at the ``Data`` directory. +Variables in Paths as Arguments +------------------------------- + +In addition to the ``packages`` variable, which expands to the packages +directory, the same variables available to build systems are expanded in +arguments to commands. See :ref:`build-system-variables` for more information. + Commands ======== @@ -57,333 +65,327 @@ Commands - **to** [Enum]: Values: *bol*, *eol*, *bof*, *eof*, *brackets*. - **extend** [Bool]: Whether to extend the selection. Defaults to ``false``. - **new_window** - Opens a new window. - - **close_window** - Closes the active window. +**new_window** + Opens a new window. - **switch_file** - Switches between two files with the same name and different extensions. +**close_window** + Closes the active window. - - **extensions** [[String]]: Extensions (without leading dot) for which switching will be enabled. +**switch_file** + Switches between two files with the same name and different extensions. - **close** - Closes the active view. + - **extensions** [[String]]: Extensions (without leading dot) for which switching will be enabled. - **close_file** - Closes the active view and, under certain circumsances, the whole application. - XXX Sounds kinda wrong. +**close** + Closes the active view. - **toggle_sidebar** - Shows or hides the sidebar. +**close_file** + Closes the active view and, under certain circumsances, the whole application. + XXX Sounds kinda wrong. - **toggle_full_screen** - Toggles full screen mode on or off. +**toggle_sidebar** + Shows or hides the sidebar. - **toggle_distraction_free** - Toggles distraction free mode on or off. +**toggle_full_screen** + Toggles full screen mode on or off. - **left_delete** - Deletes the character right before the caret. +**toggle_distraction_free** + Toggles distraction free mode on or off. - **right_delete** - Deletes the character right after the caret. +**left_delete** + Deletes the character right before the caret. - **undo** - Undoes the latest action. +**right_delete** + Deletes the character right after the caret. - **redo** - Reapplies the latest undone action. +**undo** + Undoes the latest action. - **redo_or_repeat** - Performs the latest action again. +**redo** + Reapplies the latest undone action. - **soft_undo** - Undoes each action stepping through granular edits. +**redo_or_repeat** + Performs the latest action again. - **soft_redo** - Redoes each action stepping through granular edits. +**soft_undo** + Undoes each action stepping through granular edits. - **cut** - Removes the selected text and sends it to the system clipboard. Put - differently, it cuts. +**soft_redo** + Redoes each action stepping through granular edits. - **copy** - Sends the selected text to to the system clipboard. +**cut** + Removes the selected text and sends it to the system clipboard. Put + differently, it cuts. - **paste** - Inserts the clipboard contents after the caret. +**copy** + Sends the selected text to to the system clipboard. - **paste_and_indent** - Inserts the clipboard contents after the caret and indents contextually. +**paste** + Inserts the clipboard contents after the caret. - **select_lines** - Adds a line to the current selection. +**paste_and_indent** + Inserts the clipboard contents after the caret and indents contextually. - - **forward** [Bool]: Whether to add the next or previous line. Defaults to - ``true``. +**select_lines** + Adds a line to the current selection. - **scroll_lines** - Scroll lines in the view. + - **forward** [Bool]: Whether to add the next or previous line. Defaults to + ``true``. - - **amount** [Float]: Positive values scroll lines down and negative values scroll lines up. +**scroll_lines** + Scrolls lines in the view. - **prev_view** - Switch to the previous view. + - **amount** [Float]: Positive values scroll lines down and negative values scroll lines up. - **next_view** - Switch to the next view. +**prev_view** + Switches to the previous view. - **next_view_in_stack** - Switch to the most recently active view. +**next_view** + Switches to the next view. - **previous_view_in_stack** - Switch to the view that was active before the view that was active most - recently. I don't think this is very clear. +**next_view_in_stack** + Switches to the most recently active view. - **select_all** - Select the view's content. +**previous_view_in_stack** + Switches to the view that was active before the most recently active view. + I don't think this is very clear or even true. - **split_selection_into_lines** - Unsurprisingly, it splits the selection into lines. +**select_all** + Select the view's content. - **single_selection** - Collapses multiple selections into a single selection. +**split_selection_into_lines** + Unsurprisingly, it splits the selection into lines. - **clear_fields** - Breaks out of the active snippet field cycle. +**single_selection** + Collapses multiple selections into a single selection. - **hide_panel** - Hides the active panel. +**clear_fields** + Breaks out of the active snippet field cycle. - - **cancel** [Bool]: XXX +**hide_panel** + Hides the active panel. - **hide_overlay** - Hides the active overlay. + - **cancel** [Bool]: XXX - **hide_auto_complete** - Hides the auto complete list. +**hide_overlay** + Hides the active overlay. - **insert_best_completion** - Inserts the best completion that can be inferred from the current context. +**hide_auto_complete** + Hides the auto complete list. - - **default** [String]: String to insert failing a best completion. +**insert_best_completion** + Inserts the best completion that can be inferred from the current context. + XXX Probably useless. XXX - **replace_completion_with_next_completion** - Weird stuff. + - **default** [String]: String to insert failing a best completion. - **reindent** - Documenting some commands is such a waste of time. +**replace_completion_with_next_completion** + XXX Useless for users. XXX - **indent** - Awesome. +**reindent** + XXX ??? XXX - **next_field** - Advances the caret to the text snippet field in the current cycle. +**indent** + Increments indentation. - **commit_completion** - Inserts into the buffer the item that's currently selected in the auto - complete list. +**next_field** + Advances the caret to the text snippet field in the current snippet field + cycle. - **unindent** - Does what it says. +**prev_field** + Moves the caret to the previous snippet field in the current snippet field + cycle. - **prev_field** - Moves the caret to the previous snippet field in the current cycle. +**commit_completion** + Inserts into the buffer the item that's currently selected in the auto + complete list. XXX Probably not useful for users. XXX - **toggle_overwrite** - Toggles overwriting on or off. +**unindent** + Unindents. - **expand_selection** - Extends the selection until predifined limits. +**toggle_overwrite** + Toggles overwriting on or off. - - **to** [Enum]: line XXX there must be more of these XXX +**expand_selection** + Extends the selection up to predifined limits. - **find_under_expand** - Adds a new selection based on the current selection or expands the - selection to the current word. + - **to** [Enum]: line XXX there must be more of these XXX - **close_tag** - Surrounds the current inner text with the appropiate tags. +**find_under_expand** + Adds a new selection based on the current selection or expands the + selection to the current word. - **toggle_record_macro** - Starts or stops the macro recorder. +**close_tag** + Surrounds the current inner text with the appropiate tags. - **run_macro** - Runs the macro stored in the macro buffer. +**toggle_record_macro** + Starts or stops the macro recorder. - **show_overlay** - Shows an overlay. +**run_macro** + Runs the macro stored in the macro buffer. - - **overlay** [Enum]: Values: goto, command_palette - - **show_files** [Bool]: Optimize overlay display for displaying paths. +**show_overlay** + Shows an overlay. - **show_panel** - Shows a panel. + - **overlay** [Enum]: Values: goto, command_palette + - **show_files** [Bool]: Optimize overlay display for displaying paths. - - **panel** [Enum]: Values: incremental_find, find, replace, find_in_files, console - - **reverse** [Bool]: Whether to search backwards in the buffer. - - **toggle** [Bool]: xXX +**show_panel** + Shows a panel. - **find_next** - Find the next occurrence of the current search term. + - **panel** [Enum]: Values: incremental_find, find, replace, find_in_files, console + - **reverse** [Bool]: Whether to search backwards in the buffer. + - **toggle** [Bool]: xXX - **find_prev** - Find the previous occurrence of the current search term. +**find_next** + Finds the next occurrence of the current search term. - **find_under** - Find the next occurrence of the current selection or the current word. +**find_prev** + Finds the previous occurrence of the current search term. - **find_under_prev** - Find the previous occurrence of the current selection or the current word. +**find_under** + Finds the next occurrence of the current selection or the current word. - **find_all_under** - Find all occurrences of the current selection or the current word. +**find_under_prev** + Finds the previous occurrence of the current selection or the current word. - **slurp_find_string** - XXX +**find_all_under** + Finds all occurrences of the current selection or the current word. - **slurp_replace_string** - XXX +**slurp_find_string** + XXX - **next_result** - Advance to the next captured result. +**slurp_replace_string** + XXX - **prev_result** - Move to the previous captured result. +**next_result** + Advance to the next captured result. - **toggle_setting** - Toggles the value of a boolean setting. +**prev_result** + Move to the previous captured result. - - **setting** [String]: The name of the setting to be toggled. +**toggle_setting** + Toggles the value of a boolean setting. - **next_misspelling** - Advance to the next misspelling + - **setting** [String]: The name of the setting to be toggled. - **prev_misspelling** - Move to the previous misspelling. +**next_misspelling** + Advance to the next misspelling - **swap_line_down** - Swaps the current line with the line below. +**prev_misspelling** + Move to the previous misspelling. - **swap_line_up** - Swaps the current line with the line above. +**swap_line_down** + Swaps the current line with the line below. - **toggle_comment** - Comments or uncomments the active lines. +**swap_line_up** + Swaps the current line with the line above. - - **block** [Bool]: Whether to use a block comment. +**toggle_comment** + Comments or uncomments the active lines. - **join_lines** - Joins the current line with the next one. + - **block** [Bool]: Whether to use a block comment. - **duplicate_line** - Duplicates the current line. +**join_lines** + Joins the current line with the next one. - **auto_complete** - Opens the auto comeplete list. +**duplicate_line** + Duplicates the current line. - **replace_completion_with_auto_complete** - Sure. +**auto_complete** + Opens the auto comeplete list. - **show_scope_name** - Shows the name for the caret's scope. +**replace_completion_with_auto_complete** + XXX Useless for users. XXX - **exec** - Runs an external process asynchronously. +**show_scope_name** + Shows the name for the caret's scope in the status bar. - XXX Document all options. +**exec** + Runs an external process asynchronously. - **transpose** - Makes stuff dance. + XXX Document all options. - **sort_lines** - Sorts lines. +**transpose** + Makes stuff dance. - - **case_sensitive** [Bool]: Whether the sort should be case sensitive. +**sort_lines** + Sorts lines. - **set_layout** - XXX + - **case_sensitive** [Bool]: Whether the sort should be case sensitive. - **focus_group** - XXX +**set_layout** + XXX - **move_to_group** - XXX +**focus_group** + XXX - **select_by_index** - XXX +**move_to_group** + XXX - **next_bookmark** - XXX +**select_by_index** + XXX - **prev_bookmark** - XXX +**next_bookmark** + XXX - **toggle_bookmark** - XXX +**prev_bookmark** + XXX - **clear_bookmarks** - XXXX +**toggle_bookmark** + Sets or unsets bookmark for the current line(s). Bookmarks remember the + region shape when they were set. - **select_all_bookmarks** - XXX +**clear_bookmarks** + Removes all bookmarks. - **wrap_lines** - XXX +**select_all_bookmarks** + Selects all bookmarked regions. - **upper_case** - XXX +**wrap_lines** + XXX - **lower_case** - XXX +**upper_case** + Makes the selection upper case. - **set_mark** - XXX +**lower_case** + Makes the selection lower case. - **select_to_mark** - XXX +**set_mark** + XXX - **delete_to_mark** - XXX +**select_to_mark** + XXX - **swap_with_mark** - XXX +**delete_to_mark** + XXX - **yank** - XXX +**swap_with_mark** + XXX - **show_at_center** - XXX +**yank** + XXX - **increase_font_size** - XXX +**show_at_center** + XXX - **decrease_font_size** - XXX +**increase_font_size** + Increases the font size. - **fold** - XXX +**decrease_font_size** + Decreases the font size. - **unfold** - XXX +**fold** + XXX - **fold_by_level** - XXX +**unfold** + XXX - **context_menu** - Shows the context menu. +**fold_by_level** + XXX +**context_menu** + Shows the context menu. .. Some regex-related and search-related commands missing. they don's seem to .. be too useful. - - - - - - - - - From ffdb59c218b6dd194423ee88f6188fac7cfb4244 Mon Sep 17 00:00:00 2001 From: guillermooo Date: Tue, 19 Jun 2012 23:02:24 +0200 Subject: [PATCH 27/79] update info about variables in path arguments for commands --- source/reference/commands.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/source/reference/commands.rst b/source/reference/commands.rst index dd992c0..d59df65 100644 --- a/source/reference/commands.rst +++ b/source/reference/commands.rst @@ -24,9 +24,8 @@ Often, relative paths in arguments to commands are assumed to start at the Variables in Paths as Arguments ------------------------------- -In addition to the ``packages`` variable, which expands to the packages -directory, the same variables available to build systems are expanded in -arguments to commands. See :ref:`build-system-variables` for more information. +The same variables available to build systems are expanded in arguments to +commands. See :ref:`build-system-variables` for more information. Commands From cae3783c2f1e1a5ce131c48f7fe4b9fb829f94f8 Mon Sep 17 00:00:00 2001 From: guillermooo Date: Wed, 20 Jun 2012 23:26:43 +0200 Subject: [PATCH 28/79] add more commands; clean up --- source/reference/commands.rst | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/source/reference/commands.rst b/source/reference/commands.rst index d59df65..5a8605b 100644 --- a/source/reference/commands.rst +++ b/source/reference/commands.rst @@ -164,7 +164,8 @@ Commands **hide_panel** Hides the active panel. - - **cancel** [Bool]: XXX + - **cancel** [Bool]: Notifies the panel to restore the selection to what it + was when the panel was opened. (Only incremental find panel.) **hide_overlay** Hides the active overlay. @@ -208,7 +209,7 @@ Commands **expand_selection** Extends the selection up to predifined limits. - - **to** [Enum]: line XXX there must be more of these XXX + - **to** [Enum]: Values: bol, hardbol, eol, hardeol, bof, eof, brackets, line. **find_under_expand** Adds a new selection based on the current selection or expands the @@ -234,7 +235,7 @@ Commands - **panel** [Enum]: Values: incremental_find, find, replace, find_in_files, console - **reverse** [Bool]: Whether to search backwards in the buffer. - - **toggle** [Bool]: xXX + - **toggle** [Bool]: Whether to hide the panel if it's already visible. **find_next** Finds the next occurrence of the current search term. @@ -252,10 +253,12 @@ Commands Finds all occurrences of the current selection or the current word. **slurp_find_string** - XXX + Copies the current selection or word into the "find" field of the find + panel. **slurp_replace_string** - XXX + Copies the current selection or word into the "replace" field of the find + and replace panel. **next_result** Advance to the next captured result. @@ -326,14 +329,14 @@ Commands XXX **next_bookmark** - XXX + Select the next bookmarked region. **prev_bookmark** - XXX + Select the previous bookmarked region. **toggle_bookmark** - Sets or unsets bookmark for the current line(s). Bookmarks remember the - region shape when they were set. + Sets or unsets a bookmark for the active region(s). (Bookmarks can be + accessed via the regions API using ``"bookmarks"`` as the key.) **clear_bookmarks** Removes all bookmarks. @@ -342,7 +345,9 @@ Commands Selects all bookmarked regions. **wrap_lines** - XXX + Wraps lines. By default, it wraps lines at the first ruler's column. + + - **width** [Int]: Specifies the column at which lines should be wrapped. **upper_case** Makes the selection upper case. From 162ea0b045a16933d1149ebd41d859ce02938fc2 Mon Sep 17 00:00:00 2001 From: guillermooo Date: Thu, 28 Jun 2012 01:02:46 +0200 Subject: [PATCH 29/79] I shouldn't... --- source/basic_concepts.rst | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/source/basic_concepts.rst b/source/basic_concepts.rst index 58d2509..d385ec1 100644 --- a/source/basic_concepts.rst +++ b/source/basic_concepts.rst @@ -156,7 +156,7 @@ Vi Emulation This information is mainly useful for dinosaurs and people who like to drop the term RSI in conversations. Vi is an ancient modal editor that lets the -user perform all operation from the keyboard. Vim, a modern version of vi, +user perform all operations from the keyboard. Vim, a modern version of vi, is still in widespread use. Sublime Text provides vi emulation through the *Vintage* package. The Vintage @@ -166,11 +166,22 @@ documentation. .. _Vintage: http://www.sublimetext.com/docs/2/vintage.html +Emacs +===== + +This information is hardly useful for anyone. Emacs is... Well, nobody really +knows what emacs is, although some people edit text with it. + +If you are an emacs user, you're probably not reading this. + + Be Sublime, My Friend ===================== -Borrowing from `Bruce Lee's wisdom`_, Sublime Text 2 can become almost anything +Borrowing from `Bruce Lee's wisdom`_, Sublime Text can become almost anything you need it to be. In skilled hands, it can defeat an army of ninjas without -your breaking a sweat. So... empty your mind; be sublime, my friend. +your breaking a sweat. + +Empty your mind; be sublime, my friend. .. _Bruce Lee's wisdom: http://www.youtube.com/watch?v=iO3sBulXpVw From 8f8b6138c4ca6a36b9a14c015c293ab7e2a3c942 Mon Sep 17 00:00:00 2001 From: guillermooo Date: Sat, 30 Jun 2012 19:16:36 +0200 Subject: [PATCH 30/79] fix mistake in key bindings ref docs --- source/reference/key_bindings.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/reference/key_bindings.rst b/source/reference/key_bindings.rst index c37df33..88c2fcc 100644 --- a/source/reference/key_bindings.rst +++ b/source/reference/key_bindings.rst @@ -109,7 +109,7 @@ Context Operands Returns the value of the ``x`` setting. ``x`` can be any string. ``text`` - Restricts the test to the line the caret is in. + Restricts the test to the selected text. ``selector`` Returns the current scope. From 56520102ab9145a9369efc803ea0ad24946edcd6 Mon Sep 17 00:00:00 2001 From: guillermooo Date: Mon, 9 Jul 2012 21:48:57 +0200 Subject: [PATCH 31/79] editing section draft --- source/editing/editing.rst | 56 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 3 deletions(-) diff --git a/source/editing/editing.rst b/source/editing/editing.rst index 4941fc1..133ba70 100644 --- a/source/editing/editing.rst +++ b/source/editing/editing.rst @@ -2,8 +2,58 @@ Editing ======= -This topic isn't available yet. +Overview +======== -But here's `Bruce Lee beating up Chuck Norris`_. Yeah, beating *him* up. +Sublime Text is full to the brim with editing features. This topic just +scratches the surface of what's possible. -.. _Bruce Lee beating up Chuck Norris: http://www.youtube.com/watch?v=JLO1YIWQuXE \ No newline at end of file + +Multiple Selections +=================== + +Multiple selections let you make sweeping changes to your text efficiently. +Any praise about multiple selections is an understatement. This is why: + +Select some text and press ``Ctrl + D`` to **add more** instances. If +you want **to skip the current instance**, press ``Ctrl + K, Ctrl + D``. + +If you go too far, press ``Ctrl + U`` to **deselect** the current instance. + + +Transforming Multiple Selections into Lines +=========================================== + +``Ctrl + L`` expands the selections to the end of the line. ``Ctrl + Shift + L`` +splits the selections into lines. + +You can copy multiple selected lines to a separate buffer, edit them there, +select the content again as multiple lines and then paste them back into +place in the first buffer. + + +Other Ways of Selecting Text +============================ + +The list is long; all available options can be found under **Selection**. To +name a few: + +* Select subwords (``Alt + Shift + ``) +* Expand selection to brackets (``Ctrl + Shift + M``) +* Expand selection to indentation (``Ctrl + Shift + J``) +* Expand selection to scope (``Ctrl + Shift + Space``) + + +Transposing Things +================== + +Need to swap two letters or, better yet, two words? Experiment with +``Ctrl + T``. + + +And much, much more... +====================== + +The **Edit**, **Selection**, **Find** and **Goto** menus are good places to +look for handy editing tools. You might end up using just a few of them, +but the rest will still be there when you need them. \ No newline at end of file From 7b24bcba923089ca01fb4c0ed3c28247f2c01d69 Mon Sep 17 00:00:00 2001 From: Dan Loewenherz Date: Thu, 12 Jul 2012 21:47:14 -0700 Subject: [PATCH 32/79] Add additional arguments to move command --- source/reference/commands.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/reference/commands.rst b/source/reference/commands.rst index 5a8605b..f07ff93 100644 --- a/source/reference/commands.rst +++ b/source/reference/commands.rst @@ -55,8 +55,12 @@ Commands **move** Advances the caret by predefined units. - - **by** [Enum]: Values: *characters*, *words*, *word_ends*, *subwords*, *subword_ends*, *lines*, *pages*. + - **by** [Enum]: Values: *characters*, *words*, *word_ends*, *subwords*, *subword_ends*, *lines*, *pages*, *stops*. - **forward** [Bool]: Whether to advance or reverse in the buffer. + - **word_begin** [Bool] + - **empty_line** [Bool] + - **punct_begin** [Bool] + - **separators** [Bool] **move_to** Advances the caret to predefined locations. From bd2d529508fe2c577c07742b41e18c4deaed3dd7 Mon Sep 17 00:00:00 2001 From: rivethead_ Date: Tue, 31 Jul 2012 20:40:25 +0200 Subject: [PATCH 33/79] add shortcut to switch between tabs --- source/reference/keyboard_shortcuts_win.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/reference/keyboard_shortcuts_win.rst b/source/reference/keyboard_shortcuts_win.rst index cc0fa18..148cd67 100644 --- a/source/reference/keyboard_shortcuts_win.rst +++ b/source/reference/keyboard_shortcuts_win.rst @@ -112,6 +112,8 @@ Tabs +-----------------+-----------------------------------------------------------+ | Ctrl + ⇆ | Find in files | +-----------------+-----------------------------------------------------------+ +| Alt + [NUM] | Switch to tab nummber [NUM] where [NUM] <= number of tabs | ++-----------------+-----------------------------------------------------------+ Split window ------------------------ From d3e10c95513f7a1bee762709e7aca3af3cf11cf8 Mon Sep 17 00:00:00 2001 From: rivethead_ Date: Tue, 31 Jul 2012 20:44:32 +0200 Subject: [PATCH 34/79] fix spelling mistake --- source/reference/keyboard_shortcuts_win.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/reference/keyboard_shortcuts_win.rst b/source/reference/keyboard_shortcuts_win.rst index 148cd67..32e481f 100644 --- a/source/reference/keyboard_shortcuts_win.rst +++ b/source/reference/keyboard_shortcuts_win.rst @@ -112,7 +112,7 @@ Tabs +-----------------+-----------------------------------------------------------+ | Ctrl + ⇆ | Find in files | +-----------------+-----------------------------------------------------------+ -| Alt + [NUM] | Switch to tab nummber [NUM] where [NUM] <= number of tabs | +| Alt + [NUM] | Switch to tab number [NUM] where [NUM] <= number of tabs | +-----------------+-----------------------------------------------------------+ Split window From 9a50546e63ef18c476a6af78852e26032da9f390 Mon Sep 17 00:00:00 2001 From: Scott Bronson Date: Wed, 28 Nov 2012 15:56:15 -0800 Subject: [PATCH 35/79] Update source/reference/commands.rst Fill in show_overlay options --- source/reference/commands.rst | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/source/reference/commands.rst b/source/reference/commands.rst index f07ff93..4279e34 100644 --- a/source/reference/commands.rst +++ b/source/reference/commands.rst @@ -172,7 +172,7 @@ Commands was when the panel was opened. (Only incremental find panel.) **hide_overlay** - Hides the active overlay. + Hides the active overlay. Show the overlay using the show_overlay command. **hide_auto_complete** Hides the auto complete list. @@ -229,10 +229,16 @@ Commands Runs the macro stored in the macro buffer. **show_overlay** - Shows an overlay. + Shows the overlay box. Use the hide_overlay command to hide it. - - **overlay** [Enum]: Values: goto, command_palette - - **show_files** [Bool]: Optimize overlay display for displaying paths. + - **overlay** [Enum]: + The type of overlay to show. Possible values: + + - 'goto': Show the `Goto Anything `_ overlay. + - 'command_palette': Show the `command palette `_. + + - **show_files** [Bool]: If using the goto overlay, start by displaying files rather than an empty box. + - **text** [String]: The initial contents to put in the overlay box. **show_panel** Shows a panel. From a7d06ab8c73210ccc05ddaf8ee6371f9009f9f02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guillermo=20L=C3=B3pez-Anglada?= Date: Thu, 29 Nov 2012 10:04:46 +0100 Subject: [PATCH 36/79] Minor changes for consistency. --- source/reference/commands.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/reference/commands.rst b/source/reference/commands.rst index 4279e34..6396d3c 100644 --- a/source/reference/commands.rst +++ b/source/reference/commands.rst @@ -229,16 +229,16 @@ Commands Runs the macro stored in the macro buffer. **show_overlay** - Shows the overlay box. Use the hide_overlay command to hide it. + Shows the requested overlay. Use the **hide_overlay** command to hide it. - **overlay** [Enum]: - The type of overlay to show. Possible values: + The type of overlay to show. Possible values: - - 'goto': Show the `Goto Anything `_ overlay. - - 'command_palette': Show the `command palette `_. + - *goto*: Show the `Goto Anything `_ overlay. + - *command_palette*: Show the `command palette `_. - - **show_files** [Bool]: If using the goto overlay, start by displaying files rather than an empty box. - - **text** [String]: The initial contents to put in the overlay box. + - **show_files** [Bool]: If using the goto overlay, start by displaying files rather than an empty widget. + - **text** [String]: The initial contents to put in the overlay. **show_panel** Shows a panel. From e49e0a29ecf71eca5da3073d517092bc6dbf6d6c Mon Sep 17 00:00:00 2001 From: bgeron Date: Sun, 30 Dec 2012 01:48:04 +0100 Subject: [PATCH 37/79] Escaped backslashes in build_systems.rst --- source/reference/build_systems.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/reference/build_systems.rst b/source/reference/build_systems.rst index 20a7077..d3c84fa 100644 --- a/source/reference/build_systems.rst +++ b/source/reference/build_systems.rst @@ -186,8 +186,8 @@ Build System Variables Build systems expand the following variables in *.sublime-build* files: ====================== ===================================================================================== -``$file_path`` The directory of the current file, e. g., *C:\Files*. -``$file`` The full path to the current file, e. g., *C:\Files\Chapter1.txt*. +``$file_path`` The directory of the current file, e. g., *C:\\Files*. +``$file`` The full path to the current file, e. g., *C:\\Files\\Chapter1.txt*. ``$file_name`` The name portion of the current file, e. g., *Chapter1.txt*. ``$file_extension`` The extension portion of the current file, e. g., *txt*. ``$file_base_name`` The name only portion of the current file, e. g., *Document*. From da6dadf7a2cba977a22bd5ca70ecdd02fc281762 Mon Sep 17 00:00:00 2001 From: Chad Colgur Date: Tue, 29 Jan 2013 07:36:43 -0800 Subject: [PATCH 38/79] Update source/basic_concepts.rst Minor change: contens --> contents --- source/basic_concepts.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/basic_concepts.rst b/source/basic_concepts.rst index d385ec1..a9e8833 100644 --- a/source/basic_concepts.rst +++ b/source/basic_concepts.rst @@ -50,7 +50,7 @@ data directory. This is a platform-dependent location: For **portable installations**, look inside *Sublime Text 2/Data*. Here, the *Sublime Text 2* part refers to the directory to which you've extracted the -contens of the compressed file containing Sublime Text 2. +contents of the compressed file containing Sublime Text 2. Note that only for portable installations does a directory named *Data* exist. For the other types of installation, the data directory is the location From b241d183d9a7afc072ed7c943f96bf21cb4bd5b5 Mon Sep 17 00:00:00 2001 From: tobeportable Date: Wed, 6 Feb 2013 13:39:12 +0100 Subject: [PATCH 39/79] clarification on file naming --- source/extensibility/syntaxdefs.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/extensibility/syntaxdefs.rst b/source/extensibility/syntaxdefs.rst index 62d36c6..35d07ba 100644 --- a/source/extensibility/syntaxdefs.rst +++ b/source/extensibility/syntaxdefs.rst @@ -139,7 +139,7 @@ Creating A New Syntax Definition To create a new syntax definition, follow these steps: - Go to **Tools | Packages | Package Development | New Syntax Definition** - - Save the new file to your ``Packages/User`` folder as ``Sublime Snippets (Raw).JSON-tmLanguage``. + - Save the new file to your ``Packages/User`` folder as a ``.JSON-tmLanguage`` file. You should now see a file like this:: From ba8f1f51691fdced31339db2face58dc09713a2f Mon Sep 17 00:00:00 2001 From: Brad Olson Date: Mon, 25 Feb 2013 20:34:01 -0500 Subject: [PATCH 40/79] Added some Mac keyboard shortcuts --- source/reference/keyboard_shortcuts_osx.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/reference/keyboard_shortcuts_osx.rst b/source/reference/keyboard_shortcuts_osx.rst index 42962e9..a8de843 100644 --- a/source/reference/keyboard_shortcuts_osx.rst +++ b/source/reference/keyboard_shortcuts_osx.rst @@ -41,7 +41,7 @@ Editing +-----------------+-----------------------------------------------------------+ | ⌘ + ⇧ + D | Duplicate line(s) | +-----------------+-----------------------------------------------------------+ -| | Join line below to the end of the current line | +| ⌘ + J | Join line below to the end of the current line | +-----------------+-----------------------------------------------------------+ | ⌘ + / | Comment/un-comment current line | +-----------------+-----------------------------------------------------------+ @@ -93,7 +93,7 @@ Find/Replace +=================+===========================================================+ | ⌘ + F | Find | +-----------------+-----------------------------------------------------------+ -| | Replace | +| ⌘ + ⌥ + F | Replace | +-----------------+-----------------------------------------------------------+ | ⌘ + ⇧ + F | Find in files | +-----------------+-----------------------------------------------------------+ @@ -106,9 +106,9 @@ Tabs +=================+===========================================================+ | ⌘ + ⇧ + t | Open last closed tab | +-----------------+-----------------------------------------------------------+ -| | Cycle up through tabs | +| ^ + Tab | Cycle up through tabs | +-----------------+-----------------------------------------------------------+ -| | Cycle down through tabs | +| ⇧ + ^ + Tab | Cycle down through tabs | +-----------------+-----------------------------------------------------------+ | | Find in files | +-----------------+-----------------------------------------------------------+ From e441c903a065257bcef2daee6806fa6f156620d7 Mon Sep 17 00:00:00 2001 From: Void Main Date: Tue, 26 Mar 2013 13:55:09 +0800 Subject: [PATCH 41/79] Update translator --- AUTHORS.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/AUTHORS.txt b/AUTHORS.txt index 87a228b..b3bea23 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -1 +1,4 @@ -Guillermo López-Anglada (guillermooo) \ No newline at end of file +Guillermo López-Anglada (guillermooo) + +Translator: +Void Main (void-main) From 50cf503f549853972f397a9141a63cae6a08865f Mon Sep 17 00:00:00 2001 From: Void Main Date: Tue, 26 Mar 2013 21:39:20 +0800 Subject: [PATCH 42/79] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BA=86=E5=89=8D?= =?UTF-8?q?=E4=B8=89=E7=AB=A0=E7=9A=84=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/basic_concepts.rst | 221 ++++++++++++++--------------- source/conf.py | 18 +-- source/getting_started/install.rst | 108 ++++++-------- source/index.rst | 26 ++-- source/intro.rst | 16 +-- 5 files changed, 178 insertions(+), 211 deletions(-) diff --git a/source/basic_concepts.rst b/source/basic_concepts.rst index a9e8833..29cd61f 100644 --- a/source/basic_concepts.rst +++ b/source/basic_concepts.rst @@ -1,167 +1,152 @@ ============== -Basic Concepts +基本概念 ============== -Here we'll explain concepts that the reader needs to be familiar with in order -to fully understand the contents of this guide. +这里我们将解释一些基本概念,只有在熟悉这些概念后,你才能彻底理解这份文档的所有内容。 -Conventions in This Guide +文档命名规范 ========================== -This guide is written from the perspective of a Windows user, but most -instructions should only require trivial changes to work on other platforms. +这份文档是从Windows用户的角度撰写的,但是文档中提到的大部分内容只需要很小的变化就能在其他 +平台正常工作。 -Relative paths (e. g. *Packages/User*) start at the *data directory* unless -otherwise noted. The *data directory* is explained further below. +除非特别说明,否则文档中所有的相对路径(例如 *Packages/User*)都是相对于*数据目录*的。 +后文将解释*数据目录*的含义。 -We assume default key bindings when indicating keyboard shortcuts. Due to the -way Sublime Text maps keys to commands, **some key bindings won't match your -locale's keyboard layout**. +在介绍快捷键的时候,我们假定你正在使用系统默认的按键设定。由于Submline Text按键与命令映射 +的工作方式,**有些按键组合可能与你正在使用键盘的布局不同**。 -With Great Power Comes Lots of Questions +能力越大,需要处理的问题也就越多 ======================================== -Sublime Text is a very extensible and customizable editor. It does many things -out of the box, but if you spend some time tailoring it to your exact needs, -it will give you superpowers. This guide will teach you all you need to know -to configure Sublime Text. +Sublime Text是一款高度可扩展、可定制的文本编辑器。它已经为你提供了许多开箱即用的功能, +尽管如此,如果你愿意花时间根据自己的需求进行调教,ST将为你提供超高的生产力。本文档将介绍你 +所需要知道的配置Sublime Text的一切内容。 -In the following paragraphs, we'll outline some aspects that won't click in -your mind until you've spent some time using Sublime Text. Keep exploring the -editor and looking around in this guide, and everything will fall into place -at some point. +我们将在接下来的几段文字中,简单说明一些有关Sublime Text的内容,这些内容只有在真正地使用 +这个编辑器一段时间后才能被理解。请不断地探索这个编辑器,同时也经常来翻翻这个文档,总有一天 +文档中的所有内容你都会烂熟于心。 -Sublime Text is undeniably a versatile tool for programmers, but you don't -need to be one to use it, or even to configure it to make it the perfect tool -for your writing. If you're a hacker, however, you are about to spend the -remainder of your day playing around with this editor. +不可否认,Sublime Text是码农的神器,尽管如此你没必要一定要是程序员才能使用它,即使你不做 +任何配置,你也会发现这是你写作工作的一个完美工具。当然了,如果你是一名黑客,那么你很有可能 +会把今天剩下的时间都用在探索合格编辑器上了。 -The *Data* Directory +*Data(数据)* 目录 ==================== -Sublime Text 2 stores nearly all of the interesting files for users under the -data directory. This is a platform-dependent location: +Sublime Text 2把几乎所有用户感兴趣的内容都存放在所谓的数据目录下。这个目录的位置是平台相 +关的: -* **Windows**: *%APPDATA%\\Sublime Text 2* -* **OS X**: *~/Library/Application Support/Sublime Text 2* -* **Linux**: *~/.config/sublime-text-2* +* **Windows平台**: *%APPDATA%\\Sublime Text 2* +* **OS X平台**: *~/Library/Application Support/Sublime Text 2* +* **Linux平台**: *~/.config/sublime-text-2* -For **portable installations**, look inside *Sublime Text 2/Data*. Here, the -*Sublime Text 2* part refers to the directory to which you've extracted the -contents of the compressed file containing Sublime Text 2. +对于使用 **portable installations(便携安装版)** 的用户,数据目录的位置则是 +*Sublime Text 2/Data* 。这里 *Sublime Text 2* 部分指的是你把包含Sublime Text 2的压缩包 +解压的位置。 -Note that only for portable installations does a directory named *Data* exist. -For the other types of installation, the data directory is the location -indicated above. +需要注意的是,虽然被称作 *数据* 目录,但只有便携安装版的用户,才能真正找到一个叫 *Data* 的目录。 +对于其他类型的安装方式,数据目录的位置请参考上面的说明。 -The *Packages* Directory +*Packages(包组)* 目录 ============================== -This is a **key directory**: all resources for supported programming and -markup languages are stored here. A *package* is a directory containing -related files having a special meaning to Sublime Text. +这是一个 **关键目录** :编辑器所支持的编程或标记语言的所有资源都被存放在这里。一个存放对 +Sublime Text而言有意义文件的文件夹就被叫做一个 *包* 。 -You can access the packages directory from the Sublime Text 2 menu -(**Preferences | Browse Packages...**), or by means of an api call: -``sublime.packages_path()``. In this guide, we refer to this location as -*Packages*, *packages path*, *packages folder* or *packages directory*. +你可以通过Sublime Text 2的菜单来访问这个目录(**Preferences | Browse Packages...**), +也可以通过调用``sublime.packages_path()``这个api来访问。在本文档中,我们使用 *包组*、 +*包组路径* 、*包组文件夹* 以及 *包组目录* 来指代这个文档。 -The ``User`` Package -^^^^^^^^^^^^^^^^^^^^ -*Packages/User* is a catch-all directory for custom plugins, snippets, -macros, etc. Consider it your personal area in the packages folder. Sublime -Text 2 will never overwrite the contents of *Packages/User* during upgrades. +``User(用户)`` 包 +^^^^^^^^^^^^^^^^^^^^^^^ +*Packages/User* 这个目录是一个存放所有用户自定义的插件、代码片段、宏等等的大杂烩。请把这个 +目录看成是你在包组目录中的私人领地。Sublime Text 2在升级的过程中永远不会覆盖*Packages/User* +这个目录中的内容。 -The Python Console and the Python API -===================================== -This information is especially interesting for programmers. For the rest of -Sublime Text 2 users, you just need to know that Sublime Text enables users -with programming skills to add their own features to the editor. (So go learn -how to program; it's great fun!) +Python控制台以及Python API +================================= -Sublime Text 2 comes with an embedded Python interpreter. It's an useful tool -to inspect Sublime Text 2 settings and to quickly test API calls while you're -writing plugins. +这部分信息对码农来说格外有趣。而对于其他的Sublime Text 2用户来说,你只需要知道Sublime Text +允许会编程的人为这个编辑器添加他们自己需要的功能。(所以赶紧去学学编程吧,真的很有趣!) -To open the Python console, press ``Ctrl+``` or select **View | Show Console** -in the menu. +( 译者注:小伙子,干什么不好非要当码农,此间慎入! ;) ) -Confused? Let's try again more slowly: +Sublime Text 2自带了一个内嵌的Python解释器。这对于检视Sublime Text 2的各种设置项,以及 +在开发插件过程中快速简单测试API调用的效果来说都是非常有用的! -*Python* is a programming language known to be easy for beginners and very -powerful at the same time. *API* is short for ‘Application Programming -Interface', which is a fancy way of saying that Sublime Text 2 is prepared to -be programmed by the user. Put differently, Subime Text gives the user access -to its internals through Python. Lastly, a *console* is a little window inside -Sublime Text which lets you type in short snippets of Python code and run them. -The console also shows text output by Sublime Text or its plugins. +只需按下组合件 ``Ctrl+``` 或者从菜单中选择 **View | Show Console**,就能呼出Python控制台。 -Your System's Python vs the Sublime Text 2 Embedded Python +有点听迷糊了?咱们再说一些背景知识吧: + +*Python* 是一门对初学者而言非常容易上手,同时又具有强大能力的编程语言。 而 *API* 则是对 +‘Application Programming Interface(应用程序编程接口)'的缩写,这实际指的是Sublime +Text 2为用户准备的可以调教它的方式。换句话说,Sublime Text通过Python这门语言为用户提供了访 +问其内部的方式。最后需要说明的是 *控制台*,它是Sublime Text内部的一个可以输入并运行Python +代码片段的小窗口。控制台同时也负责显示由Sublime Text以及相关插件输出的文本信息。 + +操作系统中的Python vs Sublime Text 2内嵌的Python ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -On **Windows** and **Linux**, Sublime Text 2 comes with its own Python -interpreter and it's separate from your system's Python installation. +在 **Windows** 以及 **Linux** 平台,Sublime Text 2的Python解释器是完全与系统的Python +解释器分离的。 -On **OS X**, the system Python is used instead. Modifying your system version -of Python, such as replacing it with the MacPorts version, can cause problems -for Sublime Text. +而在 **OS X** 平台上,Sublime Text使用的则是系统的Python解释器。这就导致对系统Python解释 +器版本所做的修改,可能会对Sublime Text造成影响。比如使用MacPorts提供的解释器替换系统默认的 +解释器,就可能造成一些问题。 -The embedded interpreter is intended only to interact with the plugin API, not -for general development. +这个内嵌的解释器只是为了与插件API作交互,并不应该用来进行通用Python应用的开发。 -Packages, Plugins, Resources and Other Things That May Not Make Sense to You Now -================================================================================ +包组,插件,资源以及其他你现在可能并不理解的东西 +======================================================= -For now, just keep in mind that almost everything in Sublime Text can be adapted -to your needs. This vast flexibility is the reason why you will learn about so -many settings files: there simply must be a place to specify all your preferences. +就目前而言,你只需要记住Sublime Text中几乎所有的东西都能根据你的需求作调整。这种巨大的灵活性 +解释了你为什么要学如此多种类型的设置文件——从得有个地方记录你的设置吧! -Configuration files in Sublime Text let you change the editor's behavior, add -macros, snippets or create new features --where *feature* means ‘anything you can -think of'. Ok, maybe not *anything*, but Sublime Text definitely hands you over -a good deal of control. +Sublime Text中的配置文件允许你调整编辑器的表现,添加宏和代码片段,以及创造更多新的特性,注意 +这里的 *特性* 指的是 ‘你能想到的一切'。好吧,也许 *一切* 说的有点夸张了,但是Sublime Text绝对 +为你提供了巨大的控制权。 -These settings files are simply text files following a special structure or -*format*: JSON predominates, but you'll find XML files too. +这些配置文件就是一些遵循特定结构或 *格式* 的文本文件:在配置文件中,JSON文件占主导地位,有时 +你也会发现一些XML文件。 -In this guide, we refer collectively to all these disparate configuration -files as *resources*. Sublime Text will look for resources inside the packages -directory. To keep things tidy, the editor has a notion of a *package*, which -is a directory containing resources that belong together (maybe they all help -write emails faster or code in a certain programming language). +在本文档中,我们把这些完全不同的配置文件总体的称为 *资源* 。Sublime Text会在包组路径中寻找这 +些资源。为了让文件夹结构不显得那么杂乱,编辑器把包含为同一功能服务的各种资源的文件夹称为一个 *包* +(举例来说,也许某个包中的资源都是为更快的编写email服务的,亦或都是为某个编程语言服务的)。 -Textmate Compatibility +Textmate兼容性 ====================== This information is mainly useful for Textmate users who are now using Sublime Text. Textmate was an editor for the Mac. +这部分信息主要是为从Textmate转型使用Sublime Text的用户准备的。关于Textmate,它是Mac平台的 +一个编辑器。 + +(译者注:Textmate是Mac平台很成功的一款编辑器) -Sublime Text 2 is fairly compatible with Textmate bundles with the notable -exception of commands. Additionally, Sublime Text requires all syntax -definitions to have the *.tmLanguage* extension, and all preferences files to -have the *.tmPreferences* extension. This means that *.plist* files will be -ignored, even if they are located under a *Syntaxes* or *Preferences* -subdirectory. +除了命令有些差距之外,Sublime Text 2与Textmate的bundles(包)能较好的兼容。更进一步的说, +为了识别为TM编写的bundles,Sublime Text要求所有的语法定义文件都包含 *.tmLanguage* 扩展名, +并且所有的配置文件都有 *.tmPreferences*扩展名。这意味着即使 *.plist* 文件保存在 *Syntaxes* +或者 *Preferences* 目录下,它们也会被忽略。 -Vi Emulation -============ +模拟Vi +====== -This information is mainly useful for dinosaurs and people who like to drop -the term RSI in conversations. Vi is an ancient modal editor that lets the -user perform all operations from the keyboard. Vim, a modern version of vi, -is still in widespread use. +这部分信息主要对恐龙和甘愿在对话中绝口不提RSI的人有用。Vi是一款古老的模式编辑器,在编辑器中, +人们可以只通过键盘完成所有的操作。Vim,vi的更新版本仍然在被广泛的使用。 -Sublime Text provides vi emulation through the *Vintage* package. The Vintage -package is *ignored* by default. Read more about Vintage_ in the official -documentation. +(译者注:我也不知道RSI是什么,求科普) + +Sublime Text通过名为 *Vintage* 的包来模拟vi的操作方式。默认情况下Vintage包是被 *忽略* 的。 +请阅读 Vintage_ 的官方文档来了解更多内容。 .. _Vintage: http://www.sublimetext.com/docs/2/vintage.html @@ -169,19 +154,19 @@ documentation. Emacs ===== -This information is hardly useful for anyone. Emacs is... Well, nobody really -knows what emacs is, although some people edit text with it. +这部分内容基本对谁都没有用。Emacs是…… 好吧,没人知道emacs到底是什么,只不过有些人用它来编辑 +文本罢了。 + +如果你是emacs用户,那么估计你也不可能看到这个文档。 -If you are an emacs user, you're probably not reading this. +Be Sublime, My Friend(保持崇高,我的朋友) +============================================== -Be Sublime, My Friend -===================== +借用 `李小龙的智慧`_ (视频需翻墙)中的一句话,Sublime Text几乎可以成为你所需要的任何东西。当你能熟练使用 +它的时候,就可以不费吹灰之力搞定任何敌人。 -Borrowing from `Bruce Lee's wisdom`_, Sublime Text can become almost anything -you need it to be. In skilled hands, it can defeat an army of ninjas without -your breaking a sweat. -Empty your mind; be sublime, my friend. +放下杂念,保持崇高,我的朋友。 -.. _Bruce Lee's wisdom: http://www.youtube.com/watch?v=iO3sBulXpVw +.. _李小龙的智慧: http://www.youtube.com/watch?v=iO3sBulXpVw diff --git a/source/conf.py b/source/conf.py index e4b72a3..191b1bf 100644 --- a/source/conf.py +++ b/source/conf.py @@ -40,8 +40,8 @@ master_doc = 'index' # General information about the project. -project = u'Sublime Text Unofficial Documentation' -copyright = u'2012, Sublime Text Community' +project = u'Sublime Text非官方文档' +copyright = u'2012, Sublime Text社区' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the @@ -103,10 +103,10 @@ # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". -html_title = "Sublime Text Unofficial Documentation" +html_title = u"Sublime Text非官方文档(中文翻译版)" # A shorter title for the navigation bar. Default is the same as html_title. -html_short_title = 'Sublime Text Docs' +html_short_title = u'Sublime Text文档' # The name of an image file (relative to this directory) to place at the top # of the sidebar. @@ -164,7 +164,7 @@ #html_file_suffix = '' # Output file base name for HTML help builder. -htmlhelp_basename = 'Sublime Text Unofficial Documentation' +htmlhelp_basename = u'Sublime Text非官方文档' # -- Options for LaTeX output -------------------------------------------------- @@ -178,8 +178,8 @@ # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ - ('index', 'SublimeTextHelp.tex', u'Sublime Text Unofficial Documentation', - u'guillermooo', 'manual'), + ('index', 'SublimeTextHelp.tex', u'Sublime Text非官方文档', + u'guillermooo (Void Main翻译版)', u'手册'), ] # The name of an image file (relative to this directory) to place at the top of @@ -211,6 +211,6 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - ('index', 'sublimetexthelp', u'Sublime Text Unofficial Documentation', - [u'Sublime Text Community'], 1) + ('index', 'sublimetexthelp', u'Sublime Text非官方文档', + [u'Sublime Text社区'], 1) ] diff --git a/source/getting_started/install.rst b/source/getting_started/install.rst index db243de..8b588cb 100644 --- a/source/getting_started/install.rst +++ b/source/getting_started/install.rst @@ -1,73 +1,64 @@ -============ -Installation -============ +==== +安装 +==== -The process of installing Sublime Text is different for each platform. +在不同平台上安装Sublime Text的过程是不同的。 -Make sure to read the `conditions for use`_ on the official site. Sublime Text -is not free. +请务必阅读官方网站上的 `使用条约`_ ,Sublime Text并不是免费的。 -.. _conditions for use: http://www.sublimetext.com/buy +.. _使用条约: http://www.sublimetext.com/buy -32 bits or 64 bits? -=================== +32位还是64位? +============== -Choose the 64-bit version if you're running a 64-bit operating system, -otherwise the 32-bit version. +请根据操作系统作对应选择,如果你正在使用64位的系统,就请下载64位的版本,否则就下载32位的版本。 -On **Windows**, if in doubt, choose the 32-bit version. Modern 64-bit -versions of Windows can run 32-bit software. +在 **Windows** 平台,如果你不知道如何查看操作系统的版本,就请下载32位版。现在的64位Windows +操作系统可以正常运行32位的软件。 -On **Linux** run this command in your terminal to check your operating -system's type:: +在 **Linux** 平台,请在终端中输入下面的命令来查看操作系统的类型:: uname -m -For **OS X**, you can ignore this section: there is only one version of -Sublime Text for OS X. +对于 **OS X** 的用户,你大可不必关心此部分内容,因为Sublime Text在OS X平台只有一个版本。 Windows ======= -Portable or Not Portable? -------------------------- +选择便携版还是非便携版? +--------------------------- -Sublime Text comes in two flavors for Windows: normal, and portable. If you -need the portable installation, you probably know already. Otherwise, go with -the normal one. +Sublime Text在Windows平台提供了两种安装类型:一种是标准安装,另外一种则是便携安装。只有 +当你确信自己要使用便携版的时候才选择便携安装,否则就选择标准安装好了。 -**Normal installations** separate data between two folders: the installation -folder proper, and the *data directory*. These concepts are explained later -in this guide. Normal installations also integrate Sublime Text with the -Windows context menu. +**标准安装** 会将数据分散到两个文件夹:适当的安装目录,以及 *数据目录* 。这些概念将在稍后 +的文档中进行解释。标准安装也会将Sublime Text的选项与Windows的快捷菜单进行整合。 -**Portable installations** will keep all files Sublime Text needs to run in -one single folder. You can then move this folder around and the editor will -still work. +**便携安装** 会将所有Sublime Text需要的文件放到一个目录中。这样你就可以通过介质随身携带 +这个目录,而编辑器仍然可以正常工作。 -How to Install the Normal Version of Sublime Text +如何安装标准版的Sublime Text ------------------------------------------------- -Download the installer, doubleclick on it and follow the onscreen -instructions. +很简单,下载安装器,双击运行,然后跟着屏幕上的指令一步一步操作就可以了。 -How to Install the Portable Version of Sublime Text +如何安装便携版的Sublime Text ---------------------------------------------------- Download the package and uncompress it to a folder of your choice. You will find the *sublime_text.exe* executable inside that folder. +下载压缩包,并且将其中的内容解压到你选择的路径。你能在解压的路径中找到 *sublime_text.exe* +的可执行文件。 OS X ==== -Download and open the *.dmg* file, and then drag the Sublime Text 2 bundle -into the *Applications* folder. +下载并打开 *.dmg* 文件,将其中的Sublime Text 2拖拽到 *应用程序* 文件夹即可。 Linux ===== -You can download the package and uncompress it manually. Alternatively, you -can use the command line: +你可以手动下载并解压包文件。或者,你可以使用下面的几行命令: :: @@ -75,39 +66,32 @@ can use the command line: wget http://url/to/sublime.tar.bz2 tar vxjf sublime.tar.bz2 -If you want, you can also create a symbolic link to the executable for -convenience:: +如果你愿意的话,也可以使用下面的命令来创建一个可以方便使用的符号连接:: sudo ln -s /path/to/sublime_text /usr/bin/subl -Living Dangerously... or Not +尝试冒险或者选择稳定 ============================ -Sublime Text has three release *channels*: +Sublime Text有三个发布 *通道* : -* `Stable`_ (default) -* `Dev`_ -* `Nightly`_ +* `稳定版`_ (默认选择) +* `开发版`_ +* `日更新版`_ -.. _Stable: http://www.sublimetext.com/2 -.. _Dev: http://www.sublimetext.com/dev -.. _Nightly: http://www.sublimetext.com/nightly +.. _稳定版: http://www.sublimetext.com/2 +.. _开发版: http://www.sublimetext.com/dev +.. _日更新版: http://www.sublimetext.com/nightly -If you are working on a NASA project or are on a tight deadline, keep using -the stable releases and stop reading here. **Stable releases** are better -tested and more reliable for everyday use than the others. They come out -roughly once a month. **The majority of users will want to use stable releases -only.** +如果你正在为NASA的项目工作,或者正在赶一个紧迫的截止日期,请使用稳定发行版,并且没必要继续 +阅读了。**稳定发行版** 受过更加完整的测试,而且比其他版本更可信赖,更适宜日常的工作。稳定 +发行版基本是每月更新一次。 **大部分的用户都只需要使用稳定版。** -The *dev* and *nightly* channels are unstable, which means that builds -published through them are likely to contain bugs and to not work reliably. -They are updated more often than stable releases. +*开发* 或者 *日更新* 通道都不是稳定通道,这意味着通过这些通道发布的版本可能包含更多的bug, +或者可能无法可靠的运行。但是它们的更新速度比稳定版要快得多。 -**Dev builds** are available for everyone. On average, they're released twice -a month. While not quite ready for everyday use yet, they showcase new -features in a mostly unbroken fashion. +每个人都能用免费使用 **开发发行版**。 平均看来,开发版每月发布两次。尽管它们可能还不能胜任 +每天的工作,但是这些发行版的确较为稳定的展示了接下来要发放版本的新特性。 -Lastly, **nightly builds** are the bleeding edge, with frequent updates and -also frequent problems of various degrees of severity. They are fun to try -out, but do so at your own risk. Nighlty builds are **only available for -registered users**. +最后,使用 **日更新版** 真是站在风口浪尖上,这些发行版发布频率很高,同时也包含大量严重程度 +不一的问题。试用这些版本很好玩,但是风险请自负。需要注意的是日更新版 **只对注册用户开放** 。 diff --git a/source/index.rst b/source/index.rst index bb7cad2..ead89e1 100644 --- a/source/index.rst +++ b/source/index.rst @@ -3,24 +3,24 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Sublime Text Unofficial Documentation +Sublime Text非官方文档(中文翻译版) ===================================== .. toctree:: :maxdepth: 2 - intro - Installation - basic_concepts - Editing - Search and Replace - Build Systems (Batch Processing) - File Navigation and File Management - Customization - Extensibility and Automation - Command Line - Reference - Glossary + 关于本文档 + 安装 + 基本概念 + 编辑(尚未翻译) + 搜索和替换(尚未翻译) + 构建系统 (批处理)(尚未翻译) + 文件导航与文件管理(尚未翻译) + 自定义内容(尚未翻译) + 可扩展性与自动化(尚未翻译) + 命令行(尚未翻译) + 参考内容(尚未翻译) + 词汇表(尚未翻译) .. Indices and tables .. ================== diff --git a/source/intro.rst b/source/intro.rst index bdb01e4..7e1bd08 100644 --- a/source/intro.rst +++ b/source/intro.rst @@ -1,18 +1,16 @@ ======================== -About This Documentation +关于本文档 ======================== -This is the unofficial documentation for the Sublime Text editor, maintained by -volunteers. We hope it's useful! +这是由ST党拥护者们维护的Sublime Text编辑器的非官方文档。希望能对你有所帮助! -*The sublime what? What are you talking about!?* +*sublime什么?你在说什么东西啊?* -`Sublime Text`_ is a text editor for code and prose. It does away with many -repetitive tasks so you can focus on your work. And it's fun to use! +`Sublime Text`_ 是一款为编写代码和文稿而准备的多功能编辑器。它为你做了很多重复性的工作, +从而让你的精力专注在正在编写的内容上面。重要的是,使用它你会感觉很快乐! .. _Sublime Text: http://www.sublimetext.com -Before you continue, we encourage you to read through the :doc:`basic_concepts` -section. +在你继续阅读之前,我们鼓励你通读一下 :doc:`基本概念 ` 章节。 -Happy learning! +学的开心哦! From c79995785fad8cfb60ae12354fa12e685ddcd98a Mon Sep 17 00:00:00 2001 From: Void Main Date: Wed, 27 Mar 2013 10:11:25 +0800 Subject: [PATCH 43/79] finished translating editing part --- source/editing/editing.rst | 60 ++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 32 deletions(-) diff --git a/source/editing/editing.rst b/source/editing/editing.rst index 133ba70..f87f56b 100644 --- a/source/editing/editing.rst +++ b/source/editing/editing.rst @@ -1,59 +1,55 @@ ======= -Editing +编辑 ======= -Overview +概览 ======== -Sublime Text is full to the brim with editing features. This topic just -scratches the surface of what's possible. +Sublime Text具有多种多样的编辑特性。本主题只简单展示其中的几种。 -Multiple Selections +多重选择 =================== -Multiple selections let you make sweeping changes to your text efficiently. -Any praise about multiple selections is an understatement. This is why: +多重选择特性让你可以高效的在文档中进行批量修改。任何对这个特性的赞誉都不为过。接下来我们就展示 +为什么这么说: -Select some text and press ``Ctrl + D`` to **add more** instances. If -you want **to skip the current instance**, press ``Ctrl + K, Ctrl + D``. +首先选中一些文本,然后按 ``Ctrl + D`` 的组合键来 **添加更多** 实例。如果你想 **跳过当前实例**, +可以按 ``Ctrl + K, Ctrl + D``。 -If you go too far, press ``Ctrl + U`` to **deselect** the current instance. +如果你按键太快,导致误添加了一个实例,可以用 ``Ctrl + U`` 来 **取消** 对当前实例的选择。 - -Transforming Multiple Selections into Lines +把多重选择的内容扩展到行 =========================================== -``Ctrl + L`` expands the selections to the end of the line. ``Ctrl + Shift + L`` -splits the selections into lines. +使用 ``Ctrl + L`` 可以把多重选择的内容从单词扩展到整行。使用 ``Ctrl + Shift + L`` 可以把 +选中的多行文本分成多个独立的行。 -You can copy multiple selected lines to a separate buffer, edit them there, -select the content again as multiple lines and then paste them back into -place in the first buffer. +(译者注:这里多个独立的行指的是每行末尾都有单独的光标。平时选中多行文字之后只会有一个光标,这 +时按 ``Ctrl + Shift + L`` 后,每一行末尾都有一个光标,可以按左方向键查看效果。这种选择适用 +于在 *每行* 都添加/删除相同的内容) +你可以复制多重选择的行到一个单独的缓冲区,在那里编辑他们,并将编辑后的结果贴回到第一个缓冲区。 -Other Ways of Selecting Text -============================ -The list is long; all available options can be found under **Selection**. To -name a few: +文本选择的其他方法 +============================ -* Select subwords (``Alt + Shift + ``) -* Expand selection to brackets (``Ctrl + Shift + M``) -* Expand selection to indentation (``Ctrl + Shift + J``) -* Expand selection to scope (``Ctrl + Shift + Space``) +文本选择的方法很多,可以在 **Selection** 菜单下找到所有可能的选项。下面举几个例子: +* 选择子单词 (``Alt + Shift + ``) +* 添加对选中文字周围括号的选择 (``Ctrl + Shift + M``) +* 添加对选中文字缩进空格的选择 (``Ctrl + Shift + J``) +* 添加对选中文字当前域的选择 (``Ctrl + Shift + Space``) -Transposing Things +交换位置 ================== -Need to swap two letters or, better yet, two words? Experiment with -``Ctrl + T``. +需要调换两个字母甚至两个单词的位置?试试 ``Ctrl + T``吧。 -And much, much more... +其他内容 ====================== -The **Edit**, **Selection**, **Find** and **Goto** menus are good places to -look for handy editing tools. You might end up using just a few of them, -but the rest will still be there when you need them. \ No newline at end of file +在 **Edit**, **Selection**, **Find** 和 **Goto** 菜单中可以找到很多好用的编辑工具。平常 +你可能只需要其中的部分功能,当你遇到问题的是后看看这些菜单项,也许其他功能能够帮助你解决问题。 From 795b82aefe3bc2486bdaeaf9772675aaa77f3daa Mon Sep 17 00:00:00 2001 From: Void Main Date: Wed, 27 Mar 2013 10:12:05 +0800 Subject: [PATCH 44/79] editing part is done, so edit index --- source/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/index.rst b/source/index.rst index ead89e1..0c081a6 100644 --- a/source/index.rst +++ b/source/index.rst @@ -12,7 +12,7 @@ Sublime Text非官方文档(中文翻译版) 关于本文档 安装 基本概念 - 编辑(尚未翻译) + 编辑 搜索和替换(尚未翻译) 构建系统 (批处理)(尚未翻译) 文件导航与文件管理(尚未翻译) From 86c8aa7530748792f38f7922d00655eb80b094e1 Mon Sep 17 00:00:00 2001 From: Void Main Date: Wed, 27 Mar 2013 14:18:55 +0800 Subject: [PATCH 45/79] forgot the after space --- source/editing/editing.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/editing/editing.rst b/source/editing/editing.rst index f87f56b..c91089d 100644 --- a/source/editing/editing.rst +++ b/source/editing/editing.rst @@ -45,7 +45,7 @@ Sublime Text具有多种多样的编辑特性。本主题只简单展示其中 交换位置 ================== -需要调换两个字母甚至两个单词的位置?试试 ``Ctrl + T``吧。 +需要调换两个字母甚至两个单词的位置?试试 ``Ctrl + T`` 吧。 其他内容 From 621d22e69f95cbbe2ba19e78981e7f29a2b93ce3 Mon Sep 17 00:00:00 2001 From: Void Main Date: Wed, 27 Mar 2013 14:25:18 +0800 Subject: [PATCH 46/79] Warmly welcome, Cliff Woo --- AUTHORS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.txt b/AUTHORS.txt index b3bea23..aa365b9 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -2,3 +2,4 @@ Guillermo López-Anglada (guillermooo) Translator: Void Main (void-main) +Cliff Woo (cliffwoo) From b43f4c39dc9bcae4d0abe0e201d4982674b65274 Mon Sep 17 00:00:00 2001 From: Void Main Date: Wed, 27 Mar 2013 14:51:45 +0800 Subject: [PATCH 47/79] mv translator names to a seperate file to honour the real author --- AUTHORS.txt | 4 ---- TRANSLATORS.txt | 2 ++ 2 files changed, 2 insertions(+), 4 deletions(-) create mode 100644 TRANSLATORS.txt diff --git a/AUTHORS.txt b/AUTHORS.txt index aa365b9..3a5066a 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -1,5 +1 @@ Guillermo López-Anglada (guillermooo) - -Translator: -Void Main (void-main) -Cliff Woo (cliffwoo) diff --git a/TRANSLATORS.txt b/TRANSLATORS.txt new file mode 100644 index 0000000..88c4ea8 --- /dev/null +++ b/TRANSLATORS.txt @@ -0,0 +1,2 @@ +Void Main (void-main) +Cliff Woo (cliffwoo) From 2c895dab48c2397841fa9e3b322a1b311120031e Mon Sep 17 00:00:00 2001 From: Void Main Date: Wed, 27 Mar 2013 14:52:59 +0800 Subject: [PATCH 48/79] add reviewer placeholder --- TRANSLATORS.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/TRANSLATORS.txt b/TRANSLATORS.txt index 88c4ea8..0a0b080 100644 --- a/TRANSLATORS.txt +++ b/TRANSLATORS.txt @@ -1,2 +1,5 @@ +翻译: Void Main (void-main) Cliff Woo (cliffwoo) + +审校: From b577759d24d8f3f043424cf118ee0a5d9ea3fdcf Mon Sep 17 00:00:00 2001 From: Void Main Date: Wed, 27 Mar 2013 15:27:28 +0800 Subject: [PATCH 49/79] translate command_line --- source/command_line/command_line.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/command_line/command_line.rst b/source/command_line/command_line.rst index 0ca7234..a53945b 100644 --- a/source/command_line/command_line.rst +++ b/source/command_line/command_line.rst @@ -1,7 +1,7 @@ -Command Line Usage +使用命令行 ================== -.. seealso:: - - `OS X Command Line `_ - Official Sublime Text Documentation +详情请参考: + + `OS X平台命令行支持 `_ + 官方Sublime Text文档 From 5c388a49419b78cdcaee140560963024f6200b68 Mon Sep 17 00:00:00 2001 From: Void Main Date: Wed, 27 Mar 2013 15:49:09 +0800 Subject: [PATCH 50/79] translated glossary part --- source/glossary/glossary.rst | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/source/glossary/glossary.rst b/source/glossary/glossary.rst index 8a10617..7388650 100644 --- a/source/glossary/glossary.rst +++ b/source/glossary/glossary.rst @@ -1,33 +1,50 @@ .. _glossary: ======== -Glossary +词汇表 ======== .. glossary:: buffer + 缓冲区 Data of a loaded file and additional metadata. Associated with one or more views. The distinction between *buffer* and *view* is technical. Most of the time, both terms can be used interchangeably. + 存放已经加载文件的内容以及文件元数据的区域称为缓冲区。缓冲区一般与一个或多个视图相关联。 + *缓冲区* 与 *视图* 只有一些细节上的差别。大多数情况下这两个术语是可以混用的。 view + 视图 Graphical display of a buffer. Multiple views can show the same buffer. + 显示缓冲区内容的图形区域。多个不同的视图可以显示同一块缓冲区内容。 plugin + 插件 A feature impemented in Python. It can consist of a single command or multiple commands. It can be contained in one *.py* file or many *.py* files. + 使用Python实现的一个功能称为插件。它可以包含一个或多个命令。它可以由一个或多个 *.py* + 文件组成。 package + 包 This term in ambiguous in the context of Sublime Text, because it can refer to a Python package (unlikely), a directory inside ``Packages`` or a *.sublime-package* file. Most of the time, it means a directory inside ``Packages`` containing resources that belong together to build a new feature or provide support for a programming or markup language. + 在Sublime Text中这个术语的意义有点模糊,它可以指一个Python包(这种用法很少),或者 + 是 ``包组`` 目录下的一个文件夹,亦或是一个 *.sublime-package* 文件。大多数情况下, + 包指的是 ``包组`` 目录下的一个文件夹,这个文件夹中包含为某个特性或者某种语言服务的各 + 种资源。 panel + 面板 An input/output widget such as a search panel or the output panel. + 像搜索或者输出这样的,用于进行输入/输出的窗体控件称为面板。 overlay + 覆盖层控件 An input widget of a special kind. Goto Anything is an overlay. + 一种特殊的输入控件。快速跳转就是一种覆盖层控件。 From bee0677db562290ccaf2fb0198c03c84b1f7668e Mon Sep 17 00:00:00 2001 From: Void Main Date: Wed, 27 Mar 2013 16:06:15 +0800 Subject: [PATCH 51/79] translate search and replace part --- source/index.rst | 6 +-- .../search_and_replace/search_and_replace.rst | 48 +++++++++++++++---- .../search_and_replace_files.rst | 29 ++++++++++- .../search_and_replace_overview.rst | 45 +++++++++-------- 4 files changed, 95 insertions(+), 33 deletions(-) diff --git a/source/index.rst b/source/index.rst index 0c081a6..32ca509 100644 --- a/source/index.rst +++ b/source/index.rst @@ -13,14 +13,14 @@ Sublime Text非官方文档(中文翻译版) 安装 基本概念 编辑 - 搜索和替换(尚未翻译) + 搜索和替换 构建系统 (批处理)(尚未翻译) 文件导航与文件管理(尚未翻译) 自定义内容(尚未翻译) 可扩展性与自动化(尚未翻译) - 命令行(尚未翻译) + 命令行 参考内容(尚未翻译) - 词汇表(尚未翻译) + 词汇表 .. Indices and tables .. ================== diff --git a/source/search_and_replace/search_and_replace.rst b/source/search_and_replace/search_and_replace.rst index 4266aa6..b1a7b14 100644 --- a/source/search_and_replace/search_and_replace.rst +++ b/source/search_and_replace/search_and_replace.rst @@ -1,27 +1,41 @@ ================================ -Search and Replace - Single File +搜索和替换 - 单文件 ================================ .. _snr-search-buffer: Searching +搜索 ========= To open the **search panel** for buffers, press ``Ctrl + F``. Some options in the search panel and search actions can be controlled with the keyboard: +按下 ``Ctrl + F`` 键就可以打开对应当前缓冲区的 **搜索面板** 。搜索面板里的一些选项和搜索动作 +有着对应的快捷键: ========================== =========== -Toggle Regular Expressions ``Alt + R`` -Toggle Case Sensitivity ``Alt + C`` -Toggle Exact Match ``Alt + W`` -Find Next ``Enter`` -Find Previous ``Shift + Enter`` -Find All ``Alt + Enter`` +Toggle Regular Expressions ``Alt + R`` +开/关正则表达式选项 ``Alt + R`` +Toggle Case Sensitivity ``Alt + C`` +开/关大小写敏感选项 ``Alt + C`` +Toggle Exact Match ``Alt + W`` +开/关精确匹配选项 ``Alt + W`` +Find Next ``Enter`` +查找下一个 ``Enter`` +Find Previous ``Shift + Enter`` +查找上一个 ``Shift + Enter`` +Find All ``Alt + Enter`` +查找全部 ``Alt + Enter`` ========================== =========== +(译者注:关于缓冲区,请参考 `词汇表`_ 这个章节) + +.. _词汇表: ../glossary/glossary.html + .. _snr-incremental-search-buffer: Incremental Search +增量查找 ================== The **incremental search panel** can be brought up with ``Ctrl + I``. The only @@ -29,17 +43,23 @@ difference with the regular search panel lies in the behavior of the ``Enter`` key: in incremental searches, it will select the next match in the buffer and dismiss the search panel for you. Choosing between this panel or the regular search panel is mainly a matter of preference. +按下 ``Ctrl + I`` 可以呼出 **增量搜索面板** 。与正常的搜索面板相比,唯一的区别在于 ``回车`` +键的作用:在增量搜索中,按下回车键将选中缓冲区中下一段与搜索条件匹配的文字,并自动关闭面板。 +一般来说,可以根据个人的喜好来决定是选择增量搜索面板还是普通搜索面板。 .. _snr-replace-buffer: Replacing Text +替换文本 ============== You can open the replace planel with ``Ctrl + H``. +可以通过 ``Ctrl + H`` 来打开替换面板。 ========================== ====================== Replace All: ``Ctrl + Alt + Enter`` +替换全部内容: ``Ctrl + Alt + Enter`` ========================== ====================== .. xxx no key binding for replacing once? @@ -48,32 +68,44 @@ Replace All: ``Ctrl + Alt + Enter`` .. _snr-tips-buffer: Tips -==== +小技巧 +======== Other Ways of Searching in Buffers +搜索文本的其他方法 ---------------------------------- .. todo: link to goto anything section Goto Anything provides the operator ``#`` to search in the current buffer. The search term will be the part following the ``#`` operator. +可以在Goto Anything(快速跳转)面板中使用 ``#`` 操作符在当前缓冲区中进行搜索。跟在 ``#`` +操作符后面的内容将被识别为搜索关键字。 Other Key Bindings to Search in Buffers +文本搜索的其他快捷键 --------------------------------------- These keybindings work when the search panel is hidden. +下面的这些快捷键在搜索面板不可见的情况下仍然有效。 =============================================== ============== Search Forward Using Most Recent Pattern ``F3`` +使用最近一次的搜索模式进行前向搜索 ``F3`` Search Backwards Using Most Recent Pattern ``Shift + F3`` +使用最近一次的搜索模式进行后向搜索 ``Shift + F3`` Select All Matches Using Most Recent Pattern ``Alt + F3`` +使用最近一次的搜索模式进行全搜索 ``Alt + F3`` =============================================== ============== .. search under cursor ?? Multiline Search +多行搜索 ---------------- You can type a multiline search pattern. To enter a newline character, press ``Ctrl + Enter`` in the search panel. Note that the search panel is resizable too. +你可以输入一个多行搜素模式。在搜索面板中使用 ``Ctrl + 回车`` 键来输入换行符。值得一提的是, +搜索面板的大小是可以调整的。 diff --git a/source/search_and_replace/search_and_replace_files.rst b/source/search_and_replace/search_and_replace_files.rst index 2d72ce1..76360da 100644 --- a/source/search_and_replace/search_and_replace_files.rst +++ b/source/search_and_replace/search_and_replace_files.rst @@ -1,40 +1,56 @@ =================================== -Search and Replace - Multiple Files +搜索与替换 - 多文件 =================================== .. _snr-search-files: Searching +搜索 ========= To open the search panel for files, press ``Ctrl + Shift + F``. You can use the keyboard to control the search panel and some search actions: +使用 ``Ctrl + Shift + F`` 键可以打开多文件搜索面板。搜索面板与搜索动作可以使用快捷键进行操作: ========================== =========== Toggle Regular Expressions ``Alt + R`` +开/关正则表达式选项 ``Alt + R`` Toggle Case Sensitivity ``Alt + C`` +开/关大小写敏感选项 ``Alt + C`` Toggle Exact matches ``Alt + W`` +开/关精确匹配选项 ``Alt + W`` Find Next ``Enter`` +查找下一个 ``Enter`` ========================== =========== .. _snr-search-scope-files: Search Scope +搜索作用域 ============ The **Where** field in the search panel determines where to search. You can define the scope of the search in several ways: +搜索面板中的 **Where** 字段决定搜索文件的范围。你可以通过以下几种方式来确定文件的搜索作用域: * Adding individual directories (Unix-style paths, even on Windows) +* 添加一个独立的目录 (需要使用 Unix风格的文件路径,在Windows平台也是如此) * Adding/excluding files based on a pattern +* 使用某种模式来添加/删除某些文件 * Adding symbolic locations (````, ````) +* 添加链接位置(````, ````) You can combine these filters separing them with commas, for example: +你可以在一次搜索中组合使用以上确定作用域的方式,并且在不同方式之间用逗号分隔,例如: /C/Users/Joe/Top Secret,-*.html, Press the **...** button in the search panel to display a menu containing these options. +通过在搜索面板中按 **...** 按钮来显示包含这些选项的菜单。 + +(译者注:Unix风格的文件路径指的是使用 */* 来区分目录结构,例如 */Users/voidmain/* ,在 +Windows平台上,可以使用 */C/Users/* 来指定盘符) .. xxx what kind of patterns are those? .. xxx special locations? @@ -44,24 +60,33 @@ these options. .. _snr-results-format-files: Results Format -============== +搜索结果显示方式 +================== In the search panel, you can find the following options to customize the results format: +在搜索面板中,可以使用下面的选项来自定义搜索结果的显示方式: + * Show in Separate Buffer/Output Panel +* 在单独的缓冲区/输出面板中显示 * Show Context +* 显示上下文 .. _snr-results-navigation-files: Navigating Results +搜索结果跳转 ================== If the search yields matches, you can move through the sequence using the following key bindings: +一旦找到了符合要求的内容,你就可以使用以下的快捷键进行结果之间的跳转: ================ ============== Next match ``F4`` +转到下一个匹配项 ``F4`` Previous match ``Shift + F4`` +转到前一个匹配相 ``Shift + F4`` ================ ============== diff --git a/source/search_and_replace/search_and_replace_overview.rst b/source/search_and_replace/search_and_replace_overview.rst index 1b94f2f..cdc6998 100644 --- a/source/search_and_replace/search_and_replace_overview.rst +++ b/source/search_and_replace/search_and_replace_overview.rst @@ -1,41 +1,46 @@ ================== -Search and Replace + 搜索和替换 ================== -Sublime Text features two main types of search: +Sublime Text主要有两种搜索方式: .. toctree:: :maxdepth: 1 - Search - Single File - Search - Multiple Files + 搜索和替换 - 单文件 + 搜索和替换 - 多文件 -We'll examine them in turn, but let's talk about a powerful tool for searching -text first: regular expressions. +我们将逐一讲解这两种搜索方式,但在此之前,让我们先来聊一聊一个强大的文本搜索工具:正则表达式。 .. _snr-regexes: -Regular Expressions +正则表达式 =================== -Regular Expressions find complex *patterns* in text. To take full advantage of -the search and replace facilities in Sublime Text, you should learn at least -the basics of regular expressions. In this guide we will not explain how to use -regular expressions. +正则表达式用于在文本中找到复杂的 *模式* 。为了最大程度的利用Sublime Text提供的搜索与替换功能, +你至少需要掌握基本的正则表达式使用方法。在本文档中我们不会讲解如何使用正则表达式。 -Typing out *regular expression* gets boring fast, and actually saying it is -even more annoying, so nerds usually shorten that to *regexp* or *regex* -instead. +(译者注:要想学习正则表达式,可以阅读O'REILLY出版社出版的 `《精通正则表达式》`_ 一书) -This is how a regex might look like:: +.. _《精通正则表达式》: http://book.douban.com/subject/2154713 + +如果让你一直输入 *regular expression(正则表达式)* 这个词组,很快你就会觉得很无聊,甚至会 +觉得的很烦人,因此宅男们经常把这个词组缩写为 *regexp* 或者 *regex* 。 + +(译者注:对汉语来说毫无压力,大家可以说“正则表达式”或者“正则”;另外,上文中的 *宅男* 原文为 +*nerd* ,还可以翻译成书呆子、极客 *geek* ,根据语境这里指代经常使用计算机的人) + +咱们来看个正则表达式的例子吧:: (?:Sw|P)i(?:tch|s{2})\s(?:it\s)?of{2}! -Regexes are known to hurt people's feelings. +正则表达式真是坑爹啊。 + +为了在搜索中利用正则表达式,需要在搜索面板中开启这个选项。否则,输入的正则字符将被视作字符常量 +进行匹配。 -To use regular expressions, you need to activate them first in the various -search panels. Othwerwise, the search term will be interpreted literally. +Sublime Text使用正则表达式中的 `Boost语法`_ 。 -Sublime Text uses the `Boost syntax`_ for regular expressions. +.. _Boost语法: http://www.boost.org/doc/libs/1_47_0/libs/regex/doc/html/boost_regex/syntax/perl_syntax.html -.. _Boost syntax: http://www.boost.org/doc/libs/1_47_0/libs/regex/doc/html/boost_regex/syntax/perl_syntax.html +(译者注:正则表达式有很多类型的方言) From 8dbece3c43c38048bcd11def6076bc4ff64c5af8 Mon Sep 17 00:00:00 2001 From: Void Main Date: Wed, 27 Mar 2013 17:16:47 +0800 Subject: [PATCH 52/79] small fix on search and replace --- source/search_and_replace/search_and_replace.rst | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/source/search_and_replace/search_and_replace.rst b/source/search_and_replace/search_and_replace.rst index b1a7b14..ff3596e 100644 --- a/source/search_and_replace/search_and_replace.rst +++ b/source/search_and_replace/search_and_replace.rst @@ -28,9 +28,7 @@ Find All ``Alt + Enter`` 查找全部 ``Alt + Enter`` ========================== =========== -(译者注:关于缓冲区,请参考 `词汇表`_ 这个章节) - -.. _词汇表: ../glossary/glossary.html +(译者注:关于缓冲区,请参考 :doc:`词汇表 <../glossary/glossary>` 这个章节) .. _snr-incremental-search-buffer: From 3c936715adee165c6243d8c10b77d7c2d144ac14 Mon Sep 17 00:00:00 2001 From: Void Main Date: Wed, 27 Mar 2013 17:17:03 +0800 Subject: [PATCH 53/79] translate file_processing part --- source/file_processing/build_systems.rst | 28 +++++++++++++++++++++++- source/index.rst | 2 +- source/reference/build_systems.rst | 4 ++-- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/source/file_processing/build_systems.rst b/source/file_processing/build_systems.rst index 39930e0..9a11efd 100644 --- a/source/file_processing/build_systems.rst +++ b/source/file_processing/build_systems.rst @@ -1,24 +1,32 @@ ================================ -Build Systems (Batch Processing) +构建系统(批处理) ================================ Build systems let you run your files through external programs like :program:`make`, :program:`tidy`, interpreters, etc. +通过构建系统,你能够使用像 :program:`make`, :program:`tidy` 这样的外部程序以及各种解释器 +来运行你的文件。 Executables called from build systems must be in your :const:`PATH`. For more information about making sure the :const:`PATH` seen by Sublime Text is set correctly, see :ref:`troubleshooting-build-systems`. +在构建系统中调用的外部可执行程序一定要能够通过 :const:`PATH` 环境变量找到。请参考 :ref:`构建系统常见问题` +章节来了解有关如何正确设置 :const:`PATH` 环境变量的更多信息。 File Format +文件格式 =========== Build systems are JSON files and have the extension *.sublime-build*. +构建系统是以 *.sublime-build* 作为文件扩展名的JSON文件。 Example +示例 ------- Here's an example of a build system: +下面是构建系统的一个小例子: .. code-block:: js @@ -30,6 +38,7 @@ Here's an example of a build system: ``cmd`` Required. This option contains the actual command line to be executed:: + 必填内容。这个选项的内容是实际执行的命令行语句:: python -u /path/to/current/file.ext @@ -37,31 +46,48 @@ Here's an example of a build system: A Perl-style regular expression to capture error information out of the external program's output. This information is then used to help you navigate through error instances with :kbd:`F4`. + 存放一段用于捕获外部程序输出的错误信息的Perl风格的正则表达式。这部分信息用于帮助你在不同 + 的错误实例之间使用 :kbd:`F4` 快捷键进行跳转。 + ``selector`` If the **Tools | Build System | Automatic** option is set, Sublime Text will automatically find the corresponding build system for the active file by matching ``selector`` to the file's scope. + 如果你勾选了 **Tools | Build System | Automatic** 选项,Sublime Text会自动从构建 + 系统中通过 ``selector`` 选项找到适合当前文件的构建方式。 In addition to options, you can also use some variables in build systems, like we have done above with ``$file``, which expands to the the active buffer's file name. +除了这些选项,在构建系统中还可以使用一些变量,例如在前面使用的 ``$file`` 变量,就能自动扩充为 +当前缓冲区对应的文件名。 Where to Store Build Systems +构建系统存储在哪里 ============================ Build systems must be located somewhere under the *Packages* folder (e. g. *Packages/User*). Many packages include their own build systems. +构建系统必须被放在 *包组* 文件夹下面的某个位置(例如 *Packages/User*)。许多包都含有它们自己 +的构建系统。 Running Build Systems +运行构建系统 ===================== Build systems can be run by pressing :kbd:`F7` or from **Tools | Build**. +可以使用 :kbd:`F7` 快捷键来运行构建系统,也可以从 **Tools | Build** 菜单中运行。 .. seealso:: :doc:`Reference for build systems <../reference/build_systems>` Complete documentation on all available options, variables, etc. + +更多信息请参考 + + :doc:`构建系统参考文档 <../reference/build_systems>` + 记录所有可用选项、变量的完整文档。 diff --git a/source/index.rst b/source/index.rst index 32ca509..c9c61de 100644 --- a/source/index.rst +++ b/source/index.rst @@ -14,7 +14,7 @@ Sublime Text非官方文档(中文翻译版) 基本概念 编辑 搜索和替换 - 构建系统 (批处理)(尚未翻译) + 构建系统(批处理) 文件导航与文件管理(尚未翻译) 自定义内容(尚未翻译) 可扩展性与自动化(尚未翻译) diff --git a/source/reference/build_systems.rst b/source/reference/build_systems.rst index d3c84fa..601860a 100644 --- a/source/reference/build_systems.rst +++ b/source/reference/build_systems.rst @@ -221,9 +221,9 @@ Select the desired build system from **Tools | Build System**, and then select **Tools | Build** or press ``F7``. -.. _troubleshooting-build-systems: +.. _构建系统常见问题: -Troubleshooting Build Systems +构建系统常见问题 ***************************** Build systems will look for executables in your :const:`PATH`, unless you specify From ae8193abe9c5116f52b2cc888e9f729ea80b60d0 Mon Sep 17 00:00:00 2001 From: Cliff Woo Date: Wed, 27 Mar 2013 22:29:44 +0800 Subject: [PATCH 54/79] file management chs translation --- source/file_management/file_management.rst | 56 +++++++++++++++++++--- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/source/file_management/file_management.rst b/source/file_management/file_management.rst index b7889b2..9d63524 100644 --- a/source/file_management/file_management.rst +++ b/source/file_management/file_management.rst @@ -1,8 +1,8 @@ =================================== -File Navigation and File Management +文件导航与文件管理 =================================== -Goto Anything +随意跳转 ============= Goto Anything lets you **navigate files** swiftly. Open it with :kbd:`Ctrl+P`. @@ -13,30 +13,49 @@ until you perform some operation on it. Transient views go away when you press :kbd:`Esc`. You will find transient views in other situations. They are like ghosts or something. +“随意跳转” 可以让你方便的在文件之间切换,使用 :kbd:`Ctrl+P` 启动该功能。你在输入栏输入,ST则会 +对已经打开的文件或者目录进行搜索,并给出匹配最佳的搜索结果的预览。如果你不进行任何操作,将不会 +真正加载这些文件。可以按:kbd:`Esc`取消预览界面。快捷预览界面形似鬼魅,你在使用ST的其他功能时也会遇到哦。 + Goto Anything lives up to its name --there's more to it than locating files: +“随意跳转”正如其名,其功能不仅限于查找文件: To perform a **fuzzy search**, append ``#`` and then keep typing, like this: - :: island#treasure +还可以在输入一些内容后接上 ``#`` 再接着输入来进行 **模糊搜索** ,,比如说: +:: + + island#treasure + + This instructs Sublime Text to perform a fuzzy search for *treasure* in the file whose name matches *island*. Pressing :kbd:`Ctrl+;` will open Goto Anything and type ``#`` for you. +Sublime Text会进行在所有文件名匹配 *island* 的文件中搜索 *treasure* 关键字。使用组合键 +:kbd:`Ctrl+;` 可以打开“随意跳转” 功能并输入 ``#`` + And there's more: To **search symbols** in the active buffer, press :kbd:`Ctrl+R`. The operator ``@`` can be used as explained above too. +可以通过按下组合键 :kbd:`Ctrl+R` 在活动缓冲区中进行**符号搜索** 。操作符 ``@`` 与之前提到的用法相同。 + To **go to a line number**, press :kbd:`Ctrl+G`. The operator ``:`` can be used as explained above too. +可以通过按下组合键 :kbd:`Ctrl+G`来跳转到指定的行号。操作符 ``:`` 与之前提到的用法相同。 + Searching for symbols will only work for file types that have symbols defined for them. -Sidebar +符号搜索的功能只能在那些已经定义了符号的文件类型中使用。 + +侧边栏 ======= The sidebar gives you an overview of your project. Files and folders added to @@ -44,38 +63,63 @@ the sidebar will be available in Goto Anything and project-wide actions. Projects and the sidebar are closely related. There's always an open project, whether it's implicit or explicit. +侧边栏可以提供一个项目的概览视图。添加到侧边栏的文件和目录均可以通过“随意跳转”功能访问,并且响应 +项目范围内的指令。项目与侧边栏是密切相关的。不管以显式或是隐式的方式,总是有一个项目存在于侧边栏中。 + To **open or close** the sidebar, press :kbd:`Ctrl+K, Ctrl+B`. +可以通过组合键:kbd:`Ctrl+K, Ctrl+B`来打开或关闭侧边栏。 + The sidebar can be navigated with the arrow keys, but first you need to give it the **input focus** by pressing :kbd:`Ctrl+0`. To return input focus to the buffer, press :kbd:`Esc`. Alternatively, you can use the mouse to the same effect, but why would you? +在侧边栏可以使用方向键来在文件间切换,但是首先需要通过按组合键:kbd:`Ctrl+0` 使其获得**输入焦点**。 +如果希望缓冲区重新获得输入焦点,则需要按 :kbd:`Esc`键。同样,你也可以使用鼠标达到同样的效果,但是 +你有必要这么做吗? + The sidebar also provides basic file management operations through the context menu. -Projects +侧边栏可以通过菜单的方式提供基本的文件管理操作。 + +项目 ======== Projects group sets of files and directories you need to work on as a unit. Once you've set up your project the way that suits you by adding folders, save it and give it a name. +项目可以将你需要的文件和目录组织成一个单元。当你将项目需要的目录均添加进来以后,你可以这些保存 +成一个项目并命名该项目。 + To save a project, go to **Project | Save Project As...**. +保存项目可以使用菜单中的 **项目 | 项目另存为...**. + To quickly switch between projects, press :kbd:`Ctrl+Alt+P`. +可以使用组合键 :kbd:`Ctrl+Alt+P` 在项目间快速的切换。 + Project data are stored in JSON files with a `.sublime-project` extension. Wherever there's a `.sublime-project` file, you will find an ancillary `.sublime-workspace` file too. The second one is used by Sublime Text and you shouldn't edit it yourself. +项目数据保存在一些以 `.sublime-project` 为扩展名的JSON文件中。只要有 `.sublime-project` +文件,相应的都会有一个`.sublime-workspace` 文件。后者是Sublime Text使用,用户请不要进行修改。 + Project files can define settings specific to that project only. More on that in the `official documentation`_. -.. _official documentation: http://www.sublimetext.com/docs/2/projects.html +项目文件可以根据项目进行特殊的设定。更多细节可以参考 `官方文档`_。 + +.. _官方文档: http://www.sublimetext.com/docs/2/projects.html You can open a project from the **command line** by passing the *.sublime- project* file as an argument. +在命令行模式下,可以通过将 *.sublime-project* 文件做为参数来打开整个项目。 + .. TODO: talk about settings related to projects From 48c8575ee507789dc3b8dee9426c3716f4d946c4 Mon Sep 17 00:00:00 2001 From: Cliff Woo Date: Wed, 27 Mar 2013 22:35:38 +0800 Subject: [PATCH 55/79] command_line translate --- source/command_line/command_line.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/command_line/command_line.rst b/source/command_line/command_line.rst index 0ca7234..61e304b 100644 --- a/source/command_line/command_line.rst +++ b/source/command_line/command_line.rst @@ -1,7 +1,7 @@ -Command Line Usage +命令行用法 ================== -.. seealso:: +.. 请参考:: `OS X Command Line `_ - Official Sublime Text Documentation + Sublime Text的官方文档 From 7a24454bb632a5ecc576ceddc5186e82f018a0f9 Mon Sep 17 00:00:00 2001 From: Cliff Woo Date: Thu, 28 Mar 2013 06:55:09 +0800 Subject: [PATCH 56/79] minor update --- source/glossary/glossary.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/glossary/glossary.rst b/source/glossary/glossary.rst index 7388650..2bd8df9 100644 --- a/source/glossary/glossary.rst +++ b/source/glossary/glossary.rst @@ -35,9 +35,10 @@ inside ``Packages`` containing resources that belong together to build a new feature or provide support for a programming or markup language. 在Sublime Text中这个术语的意义有点模糊,它可以指一个Python包(这种用法很少),或者 - 是 ``包组`` 目录下的一个文件夹,亦或是一个 *.sublime-package* 文件。大多数情况下, - 包指的是 ``包组`` 目录下的一个文件夹,这个文件夹中包含为某个特性或者某种语言服务的各 + 是 ``Packages`` 目录下的一个文件夹,亦或是一个 *.sublime-package* 文件。大多数情况下, + 包指的是 ``Packages`` 目录下的一个文件夹,这个文件夹中包含为某个特性或者某种语言服务的各 种资源。 + 译者注: Packages 目录保存在Sublime Text的安装目录中 panel 面板 From de6b7f2af35a6c944524b3e14654ae3d5d5d6b3e Mon Sep 17 00:00:00 2001 From: Void Main Date: Thu, 28 Mar 2013 10:20:25 +0800 Subject: [PATCH 57/79] Warmly welcome, tonyhty --- TRANSLATORS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/TRANSLATORS.txt b/TRANSLATORS.txt index 0a0b080..a35d307 100644 --- a/TRANSLATORS.txt +++ b/TRANSLATORS.txt @@ -1,5 +1,6 @@ 翻译: Void Main (void-main) Cliff Woo (cliffwoo) +Tony Han (tonyhty) 审校: From 7ba6169c4505bb7810df0e008e47f74d5ea12545 Mon Sep 17 00:00:00 2001 From: Cliff Woo Date: Thu, 28 Mar 2013 10:26:36 +0800 Subject: [PATCH 58/79] reference/api translation --- source/reference/api.rst | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/source/reference/api.rst b/source/reference/api.rst index f97c9d6..2c1a1de 100644 --- a/source/reference/api.rst +++ b/source/reference/api.rst @@ -1,20 +1,31 @@ Python API ========== -.. seealso:: +.. 参考:: - `Official Documentation `_ + `官方文档 `_ API documentation. -Exploring the API +浏览 API ***************** A quick way to see the API in action: +快速查看API的方法: + #. Add ``Packages\Default`` (**Preferences | Browse Packages…**) to your project. #. ``CTRL + SHIFT + F`` #. Enter ``*.py`` in the **In Files:** field #. Check ``Use Buffer`` option #. Search API name #. ``F4`` -#. Study relevant source code \ No newline at end of file +#. Study relevant source code + + +#. 将 ``Packages\Default`` (**Preferences | Browse Packages…**) 添加到你的项目中. +#. 按下组合键 ``CTRL + SHIFT + F`` +#. 在 **In Files:** 栏中输入 ``*.py`` +#. 检查 ``Use Buffer`` 选项 +#. 搜索 API 名字 +#. 按 ``F4`` +#. 学习相关的源代码 \ No newline at end of file From aa5e23bb2605d43935c34b210195d758379a9b91 Mon Sep 17 00:00:00 2001 From: Void Main Date: Thu, 28 Mar 2013 11:17:42 +0800 Subject: [PATCH 59/79] translated customization part --- source/customization/customization.rst | 11 ++-- source/customization/indentation.rst | 10 ++-- source/customization/key_bindings.rst | 30 ++++++++++- source/customization/menus.rst | 8 +-- source/customization/settings.rst | 72 +++++++++++++++++++++++++- source/index.rst | 4 +- 6 files changed, 117 insertions(+), 18 deletions(-) diff --git a/source/customization/customization.rst b/source/customization/customization.rst index 879d985..40d8758 100644 --- a/source/customization/customization.rst +++ b/source/customization/customization.rst @@ -1,15 +1,16 @@ -Customizing Sublime Text +定制Sublime Text ======================== Sublime Text is highly customizable. In the topics below, we'll explain you how you can adapt it to your needs and preferences. +Sublime Text是高度可定制的。在接下来的几节中,我们将向你介绍如何根据自己的需要和偏好来定制它。 .. toctree:: :maxdepth: 2 - settings - indentation - key_bindings - menus + 设置项 + 缩进 + 键位绑定 + 菜单栏 diff --git a/source/customization/indentation.rst b/source/customization/indentation.rst index bfafcf6..6db2320 100644 --- a/source/customization/indentation.rst +++ b/source/customization/indentation.rst @@ -1,8 +1,8 @@ -Indentation +缩进 =========== -.. seealso:: - - `Indentation `_ - Official Sublime Text Documentation. +更多信息请参考 + + `缩进 `_ + 官方Sublime Text文档 diff --git a/source/customization/key_bindings.rst b/source/customization/key_bindings.rst index 87a751e..9dc5931 100644 --- a/source/customization/key_bindings.rst +++ b/source/customization/key_bindings.rst @@ -1,26 +1,37 @@ ============ Key Bindings +键位绑定 ============ .. seealso:: +更多信息请参考 :doc:`Reference for key bindings <../reference/key_bindings>` Complete documentation on key bindings. + :doc:`键位绑定参考文档 <../reference/key_bindings>` + 有关键位绑定的完整文档。 + Key bindings let you map sequences of key presses to actions. +键位绑定使得你能够将按键与动作进行映射。 File Format +文件格式 =========== Key bindings are defined in JSON and stored in ``.sublime-keymap`` files. In order to integrate better with each platform, there are separate key map files for Linux, OSX and Windows. Only key maps for the corresponding platform will be loaded. +键位绑定是以 ``.sublime-keymap`` 作为扩展名的JSON文件。为了让键位能够更好的与各平台融合,系统为 +Linux,OSX以及Windows平台分别提供了不同的文件。只有与当前系统相符的键位映射文件才会生效。 Example +示例 ******* Here's an excerpt from the default key map for Windows:: +下面这段代码是从Windows平台默认的按键映射文件中截取出来的:: [ { "keys": ["ctrl+shift+n"], "command": "new_window" }, @@ -28,6 +39,7 @@ Here's an excerpt from the default key map for Windows:: ] Defining and Overriding Key Bindings +定义与重载键位绑定 ==================================== Sublime Text ships with a default key map (e. g. @@ -35,31 +47,43 @@ Sublime Text ships with a default key map (e. g. override key bindings defined there or add new ones, you can store them in aseparate key map with a higher precedence, for example :file:`Packages/User/Default (Windows).sublime-keymap`. +Sublime Text自带一套默认的键位绑定(一般对应这个文件: +:file:`Packages/Default/Default (Windows).sublime-keymap)`)。如果你想重载其中的部分键位 +或者添加新的键位绑定,你可以在具有更高文件优先级的位置重新存储一个文件,例如 +:file:`Packages/User/Default (Windows).sublime-keymap`。 See :ref:`merging-and-order-of-precedence` for more information about how Sublime Text sorts files for merging. +请参考 :ref:`排序与优先级顺序` 来了解Sublime Text中关于文件优先级以及文件合并的更多信息。 Advanced Key Bindings +高级键位绑定 ===================== Simple key bindings consist of a key combination and a command to be executed. However, there are more complex syntaxes to pass arguments and provide contextual awareness. +对于简单的键位绑定,就是一个键位组合对应一个命令。除此之外,还有一些传递参数和上下文信息的复杂语法。 Passing Arguments +参数传递 ***************** Arguments are specified in the ``args`` key:: +通过 ``args`` 键可以指定需要的参数:: { "keys": ["shift+enter"], "command": "insert", "args": {"characters": "\n"} } Here, ``\n`` is passed to the ``insert`` command when you press :kbd:`Shift+Enter`. +在这个例子中当你按下 :kbd:`Shift+Enter` 的时候, ``\n`` 将会作为参数传递给 ``insert`` 命令。 Contexts +上下文 ******** Contexts determine when a given key binding will be enabled based on the caret's position or some other state. +利用上下文,可以通过插入符的位置及其他状态信息来决定某种键位组合是否可以发挥作用。 :: @@ -73,4 +97,8 @@ This key binding translates to *clear snippet fields and resume normal editing if there is a next field available*. Thus, pressing :kbd:`ESC` when you are not cycling through snippet fields will **not** trigger this key binding (however, something else might occur instead if :kbd:`ESC` happens to be bound to a -different context too ---and that's likely to be the case for :kbd:`ESC`). \ No newline at end of file +different context too ---and that's likely to be the case for :kbd:`ESC`). +这段代码的作用是 *当有下一个可用域的时候就清空当前代码片段,并返回正常编辑模式* 。因此,当你 +没有在代码域中循环切换的时候,按下 :kbd:`ESC` 键就 *不会* 触发这个按键绑定(然而,如果 :kbd:`ESC` +恰巧与另外的上下文进行了绑定,那么那个动作仍然会被触发——事实上,对于 :kbd:`ESC` 来说,这种情况 +并不少见)。 diff --git a/source/customization/menus.rst b/source/customization/menus.rst index e2d77ad..6490301 100644 --- a/source/customization/menus.rst +++ b/source/customization/menus.rst @@ -1,6 +1,8 @@ -Menus -===== +菜单项 +======= No documenation available about this topic. +关于这个主题没有任何可用文档。 -But here's `Bruce Lee screaming `_. \ No newline at end of file +But here's `Bruce Lee screaming `_. +但是,可以参考 `李小龙的嘶吼 `_。 diff --git a/source/customization/settings.rst b/source/customization/settings.rst index bf461ad..b994528 100644 --- a/source/customization/settings.rst +++ b/source/customization/settings.rst @@ -1,25 +1,36 @@ ======== Settings +设置项 ======== Sublime Text stores configuration data in *.sublime-settings* files. Flexibility comes at the price of a slightly complex system for applying settings. However, here's a rule of thumb: +Sublime Text把配置信息保存在 *.sublime-settings* 文件中。为了拥有较好的灵活性,作为代价, +需要一个略显繁琐的系统来管理设置项。我们先来说一条基本原则吧: Always place your personal settings files under *Packages/User* to guarantee that they will take precedence over any other conflicting settings files. +个人定义的设置项文件一定要保存到 *Packages/User* 目录下,这样就能保证在发生冲突的时候,你定 +义的文件拥有较高的优先级。 With that out of the way, let's unveil the mysteries of how settings work to please masochistic readers. +这一点解释清楚之后,咱们就可以揭开设置项工作的具体原理了,从而满足部分喜欢受虐读者的需求。 + +(译者注:作者原文是masochistic,可以翻译成受虐狂,这里感觉也可以理解成求知若渴的人,求指正) Format -====== +文件格式 +========== Settings files use JSON and have the *.sublime-settings* extension. +设置项文件是以 *.sublime-settings* 作为扩展名的的JSON文件。 Types of Settings +设置项文件类型 ================= The purpose of each *.sublime-settings* file is determined by its name. These @@ -29,17 +40,27 @@ file is controlling. For example, file type settings need to carry the name of the *.tmLanguage* syntax definition for the file type. Thus, for the *.py* file type, whose syntax definition is contained in *Python.tmLanguage*, the corresponding settings files would be called *Python.sublime-settings*. +可以通过 *.sublime-settings* 文件的名字看出它的用途。这些文件的名字可能具有一定的描述性(例如 +*Preferences (Windows).sublime-settings* 或者 *Minimap.sublime-settings*),亦或是跟 +它所控制的内容有关联。以控制文件类型的设置项文件为例,命名时要求必须有与之对应的 *.tmLanguage* +语法定义文件。因此,对于 *.py* 文件类型,它的语法定义信息存放在 *Python.tmLanguage* 文件中, +那么对应的文件类型设置项文件就该被叫做 *Python.sublime-settings* 。 Also, some settings files only apply for specific platforms. This can be inferred from the file names: *Preferences (Windows).sublime-settings*, *Preferences (Linux).sublime-settings*, etc. +除此之外,某些设置文件只能作用于某个特定的平台。可以通过文件名进行推断,例如: +*Preferences (Windows).sublime-settings* 和 *Preferences (Linux).sublime-settings* 。 This is **important**: Platform-specific settings files in the *Packages/User* folder are ignored. This way, you can be sure a single settings file overrides all the others. +有一点特别 **重要** :存放在 *Packages/User* 目录中的平台相关的设置文件将被忽略。通过这种方式, +就可以保证单个设置文件内容可以覆盖其他所有设置文件的内容了。 How to Access and Edit Common Settings Files +如何访问并修改公共的设置项文件 ============================================ Unless you need very fine-grained control over settings, you can access the main @@ -48,35 +69,57 @@ configuration files through the **Preferences | Settings - User** and isn't a smart thing to do, because changes will be reverted with every update to the software. However, you can use that file for reference: it contains comments explaining the purpose of all available global and file type settings. +除非你对设置项有非常精确的掌控力,否则,你只需要通过 **Preferences | Settings - User** 和 +**Preferences | Settings - More** 菜单项来访问主要的配置文件。编辑 +**Preferences - Settings Default** 这个文件并不是一件明智的事情,因为每次版本升级这些修改都 +将被重置。不过,你确实可以把这些文件当作一个不错的参考资料:默认设置项文件里面包含了解释所有能 +为你所用的全局设置项和文件类型设置项的说明注释。 Order of Precedence of *.sublime-settings* Files +*.sublime-settings* 文件的优先级顺序 ================================================== The same settings file (such as *Python.sublime-settings*) can appear in multiple places. All settings defined in identically named files will be merged together and overwritten according to predefined rules. See :ref:`merging-and-order-of-precedence` for more information. +名字相同的设置项文件(例如,都叫 *Python.sublime-settings* 的文件)可以在多个位置出现。以相同 +名称命名的设置项文件中的内容都将按预定义的规则进行合并或者覆盖。请参考 :ref:`排序与优先级顺序` +这一小节以了解更多信息。 Let us remember again that any given settings file in *Packages/User* ultimately overrides every other settings file of the same name. +再说明一次,在 *Packages/User* 目录下的设置项文件拥有最高优先级,并且最终会覆盖其他同名设置项 +文件中的相同内容。 In addition to settings files, Sublime Text maintains *session* data --settings for the particular set of files being currently edited. Session data is updated as you work on files, so if you adjust settings for a particular file in any way (mainly through API calls), they will be recorded in the session and will take precedence over any applicable *.sublime-settings* files. +除了设置项文件以外,Sublime Text还维护 *会话* 数据 —— 一些针对正在编辑的文件集所应用的设置项。 +会话数据是在你编辑文件的过程中发生变化的,所以,无论你通过何种方式调整了一个特定文件的设置项 +(主要是通过API调用的方式),这些设置项的变更将被记录在当前的会话中,并且将拥有比所有符合条件的 +*.sublime-settings* 文件更高的优先级。 To check the value of a setting in effect for a particular file, use *view.settings().get()* from the console. +如果想要检查针对特定文件当前正在发挥作用的设置项的值,可以在控制台中输入 +*view.settings().get(<设置项名称>)* 命令。 Lastly, it's also worth noting that some settings may be adjusted automatically for you. Keep this is mind if you're puzzled about some setting's value. For instance, this is the case for certain whitespace-related settings and the ``syntax`` setting. +最后需要注意的是,某些设置项的值可能会被系统自动进行调整。请记住这一点,这样一来你就能够解释某 +些令你困惑的设置项内容了。举例来说,在查看某些与空格相关的设置项的值,以及某些 ``语法`` 设置项 +内容的时候,就有可能遇到这种问题。 Below, you can see the order in which Sublime Text would process a hypothetical hierarchy of settings for Python files on Windows: +接下来你将看到Sublime Text是如何处理Windows平台上Python相关的设置项文件的,这里的设置项文件 +目录结构是虚构的: - *Packages/Default/Preferences.sublime-settings* - *Packages/Default/Preferences (Windows).sublime-settings* @@ -84,45 +127,70 @@ hypothetical hierarchy of settings for Python files on Windows: - *Packages/Python/Python.sublime-settings* - *Packages/User/Python.sublime-settings* - Session data for the current file +- 当前文件的会话数据 - Auto adjusted settings +- 由系统自动调整的设置项内容 + +(译者注:分析下优先级,可以得到结论:全局默认项 < 平台默认项 < 用户设置项 < 语言相关的设置 +< 由用户指定的语言相关的设置 < 会话数据 < 系统调整的数据) Global Editor Settings and Global File Settings +全局编辑器设置以及全局文件设置 =============================================== These settings are stored in *Preferences.sublime-settings* and *Preferences ().sublime-settings* files. The defaults can be found in *Packages/Default*. +这类全局设置项内容一般被保存在名为 *Preferences.sublime-settings* 和 +*Preferences (<平台名称>).sublime-settings* 的文件中。默认的全局设置项存放在 +*Packages/Default* 目录中。 Valid names for ** are ``Windows``, ``Linux``, ``OSX``. +上面所说的 *<平台名称>* 可能是 ``Windows``, ``Linux`` 或者 ``OSX``。 File Type Settings +文件类型设置项 ================== If you want to target a specific file type, name the *.sublime-settings* file after the file type's syntax definition. For example, if our syntax definition was called *Python.tmLanguage*, we'd need to call our settings file *Python.sublime-settings*. +如果你想针对某个特定的文件类型进行一些配置,那请根据这个文件类型的语法定义文件名称来对应的命名 +*.sublime-settings* 文件。举例来说,如果我们的语法定义文件叫 *Python.tmLanguage* ,那么 +设置项文件的名称就应该叫 *Python.sublime-settings* 。 Settings files for specific file types usually live in packages, like *Packages/Python*, but there can be multiple settings files for the same file type in separate locations. +通常情况下,某个特定文件类型的设置项信息一般存放在包组文件夹的一个目录中,例如 *Packages/Python*, +但是,与同一个文件类型相关的多个设置项文件也有可能被存放在不同的位置。 Similarly to global settings, one can establish platform-specific settings for file types. For example, *Python (Linux).sublime-settings* would only be consulted under Linux. +与全局设置项类似,也可以为文件类型设置项信息创建平台相关的内容。例如只有在Linux平台下,保存在 +*Python (Linux).sublime-settings* 中的设置项内容才会被系统考虑。 Also, let us emphasize that under *Pakages/User* only *Python.sublime-settings* would be read, but not any *Python ().sublime-settings* variant. +需要特别指出的一点是,在 *Packages/User* 目录下,只有 *Python.sublime-settings* 文件会被 +加载,所有以 *Python (<平台名称>).sublime-settings* 命名的平台相关的变种都不会被考虑。 Regardless of its location, any file-type-specific settings file has precedence over every global settings file affecting file types. +不管文件类型设置项信息保存在哪里,它拥有比保存在全局设置项文件中的、影响文件类型的设置项都高的 +优先级。 Where to Store User Settings (Once Again) -========================================= +(再说一次)用户指定的设置项信息应该保存到哪里 +============================================ Whenever you want to save settings, especially if they should be preserved between software updates, place the corresponding *.sublime-settings* file in *Packages/User*. +无论何时,当你想要保存一些设置的时候,尤其是那些在软件升级前后应该被保留的设置,就把它们保存在 +*Packages/User* 目录下的对应 *.sublime-settings* 文件中吧。 diff --git a/source/index.rst b/source/index.rst index c9c61de..d102655 100644 --- a/source/index.rst +++ b/source/index.rst @@ -15,8 +15,8 @@ Sublime Text非官方文档(中文翻译版) 编辑 搜索和替换 构建系统(批处理) - 文件导航与文件管理(尚未翻译) - 自定义内容(尚未翻译) + 文件导航与文件管理 + 自定义 可扩展性与自动化(尚未翻译) 命令行 参考内容(尚未翻译) From f14d4f90ef63b4741918e8bbade0741f3fdbbf6a Mon Sep 17 00:00:00 2001 From: cloudmonkeypeng Date: Thu, 28 Mar 2013 11:51:23 +0800 Subject: [PATCH 60/79] add reviewer cloud peng --- TRANSLATORS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/TRANSLATORS.txt b/TRANSLATORS.txt index a35d307..5343f74 100644 --- a/TRANSLATORS.txt +++ b/TRANSLATORS.txt @@ -4,3 +4,4 @@ Cliff Woo (cliffwoo) Tony Han (tonyhty) 审校: +Cloud Peng (cloudmonkeypeng) \ No newline at end of file From 4c4bf2af6dfb32c9b3b01a0146f59a53fc61d918 Mon Sep 17 00:00:00 2001 From: Void Main Date: Thu, 28 Mar 2013 17:34:42 +0800 Subject: [PATCH 61/79] tranlate snippets & syntaxdefs in reference --- source/reference/reference.rst | 27 +++++++++------- source/reference/snippets.rst | 45 ++++++++++++++++++++++++++ source/reference/syntaxdefs.rst | 56 ++++++++++++++++++++++++++++++++- 3 files changed, 115 insertions(+), 13 deletions(-) diff --git a/source/reference/reference.rst b/source/reference/reference.rst index 0527736..99443a4 100644 --- a/source/reference/reference.rst +++ b/source/reference/reference.rst @@ -1,23 +1,26 @@ Reference +参考内容 ========= In this section you will find concise information about many aspects of Sublime Text. +在这一部分中,你可以找到Sublime Text中许多内容的详细信息。 If you're looking for a slow-paced introduction to any of these topics, try the general index. +如果你只是想找找关于这些主题的介绍性质的内容,可以去文档的主页看看。 .. toctree:: :maxdepth: 2 - snippets - syntaxdefs - build_systems - key_bindings - Settings - Command Palette - completions - plugins - api - commands - keyboard_shortcuts_win - keyboard_shortcuts_osx + 代码片段 + 语法定义 + 构建系统 + 按键绑定 + 设置项 + 命令面板 + 自动补全 + 插件 + API + 命令 + Windows 平台快捷键 + OSX 平台快捷键 diff --git a/source/reference/snippets.rst b/source/reference/snippets.rst index dc3d886..be9da0b 100644 --- a/source/reference/snippets.rst +++ b/source/reference/snippets.rst @@ -1,17 +1,22 @@ .. sublime: wordWrap false Snippets +代码片段 ======== Compatibility with Textmate +与Textmate的兼容性 *************************** Sublime Text snippets are generally compatible with Textmate snippets. +Sublime Text的代码片段与Textmate的代码片段基本兼容。 File Format +文件格式 *********** Snippet files are XML files with the ``sublime-snippet`` extension. +代码片段文件是有 ``sublime-snippet`` 后缀的XML文件。 .. code-block:: xml @@ -24,81 +29,121 @@ Snippet files are XML files with the ``sublime-snippet`` extension. ``content`` Actual snippet content. + 实际的代码片段内容。 ``tabTrigger`` Implicit keybinding for this snippet. Last key (implicit) is ``TAB``. + 与这段代码片段关联的隐式按键绑定。最后一个(隐式的)按键式 ``TAB`` 。 ``scope`` Scope selector to activate this snippet. + 适用于这段代码片段的作用域选择子。 ``description`` User friendly description for menu item. + 为了菜单项准备的用户友好的说明性文字。 Escape Sequences +转义序列 **************** ``\$`` Literal ``$``. +``\$`` + 常量 ``$`` 。 + Environment Variables +环境变量 ********************* ====================== ===================================================================== ``$PARAM1 .. $PARAMn`` Arguments passed to the ``insertSnippet`` command. +``$PARAM1 .. $PARAMn`` 传递给 ``insertSnippet`` 命令的各个参数。 ``$SELECTION`` The text that was selected when the snippet was triggered. +``$SELECTION`` 代码片段被触发的时候选中的文本内容。 ``$TM_CURRENT_LINE`` Content of the line the cursor was in when the snippet was triggered. +``$TM_CURRENT_LINE`` 代码片段被触发的时候光标所在行的内容。 ``$TM_CURRENT_WORD`` Current word under the cursor when the snippet was triggered. +``$TM_CURRENT_WORD`` 代码片段被触发的时候光标所在的单词。 ``$TM_FILENAME`` File name of the file being edited including extension. +``$TM_FILENAME`` 正在编辑的文件名称,包含文件扩展名。 ``$TM_FILEPATH`` File path to the file being edited. +``$TM_FILEPATH`` 正在编辑的文件的文件路径。 ``$TM_FULLNAME`` User's user name. +``$TM_FULLNAME`` 用户的用户名。 ``$TM_LINE_INDEX`` Column the snippet is being inserted at, 0 based. +``$TM_LINE_INDEX`` 插入代码片段的列的位置,位置是从0开始计数的。 ``$TM_LINE_NUMBER`` Row the snippet is being inserted at, 1 based. +``$TM_LINE_NUMBER`` 插入代码片段的行的位置,位置是从1开始计数的。 ``$TM_SELECTED_TEXT`` An alias for ``$SELECTION``. +``$TM_SELECTED_TEXT`` 与 ``$SELECTION`` 是等价的。 ``$TM_SOFT_TABS`` ``YES`` if ``translateTabsToSpaces`` is true, otherwise ``NO``. +``$TM_SOFT_TABS`` 当 ``translateTabsToSpaces`` 选项是真的时候,值是 ``YES`` ,否则为 ``NO`` 。 ``$TM_TAB_SIZE`` Spaces per-tab (controlled by the ``tabSize`` option). +``$TM_TAB_SIZE`` tab对应的空格数(受 ``tabSize`` 选项的控制)。 ====================== ===================================================================== Fields +字域 ****** Mark positions to cycle through by pressing ``TAB`` or ``SHIFT + TAB``. +标记代码片段中可以通过 ``TAB`` 或 ``SHIFT + TAB`` 循环的各个位置。 Syntax: ``$1`` .. ``$n`` +语法: ``$1`` .. ``$n`` ``$0`` Exit mark. Position at which normal text editing should be resumed. By default, Sublime Text implicitly sets this mark at the end of the snippet's ``content`` element. + 退出标记。当循环到这个标记的时候,编辑器应该返回至正常的编辑模式。默认情况下,Sublime Text在 ``content`` + 元素内容的结尾位置隐式的添加这个标记。 Fields with the same name mirror each other. +有相同名字的字域互相映射。 Place Holders +站位符 ************* Fields with a default value. +带有默认值的字域。 Syntax: ``${1:PLACE_HOLDER}`` .. ``${n:PLACE_HOLDER}`` +语法: ``${1:PLACE_HOLDER}`` .. ``${n:PLACE_HOLDER}`` Fields and place holders can be combined and nested within other place holders. +字域和站位符可以遇其他的站位符进行组合和嵌套。 Substitutions +替换 ************** Syntax: +语法: - ``${var_name/regex/format_string/}`` - ``${var_name/regex/format_string/options}`` ``var_name`` The field's name to base the substitution on: 1, 2, 3… + 替换展开所以来的字域的名字:1,2,3…… ``regex`` Perl-style regular expression: See the Boost library documentation for `regular expressions `_. + Perl风格的正则表达式:关于`正则表达式 `_ ,请参考Boost库的文档。 ``format_string`` See the Boost library documentation for `format strings `_. + 参考Boost库文档的 `格式字符串 `_ 内容。 ``options`` Optional. Any of the following: + 可选的。可以选择下面的任何一个: ``i`` Case-insensitive regex. + 忽略大小写敏感的正则。 ``g`` Replace all occurrences of ``regex``. + 替换所有匹配 ``regex`` 的内容。 ``m`` Don't ignore newlines in the string. + 在字符串中不要忽略换行符。 diff --git a/source/reference/syntaxdefs.rst b/source/reference/syntaxdefs.rst index 86b9fa5..08e254e 100644 --- a/source/reference/syntaxdefs.rst +++ b/source/reference/syntaxdefs.rst @@ -1,22 +1,30 @@ .. sublime: wordWrap false Syntax Definitions +语法定义 ================== .. warning:: This topic is a draft and may contain wrong information. +警告: + 这部分内容仍处于草稿阶段,并可能包含错误信息。 Compatibility with Textmate +与Textmate的兼容性 *************************** Sublime Text syntax definitions are generally compatible with Textmate language files. +Sublime Text的语法定义内容基本上与Textmate的语法定义文件是相互兼容的。 File Format +文件格式 *********** Syntax definitions are files in the Plist format with the ``tmLanguage`` extension. In this reference files, however, JSON is used instead and converted into Plist. +语法定义文件是以 ``tmLanguage`` 作为扩展名的Plist(属性列表)文件。然而,在本文档中,我们将使用 +JSON文件来进行讲解,然后再将JSON文件转换为Plist文件。 .. code-block:: js @@ -66,56 +74,79 @@ In this reference files, however, JSON is used instead and converted into Plist. Descriptive name for the syntax definition. Shows up in the syntax definition dropdown menu located in the bottom right of Sublime Text interface. It's usually the name of the programming language or equivalent. + 所定义语法的描述性名称。这个名称显示在Sublime Text界面右下角的下拉菜单中。通常情况下, ``name`` 表示的是 + 编程语言或其他标记语言的名称。 ``scopeName`` Name of the top-level scope for this syntax definition. Either ``source.`` or ``text.``. Use ``source`` for programming languages and ``text`` for everything else. + 语法定义文件起效的顶级坐拥域名称。这个名称一般是 ``source.<语言名称>`` 或者 ``text.<语言名称>`` 。 + 如果是在定义编程语言的语法,那么就使用 ``source`` 这个名称,否则使用 ``text`` 作为名称。 ``fileTypes`` And array of file type extensions for which this syntax should be automatically activated. Include the extensions without the leading dot. + 记录适用于这个语法文件的文件扩展名的数组。数组中的每项是去掉"."的文件扩展名称。 + ``uuid`` Unique indentifier for this syntax definition. Currently ignored. + 这个语法定义的唯一标示符。目前被忽略。 ``foldingStartMarker`` Currently ignored. Used for code folding. + 目前被忽略,用于标示折叠内容的开始。 ``foldingStopMarker`` Currently ignored. Used for code folding. + 目前被忽略,用于标示折叠内容的结束。 ``patterns`` Array of patterns to match against the buffer's text. + 记录与缓冲区中的文字进行匹配的模式的数组。 ``repository`` Array of patterns abstracted out from the patterns element. Useful to keep the syntax definition tidy as well as for specialized uses like recursive patterns. Optional. + 从模式元素中抽象出来的数组。定义这个数组一方面有助于保持语法定义文件整洁,另一方面也能为像 + 递归模式这样的功能服务。这个内容是可选的。 The Patterns Array +模式数组 ****************** Elements contained in the ``patterns`` array. +在 ``patterns`` 数组中包含的元素。 ``match`` Contains the following elements: + 包含下列原素: ============ ================================================== ``match`` Pattern to search for. + ``match`` 用于搜索的模式。 ``name`` Scope name to be assigned to matches of ``match``. + ``name`` 设置被 ``match`` 匹配到的内容所具有的作用域。 ``comment`` Optional. For information only. + ``comment`` 可选。只是为了提供信息。 ``captures`` Optional. Refinement of ``match``. See below. + ``captures`` 可选。是对 ``match`` 的精炼。见下文解释 ============ ================================================== In turn, ``captures`` can contain *n* of the following pairs of elements: + ``captures`` 内容可以包含 *多* 组下面要说明的元素对: ======== ================================== ``0..n`` Name of the group referenced. + ``0..n`` 被索引的组的名字。 ``name`` Scope to be assigned to the group. + ``name`` 组内元素具有的作用域。 ======== ================================== Examples: + 示例: .. code-block:: js @@ -138,16 +169,21 @@ Elements contained in the ``patterns`` array. ``include`` Includes items in the repository, other syntax definitions or the current one. + 在仓库中包含其他的语法定义内容或者当前定义的内容。 References: ========= =========================== $self The current syntax definition. + $self 当前的语法定义。 #itemName itemName in the repository. + #itemName 仓库中名为 "itemName" 的内容。 source.js External syntax definitions. + source.js 外部的语法定义。 ========= =========================== Examples: + 示例: .. code-block:: js @@ -162,20 +198,30 @@ Elements contained in the ``patterns`` array. ``begin..end`` Defines a scope potentially spanning multiple lines + 定义一个可以跨多行的作用域。 Contains the following elements: + 包含下面的一些元素: ================= ================================================ ``begin`` The start marker pattern. + ``begin`` 模式的开始标志。 ``end`` The end marker pattern. + ``end`` 模式的终止标志。 ``name`` Scope name for the whole region. + ``name`` 整个区域的作用域名称。 ``beginCaptures`` ``captures`` for ``begin``. See ``captures``. + ``beginCaptures`` 为 ``begin`` 准备的 ``captures``。请参考 ``captures``。 ``endCaptures`` ``captures`` for ``end``. See ``captures``. + ``endCaptures`` 为 ``end`` 准备的 ``captures``。请参考 ``captures``。 ``patterns`` ``patterns`` to be matched against the content. + ``patterns`` 与正文内容进行配对的 ``patterns`` 。 ``contentName`` Scope name for the content excluding the markers. + ``contentName`` 除掉标志符之后的内容的作用域名称。 ================= ================================================ Example: + 示例: .. code-block:: js @@ -195,12 +241,17 @@ Elements contained in the ``patterns`` array. } Repository +仓库 ********** Can be referenced from ``patterns`` or from itself in an ``include`` element. See ``include`` for more information. +在 ``include`` 元素中,既可以从 ``patterns`` 中饮用,也可以从自身引用。请参考 ``include`` +章节来了解更多信息。 + The repository can contain the following elements: +仓库可以包含下列元素: - Simple elements: @@ -227,6 +278,7 @@ The repository can contain the following elements: } Examples: +示例: .. code-block:: js @@ -262,8 +314,10 @@ Examples: Escape Sequences +转义序列 **************** Be sure to escape JSON/XML sequences as needed. +请确保对JSON/XML序列内容进行正确的转义。 -.. EXPLAIN \ No newline at end of file +.. EXPLAIN From 352195dd3a3e99ca98bbe344788d9f584969438d Mon Sep 17 00:00:00 2001 From: Cliff Woo Date: Thu, 28 Mar 2013 18:34:58 +0800 Subject: [PATCH 62/79] ref/build system translation --- source/reference/build_systems.rst | 160 +++++++++++++++++++++++++---- 1 file changed, 139 insertions(+), 21 deletions(-) diff --git a/source/reference/build_systems.rst b/source/reference/build_systems.rst index 601860a..0363aef 100644 --- a/source/reference/build_systems.rst +++ b/source/reference/build_systems.rst @@ -4,36 +4,54 @@ Build Systems Build systems let you run your files through external programs and see the output they generate within Sublime Text. +构建系统可以让您通过外部程序来运行文件,并可以在Sublime Text查看输出。 + Build systems consist of two --or optionally three-- parts: * configuration data in JSON format (the *.sublime-build* file contents) * a Sublime Text command driving the build process * optionally, an external executable file (script, binary file) +构建系统包括两 -- 或者说三个 -- 部分 + +* 使用JSON格式保存配置文件 (*.sublime-build* 内容) +* 使用Sublime Text命令来驱动构建过程 +* 还包括一个外部的可执行程序(脚本或者二进制) + Essentially, *.sublime-build* files are configuration data for an external program as well as for the Sublime Text command just mentioned. In them, you specify the switches, options and environment information you want forwarded. +从根本上来讲,*.sublime-build* 配置文件对于外部可执行程序与前面提到的Sublime Text命令是一样的。在配置文件中可以指定开关、配置以及环境变量。 + + The Sublime Text command then receives the data stored in the *.sublime-build* file. At this point, it can do whatever it needs to *build* the files. By default, build systems will use the ``exec`` command, implemented in *Packages/Default/exec.py*. As we'll explain below, you can override this command. +Sublime Text命令从 *.sublime-build* 中读取配置数据,然后根据需要*构建*这些文件。 +构建系统缺省会使用``exec`` 命令,该命令在 *Packages/Default/exec.py* 中实现。 +在后续的讲解中,我们会重写这个命令。 + Lastly, the external program may be a shell script you've created to process your files, or a well-known utility like ``make`` or ``tidy``. Usually, these executable files will receive paths to files or directories, along with switches and options to be run with. +外部程序可能是你用来处理文件的脚本,也可以能是类似 ``make`` 或 ``tidy`` 这类的命令。通常,这些可执行文件从配置中获取文件路径或者目录以及运行是需要的开关及选项。 + Note that build systems need not call any external program at all if there isn't any reason to; you could implement a build system entirely in a Sublime Text command. +注意,构建系统可以完全不依赖调用外部程序,完全可以通过Sublime Text -File Format +文件格式 *********** -*.build-system* files use JSON. Here's an example: +*.构建系统* 文件使用JSON. 以下是一个例子: .. sourcecode:: python @@ -44,7 +62,7 @@ File Format } -Options +选项 ******* ``cmd`` @@ -52,31 +70,61 @@ Options specify an absolute path, the external program will be searched in your :const:`PATH`, one of your system's environmental variables. +``cmd`` + + 包括命令及其参数数组。如果不指定绝对路径,外部程序会在你系统的:const:`PATH` 环境变量中搜索。 + On Windows, GUIs are supressed. + 在Windows 系统中,***TBT*** + + + ``file_regex`` Optional. Regular expression (Perl-style) to capture error output of ``cmd``. See the next section for details. + +``file_regex`` + 可选。 Perl格式的正则表达式可以获取``cmd``的错误输出,详情参考下一节 + ``line_regex`` Optional. If ``file_regex`` doesn't match on the current line, but ``line_regex`` exists, and it does match on the current line, then walk backwards through the buffer until a line matching ``file regex`` is found, and use these two matches to determine the file and line to go to. +``line_regex`` + + 可选。当``file_regex``与该行不匹配,如果``line_regex``存在,并且确实与当前行匹配, + 则遍历整个缓冲区,直到与``file regex``匹配的行出现,并用这两个匹配决定最终要跳转的文件 + 或行。 + + ``selector`` Optional. Used when **Tools | Build System | Automatic** is set to ``true``. Sublime Text uses this scope selector to find the appropriate build system for the active view. +``selector`` + 可选。在选定 **Tools | Build System | Automatic** 时使用。Sublime Text使用这个 + 选择器自动为活动试图选择构建系统。 + ``working_dir`` Optional. Directory to change the current directory to before running ``cmd``. The original current directory is restored afterwards. +``working_dir`` + 可选。在运行``cmd``前会切换到该目录。运行结束后会切换到原来的目录。 + ``encoding`` Optional. Output encoding of ``cmd``. Must be a valid python encoding. Defaults to ``UTF-8``. +``encoding`` + 可选。输出``cmd``的编码。必须是合法的Python编码,缺省为``UTF-8``。 + + ``target`` Optional. Sublime Text command to run. Defaults to ``exec`` (*Packages/Default/exec.py*). This command receives the configuration data specified in the *.build-system* file. @@ -85,6 +133,14 @@ Options to override the default command for build systems, you can add arbitrary variables in the *.sublime-build* file. +``target`` + 可选。运行的Sublime Text命令,缺省为``exec`` (*Packages/Default/exec.py*)。该命令从 + *.build-system*中获取配置数据。 + + 用来替代缺省的构建系统命令。注意,如果你希望替代构建系统的缺省命令,请在*.sublime-build* + 文件中专门设置。 + + ``env`` Optional. Dictionary of environment variables to be merged with the current process' before passing them to ``cmd``. @@ -92,9 +148,16 @@ Options Use this element, for example, to add or modify environment variables without modifying your system's settings. +``env`` + 可选。在环境变量被传递给``cmd``前,将他们封装成词典。 + + ``shell`` Optional. If ``true``, ``cmd`` will be run through the shell (``cmd.exe``, ``bash``\ …). + ``shell`` + 可选。如果该选项为``true`` ,``cmd``则可以通过shell运行。 + ``path`` Optional. This string will replace the current process' :const:`PATH` before calling ``cmd``. The old :const:`PATH` value will be restored after that. @@ -102,17 +165,34 @@ Options Use this option to add directories to :const:`PATH` without having to modify your system's settings. +``path`` + 可选。该选项可以在调用``cmd``前替换当前进程的' :const:`PATH` 。原来的' :const:`PATH` + 将在运行后恢复。 + + 使用这个选项可以在不修改系统设置的前提下将目录添加到' :const:`PATH` 中。 + + ``variants`` Optional. A list of dictionaries of options to override the main build system's options. Variant ``name``s will appear in the Command Palette for easy access if the build system's selector matches for the active file. +``variants`` + 可选。用来替代主构建系统的备选。如果构建系统的选择器与激活的文件匹配,变量的``名称``则 + 会出现在 Command Palette 中。 + + ``name`` **Only valid inside a variant** (see ``variants``). Identifies variant build systems. If ``name`` is *Run*, the variant will show up under the **Tools | Build System** menu and be bound to *Ctrl + Shift + B*. -Capturing Error Output with ``file_regex`` +``name`` + **仅在variant中是合法的** (详见 ``variants``)。用来标识系统中不同的构建系统。如果 + ``name``是*Run* ,则会显示在**Tools | Build System** 下,并且可以使用 + *Ctrl + Shift + B*调用。 + +使用 ``file_regex``获取错误输出 ------------------------------------------ The ``file_regex`` option uses a Perl-style regular expression to capture up @@ -121,16 +201,27 @@ to four fields of error information from the build program's output, namely: groups in the pattern to capture this information. The *file name* field and the *line number* field are required. +``file_regex``选项用Perl的正则表达式来捕获构建系统的错误输出,主要包括四部分内容,分别是 +file name*, *line number*, *column number* and *error message*. Sublime Text +在匹配模式中使用分组的方式捕获信息。*file name* 和 *line number*域是必须的。 + + When error information is captured, you can navigate to error instances in your project's files with ``F4`` and ``Shift+F4``. If available, the captured *error message* will be displayed in the status bar. -Platform-specific Options +当错误信息被捕获时,你可以使用``F4`` 和 ``Shift+F4``在你的项目文件中跳转。被捕获的*错误 +信息*会显示在状态栏。 + +平台相关选项 ------------------------- The ``windows``, ``osx`` and ``linux`` elements let you provide platform-specific data in the build system. Here's an example:: +``windows``, ``osx`` 以及 ``linux``元素可以帮助你在构建系统中设定平台相关 +的选项,举例如下: + { "cmd": ["ant"], @@ -147,10 +238,13 @@ platform-specific data in the build system. Here's an example:: In this case, ``ant`` will be executed for every platform except Windows, where ``ant.bat`` will be used instead. -Variants +在这个例子中,``ant``在除了Windows之外的平台中都是执行 ant ,而在Windows中则执行 +``ant.bat`` + +构建系统备选项 -------- -Here's a contrived example of a build system with variants:: +如下是一个带有备选项的构建系统实例:: { "selector": "source.python", @@ -178,48 +272,59 @@ Given these settings, *Ctrl + B* would run the *date* command, *Crtl + Shift + B* would run the Python interpreter and the remaining variants would appear in the Command Palette whenever the build system was active. +根据以上的设定,按 *Ctrl + B* 会运行*date*命令, 按 *Crtl + Shift + B* 会运行Python +解释器,并且在构建系统激活时将剩余的备选项显示在Command Palette中。 + .. _build-system-variables: -Build System Variables +构建系统变量 ********************** Build systems expand the following variables in *.sublime-build* files: +在*.sublime-build* 中包括如下构建系统变量。 + ====================== ===================================================================================== -``$file_path`` The directory of the current file, e. g., *C:\\Files*. -``$file`` The full path to the current file, e. g., *C:\\Files\\Chapter1.txt*. -``$file_name`` The name portion of the current file, e. g., *Chapter1.txt*. -``$file_extension`` The extension portion of the current file, e. g., *txt*. -``$file_base_name`` The name only portion of the current file, e. g., *Document*. -``$packages`` The full path to the *Packages* folder. -``$project`` The full path to the current project file. -``$project_path`` The directory of the current project file. -``$project_name`` The name portion of the current project file. -``$project_extension`` The extension portion of the current project file. -``$project_base_name`` The name only portion of the current project file. +``$file_path`` 当前文件所在路径, 比如 *C:\\Files*. +``$file`` 当前文件的完整路径, 比如 *C:\\Files\\Chapter1.txt*. +``$file_name`` 当前文件的文件名, 比如 *Chapter1.txt*. +``$file_extension`` 当前文件的扩展名, 比如 *txt*. +``$file_base_name`` 当前文件仅包含文件名的部分, 比如 *Document*. +``$packages`` *Packages* 文件夹的完整路径. +``$project`` 当前项目文件的完整路径. +``$project_path`` 当前项目文件的路径. +``$project_name`` 当前项目文件的名称. +``$project_extension`` 当前项目文件的扩展部分. +``$project_base_name`` 当前项目仅包括名的部分. ====================== ===================================================================================== -Place Holders for Variables +变量用法 --------------------------- Features found in snippets can be used with these variables. For example:: +可以在代码片段上中使用以上变量。例如:: + ${project_name:Default} This will emit the name of the current project if there is one, otherwise ``Default``. +如果当前项目存在则使用该项目名称,否则则使用``Default``替代 :: ${file/\.php/\.txt/} This will emit the full path of the current file, replacing *.php* with *.txt*. -Running Build Systems +该例会获取当前文件的完整路径,并用*.txt*替换路径中的*.php* + +运行构建系统 ********************* Select the desired build system from **Tools | Build System**, and then select **Tools | Build** or press ``F7``. +从**Tools | Build System**选择构建系统,然后选择**Tools | Build** ,再按``F7``。 .. _构建系统常见问题: @@ -230,20 +335,33 @@ Build systems will look for executables in your :const:`PATH`, unless you specif an absolute path to the executable. Therefore, your :const:`PATH` variable must be correctly set. +如果你没有为构建系统指定一个可执行文件的绝对路径,构建系统怎么会在你的 :const:`PATH` 中进行查找。 +所以,你需要正确设置 :const:`PATH` 。 + On some operating systems, the value for :const:`PATH` will vary from a terminal window to a graphical application. Thus, even if the command you are using in your build system works in the command line, it may not work from Sublime Text. This is due to user profiles in shells. +在某些操作系统中,终端和图形化应用的 :const:`PATH` 值会有所不同。所以即便你的构建系统在命令行下 +可以正常工作,在Sublime Text也不见得能够正常。这与Shell中的用户设置有关。 + To solve this issue, make sure you set the desired :const:`PATH` so that graphical applications such as Sublime Text can find it. See the links below for more information. +为了解决这个问题,请确认你正确设置了 :const:`PATH` ,以便类似Sublime Text一类的图形化应用 +可以正确找到。更多内容,请参考一下链接 + Alternatively, you can use the ``path`` element in *.sublime-build* files to override the :const:`PATH` used to locate the executable specified in ``cmd``. This new value for :const:`PATH` will only be in effect for as long as your build system is running. After that, the old :const:`PATH` will be restored. +另外,你也可以在 *.sublime-build* 文件中设定 ``path`` 来替代:const:`PATH` ,并在 ``path`` +指定的路径中查找 ``cmd`` 可执行文件。新设定的值,仅在构建系统运行期间有效,过后将会恢复为原始的 + :const:`PATH` + .. seealso:: `Managing Environment Variables in Windows `_ From 18ca81e7cebc1d7b5d94518709b97ed7877f50a0 Mon Sep 17 00:00:00 2001 From: Cliff Woo Date: Thu, 28 Mar 2013 19:56:02 +0800 Subject: [PATCH 63/79] command palette translation --- source/reference/command_palette.rst | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/source/reference/command_palette.rst b/source/reference/command_palette.rst index 6dc7d75..3cf9eda 100644 --- a/source/reference/command_palette.rst +++ b/source/reference/command_palette.rst @@ -1,14 +1,15 @@ =============== -Command Palette +命令面板 =============== -The command palette is fed entries with ``.sublime-commands`` files. +命令面板由 ``.sublime-commands`` 文件中的各项组成. -File Format (``.sublime-commands`` Files) + +文件格式 (``.sublime-commands`` 文件) ========================================= -Here's an excerpt from ``Packages/Default/Default.sublime-commands``:: +如下是来自 ``Packages/Default/Default.sublime-commands`` 的实例:: [ { "caption": "Project: Save As", "command": "save_project_as" }, @@ -23,21 +24,25 @@ Here's an excerpt from ``Packages/Default/Default.sublime-commands``:: ] ``caption`` - Text for display in the command palette. + 显示在命令面板中的标题. ``command`` - Command to be executed. + 代执行的命令. ``args`` Arguments to pass to ``command``. Note that to locate the packages folder you need to use a snippet-like variable: ``${packages}`` or $packages. This different to other areas of the editor due to different implementations of the lower level layers. +传给 ``command`` 的参数。 需要注意的是,要定位包所在目录,需要使用 ``${packages}`` 或 $packages。由于底层的实现不同,这与在编辑器的其他区域的用法略有不同。 + -How to Use the Command Palette +如何使用命令面板 ============================== -#. Press :kbd:`Ctrl+Shift+P` -#. Select command +#. 按 :kbd:`Ctrl+Shift+P` +#. 选择命令 Entries are filtered by current context. Not all entries will be visible at all times. + +显示的选项会根据上下文不同有所区别,并不是在任何时候都会显示所有选项。 From 3ebb1781b0a64dd2b33092cb02591142cae69c54 Mon Sep 17 00:00:00 2001 From: Void Main Date: Sat, 30 Mar 2013 14:00:55 +0800 Subject: [PATCH 64/79] finish settings part --- source/reference/settings.rst | 90 +++++++++++++++++++++++++++++++++-- 1 file changed, 87 insertions(+), 3 deletions(-) diff --git a/source/reference/settings.rst b/source/reference/settings.rst index 0829f3b..9705315 100644 --- a/source/reference/settings.rst +++ b/source/reference/settings.rst @@ -1,195 +1,279 @@ ==================== Settings (Reference) +设置项(参考内容) ==================== Global Settings +全局设置项 =============== **Target file:** ``Global.sublime-settings``. +**对应文件:** ``Global.sublime-settings`` 。 ``theme`` Theme to be used. Accepts a file base name (e. g.: ``Default.sublime-theme``). + 系统使用的主题文件。接受主题文件的名称(例如: ``Default.sublime-theme`` )。 ``remember_open_files`` Determines whether to reopen the buffers that were open when Sublime Text was last closed. + 设置Sublime Text启动时是否需要打开上次关闭时打开了的缓冲区。 ``folder_exclude_patterns`` Excludes the matching folders from the side bar, GoTo Anything, etc. + 与匹配模式相符的目录将不会出现在侧边栏、快速跳转面板等位置。 ``file_exclude_patterns`` Excludes the matching files from the side bar, GoTo Anything, etc. + 与匹配模式相符的文件将不会出现在侧边栏、快速跳转面板等位置。 ``scroll_speed`` Set to ``0`` to disable smooth scrolling. Set to a value between ``0`` and ``1`` to scroll slower, or set to a value larger than ``1`` to scroll faster. + 如果把值设为 ``0`` ,将禁止平滑滚动。取 ``0`` 到 ``1`` 之间的数值将使滑动变的比较缓慢,取大于 + ``1`` 的值使得滑动更加迅速。 ``show_tab_close_buttons`` If ``false``, hides the tabs' close buttons until the mouse is hovered over the tab. + 如果设置为 ``false`` ,通常情况下就不会显示标签页的关闭按钮,只有当鼠标移动到标签上时才显示。 ``mouse_wheel_switches_tabs`` If ``true``, scrolling the mouse wheel will cause tabs to switch if the cursor is in the tab area. -``open_files_in_new_window`` + 如果设置为 ``true`` ,在标签区域滑动鼠标滚轮会触发标签页之间的切换。 +``open_files_in_new_window`` OS X only. When filters are opened from Finder, or by dragging onto the dock icon, this controls if a new window is created or not. + 仅在OS X平台有效。当用户从Finder中开打文件,或者把文件拖拽到dock面板的图标上,这个设置项将决定 + 是否需要创建一个新窗口。 File Settings +文件设置项 ============= **Target files:** ``Base File.sublime-settings``, ``.sublime-settings``. +**对应文件:** ``Base File.sublime-settings``, ``.sublime-settings``。 Whitespace and Indentation +空格与缩进 ************************** ``auto_indent`` Toggles automatic indentation. + 开/关自动缩进选项。 ``tab_size`` Number of spaces a tab is considered to be equal to. + 设置tab键对应的空格数。 ``translate_tabs_to_spaces`` Determines whether to replace a tab character with ``tab_size`` number of spaces when :kbd:`Tab` is pressed. + 设置当用户按下 :kbd:`Tab` 键时,是否需要用 ``tab_size`` 选项所指定数目的空格进行替换。 ``use_tab_stops`` If ``translate_tabs_to_spaces`` is ``true``, will make :kbd:`Tab` and :kbd:`Backspace` insert/delete ``tab_size`` number of spaces per key press. + 如果 ``translate_tabs_to_spaces`` 选项为 ``true`` ,设置这个选项就使得每次按下 :kbd:`Tab` + 与 :kbd:`Backspace` 键时,将插入/删除 ``tab_size`` 选项所指定数目的空格。 ``trim_automatic_white_space`` Toggles deletion of white space added by ``auto_indent``. + 开/关对由 ``auto_indent`` 选项自动添加的只有空格的行的检测。 ``detect_indentation`` Set to ``false`` to disable detection of tabs vs. spaces whenever a buffer is loaded. If set to ``true``, it will automatically modify ``translate_tabs_to_spaces`` and ``tab_size``. + 如果设置为 ``false`` ,当系统加在缓冲区内容的时候,就会停止对tab与空格的检测。如果设置为 ``true`` + 则会自动修改 ``translate_tabs_to_spaces`` 以及 ``tab_size`` 的值。 ``draw_white_space`` Valid values: ``none``, ``selection``, ``all``. + 有效值: ``none``, ``selection``, ``all`` 。 ``trim_trailing_white_space_on_save`` Set to ``true`` to remove white space on save. + 将这个选项设置为 ``true`` 就会在文件保存时候自动去处行为的空格。 Visual Settings +显示设置项 *************** ``color_scheme`` Sets the colors used for text highlighting. Accepts a path rooted at the data directory (e. g.: ``Packages/Color Scheme - Default/Monokai Bright.tmTheme``). + 设置文本高亮的配色方案。接受从数据目录开始的相对路径(例如: + ``Packages/Color Scheme - Default/Monokai Bright.tmTheme``)。 ``font_face`` Font face to be used for editable text. + 设置可编辑文本的字体样式。 ``font_size`` Size of the font for editable text. + 设置可编辑字体的字体大小。 ``font_options`` Valid values: ``bold``, ``italic``, ``no_antialias``, ``gray_antialias``, ``subpixel_antialias``, ``directwrite`` (Windows). + 有效值:``bold``, ``italic``, ``no_antialias``, ``gray_antialias``, + ``subpixel_antialias``, ``directwrite`` (对Windows平台有效)。 ``gutter`` Toggles display of gutter. + 开/关侧边栏选项。 ``rulers`` Columns in which to display vertical rules. Accepts a list of numeric values (e. g. ``[79, 89, 99]`` or a single numeric value (e. g. ``79``). + 设置标尺所在的列坐标。接受一个数字值的列表(例如 ``[79, 89, 99]`` 或者一个单一的数字值 ``79``)。 ``draw_minimap_border`` Set to ``true`` to draw a border around the minimap's region corresponding to the the view's currently visible text. The active color scheme's ``minimapBorder`` key controls the border's color. + 如果将这个值设置为 ``true`` ,就将根据视图当前可见文本的内容在迷你地图区域画一个边框。当前选中的 + 配色方案中的 ``minimapBorder`` 键对应的值用于控制边框的颜色。 ``highlight_line`` Set to ``false`` to stop highlighting lines with a cursor. + 将这个值设置为 ``false`` 来阻止高亮当前光标所在行。 ``line_padding_top`` Additional spacing at the top of each line, in pixels. + 每行文字与上一行的额外距离,以像素为单位。 ``line_padding_bottom`` Additional spacing at the bottom of each line, in pixels. + 每行文字与下一行的额外距离,以像素为单位。 ``scroll_past_end`` Set to ``false`` to disable scrolling past the end of the buffer. If ``true``, Sublime Text will leave a wide, empty margin between the last line and the bottom of the window. + 设置为 ``false`` 以关闭超出缓冲区的滚动。如果设置为 ``true`` ,Sublime Text将在文本的最后一行 + 与窗口下边界之间添加一大块空白区域。 ``line_numbers`` Toggles display of line numbers in the gutter. + 开/关对行号的显示。 ``word_wrap`` If set to ``false``, long lines will be clipped instead of wrapped. Scroll the screen horizontally to see the clipped text. + 如果设置为 ``false`` 那么对于内容很多的行,文本将被截取,而不会自动换行。在水平方向拖动滚动条可以 + 查看被截取的文字。 ``wrap_width`` If greater than ``0``, wraps long lines at the specified column as opposed to the window width. Only takes effect if ``wrap_width`` is set to ``true``. + 如果这个值大于 ``0`` , 系统就会在这个指定的列进行换行切分;否则会根据屏幕的宽度进行换行。这个值 + 只有在 ``wrap_width`` 设置为 ``true`` 的时候才有效果。 ``indent_subsequent_lines`` If set to ``false``, wrapped lines will not be indented. Only takes effect if ``wrap_width`` is set to ``true``. + 如果这个值设置为 ``false`` ,被转换的行就不会进行缩进。只有在 ``wrap_width`` 为 ``true`` 时 + 才有效。 ``draw_centered`` If set to ``true``, text will be drawn centered rather than left-aligned. + 如果设置为 ``true`` ,文本将居中对齐,否则为左对齐。 ``match_brackets`` Set to ``false`` to disable underlining the brackets surrounding the cursor. + 当值设置为 ``false`` 时,光标放在括号周围的时候就不会显示下划线。 ``match_brackets_content`` Set to ``false`` is you'd rather only highlight the brackets when the cursor is next to one. + 设置光标在括号周围时,是否要高亮括号中的内容。 ``match_brackets_square`` Set to ``false`` to stop highlighting square brackets. Only takes effect if ``match_brackets`` is ``true``. + 如果设置项值为 ``false`` ,就停止对方括号的配对显示。只有在 ``match_brackets`` 值为 ``true`` + 时有效。 ``match_bracktets_braces`` Set to ``false`` to stop highlighting curly brackets. Only takes effect if ``match_brackets`` is ``true``. + 如果设置项值为 ``false`` ,就停止对花括号的配对显示。只有在 ``match_brackets`` 值为 ``true`` + 时有效。 ``match_bracktets_angle`` Set to ``false`` to stop highlighting angle brackets. Only takes effect if ``match_brackets`` is ``true``. + 如果设置项值为 ``false`` ,就停止对尖括号的配对显示。只有在 ``match_brackets`` 值为 ``true`` + 时有效。 Automatic Behavior +自动行为设置项 ****************** ``auto_match_enabled`` Toggles automatic pairing of quotes, brackets, etc. + 开/关自动配对引号、括号等符号。 ``save_on_focus_lost`` Set to true to automatically save files when switching to a different file or application. + 如果这个值为真,那么当用户切换到一个不同的文件,或不同的应用程序时,文件的内容将会自动保存。 ``find_selected_text`` If ``true``, the selected text will be copied into the find panel when it's shown. + 如果设置为 ``true`` ,那么当打开搜索面板时,当前选中的文字会被自动的复制到搜索面板中。 ``word_separators`` Characters considered to separate words in actions like advancing the cursor, etc. They are not used in all contexts where a notion of a word separator is useful (e. g.: word wrapping). In such other contexts, the text might be tokenized based on other criteria (e. g. the syntax definition rules). + 设置在动作中用于分割单词的字符,例如光标跨单词移动的时候来界定单词的分隔符。这个单词分隔符并 + 不用于所有需要区分单词的情况(例如:换行时不切分单词)。在这种情况下,文本是基于其他标准来界 + 定的(例如:语法定义规则)。 ``ensure_newline_at_eof_on_save`` - Always adds a new line at the end of the file if not present when saving. + Always adds a new line at the end of the file if not present when saving. + 如果文本末尾没有空行,那么当保存文件的时候,会自动在文件末尾添加一个空行。 System and Miscellaneous Settings +系统与其他设置项 ********************************* ``is_widget`` Returns ``true`` if the buffer is an input field in a dialog as opposed to a regular buffer. + 当缓冲区为输入对话框中的输入域的时候,返回 ``true`` 。 ``spell_check`` Toggles the spell checker. + 开/关拼写检查选项。 ``dictionary`` Word list to be used by the spell checker. Accepts a path rooted at the data directory (e. g.: ``Packages/Language - English/en_US.dic``). You can `add more dictionaries `_. + 拼写检查器可选的单词列表。接受从数据目录开始的一个路径(例如: ``Packages/Language - English/en_US.dic`` )。 + 你也可以 `添加更多目录 `_ 。 ``fallback_encoding`` The encoding to use when the encoding can't be determined automatically. ASCII, UTF-8 and UTF-16 encodings will be automatically detected. + 控制当无法自动判断编码的时候选用的默认编码。系统可以自动检测的编码包括ASCII,UTF-8以及UTF-16. ``default_line_ending`` Determines what characters to use to designate new lines. Valid values: ``system`` (OS-dependant), ``windows`` (``CRLF``) and ``unix`` (``LF``). + 控制系统使用的换行符的字符。有效选项: ``system`` (OS相关), ``windows`` (即 ``CRLF`` )以及 + ``unix`` ( ``LF`` )。 ``tab_completion`` Determines whether pressing :kbd:`Tab` will insert completions. + 控制按下 :kbd:`Tab` 时是否进行补全。 Build and Error Navigation Settings +构建与错误导航设置项 *********************************** ``result_file_regex`` Regular expression used to extract error information from some output dumped into a view or output panel. Follows the same rules as error capturing in build systems.º + 用于过滤视图或输出面板中的错误信息的正则表达式。这里的正则表达式遵循与构建系统中的错误捕获相同的规则。 ``result_line_regex`` Regular expression used to extract error information from some output dumpºed into a view or output panel. Follows the same rules as error capturing in build systems. + 用于过滤视图或输出面板中的错误信息的正则表达式。这里的正则表达式遵循与构建系统中的错误捕获相同的规则。 ``result_base_dir`` Directory to start looking for offending files in based on information extracted with ``result_file_regex`` and ``result_line_regex``. + 设置基于 ``result_file_regex`` 以及 ``result_line_regex`` 抽取出来的信息开始搜索的文件路径。 ``build_env`` List of paths to add to build systems by default. + 默认添加到构建系统中的路径列表。 File and Directory Settings +文件与目录设置项 *************************** ``default_dir`` Sets the default save directory for the view. + 设置视图对应的默认保存路径。 Input Settings +输入设置项 ************** ``command_mode`` If set to ``true``, the buffer will ignore key strokes. Useful to emulate - Vim. \ No newline at end of file + Vim. + 如果将这个值设为 ``true`` ,则缓冲区将忽略用户按键。这对模拟Vim很有帮助。 From eddecea92279c396a1360f1d456c35726b2df4e3 Mon Sep 17 00:00:00 2001 From: Void Main Date: Mon, 1 Apr 2013 11:06:27 +0800 Subject: [PATCH 65/79] translate part of the reference part --- source/reference/keyboard_shortcuts_osx.rst | 124 ++++++++++--------- source/reference/keyboard_shortcuts_win.rst | 127 +++++++++++--------- source/reference/plugins.rst | 83 +++++++++++++ 3 files changed, 220 insertions(+), 114 deletions(-) diff --git a/source/reference/keyboard_shortcuts_osx.rst b/source/reference/keyboard_shortcuts_osx.rst index a8de843..069e5e6 100644 --- a/source/reference/keyboard_shortcuts_osx.rst +++ b/source/reference/keyboard_shortcuts_osx.rst @@ -1,157 +1,169 @@ .. sublime: wordWrap false Keyboard Shortcuts - OSX +OSX平台快捷键 ================================== .. warning:: This topic is a draft and may contain wrong information. +.. 警告:: + 本文处于草稿阶段,而且可能包含错误信息。 + Editing +编辑 ------- +-----------------+-----------------------------------------------------------+ -| Keypress | Command | +| Keypress 按键 | Command 对应命令 | +=================+===========================================================+ -| ⌘ + X | Delete line | +| ⌘ + X | Delete line 删除行 | +-----------------+-----------------------------------------------------------+ -| ⌘ + ↩ | Insert line after | +| ⌘ + ↩ | Insert line after 行后插入 | +-----------------+-----------------------------------------------------------+ -| ⌘ + ⇧ + ↩ | Insert line before | +| ⌘ + ⇧ + ↩ | Insert line before 行前插入 | +-----------------+-----------------------------------------------------------+ -| ⌘ + ⌃ + ↑ | Move line/selection up | +| ⌘ + ⌃ + ↑ | Move line/selection up 上移文本/选择 | +-----------------+-----------------------------------------------------------+ -| ⌘ + ⌃ + ↓ | Move line/selection down | +| ⌘ + ⌃ + ↓ | Move line/selection down 下移文本/选择 | +-----------------+-----------------------------------------------------------+ -| ⌘ + L | Select line - Repeat to select next lines | +| ⌘ + L | Select line - Repeat to select next lines 选择行 - 重复按键可以继续选择接下来的行 | +-----------------+-----------------------------------------------------------+ -| ⌘ + D | Select word - Repeat select others occurrences | +| ⌘ + D | Select word - Repeat select others occurrences 选择单词 - 重复按键选择单词的其他出现实例 | +-----------------+-----------------------------------------------------------+ -| ⌃ + M | Jump to closing parentheses | -| | Repeat to jump to opening parentheses | +| ⌃ + M | Jump to closing parentheses 跳转到闭合括号 | +| | Repeat to jump to opening parentheses 再次按键将跳转到对应的起始括号 | +-----------------+-----------------------------------------------------------+ -| ⌃ + ⇧ + M | Select all contents of the current parentheses | +| ⌃ + ⇧ + M | Select all contents of the current parentheses 选择当前括号中的所有内容 | +-----------------+-----------------------------------------------------------+ -| ⌘ + K, ⌘ + K | Delete from cursor to end of line | +| ⌘ + K, ⌘ + K | Delete from cursor to end of line 删除光标位置到行尾的全部内容 | +-----------------+-----------------------------------------------------------+ -| ⌘ + K + ⌫ | Delete from cursor to start of line | +| ⌘ + K + ⌫ | Delete from cursor to start of line 删除光标位置到行首的全部内容 | +-----------------+-----------------------------------------------------------+ -| ⌘ + ] | Indent current line(s) | +| ⌘ + ] | Indent current line(s) 向后缩进选中行(可以为多行) | +-----------------+-----------------------------------------------------------+ -| ⌘ + [ | Un-indent current line(s) | +| ⌘ + [ | Un-indent current line(s) 向前缩进当前行(可以为多行) | +-----------------+-----------------------------------------------------------+ -| ⌘ + ⇧ + D | Duplicate line(s) | +| ⌘ + ⇧ + D | Duplicate line(s) 重复当前行内容(可以为多行) | +-----------------+-----------------------------------------------------------+ -| ⌘ + J | Join line below to the end of the current line | +| ⌘ + J | Join line below to the end of the current line 把下一行内容连接到当前行末尾 | +-----------------+-----------------------------------------------------------+ -| ⌘ + / | Comment/un-comment current line | +| ⌘ + / | Comment/un-comment current line 为当前行添加/删除注释 | +-----------------+-----------------------------------------------------------+ -| ⌘ + ⌥ + / | Block comment current selection | +| ⌘ + ⌥ + / | Block comment current selection 为当前选中内容增加块注释 | +-----------------+-----------------------------------------------------------+ -| ⌘ + Y | Redo, or repeat last keyboard shortcut command | +| ⌘ + Y | Redo, or repeat last keyboard shortcut command 恢复,或者重复执行上个快捷键对应的命令 | +-----------------+-----------------------------------------------------------+ -| ⌘ + ⇧ + V | Paste and indent correctly | +| ⌘ + ⇧ + V | Paste and indent correctly 粘贴的同时完成自动缩进 | +-----------------+-----------------------------------------------------------+ -| ⌃ + Space | Select next auto-complete suggestion | +| ⌃ + Space | Select next auto-complete suggestion 选择下一个自动补全提示 | +-----------------+-----------------------------------------------------------+ -| ⌃ + U | soft undo; jumps to your last change before | -| | undoing change when repeated | +| ⌃ + U | soft undo; jumps to your last change before 软撤销,即在撤销之前先跳转到上次修改的位置 | +| | undoing change when repeated 再次按键执行撤销操作 | +-----------------+-----------------------------------------------------------+ Navigation/Goto Anywhere +导航/快速跳转 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress | Command | +| Keypress 按键 | Command 对应命令 | +=================+===========================================================+ -| ⌘ + P | Quick-open files by name | +| ⌘ + P | Quick-open files by name 根据名称快速打开文件 | +-----------------+-----------------------------------------------------------+ -| ⌘ + R | Goto symbol | +| ⌘ + R | Goto symbol 跳转到指定符号 | +-----------------+-----------------------------------------------------------+ -| | Goto word in current file | +| | Goto word in current file 跳转到当前文件中的某个单词 | +-----------------+-----------------------------------------------------------+ -| ⌃ + G | Goto line in current file | +| ⌃ + G | Goto line in current file 跳转到当前文件中的某一行 | +-----------------+-----------------------------------------------------------+ General +通用快捷键 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress | Command | +| Keypress 按键 | Command 对应命令 | +=================+===========================================================+ -| ⌘ + ⇧ + P | Command prompt | +| ⌘ + ⇧ + P | Command prompt 命令提示 | +-----------------+-----------------------------------------------------------+ -| ⌘ + K, ⌘ + B | Toggle side bar | +| ⌘ + K, ⌘ + B | Toggle side bar 开/关侧边栏 | +-----------------+-----------------------------------------------------------+ -| ⌃ + ⇧ + P | Show scope in status bar | +| ⌃ + ⇧ + P | Show scope in status bar 在状态栏中显示作用域 | +-----------------+-----------------------------------------------------------+ Find/Replace +查找/替换 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress | Command | +| Keypress 按键 | Command 对应命令 | +=================+===========================================================+ -| ⌘ + F | Find | +| ⌘ + F | Find 查找 | +-----------------+-----------------------------------------------------------+ -| ⌘ + ⌥ + F | Replace | +| ⌘ + ⌥ + F | Replace 替换 | +-----------------+-----------------------------------------------------------+ -| ⌘ + ⇧ + F | Find in files | +| ⌘ + ⇧ + F | Find in files 在文件中查找 | +-----------------+-----------------------------------------------------------+ Tabs +标签页 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress | Command | +| Keypress 按键 | Command 对应命令 | +=================+===========================================================+ -| ⌘ + ⇧ + t | Open last closed tab | +| ⌘ + ⇧ + t | Open last closed tab 打开最后关闭的标签页 | +-----------------+-----------------------------------------------------------+ -| ^ + Tab | Cycle up through tabs | +| ^ + Tab | Cycle up through tabs 在标签页之间循环 | +-----------------+-----------------------------------------------------------+ -| ⇧ + ^ + Tab | Cycle down through tabs | +| ⇧ + ^ + Tab | Cycle down through tabs 在标签页之间循环 | +-----------------+-----------------------------------------------------------+ -| | Find in files | +| | Find in files 文件中搜索 | +-----------------+-----------------------------------------------------------+ Split window +分割窗口 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress | Command | +| Keypress 按键 | Command 对应命令 | +=================+===========================================================+ -| ⌘ + ⌥ + 2 | Split view into two columns | +| ⌘ + ⌥ + 2 | Split view into two columns 把窗口分割成两栏 | +-----------------+-----------------------------------------------------------+ -| ⌘ + ⌥ + 1 | Revert view to single column | +| ⌘ + ⌥ + 1 | Revert view to single column 把窗口恢复成一栏 | +-----------------+-----------------------------------------------------------+ -| ⌘ + ⌥ + 5 | Set view to grid (4 groups) | +| ⌘ + ⌥ + 5 | Set view to grid (4 groups) 把窗口分割成网格(4组) | +-----------------+-----------------------------------------------------------+ -| ⌃ + [NUM] | Jump to group where num is 1-4 | +| ⌃ + [NUM] | Jump to group where num is 1-4 跳转到1-4组中的某一组 | +-----------------+-----------------------------------------------------------+ -| ⌃ + ⇧ + [NUM] | Move file to specified group where num is 1-4 | +| ⌃ + ⇧ + [NUM] | Move file to specified group where num is 1-4 把文件移动到1-4组中的某一组 | +-----------------+-----------------------------------------------------------+ Bookmarks +书签 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress | Command | +| Keypress 按键 | Command 对应命令 | +=================+===========================================================+ -| ⌘ + F2 | Toggle bookmark | +| ⌘ + F2 | Toggle bookmark 开/关书签 | +-----------------+-----------------------------------------------------------+ -| F2 | Next bookmark | +| F2 | Next bookmark 下一个书签 | +-----------------+-----------------------------------------------------------+ -| ⇧ + F2 | Previous bookmark | +| ⇧ + F2 | Previous bookmark 上一个书签 | +-----------------+-----------------------------------------------------------+ -| ⇧ + ⌘ + F2 | Clear bookmarks | +| ⇧ + ⌘ + F2 | Clear bookmarks 清空书签 | +-----------------+-----------------------------------------------------------+ Text manipulation +文本操作 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress | Command | +| Keypress 按键 | Command 对应命令 | +=================+===========================================================+ -| ⌘ + K, ⌘ + U | Transform to Uppercase | +| ⌘ + K, ⌘ + U | Transform to Uppercase 将文本转换为大写 | +-----------------+-----------------------------------------------------------+ -| ⌘ + K, ⌘ + L | Transform to Lowercase | +| ⌘ + K, ⌘ + L | Transform to Lowercase 将文本转换为小写 | +-----------------+-----------------------------------------------------------+ diff --git a/source/reference/keyboard_shortcuts_win.rst b/source/reference/keyboard_shortcuts_win.rst index 32e481f..eb37862 100644 --- a/source/reference/keyboard_shortcuts_win.rst +++ b/source/reference/keyboard_shortcuts_win.rst @@ -1,159 +1,170 @@ .. sublime: wordWrap false Keyboard Shortcuts - Windows/Linux +Windows/Linux平台快捷键 ================================== .. warning:: This topic is a draft and may contain wrong information. +.. 警告:: + 本文处于草稿阶段,而且可能包含错误信息。 Editing +编辑 ------- +-----------------+-----------------------------------------------------------+ -| Keypress | Command | +| Keypress 按键 | Command 对应命令 | +=================+===========================================================+ -| Ctrl + X | Delete line | +| Ctrl + X | Delete line 删除行 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ↩ | Insert line after | +| Ctrl + ↩ | Insert line after 行后插入 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ⇧ + ↩ | Insert line before | +| Ctrl + ⇧ + ↩ | Insert line before 行前插入 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ⇧ + ↑ | Move line/selection up | +| Ctrl + ⇧ + ↑ | Move line/selection up 上移文本/选择 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ⇧ + ↓ | Move line/selection down | +| Ctrl + ⇧ + ↓ | Move line/selection down 下移文本/选择 | +-----------------+-----------------------------------------------------------+ -| Ctrl + L | Select line - Repeat to select next lines | +| Ctrl + L | Select line - Repeat to select next lines 选择行 - 重复按键可以继续选择接下来的行 | +-----------------+-----------------------------------------------------------+ -| Ctrl + D | Select word - Repeat select others occurrences | +| Ctrl + D | Select word - Repeat select others occurrences 选择单词 - 重复按键选择单词的其他出现实例 | +-----------------+-----------------------------------------------------------+ -| Ctrl + M | Jump to closing parentheses | -| | Repeat to jump to opening parentheses | +| Ctrl + M | Jump to closing parentheses 跳转到闭合括号 | +| | Repeat to jump to opening parentheses 再次按键将跳转到对应的起始括号 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ⇧ + M | Select all contents of the current parentheses | +| Ctrl + ⇧ + M | Select all contents of the current parentheses 选择当前括号中的所有内容 | +-----------------+-----------------------------------------------------------+ -| Ctrl + KK | Delete from cursor to end of line | +| Ctrl + KK | Delete from cursor to end of line 删除光标位置到行尾的全部内容 | +-----------------+-----------------------------------------------------------+ -| Ctrl + K + ⌫ | Delete from cursor to start of line | +| Ctrl + K + ⌫ | Delete from cursor to start of line 删除光标位置到行首的全部内容 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ] | Indent current line(s) | +| Ctrl + ] | Indent current line(s) 向后缩进选中行(可以为多行) | +-----------------+-----------------------------------------------------------+ -| Ctrl + [ | Un-indent current line(s) | +| Ctrl + [ | Un-indent current line(s) 向前缩进当前行(可以为多行) | +-----------------+-----------------------------------------------------------+ -| Ctrl + ⇧ + D | Duplicate line(s) | +| Ctrl + ⇧ + D | Duplicate line(s) 重复当前行内容(可以为多行) | +-----------------+-----------------------------------------------------------+ -| Ctrl + J | Join line below to the end of the current line | +| Ctrl + J | Join line below to the end of the current line 把下一行内容连接到当前行末尾 | +-----------------+-----------------------------------------------------------+ -| Ctrl + / | Comment/un-comment current line | +| Ctrl + / | Comment/un-comment current line 为当前行添加/删除注释 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ⇧ + / | Block comment current selection | +| Ctrl + ⇧ + / | Block comment current selection 为当前选中内容增加块注释 | +-----------------+-----------------------------------------------------------+ -| Ctrl + Y | Redo, or repeat last keyboard shortcut command | +| Ctrl + Y | Redo, or repeat last keyboard shortcut command 恢复,或者重复执行上个快捷键对应的命令 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ⇧ + V | Paste and indent correctly | +| Ctrl + ⇧ + V | Paste and indent correctly 粘贴的同时完成自动缩进 | +-----------------+-----------------------------------------------------------+ -| Ctrl + Space | Select next auto-complete suggestion | +| Ctrl + Space | Select next auto-complete suggestion 选择下一个自动补全提示 | +-----------------+-----------------------------------------------------------+ -| Ctrl + U | soft undo; jumps to your last change before | -| | undoing change when repeated | +| Ctrl + U | soft undo; jumps to your last change before 软撤销,即在撤销之前先跳转到上次修改的位置 | +| | undoing change when repeated 再次按键执行撤销操作 | +-----------------+-----------------------------------------------------------+ Navigation/Goto Anywhere +导航/快速跳转 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress | Command | +| Keypress 按键 | Command 对应命令 | +=================+===========================================================+ -| Ctrl + P | Quick-open files by name | +| Ctrl + P | Quick-open files by name 根据名称快速打开文件 | +-----------------+-----------------------------------------------------------+ -| Ctrl + R | Goto symbol | +| Ctrl + R | Goto symbol 跳转到指定符号 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ; | Goto word in current file | +| Ctrl + ; | Goto word in current file 跳转到当前文件中的某个单词 | +-----------------+-----------------------------------------------------------+ -| Ctrl + G | Goto line in current file | +| Ctrl + G | Goto line in current file 跳转到当前文件中的某一行 | +-----------------+-----------------------------------------------------------+ General +通用快捷键 ------------------------ +-----------------------+-----------------------------------------------------+ -| Keypress | Command | +| Keypress 按键 | Command 对应命令 | +=======================+=====================================================+ -| Ctrl + ⇧ + P | Command prompt | +| Ctrl + ⇧ + P | Command prompt 命令提示 | +-----------------------+-----------------------------------------------------+ -| Ctrl + KB | Toggle side bar | +| Ctrl + KB | Toggle side bar 开/关侧边栏 | +-----------------------+-----------------------------------------------------+ -| Ctrl + ⇧ + Alt + P | Show scope in status bar | +| Ctrl + ⇧ + Alt + P | Show scope in status bar 在状态栏中显示作用域 | +-----------------------+-----------------------------------------------------+ Find/Replace +查找/替换 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress | Command | +| Keypress 按键 | Command 对应命令 | +=================+===========================================================+ -| Ctrl + F | Find | +| Ctrl + F | Find 查找 | +-----------------+-----------------------------------------------------------+ -| Ctrl + H | Replace | +| Ctrl + H | Replace 替换 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ⇧ + F | Find in files | +| Ctrl + ⇧ + F | Find in files 在文件中查找 | +-----------------+-----------------------------------------------------------+ Tabs +标签页 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress | Command | +| Keypress 按键 | Command 对应命令 | +=================+===========================================================+ -| Ctrl + ⇧ + t | Open last closed tab | +| Ctrl + ⇧ + t | Open last closed tab 打开最后关闭的标签页 | +-----------------+-----------------------------------------------------------+ -| Ctrl + PgUp | Cycle up through tabs | +| Ctrl + PgUp | Cycle up through tabs 在标签页之间循环 | +-----------------+-----------------------------------------------------------+ -| Ctrl + PgDn | Cycle down through tabs | +| Ctrl + PgDn | Cycle down through tabs 在标签页之间循环 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ⇆ | Find in files | +| Ctrl + ⇆ | Find in files 文件中搜索 | +-----------------+-----------------------------------------------------------+ -| Alt + [NUM] | Switch to tab number [NUM] where [NUM] <= number of tabs | +| Alt + [NUM] | Switch to tab number [NUM] where [NUM] <= number of tabs 跳转到第 [NUM] 个标签页,这里 [NUM] 指标签的页数 | +-----------------+-----------------------------------------------------------+ Split window +分割窗口 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress | Command | +| Keypress 按键 | Command 对应命令 | +=================+===========================================================+ -| Alt + ⇧ + 2 | Split view into two columns | +| Alt + ⇧ + 2 | Split view into two columns 把窗口分割成两栏 | +-----------------+-----------------------------------------------------------+ -| Alt + ⇧ + 1 | Revert view to single column | +| Alt + ⇧ + 1 | Revert view to single column 把窗口恢复成一栏 | +-----------------+-----------------------------------------------------------+ -| Alt + ⇧ + 5 | Set view to grid (4 groups) | +| Alt + ⇧ + 5 | Set view to grid (4 groups) 把窗口分割成网格(4组) | +-----------------+-----------------------------------------------------------+ -| Ctrl + [NUM] | Jump to group where num is 1-4 | +| Ctrl + [NUM] | Jump to group where num is 1-4 跳转到1-4组中的某一组 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ⇧ + [NUM]| Move file to specified group where num is 1-4 | +| Ctrl + ⇧ + [NUM]| Move file to specified group where num is 1-4 把文件移动到1-4组中的某一组 | +-----------------+-----------------------------------------------------------+ Bookmarks +书签 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress | Command | +| Keypress 按键 | Command 对应命令 | +=================+===========================================================+ -| Ctrl + F2 | Toggle bookmark | +| Ctrl + F2 | Toggle bookmark 开/关书签 | +-----------------+-----------------------------------------------------------+ -| F2 | Next bookmark | +| F2 | Next bookmark 下一个书签 | +-----------------+-----------------------------------------------------------+ -| ⇧ + F2 | Previous bookmark | +| ⇧ + F2 | Previous bookmark 上一个书签 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ⇧ + F2 | Clear bookmarks | +| Ctrl + ⇧ + F2 | Clear bookmarks 清空书签 | +-----------------+-----------------------------------------------------------+ Text manipulation +文本操作 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress | Command | +| Keypress 按键 | Command 对应命令 | +=================+===========================================================+ -| Ctrl + KU | Transform to Uppercase | +| Ctrl + KU | Transform to Uppercase 将文本转换为大写 | ++-----------------+-----------------------------------------------------------+ +| Ctrl + KL | Transform to Lowercase 将文本转换为小写 | +-----------------+-----------------------------------------------------------+ -| Ctrl + KL | Transform to Lowercase | -+-----------------+-----------------------------------------------------------+ \ No newline at end of file diff --git a/source/reference/plugins.rst b/source/reference/plugins.rst index d86eddc..6963758 100644 --- a/source/reference/plugins.rst +++ b/source/reference/plugins.rst @@ -1,4 +1,5 @@ Plugins +插件 ======= .. seealso:: @@ -6,39 +7,60 @@ Plugins :doc:`API Reference <../reference/api>` More information on the Python API. +更多信息请参考: + + :doc:`API参考文档 <../reference/api>` + 有关Python API的更详细的信息。 + + Plugins are Python scripts implementing ``*Command`` classes from ``sublime_plugin``. +插件是实现了 ``sublime_plugin`` 模块中 ``*Command`` 类的Python脚本。 Where to Store Plugins +插件放到哪里 ********************** Sublime Text 2 will look for plugins in these places: +Sublime Text 2在以下这些目录中寻找可用插件: * ``Packages`` * ``Packages/`` +* ``Packages/<包名称>`` Any plugin nested deeper in ``Packages`` won't be loaded. +存放在 ``Packages`` 更深层次的目录结构中的插件不会被加载。 + All plugins should live inside a directory of their own and not directly under ``Packages``. +任何插件都应该又自己单独的目录,而不应该直接放在 ``Packages`` 目录下。 Conventions for Command Names +命令名称的命名规则 ***************************** Sublime Text 2 command class names are suffixed by convention with ``Command`` and written as ``CamelCasedPhrases``. +Sublime Text 2遵循 ``CamelCasedPhrases`` 命名规则来定义命令类,同时用 ``Command`` 作为后缀。 However, Sublime Text 2 transforms the class name from ``CamelCasedPhrases`` to ``camel_cased_phrases``. So ``ExampleCommand`` would turn into ``example`` and ``AnotherExampleCommand`` would turn into ``another_example``. +然而,Sublime Text 2将类名从 ``CamelCasedPhrases`` 形式自动转换成 ``camel_cased_phrases`` 。 +举例来说, ``ExampleCommand`` 将被转换为 ``example`` ,而 ``AnotherExampleCommand`` 将 +转换为 ``another_example`` 。 For class definition names, use ``CamelCasedPhrasesCommand``; to call a command from the API, use the normalized name (``camel_cased_phrases``). +对于类定义名称,可以使用 ``CamelCasedPhrasesCommand`` 命名方式;要从API中调用一个命令,请使用 +标准化后的名称( ``camel_cased_phrases`` )。 Types of Commands +命令类型 ***************** * ``sublime_plugin.ApplicationCommand`` @@ -49,16 +71,22 @@ Types of Commands Instances of ``WindowCommand`` have a ``.window`` attribute pointing to the window instance that created them. Similarly, instances of ``TextCommand`` have a ``.view`` attribute. +``WindowCommand`` 类的实例都有一个 ``.window`` 属性,指向创建他们的那个窗口实例。于此类似, +``TextCommand`` 类的实例拥有 ``.view`` 属性。 Shared Traits for Commands +命令之间的共享特性 -------------------------- All commands must implement a ``.run()`` method. +所有命令都必须实现一个 ``.run()`` 方法。 All commands can receive and arbitrarily long number of keyword arguments, but they must be valid JSON types. +所有命令都可以接受任意长度的关键字参数,但是这些参数一定要是有效的JSON类型。 How to Call Commands from the API +如何利用API调用命令 ********************************* Use a reference to a ``View`` or a ``Window``, or ``sublime`` depending on @@ -76,17 +104,45 @@ to ``command_name``. :: Sublime Text can pass other types of arguments to commands (such as edit objects, view instances, etc.). +Use a reference to a ``View`` or a ``Window``, or ``sublime`` depending on +the type of command, and call ``object.run_command('command_name')``. +根据命令的类型来选择对 ``View`` 、 ``Window`` 或者 ``sublime`` 的引用,然后通过 +``object.run_command('command_name')`` 来调用。 +In addition, you can pass a dictionary where keys are names of parameters +to ``command_name``. :: +除此之外, 你可以用字典作为参数,字典中的键就是要传给 ``command_name`` 的参数名称:: + + window.run_command("echo", {"Tempus": "Irreparabile", "Fugit": "."}) + + + Command Arguments + 命令参数 + ***************** + + All user-provided arguments to commands must be valid JSON types. Only + Sublime Text can pass other types of arguments to commands (such as edit + objects, view instances, etc.). + 用户提供给命令的所有参数都必须是有效的JSON类型。只有Sublime Text可以给命令传递其他类型的参数 + (例如修改对象,视图实例等等)。 + + Text Commands and the ``edit`` Object +文本命令以及 ``修改`` 对象 ************************************* The two API functions of interest are ``view.begin_edit()``, which takes an optional command name and an optional dictionary of arguments, and ``view.end_edit()``, which finishes the edit. +关于两个文本命令的两个较为重要的API是 ``view.begin_edit()`` 和 ``view.end_edit()`` 。 +其中 ``view.begin_edit()`` 可以接受一个可选的命令名称和可选的参数字典;而 ``view.end_edit()`` +用来结束编辑过程。 All actions done within an edit are grouped as a single undo action. Callbacks such as ``on_modified()`` and ``on_selection_modified()`` are called when the edit is finished. +在修改过程中发生的所有动作都被整合成一个单一的撤销动作。当编辑过程结束的时候,类似与 +``on_modified`` 和 ``on_selection_modified()`` 的回调函数会被触发。 It's important to call ``view.end_edit()`` after each ``view.begin_edit()``, otherwise the buffer will be in an inconsistent state. An attempt will be made @@ -94,26 +150,39 @@ to fix it automatically if the edit object gets collected, but that often doesn't happen when you expect, and will result in a warning printed to the console. In other words, you should always bracket an edit in a ``try..finally`` block. +有一点非常重要,每次调用 ``view.begin_edit()`` 之后必须调用 ``view.end_edit()`` 方法,否则 +缓冲将处于一种不一致状态。在不匹配发生时,系统将尝试自动进行修正,但是这种自动修正的发生频率并 +没有你想象的那么多,同时会在控制台输出一条警告信息。换句话说,你应该始终使用 ``try..finally`` +来包裹代码快。 The command name passed to ``begin_edit()`` is used for repeat, macro recording, and for describing the action when undoing/redoing it. If you're making an edit outside of a ``TextCommand``, you should almost never supply a command name. +传递给 ``begin_edit()`` 的命令名称用于重复、宏录制以及撤销/重复过程中的动作描述。如果你在 +``TextCommand`` 外面做修改,你就不该指定命令名称。 If you have created an edit object, and call a function that creates another one, that's fine: the edit is only considered finished when the outermost call to ``end_edit()`` runs. +你可以在开始的时候创建一个修改对象,然后调用了一个方法又创建了另外的一个修改对象:只有当最外层 +的修改对象执行了 ``end_edit()`` 方法之后,系统才认为整个修改都完成了。 As well as grouping modifications, you can use edit objects for grouping changes to the selection, so they're undone in a single step. +与群组修改类似,你也可以使用修改对象把对选中文本做的修改组合成一个群组,对它们的修改只要一步就 +能撤销。 Responding to Events +对事件的响应 ******************** Any subclass of ``EventListener`` will be able to respond to events. You cannot make a class derive from both ``EventListener`` and any other type of command. +任何 ``EventListener`` 的子类都能够响应事件。对于任何一个类,不能同时继承 ``EventListener`` +和其他任何的命令类。 .. sidebar:: A Word of Warning about ``EventListener`` @@ -123,15 +192,23 @@ command. is done in those and do not implement events you don't need, even if they just ``pass``. +.. sidebar:: 关于 ``EventListener`` 的注意事项 + 在事件监听器中,尤其是处理 ``on_modified`` 和 ``on_selection_modified`` 这样的经常被 + 触发的事件的监听器中,执行开销很大的操作可能会导致Sublime Text 2没有响应。所以请注意监听器 + 中所编写的代码,另外,不要实现你不需要的方法,即使这个方法只有一个 ``pass``语句。 Python and the Standard Library +Python与标准库 ******************************* Sublime Text ships with a trimmed down standard library. Notable missing modules are the *Tkinter*, *multiprocessing* and *sqlite3* modules. +Sublime Text集成了一个精简版的标准库。被裁剪掉的模块包括 *Tkinter* , *multiprocessing* +以及 *sqlite3* 。 Automatic Plugin Reload +自动插件重载 *********************** Sublime Text will automatically reload top-level Python modules from packages @@ -139,9 +216,15 @@ as they change (perhaps because you are editing a *.py* file). Note that Python subpackages won't be reloaded; this can lead to confusion while developing plugins. Generally, it's best to restart Sublime Text after you've made changes to plugin files so all changes take effect. +当你对插件做修改的时候(比如你正在修改一个 *.py* 文件),Sublime Text会自动加载包中的顶级 +Python模块。值得注意的是Python的子模块不会被自动重新加载;这一点在插件开发中可能会产生一些挺 +奇葩的问题。一般来说,当你对插件文件做修改之后,最好重启以下Sublime Text,这样能保证你做的修 +改能发挥作用。 Multithreading +多线程 ************** Only the ``.set_timeout()`` function is safe to call from different threads. +只有 ``.set_timeout()`` 方法可以安全的从其他线程调用。 From 2087102753bdb2c2fa23867d0df79d0b07bf546d Mon Sep 17 00:00:00 2001 From: cloudmonkeypeng Date: Wed, 3 Apr 2013 21:52:53 +0800 Subject: [PATCH 66/79] Modify the first five chapters --- source/basic_concepts.rst | 18 +++++++------- source/editing/editing.rst | 2 +- source/getting_started/install.rst | 24 +++++++++---------- source/index.rst | 2 +- source/intro.rst | 8 +++---- .../search_and_replace/search_and_replace.rst | 4 ++-- 6 files changed, 29 insertions(+), 29 deletions(-) diff --git a/source/basic_concepts.rst b/source/basic_concepts.rst index 29cd61f..97b37c2 100644 --- a/source/basic_concepts.rst +++ b/source/basic_concepts.rst @@ -20,17 +20,17 @@ 能力越大,需要处理的问题也就越多 ======================================== -Sublime Text是一款高度可扩展、可定制的文本编辑器。它已经为你提供了许多开箱即用的功能, -尽管如此,如果你愿意花时间根据自己的需求进行调教,ST将为你提供超高的生产力。本文档将介绍你 +Sublime Text是一款高度可扩展、可定制的文本编辑器。它已经为你提供了许多直接使用的功能, +尽管如此,如果你愿意花时间根据自己的需求进行配置,ST将为你提供超高的生产力。本文档将介绍你 所需要知道的配置Sublime Text的一切内容。 -我们将在接下来的几段文字中,简单说明一些有关Sublime Text的内容,这些内容只有在真正地使用 -这个编辑器一段时间后才能被理解。请不断地探索这个编辑器,同时也经常来翻翻这个文档,总有一天 +我们将在接下来的几段中,简单说明一些有关Sublime Text的内容,这些内容只有在使用 +这个编辑器一段时间后才能被真正理解。请不断地探索这个编辑器,同时也经常来翻翻这个文档,总有一天 文档中的所有内容你都会烂熟于心。 -不可否认,Sublime Text是码农的神器,尽管如此你没必要一定要是程序员才能使用它,即使你不做 +不可否认,Sublime Text是码农的神器(译者注:据说是网页前端神器),尽管如此你没必要一定要是程序员才能使用它,即使你不做 任何配置,你也会发现这是你写作工作的一个完美工具。当然了,如果你是一名黑客,那么你很有可能 -会把今天剩下的时间都用在探索合格编辑器上了。 +会把今天剩下的时间都用在探索这个编辑器上了。 *Data(数据)* 目录 @@ -86,7 +86,7 @@ Sublime Text 2自带了一个内嵌的Python解释器。这对于检视Sublime T *Python* 是一门对初学者而言非常容易上手,同时又具有强大能力的编程语言。 而 *API* 则是对 ‘Application Programming Interface(应用程序编程接口)'的缩写,这实际指的是Sublime -Text 2为用户准备的可以调教它的方式。换句话说,Sublime Text通过Python这门语言为用户提供了访 +Text 2为用户准备的可以配置它的方式。换句话说,Sublime Text通过Python这门语言为用户提供了访 问其内部的方式。最后需要说明的是 *控制台*,它是Sublime Text内部的一个可以输入并运行Python 代码片段的小窗口。控制台同时也负责显示由Sublime Text以及相关插件输出的文本信息。 @@ -126,7 +126,7 @@ Textmate兼容性 This information is mainly useful for Textmate users who are now using Sublime Text. Textmate was an editor for the Mac. -这部分信息主要是为从Textmate转型使用Sublime Text的用户准备的。关于Textmate,它是Mac平台的 +这部分信息主要是为从Textmate转型使用Sublime Text的用户准备的。Textmate,它是Mac平台的 一个编辑器。 (译者注:Textmate是Mac平台很成功的一款编辑器) @@ -140,7 +140,7 @@ Text. Textmate was an editor for the Mac. 模拟Vi ====== -这部分信息主要对恐龙和甘愿在对话中绝口不提RSI的人有用。Vi是一款古老的模式编辑器,在编辑器中, +这部分信息主要对恐龙(史前生物)和甘愿在对话中绝口不提RSI的人有用。Vi是一款古老的模式编辑器,在编辑器中, 人们可以只通过键盘完成所有的操作。Vim,vi的更新版本仍然在被广泛的使用。 (译者注:我也不知道RSI是什么,求科普) diff --git a/source/editing/editing.rst b/source/editing/editing.rst index c91089d..d1f8fec 100644 --- a/source/editing/editing.rst +++ b/source/editing/editing.rst @@ -12,7 +12,7 @@ Sublime Text具有多种多样的编辑特性。本主题只简单展示其中 =================== 多重选择特性让你可以高效的在文档中进行批量修改。任何对这个特性的赞誉都不为过。接下来我们就展示 -为什么这么说: +这么说的原因: 首先选中一些文本,然后按 ``Ctrl + D`` 的组合键来 **添加更多** 实例。如果你想 **跳过当前实例**, 可以按 ``Ctrl + K, Ctrl + D``。 diff --git a/source/getting_started/install.rst b/source/getting_started/install.rst index 8b588cb..fa2b1df 100644 --- a/source/getting_started/install.rst +++ b/source/getting_started/install.rst @@ -2,16 +2,16 @@ 安装 ==== -在不同平台上安装Sublime Text的过程是不同的。 +在不同平台上有不同的Sublime Text安装过程。 -请务必阅读官方网站上的 `使用条约`_ ,Sublime Text并不是免费的。 +Sublime Text并不是免费的,使用前请务必阅读官方网站上的 `使用条约`_ 。 .. _使用条约: http://www.sublimetext.com/buy 32位还是64位? ============== -请根据操作系统作对应选择,如果你正在使用64位的系统,就请下载64位的版本,否则就下载32位的版本。 +请根据操作系统的不同,做出对应选择。如果你正在使用64位的系统,就请下载64位的版本,否则就下载32位的版本。 在 **Windows** 平台,如果你不知道如何查看操作系统的版本,就请下载32位版。现在的64位Windows 操作系统可以正常运行32位的软件。 @@ -20,7 +20,7 @@ uname -m -对于 **OS X** 的用户,你大可不必关心此部分内容,因为Sublime Text在OS X平台只有一个版本。 +对于 **OS X** 的用户,你不必关心此部分内容,因为Sublime Text在OS X平台上只有一个版本。 Windows ======= @@ -29,9 +29,9 @@ Windows --------------------------- Sublime Text在Windows平台提供了两种安装类型:一种是标准安装,另外一种则是便携安装。只有 -当你确信自己要使用便携版的时候才选择便携安装,否则就选择标准安装好了。 +当你确信自己要使用便携版的时候才选择便携安装,否则就请选择标准安装。 -**标准安装** 会将数据分散到两个文件夹:适当的安装目录,以及 *数据目录* 。这些概念将在稍后 +**标准安装** 会将数据分散到两个文件夹:正确的安装目录,以及 *数据目录* 。这些概念将在稍后 的文档中进行解释。标准安装也会将Sublime Text的选项与Windows的快捷菜单进行整合。 **便携安装** 会将所有Sublime Text需要的文件放到一个目录中。这样你就可以通过介质随身携带 @@ -47,7 +47,7 @@ Sublime Text在Windows平台提供了两种安装类型:一种是标准安装 Download the package and uncompress it to a folder of your choice. You will find the *sublime_text.exe* executable inside that folder. -下载压缩包,并且将其中的内容解压到你选择的路径。你能在解压的路径中找到 *sublime_text.exe* +下载压缩包,并将其中的内容解压到你选择的路径。你能在解压的路径中找到 *sublime_text.exe* 的可执行文件。 OS X @@ -70,7 +70,7 @@ Linux sudo ln -s /path/to/sublime_text /usr/bin/subl -尝试冒险或者选择稳定 +尝试冒险或选择稳定的版本 ============================ Sublime Text有三个发布 *通道* : @@ -83,15 +83,15 @@ Sublime Text有三个发布 *通道* : .. _开发版: http://www.sublimetext.com/dev .. _日更新版: http://www.sublimetext.com/nightly -如果你正在为NASA的项目工作,或者正在赶一个紧迫的截止日期,请使用稳定发行版,并且没必要继续 +如果你正在为NASA(译者注:或者中国航天部)的项目工作,或者正在赶一个截止日期紧迫的项目。请使用稳定发行版,并且没必要继续 阅读了。**稳定发行版** 受过更加完整的测试,而且比其他版本更可信赖,更适宜日常的工作。稳定 发行版基本是每月更新一次。 **大部分的用户都只需要使用稳定版。** *开发* 或者 *日更新* 通道都不是稳定通道,这意味着通过这些通道发布的版本可能包含更多的bug, 或者可能无法可靠的运行。但是它们的更新速度比稳定版要快得多。 -每个人都能用免费使用 **开发发行版**。 平均看来,开发版每月发布两次。尽管它们可能还不能胜任 -每天的工作,但是这些发行版的确较为稳定的展示了接下来要发放版本的新特性。 +每个人都能用免费使用 **开发发行版**。 总的看来,开发版每月发布两次。尽管它们可能还不能完美承担 +每天的工作,但是这些发行版的确较为稳定的展示了接下来要发放的新版本特性。 -最后,使用 **日更新版** 真是站在风口浪尖上,这些发行版发布频率很高,同时也包含大量严重程度 +最后,使用 **日更新版** 真是站在悬崖峭壁旁,这些发行版发布频率很高,同时也包含大量严重程度 不一的问题。试用这些版本很好玩,但是风险请自负。需要注意的是日更新版 **只对注册用户开放** 。 diff --git a/source/index.rst b/source/index.rst index d102655..e1886df 100644 --- a/source/index.rst +++ b/source/index.rst @@ -13,7 +13,7 @@ Sublime Text非官方文档(中文翻译版) 安装 基本概念 编辑 - 搜索和替换 + 搜索和替换 //第一遍看完~ 构建系统(批处理) 文件导航与文件管理 自定义 diff --git a/source/intro.rst b/source/intro.rst index 7e1bd08..b8801dd 100644 --- a/source/intro.rst +++ b/source/intro.rst @@ -2,12 +2,12 @@ 关于本文档 ======================== -这是由ST党拥护者们维护的Sublime Text编辑器的非官方文档。希望能对你有所帮助! +这是由ST党拥护者们维护的Sublime Text编辑器的非官方文档。希望能对您有所帮助! -*sublime什么?你在说什么东西啊?* +*sublime是什么?你在说什么东西啊?* -`Sublime Text`_ 是一款为编写代码和文稿而准备的多功能编辑器。它为你做了很多重复性的工作, -从而让你的精力专注在正在编写的内容上面。重要的是,使用它你会感觉很快乐! +`Sublime Text`_ 是一款为编写代码和文稿而准备的多功能编辑器。它能为你做很多重复性的工作, +从而让你的精力更专注在编写的内容上面。更重要的是,它会给你带来愉悦感! .. _Sublime Text: http://www.sublimetext.com diff --git a/source/search_and_replace/search_and_replace.rst b/source/search_and_replace/search_and_replace.rst index ff3596e..df45f3e 100644 --- a/source/search_and_replace/search_and_replace.rst +++ b/source/search_and_replace/search_and_replace.rst @@ -10,7 +10,7 @@ Searching To open the **search panel** for buffers, press ``Ctrl + F``. Some options in the search panel and search actions can be controlled with the keyboard: -按下 ``Ctrl + F`` 键就可以打开对应当前缓冲区的 **搜索面板** 。搜索面板里的一些选项和搜索动作 +按下 ``Ctrl + F`` 键就可以打开当前缓冲区的 **搜索面板** 。搜索面板里的一些选项和搜索动作 有着对应的快捷键: ========================== =========== @@ -77,7 +77,7 @@ Other Ways of Searching in Buffers Goto Anything provides the operator ``#`` to search in the current buffer. The search term will be the part following the ``#`` operator. -可以在Goto Anything(快速跳转)面板中使用 ``#`` 操作符在当前缓冲区中进行搜索。跟在 ``#`` +可以在Goto Anything(快速跳转)(译者注:ctrl+P唤出,或者菜单栏->Goto->Goto Anything)面板中使用 ``#`` 操作符在当前缓冲区中进行搜索。跟在 ``#`` 操作符后面的内容将被识别为搜索关键字。 Other Key Bindings to Search in Buffers From c4239ab14f8021b93b72378b371bfe88da7f964f Mon Sep 17 00:00:00 2001 From: Void Main Date: Thu, 4 Apr 2013 21:13:39 +0800 Subject: [PATCH 67/79] translated key bindings part --- source/reference/key_bindings.rst | 63 ++++++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/source/reference/key_bindings.rst b/source/reference/key_bindings.rst index 88c2fcc..e3fa5de 100644 --- a/source/reference/key_bindings.rst +++ b/source/reference/key_bindings.rst @@ -1,52 +1,69 @@ ============ Key Bindings +按键绑定 ============ Key bindings map key presses to commands. +按键绑定为按键与动作建立了映射关系。 File Format +文件格式 *********** Key bindings are stored in ``.sublime-keymap`` files and defined in JSON. All key map file names need to follow this pattern: ``Default ().sublime-keymap``. Otherwise, Sublime Text will ignore them. +对于按键绑定的配置存储于后缀为 ``.sublime-keymap`` 的文件中,文件中记录的是JSON内容。所有按键绑定 +配置文件都需要按照如下模式命名: ``Default ().sublime-keymap`` 。否则,Sublime Text +将忽略这些文件。 Platform-Specific Key Maps +平台相关的键位设置 -------------------------- Each platform gets its own key map: +每一个平台都有它自己的按键配置文件: * ``Default (Windows).sublime-keymap`` * ``Default (OSX).sublime-keymap`` * ``Default (Linux).sublime-keymap`` Separate key maps exist to abide by different vendor-specific `HCI `_ guidelines. - +也有针对不同的硬件提供商指定的 `HCI `_ 指导文档准备的按键配置文件。 Structure of a Key Binding +一个按键绑定项的结构 -------------------------- Key maps are arrays of key bindings. Below you'll find valid elements in key bindings. +键位表是一个按键绑定项的数组。接下来将要解释的是按键绑定中的有效构成元素: ``keys`` An array of case-sensitive keys to be pressed. Modifiers can be specified with the ``+`` sign. Chords are built by adding elements to the array, e. g. ``["ctrl+k","ctrl+j"]``. Ambiguous chords are resolved with a timeout. + 一组大小写敏感的按键组合。可以用 ``+`` 指定修饰符。向数组中添加元素可以设置组合键,例如: + ``["ctrl+k","ctrl+j"]``。 ``command`` Name of the command to be executed. + 要执行的命令的名称。 ``args`` Dictionary of arguments to be passed to ``command``. Keys must be the names of parameters to ``command``. + 传递给 ``command`` 命令的参数字典。字典中键的名称是 ``command`` 命令的参数名称。 ``context`` Array of contexts to selectively enable the key binding. All contexts must be true for the key binding to trigger. See :ref:`context-reference` below. + 选择性控制按键绑定是否起效的上下文内容数组。只有当所有上下文都为真时,按键绑定才能被触发。 + 请参考下面的 :ref:`上下文参考` 内容来了解更多内容。 Here's an example illustrating most of the features outlined above:: +下面是一个说明上面提到的大部分特性的例子:: { "keys": ["shift+enter"], "command": "insert_snippet", "args": {"contents": "\n\t$0\n"}, "context": [ @@ -58,88 +75,116 @@ Here's an example illustrating most of the features outlined above:: } .. _context-reference: +.. _上下文参考: Structure of a Context +上下文的结构 ---------------------- ``key`` Name of a context operand to query. + 要请求的上下文操作符的名称。 ``operator`` Type of test to perform against ``key``. + 对 ``key`` 进行测试的类型。 ``operand`` Value against which the result of ``key`` is tested. + 与 ``key`` 的结果进行测试的值。 ``match_all`` Requires the test to succeed for all selections. Defaults to ``false``. + 需要多所有选择都进行测试。默认值为 ``false`` 。 Context Operands +上下文操作子 ^^^^^^^^^^^^^^^^ ``auto_complete_visible`` Returns ``true`` if the autocomplete list is visible. + 如果自动不全列表可见就返回 ``true`` 。 ``has_next_field`` Returns ``true`` if there's a next snippet field available. + 当下一个代码片段域可用时返回 ``true`` 。 ``has_prev_field`` Returns ``true`` if there's a previous snippet field available. + 当上一个代码片段域可用时返回 ``true`` 。 ``num_selections`` Returns the number of selections. + 返回当前选中的数目。 ``overlay_visible`` Returns ``true`` if any overlay is visible. + 当覆盖控件可见时返回 ``true`` 。 ``panel_visible`` Returns ``true`` if any panel is visible. + 当有面板可见时返回 ``true`` 。 ``following_text`` Restricts the test to the text following the caret. + 限制测试只对脱字号后的文本进行。 ``preceding_text`` Restricts the test to the text preceding the caret. + 限制测试只对脱字号前的文本进行。 ``selection_empty`` Returns ``true`` if the selection is an empty region. + 当没有选中内容的时候返回 ``true`` 。 ``setting.x`` Returns the value of the ``x`` setting. ``x`` can be any string. + 返回 ``x`` 设置项的值。 ``x`` 可以为任意字符串。 ``text`` Restricts the test to the selected text. + 限制测试只对选中的文本有效。 ``selector`` Returns the current scope. + 返回当前作用域。 Context Operators +上下文操作符 ^^^^^^^^^^^^^^^^^ ``equal``, ``not_equal`` Test for equality. + 测试是否相等。 ``regex_match``, ``not_regex_match`` Match against a regular expression. + 与一个正则表达式进行匹配。 ``regex_contains``, ``not_regex_contains`` Match against a regular expression (containment). + 与一个正则表达式进行匹配(检测是否包含)。 Command Mode +命令模式 ************ Sublime Text provides a ``command_mode`` setting to prevent key presses from being sent to the buffer. This is useful to emulate Vim's modal behavior. +Sublime Text提供一个称为 ``command_mode`` (命令模式)的设置项,启用这个设置可以阻止按键内容 +被送往缓冲区。这个设置项在模拟Vim的模式功能的时候很有用处。 Bindable Keys +可绑定的按键 ************* Keys may be specified literally or by name. Below you'll find the list of valid names: +按键可以通过字面值或者名字来指定。你可以在下面找到一个有效名称的列表: * ``up`` * ``down`` @@ -206,51 +251,67 @@ valid names: * ``browser_home`` Modifiers +修饰符 --------- * ``shift`` * ``ctrl`` * ``alt`` * ``super`` (Windows key, Command key…) +* ``super`` (在Windows平台为Windows键,在OS X平台为Command键……) Warning about Bindable Keys +关于可绑定按键的警告 --------------------------- If you're developing a package, keep this in mind: +如果你正在开发一个包,请谨记下面几点: * ``Ctrl+Alt+`` should not be used on any Windows key bindings. +* 在Windows平台上,不要使用 ``Ctrl+Alt+`` 进行任何键位绑定。 * ``Option+`` should not be used on any OS X key bindings. +* 在OS X平台上,不要使用 ``Option+`` 进行任何键位绑定。 In both cases, the user's ability to insert non-ascii characters would be compromised. +在以上两种情况下,用户都将在插入非ascii字符时遇到问题。 If you are the end-user, you are free to remap those key combinations. +如果你是终端用户,你可以随意重新映射这些按键组合。 Keeping Key Maps Organized +让按键映射井井有条 ************************** Sublime Text ships with default key maps under ``Packages/Default``. Other packages may include their own key map files. The recommended storage location for your personal key map is ``Packages/User``. +Sublime Text自带的按键组合存放在 ``Packages/Default`` 目录下。其他包组可以包含它们特有的按键 +映射文件。对于你自己的键位映射设置而言,推荐的文件存放地址是 ``Packages/User`` 目录。 See :ref:`merging-and-order-of-precedence` for information about how Sublime Text sorts files for merging. +请参考 :ref:`排序与优先级顺序` 以了解关于Sublime Text排序文件并进行合并的更多信息。 International Keyboards +国际化键盘 *********************** Due to the way Sublime Text maps key names to physical keys, there might be a mismatch between the two. +根据Sublime Text将按键名称与物理按键进行映射的方式,此二者在不同平台上可能有不同的配对。 Troubleshooting +常见问题解答 *************** .. TODO: fix formatting for API cross-ref. See `sublime.log_commands(flag)`_ to enable command logging. It may help when debugging key maps. +使用 `sublime.log_commands(flag)`_ 开启命令日志。这对于调试按键映射有所帮助。 .. _sublime.log_commands(flag): http://www.sublimetext.com/docs/2/api_reference.html From be81ea7e4b219c478c3001b2402e828a450c0467 Mon Sep 17 00:00:00 2001 From: Void Main Date: Thu, 4 Apr 2013 21:43:24 +0800 Subject: [PATCH 68/79] translated completions part --- source/reference/completions.rst | 51 ++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/source/reference/completions.rst b/source/reference/completions.rst index 2dda26f..68bda8a 100644 --- a/source/reference/completions.rst +++ b/source/reference/completions.rst @@ -1,29 +1,37 @@ Completions +补全 =========== Completions provide an IDE-like functionality to insert dynamic content through the completions list or by pressing :kbd:`Tab`. +补全提供了像IDE那样的使用补全列表或者 :kbd:`Tab` 键插入动态内容的功能。 File Format +文件格式 *********** Completions are JSON files with the ``.sublime-completions`` extension. +补全信息是以 ``.sublime-completions`` 作为扩展名的JSON文件。 Structure of a Completions List +补全列表的结构 ******************************* ``scope`` Determines whether the completions are to be sourced from this file. See :ref:`scopes-and-scope-selectors` for more information. + 控制补全是否应该在这个文件中发挥作用。参考 :ref:`作用域与作用域选择子` 来了解更多信息。 ``completions`` Array of completions. + 补全的数组。 Here's an excerpt from the html completions:: +下面是从html补全列表中截取出来的一部分:: { "scope": "text.html - source - meta.tag, punctuation.definition.tag.begin", - + "completions": [ { "trigger": "a", "contents": "$0" }, @@ -35,93 +43,132 @@ Here's an excerpt from the html completions:: Types of Completions +补全的类型 ******************** Plain Strings +纯文本字符串 ------------- Plain strings are equivalent to an entry where the ``trigger`` is identical to the ``contents``:: +当某个补全项 ``trigger`` 的内容与 ``contents`` 的内容完全一样的时候,纯文本字符串与这个补全项 +是等价的。 "foo" # is equivalent to: + # 等价于: { "trigger": "foo", "contents": "foo" } Trigger-based Completions +基于触发内容的补全 ------------------------- ``trigger`` Text that will be displayed in the completions list and will cause the ``contents`` to be inserted when validated. + 在补全列表中显示的文本,在被确认后,对应的 ``contents`` 内容被插入到缓冲区中。 ``contents`` Text to be inserted in the buffer. Can use snippet features. + 要插入到缓冲区中的文本。可以使用代码片段的特性。 Sources for Completions +补全的来源 *********************** These are the sources for completions the user can control: +用户可以控制的补全来源包括: * ``.sublime-completions`` * ``EventListener.on_query_completions()`` Additionally, other completions are folded into the final list: +除此之外,其他在最终补全列表中可以显示的内容包括: * Snippets * Words in the buffer + * 代码片段 + * 缓冲区中的单词 Priority of Sources for Completions +补全来源的优先级 ----------------------------------- * Snippets * API-injected completions * ``.sublime-completions`` files * Words in buffer + * 代码片段 + * 使用API插入的补全内容 + * ``.sublime-completions`` 文件 + * 缓冲区中的单词 Snippets will only be automatically completed against an exact match of their tab trigger. Other sources for completions are filtered with a case insensitve fuzzy search instead. +代码片段只有在与设置的tab触发器精确匹配时才会被插入。其他类型的补全则是使用大小写不敏感的模糊 +搜索进行匹配。 The Completions List +补全列表 ********************* To use the completions list: +要使用补全列表需要: * Press :kbd:`Ctrl+spacebar` to open * Optionally, press :kbd:`Ctrl+spacebar` again to select next entry * Press :kbd:`Enter` or :kbd:`Tab` to validate selection + * 按 :kbd:`Ctrl+空格` 来打开补全列表 + * 可选的, 再次按下 :kbd:`Ctrl+空格` 来选择下一个候选项 + * 按下 :kbd:`回车` or :kbd:`Tab` 来确认选择 .. note:: The current selection in the completions list can actually be validated with any punctuation sign that isn't itself bound to a snippet. +.. 注释:: + 补全列表中被选中的当前项可以用任何没有被绑定到代码片段触发器中的标点符号来确认插入。 Snippets show up in the completions list following the pattern: `` : ``. For the other completions, you will just see the text to be inserted. +代码片段以如下形式出现在补全列表中:`` : <名称>`` 。对于其他补全项,你只能看到要被 +插入的文本。 If the list of completions can be narrowed down to one choice, the autocomplete dialog will be bypassed and the corresponding content will be inserted straight away according to the priority rules stated above. +当补全列表被缩减到只有一个候选项时,系统就会绕开自动补全对话框,根据之前介绍的优先级,对应内容 +会被直接插入。 Enabling and Disabling Tab Completion for Completions +为补全列表启用或禁用Tab补全 ***************************************************** The ``tab_completion`` setting is ``true`` by default. Set it to ``false`` if you want :kbd:`Tab` to stop sourcing the most likely completion. This setting has no effect on triggers defined in ``.sublime-snippet`` files, so snippets will always be inserted after a :kbd:`Tab`. +``tab_completion`` 选项默认是 ``true`` 。如果你想停止 :kbd:`Tab` 键对最可能选项的索引功能, +就把这个值设置为 ``false`` 。这个设置项对定义在 ``.sublime-snippet`` 文件中的触发器没有效果, +因此按下 :kbd:`Tab` 时,代码片段一定会被插入。 With ``tab_completion`` on, The same order of priority as stated above applies, but, unlike in the case of the completions list, Sublime Text will always insert a completion, even if faced with an ambiguous choice. +当 ``tab_completion`` 选项开启的时候,上面介绍的优先级顺序仍然有效,但是,与补全列表不同的是, +Sbulime Text总会插入一个补全项,及时选择项存在模糊内容。 Inserting a Literal Tab +插入一个Tab(缩进)字符 ----------------------- If ``tab_completion`` is ``true``, you can press ``Shift+Tab`` after a prefix -to insert a literal tab character. \ No newline at end of file +to insert a literal tab character. +如果 ``tab_completion`` 值为 ``true`` ,你可以使用 ``Shift+Tab`` 来插入一个缩进字符。 From 8203094e6bafa06e24ba805d1d19b34ced55b95a Mon Sep 17 00:00:00 2001 From: Void Main Date: Sun, 7 Apr 2013 17:52:04 +0800 Subject: [PATCH 69/79] Translated commands part in reference --- source/index.rst | 2 +- source/reference/build_systems.rst | 16 ++-- source/reference/commands.rst | 132 +++++++++++++++++++++++++++++ 3 files changed, 141 insertions(+), 9 deletions(-) diff --git a/source/index.rst b/source/index.rst index e1886df..913cfcf 100644 --- a/source/index.rst +++ b/source/index.rst @@ -19,7 +19,7 @@ Sublime Text非官方文档(中文翻译版) 自定义 可扩展性与自动化(尚未翻译) 命令行 - 参考内容(尚未翻译) + 参考内容 词汇表 .. Indices and tables diff --git a/source/reference/build_systems.rst b/source/reference/build_systems.rst index 0363aef..bbd8f0e 100644 --- a/source/reference/build_systems.rst +++ b/source/reference/build_systems.rst @@ -84,7 +84,7 @@ Sublime Text command. Optional. Regular expression (Perl-style) to capture error output of ``cmd``. See the next section for details. - + ``file_regex`` 可选。 Perl格式的正则表达式可以获取``cmd``的错误输出,详情参考下一节 @@ -106,7 +106,7 @@ Sublime Text command. Sublime Text uses this scope selector to find the appropriate build system for the active view. -``selector`` +``selector`` 可选。在选定 **Tools | Build System | Automatic** 时使用。Sublime Text使用这个 选择器自动为活动试图选择构建系统。 @@ -137,7 +137,7 @@ Sublime Text command. 可选。运行的Sublime Text命令,缺省为``exec`` (*Packages/Default/exec.py*)。该命令从 *.build-system*中获取配置数据。 - 用来替代缺省的构建系统命令。注意,如果你希望替代构建系统的缺省命令,请在*.sublime-build* + 用来替代缺省的构建系统命令。注意,如果你希望替代构建系统的缺省命令,请在*.sublime-build* 文件中专门设置。 @@ -156,7 +156,7 @@ Sublime Text command. Optional. If ``true``, ``cmd`` will be run through the shell (``cmd.exe``, ``bash``\ …). ``shell`` - 可选。如果该选项为``true`` ,``cmd``则可以通过shell运行。 + 可选。如果该选项为``true`` ,``cmd``则可以通过shell运行。 ``path`` Optional. This string will replace the current process' :const:`PATH` before @@ -238,7 +238,7 @@ platform-specific data in the build system. Here's an example:: In this case, ``ant`` will be executed for every platform except Windows, where ``ant.bat`` will be used instead. -在这个例子中,``ant``在除了Windows之外的平台中都是执行 ant ,而在Windows中则执行 +在这个例子中,``ant``在除了Windows之外的平台中都是执行 ant ,而在Windows中则执行 ``ant.bat`` 构建系统备选项 @@ -275,7 +275,7 @@ in the Command Palette whenever the build system was active. 根据以上的设定,按 *Ctrl + B* 会运行*date*命令, 按 *Crtl + Shift + B* 会运行Python 解释器,并且在构建系统激活时将剩余的备选项显示在Command Palette中。 -.. _build-system-variables: +.. _构建系统变量: 构建系统变量 ********************** @@ -316,7 +316,7 @@ This will emit the name of the current project if there is one, otherwise ``Defa This will emit the full path of the current file, replacing *.php* with *.txt*. -该例会获取当前文件的完整路径,并用*.txt*替换路径中的*.php* +该例会获取当前文件的完整路径,并用*.txt*替换路径中的*.php* 运行构建系统 ********************* @@ -360,7 +360,7 @@ build system is running. After that, the old :const:`PATH` will be restored. 另外,你也可以在 *.sublime-build* 文件中设定 ``path`` 来替代:const:`PATH` ,并在 ``path`` 指定的路径中查找 ``cmd`` 可执行文件。新设定的值,仅在构建系统运行期间有效,过后将会恢复为原始的 - :const:`PATH` + :const:`PATH` .. seealso:: diff --git a/source/reference/commands.rst b/source/reference/commands.rst index 6396d3c..cc5f072 100644 --- a/source/reference/commands.rst +++ b/source/reference/commands.rst @@ -1,62 +1,86 @@ Commands +命令 ******** Overview +概览 ======== .. named actions, used everywhere, take json arguments This list of commands is a work in progress. +对命令列表的整理仍在进行中。 About Paths in Command Arguments +关于命令参数中的路径信息 ================================ Some commands take paths as parameters. Among these, some support snippet-like syntax, while others don't. A command of the first kind would take a parameter like *${packages}/SomeDir/SomeFile.Ext* whereas a command of the second kind would take a parameter like *Packages/SomeDir/SomeFile.Ext*. +有些命令把路径作为参数。这些命令中,有些支持代码片段那样的语法,有些则不支持。第一中类型的命令 +可以接受类似 *${packages}/SomeDir/SomeFile.Ext* 这样的参数,而第二种类型的命令可以接受类似 +*Packages/SomeDir/SomeFile.Ext* 这样的参数。 Generally, newer commands support the snippet-like syntax. +大体上来说,较新引入的命令支持类似代码片段的语法。 Often, relative paths in arguments to commands are assumed to start at the ``Data`` directory. +通常情况下,认为命令参数中的相对路径是相对与 ``数据`` 目录来说的。 Variables in Paths as Arguments +参数中路径包含的变量 ------------------------------- The same variables available to build systems are expanded in arguments to commands. See :ref:`build-system-variables` for more information. +构建系统中使用的变量在参数中也可以使用。参考 :ref:`构建系统变量` 来了解更多信息。 Commands +命令列表 ======== **build** Runs a build system. + 运行某个构件系统。 - **variant** [String]: Optional. The name of the variant to be run. + - **variant** [String]: 可选参数。要运行配置的名称。 **run_macro_file** Runs a *.sublime-macro* file. + 运行一个 *.sublime-macro* 文件。 - **file** [String]: Path to the macro file. + - **file** [String]: 宏文件路径。 **insert_snippet** Inserts a snippet from a string or *.sublime-snippet* file. + 从字符串或者 *.sublime-snippet* 文件中插入一个代码片段。 - **contents** [String]: Snippet as a string to be inserted. + - **contents** [String]: 要插入的代码片段的字符串内容。 - **name** [String]: Path to the *.sublime-snippet* file to be inserted. + - **name** [String]: 要插入的 *.sublime-snippet* 文件的路径。 **insert** Inserts a string. + 插入一个字符串。 - **characters** [String]: String to be inserted. + - **characters** [String]: 要插入的字符串内容。 **move** Advances the caret by predefined units. + 根据指定的单位移动光标。 - **by** [Enum]: Values: *characters*, *words*, *word_ends*, *subwords*, *subword_ends*, *lines*, *pages*, *stops*. + - **by** [Enum]: 可选值: *characters*, *words*, *word_ends*, *subwords*, *subword_ends*, *lines*, *pages*, *stops* 。 - **forward** [Bool]: Whether to advance or reverse in the buffer. + - **forward** [Bool]: 在缓冲区中向前或向后移动。 - **word_begin** [Bool] - **empty_line** [Bool] - **punct_begin** [Bool] @@ -64,267 +88,362 @@ Commands **move_to** Advances the caret to predefined locations. + 将光标移动到指定位置。 - **to** [Enum]: Values: *bol*, *eol*, *bof*, *eof*, *brackets*. + - **to** [Enum]: 可选值: *bol*, *eol*, *bof*, *eof*, *brackets*. - **extend** [Bool]: Whether to extend the selection. Defaults to ``false``. + - **extend** [Bool]: 是否扩展选择内容。默认值是 ``false`` 。 **new_window** Opens a new window. + 打开一个新的窗口。 **close_window** Closes the active window. + 关闭当前活跃窗口。 **switch_file** Switches between two files with the same name and different extensions. + 在有相同文件名、不同扩展名的两个文件之间进行切换。 - **extensions** [[String]]: Extensions (without leading dot) for which switching will be enabled. + - **extensions** [[String]]: 切换可以发生的文件扩展名(不包括点号)。 **close** Closes the active view. + 关闭当前视图。 **close_file** Closes the active view and, under certain circumsances, the whole application. + 关闭当前视图,在某些情况下关闭整个应用程序。 XXX Sounds kinda wrong. + XXX 看上去好像不对。 **toggle_sidebar** Shows or hides the sidebar. + 开启或关闭侧边栏。 **toggle_full_screen** Toggles full screen mode on or off. + 开启或退出全屏模式。 **toggle_distraction_free** Toggles distraction free mode on or off. + 开启或退出免打扰模式。 **left_delete** Deletes the character right before the caret. + 删除光标前的那个字符。 **right_delete** Deletes the character right after the caret. + 删除光标后的那个字符。 **undo** Undoes the latest action. + 撤销上次操作。 **redo** Reapplies the latest undone action. + 重做上次撤销的操作。 **redo_or_repeat** Performs the latest action again. + 再次执行上次的动作。 **soft_undo** Undoes each action stepping through granular edits. + 先移动到编辑位置再进行撤销操作。 **soft_redo** Redoes each action stepping through granular edits. + 先移动到编辑位置再进行重做操作。 **cut** Removes the selected text and sends it to the system clipboard. Put differently, it cuts. + 把当前选中的文字从缓冲区中移除,并送到系统剪贴板中。换句话说,执行剪切操作。 **copy** Sends the selected text to to the system clipboard. + 把当前选中的文字送到系统剪贴板中。 **paste** Inserts the clipboard contents after the caret. + 把剪贴板中的内容插入到光标后。 **paste_and_indent** Inserts the clipboard contents after the caret and indents contextually. + 把剪贴板中的内容插入到光标后同时根据上下文进行缩进。 **select_lines** Adds a line to the current selection. + 在当前选择的内容中添加一行。 - **forward** [Bool]: Whether to add the next or previous line. Defaults to ``true``. + - **forward** [Bool]: 添加下一行还是上一行。默认值是 ``true`` 。 **scroll_lines** Scrolls lines in the view. + 在视图中滚动行。 - **amount** [Float]: Positive values scroll lines down and negative values scroll lines up. + - **amount** [Float]: 正值向下滚动,负值向上滚动。 **prev_view** Switches to the previous view. + 切换到上一个视图。 **next_view** Switches to the next view. + 切换到下一个视图。 **next_view_in_stack** Switches to the most recently active view. + 切换到最近的活跃视图。 **previous_view_in_stack** Switches to the view that was active before the most recently active view. I don't think this is very clear or even true. + 切换到最近活跃视图的前一个活跃视图。我不认为这种说法非常确切,这么说甚至是不正确的。 **select_all** Select the view's content. + 选择视图的全部内容。 **split_selection_into_lines** Unsurprisingly, it splits the selection into lines. + 不出所料的,把当前的选择切散成不同行。 **single_selection** Collapses multiple selections into a single selection. + 把多重选择整合成单一选择。 **clear_fields** Breaks out of the active snippet field cycle. + 跳出活跃代码片段域的选择。 **hide_panel** Hides the active panel. + 隐藏当前活跃面板。 - **cancel** [Bool]: Notifies the panel to restore the selection to what it was when the panel was opened. (Only incremental find panel.) + - **cancel** [Bool]: 当面板打开的时候恢复它之前选择的内容。(仅对增量搜索面板有效。) **hide_overlay** Hides the active overlay. Show the overlay using the show_overlay command. + 隐藏覆盖控件。使用 show_overlay 命令打开覆盖控件。 **hide_auto_complete** Hides the auto complete list. + 隐藏自动补全列表。 **insert_best_completion** Inserts the best completion that can be inferred from the current context. XXX Probably useless. XXX + 插入根据当前上下文能推断出的最佳补全内容。 XXX 可能没什么用。 XXX - **default** [String]: String to insert failing a best completion. + - **default** [String]: 当没有找到最佳补全内容时插入的字符串。 **replace_completion_with_next_completion** XXX Useless for users. XXX + XXX 对用户来说没什么用。 XXX **reindent** XXX ??? XXX + (译者注:重新进行缩进操作,常用于整理文件缩进。) + **indent** Increments indentation. + 增加缩进。 **next_field** Advances the caret to the text snippet field in the current snippet field cycle. + 将光标移动到下一个代码片段中的可修改区域。 **prev_field** Moves the caret to the previous snippet field in the current snippet field cycle. + 将光标移动到上一个代码片段中的可修改区域。 **commit_completion** Inserts into the buffer the item that's currently selected in the auto complete list. XXX Probably not useful for users. XXX + 向缓冲区中插入自动补全列表中当前选中项的内容。 XXX 对用户来说没很么用。 XXX + **unindent** Unindents. + 取消缩进。 **toggle_overwrite** Toggles overwriting on or off. + 开启关闭覆盖插入选项。 **expand_selection** Extends the selection up to predifined limits. + 将选择内容扩展到预定义的边界。 - **to** [Enum]: Values: bol, hardbol, eol, hardeol, bof, eof, brackets, line. + - **to** [Enum]: 可选值: bol, hardbol, eol, hardeol, bof, eof, brackets, line. **find_under_expand** Adds a new selection based on the current selection or expands the selection to the current word. + 根据当前选中的内容增加一个新的选择或者把选择项扩展到当前单词。 **close_tag** Surrounds the current inner text with the appropiate tags. + 为当前内部文本添加适当的标签。 **toggle_record_macro** Starts or stops the macro recorder. + 开始或关闭宏录制器。 **run_macro** Runs the macro stored in the macro buffer. + 运行宏缓冲区中存储的宏脚本。 **show_overlay** Shows the requested overlay. Use the **hide_overlay** command to hide it. + 显示请求的覆盖控件。使用 **hide_overlay** 命令来隐藏覆盖控件。 - **overlay** [Enum]: The type of overlay to show. Possible values: + 要显示的覆盖控件的类型。可选值: - *goto*: Show the `Goto Anything `_ overlay. + - *goto*: 显示 `Goto Anything(快速跳转) `_ 覆盖控件。 - *command_palette*: Show the `command palette `_. + - *command_palette*: 显示 `命令面板 `_. - **show_files** [Bool]: If using the goto overlay, start by displaying files rather than an empty widget. + - **show_files** [Bool]: 如果显示快速跳转面板,开始的时候显示文件列表,而不是显示一个空的控件。 - **text** [String]: The initial contents to put in the overlay. + - **text** [String]: 放到覆盖控件中的初始值。 **show_panel** Shows a panel. + 显示面板。 - **panel** [Enum]: Values: incremental_find, find, replace, find_in_files, console + - **panel** [Enum]: 可选值: incremental_find, find, replace, find_in_files, console - **reverse** [Bool]: Whether to search backwards in the buffer. + - **reverse** [Bool]: 在缓冲区中是否后向搜索内容。 - **toggle** [Bool]: Whether to hide the panel if it's already visible. + - **toggle** [Bool]: 当面板已经可见时,是否隐藏面板。 **find_next** Finds the next occurrence of the current search term. + 找到当前搜索内容的下一个匹配项。 **find_prev** Finds the previous occurrence of the current search term. + 找到当前搜索内容的上一个匹配项。 **find_under** Finds the next occurrence of the current selection or the current word. + 找到与当前选中内容或光标所在位置档次匹配的下一个内容。 **find_under_prev** Finds the previous occurrence of the current selection or the current word. + 找到与当前选中内容或光标所在位置档次匹配的上一个内容。 **find_all_under** Finds all occurrences of the current selection or the current word. + 选中与当前选择内容或光标所在位置单词匹配的所有内容。 **slurp_find_string** Copies the current selection or word into the "find" field of the find panel. + 复制当前选中内容或当前单词到搜索面板中的 "find" 域。 **slurp_replace_string** Copies the current selection or word into the "replace" field of the find and replace panel. + 复制当前选中内容或当前单词到搜索域替换面板中的 "replace" 域。 **next_result** Advance to the next captured result. + 移动到下一个搜索到的结果。 **prev_result** Move to the previous captured result. + 移动到上一个搜索到的结果。 **toggle_setting** Toggles the value of a boolean setting. + 修改布尔型设置项的值。 - **setting** [String]: The name of the setting to be toggled. + - **setting** [String]: 要修改的设置项的名称。 **next_misspelling** Advance to the next misspelling + 移动到下一个错误拼写的单词的位置。 **prev_misspelling** Move to the previous misspelling. + 移动到上一个错误拼写的单词的位置。 **swap_line_down** Swaps the current line with the line below. + 交换当前行与下一行。 **swap_line_up** Swaps the current line with the line above. + 交换当前行与上一行。 **toggle_comment** Comments or uncomments the active lines. + 为当前行添加或取消注释。 - **block** [Bool]: Whether to use a block comment. + - **block** [Bool]: 是否使用块注释。 **join_lines** Joins the current line with the next one. + 把当前行与下一行连接起来。 **duplicate_line** Duplicates the current line. + 重复当前行内容。 **auto_complete** Opens the auto comeplete list. + 打开自动补全列表。 **replace_completion_with_auto_complete** XXX Useless for users. XXX + XXX 对用户来说没什么用。 XXX **show_scope_name** Shows the name for the caret's scope in the status bar. + 在状态栏中显示光标所在作用域的名称。 **exec** Runs an external process asynchronously. + 异步运行一个外部进程。 XXX Document all options. + XXX 为所有选项添加文档。 **transpose** Makes stuff dance. + 移动内容。 **sort_lines** Sorts lines. + 对行进行排序。 - **case_sensitive** [Bool]: Whether the sort should be case sensitive. + - **case_sensitive** [Bool]: 排序时是否考虑大小写。 **set_layout** XXX @@ -340,30 +459,39 @@ Commands **next_bookmark** Select the next bookmarked region. + 选择下一个被标记的区域。 **prev_bookmark** Select the previous bookmarked region. + 选择上一个被书签标记的区域。 **toggle_bookmark** Sets or unsets a bookmark for the active region(s). (Bookmarks can be accessed via the regions API using ``"bookmarks"`` as the key.) + 对活跃区域设置书签或取消书签。(在区域API中使用 ``"bookmarks"`` 作为键可以访问书签内容。) **clear_bookmarks** Removes all bookmarks. + 清楚所有书签。 **select_all_bookmarks** Selects all bookmarked regions. + 选择所有被书签标记过的区域。 **wrap_lines** Wraps lines. By default, it wraps lines at the first ruler's column. + 环绕行。默认情况下,在第一个标尺所在的列进行环绕。 - **width** [Int]: Specifies the column at which lines should be wrapped. + - **width** [Int]: 设置环绕开始的列坐标。 **upper_case** Makes the selection upper case. + 把选择的内容改成大写。 **lower_case** Makes the selection lower case. + 把选择的内容改成小写。 **set_mark** XXX @@ -385,9 +513,11 @@ Commands **increase_font_size** Increases the font size. + 增加字体大小。 **decrease_font_size** Decreases the font size. + 较少字体大小。 **fold** XXX @@ -400,6 +530,8 @@ Commands **context_menu** Shows the context menu. + 显示上下文菜单。 .. Some regex-related and search-related commands missing. they don's seem to .. be too useful. +.. 这里没有列出一些与正则表达式相关或与搜索相关的命令。这些命令看起来没有太大用处。 From 8cd2b73bd1dd8084ff7b7bc869df03c770660425 Mon Sep 17 00:00:00 2001 From: tonyhty Date: Thu, 11 Apr 2013 19:46:08 +0800 Subject: [PATCH 70/79] tonyhty command_palette, snippets --- source/extensibility/command_palette.rst | 125 +++++++++++++---------- source/extensibility/snippets.rst | 78 ++++++++++++++ 2 files changed, 149 insertions(+), 54 deletions(-) diff --git a/source/extensibility/command_palette.rst b/source/extensibility/command_palette.rst index a3508ca..81f3a86 100644 --- a/source/extensibility/command_palette.rst +++ b/source/extensibility/command_palette.rst @@ -1,54 +1,71 @@ -=============== -Command Palette -=============== - -.. seealso:: - - :doc:`Reference for Command Palette <../reference/command_palette>` - Complete documentation on the command palette options. - - -Overview -======== - -The *command palette* is an interactive list bound to :kbd:`Ctrl+Shift+P` whose -purpose is to execute commands. The command palette is fed entries with -commands files. Usually, commands that don't warrant creating a key binding of -their own are good candidates for inclusion in a ``.sublime-commands`` file. - - -File Format (Commands Files) -============================ - -Commands files use JSON and have the ``.sublime-commands`` extension. - -Here's an excerpt from ``Packages/Default/Default.sublime-commands``:: - - [ - { "caption": "Project: Save As", "command": "save_project_as" }, - { "caption": "Project: Close", "command": "close_project" }, - { "caption": "Project: Add Folder", "command": "prompt_add_folder" }, - - { "caption": "Preferences: Default File Settings", "command": "open_file", "args": {"file": "${packages}/Default/Base File.sublime-settings"} }, - { "caption": "Preferences: User File Settings", "command": "open_file", "args": {"file": "${packages}/User/Base File.sublime-settings"} }, - { "caption": "Preferences: Default Global Settings", "command": "open_file", "args": {"file": "${packages}/Default/Global.sublime-settings"} }, - { "caption": "Preferences: User Global Settings", "command": "open_file", "args": {"file": "${packages}/User/Global.sublime-settings"} }, - { "caption": "Preferences: Browse Packages", "command": "open_dir", "args": {"dir": "$packages"} } - ] - -``caption`` - Text for display in the command palette. -``command`` - Command to be executed. -``args`` - Arguments to pass to ``command``. - - -How to Use the Command Palette -============================== - -#. Press :kbd:`Ctrl+Shift+P` -#. Select command - -The command palette filters entries by context, so whenever you open it, you -won't always see all the commands defined in every ``.sublime-commands`` file. +=============== +Command Palette +������� +=============== + +.. seealso:: +������Ϣ��ο��� + + :doc:`Reference for Command Palette <../reference/command_palette>` + Complete documentation on the command palette options. + :doc:`�������ο��ĵ� <../reference/command_palette>` + �й��������ѡ��������ĵ��� + + +Overview +���� +======== + +The *command palette* is an interactive list bound to :kbd:`Ctrl+Shift+P` whose +purpose is to execute commands. The command palette is fed entries with +commands files. Usually, commands that don't warrant creating a key binding of +their own are good candidates for inclusion in a ``.sublime-commands`` file. +*�������*��һ���󶨵�����`Ctrl+Shift+P`�Ľ����б�����Ŀ������ִ������������ +�������ļ��໥��ϵ��ͨ���������֤����һ�������󶨣�������``.sublime-commands`` +����ΪһЩ�ܺõĺ�ѡ�� + +File Format (Commands Files) +�ļ���ʽ�������ļ��� +============================ + +Commands files use JSON and have the ``.sublime-commands`` extension. +�����ļ�ʹ��JSON��������һ��``.sublime-commands``����չ�� + +Here's an excerpt from ``Packages/Default/Default.sublime-commands``:: +���������� ``Packages/Default/Default.sublime-commands`` ��ʵ��:: + + [ + { "caption": "Project: Save As", "command": "save_project_as" }, + { "caption": "Project: Close", "command": "close_project" }, + { "caption": "Project: Add Folder", "command": "prompt_add_folder" }, + + { "caption": "Preferences: Default File Settings", "command": "open_file", "args": {"file": "${packages}/Default/Base File.sublime-settings"} }, + { "caption": "Preferences: User File Settings", "command": "open_file", "args": {"file": "${packages}/User/Base File.sublime-settings"} }, + { "caption": "Preferences: Default Global Settings", "command": "open_file", "args": {"file": "${packages}/Default/Global.sublime-settings"} }, + { "caption": "Preferences: User Global Settings", "command": "open_file", "args": {"file": "${packages}/User/Global.sublime-settings"} }, + { "caption": "Preferences: Browse Packages", "command": "open_dir", "args": {"dir": "$packages"} } + ] + +``caption`` + Text for display in the command palette. + ��ʾ����������еı���. +``command`` + Command to be executed. + ��ִ�е�����. +``args`` + Arguments to pass to ``command``. + ���� ``command`` �IJ����� + +How to Use the Command Palette +���ʹ��������� +============================== + +#. Press :kbd:`Ctrl+Shift+P` +#. ���¼��̵�`Ctrl+Shift+P` +#. Select command +#. ѡ������ + +The command palette filters entries by context, so whenever you open it, you +won't always see all the commands defined in every ``.sublime-commands`` file. +�������ͨ���ı�����ѡ���������ʲôʱ��򿪣��㶼���ῴ��ÿһ��``.sublime-commands`` +�ļ���������� \ No newline at end of file diff --git a/source/extensibility/snippets.rst b/source/extensibility/snippets.rst index 5643eef..e8c6b0e 100644 --- a/source/extensibility/snippets.rst +++ b/source/extensibility/snippets.rst @@ -1,26 +1,37 @@ Snippets +代码片段 ======== Whether you are coding or writing the next vampire best-seller, you're likely to need certain short fragments of text again and again. Use snippets to save yourself tedious typing. Snippets are smart templates that will insert text for you and adapt it to their context. +无论你是在敲代码还是撰写你的大作,你都会一遍一遍地写到一些小的重复片段。使用代码片段 +保存这些冗长的部分。是一种很聪明的模板,它会根据你输入的上下文帮助你添加文本。 To create a new snippet, select **Tools | New Snippet…**. Sublime Text will present you with an skeleton for a new snippet. +要新建一个代码片段,选择目录 **Tools | New Snippet…**。Sublime Text会介绍给你一个 +框架来新建一个代码片段。 Snippets can be stored under any package's folder, but to keep it simple while you're learning, you can save them to your ``Packages/User`` folder. +代码片段可以存储在任何一个包文件下,为了在你学习时方便,你可以将其保存在你的 +目录``Packages/User``下。 Snippets File Format +代码片段文件格式 ******************** Snippets typically live in a Sublime Text package. They are simplified XML files with the extension ``sublime-snippet``. For instance, you could have a ``greeting.sublime-snippet`` inside an ``Email`` package. +代码片段一般保存在Sublime Text的包里。这里使用了扩展``sublime-snippet``简化XML的 +文件。比如,你可以在包``Email``里保存``greeting.sublime-snippet``。 The structure of a typical snippet is as follows (including the default hints Sublime Text inserts for your convenience): +典型的代码片段的结构如下(包括Sublime Text为方便你使用添加的默认提示): .. code-block:: xml @@ -37,72 +48,109 @@ Sublime Text inserts for your convenience): The ``snippet`` element contains all the information Sublime Text needs in order to know *what* to insert, *whether* to insert it and *when*. Let's see all of these parts in turn. +元素``snippet``包括Sublime Text需要的所有信息,以获取需要添加什么,是否添加以及 +什么情况下。接下来我们看一下每一个部分。 ``content`` The actual snippet. Snippets can range from simple to fairly complex templates. We'll look at examples of both later. + 实际的代码片段。代码片段可以包括从最简单到相当复杂的模板。接下来,我们会看到 + 它们的例子。 Keep the following in mind when writing your own snippets: + 在编写你自己的代码片段时,你要记住以下内容: - If you want the get a literal ``$``, you have to escape it like this: ``\$``. + - 如果你想输入``$``,你需要按照方式如下转义:``\$``。 - When writing a snippet that contains indentation, always use tabs. The tabs will be transformed into spaces when the snippet is inserted if the option ``translateTabsToSpaces`` is set to ``true``. + - 如果代码片段包括缩进,一般使用tab。选项``translateTabsToSpaces``为真时, + 代码片段添加的tab会自动转换成空格。 The ``content`` must be included in a ```` section. Snippets won't work if you don't do this! + 标签``content``必须包含在块````中。如果不这么写,代码片段 + 可不好用哦~ ``tabTrigger`` Defines the sequence of keys you will press to insert this snippet. The snippet will kick in as soon as you hit the :kbd:`Tab` key after typing this sequence. + 定义你在需要添加代码片段时按下的按键序列。在你按下按键序列后,再按下键盘上的`Tab` + 键,代码片段才会生效。 A tab trigger is an implicit key binding. + tab触发器是一个隐式的按键绑定。 ``scope`` Scope selector determining the context where the snippet will be active. See :ref:`scopes-and-scope-selectors` for more information. + 作用域选择子决定了代码片段在哪个范围内生效。 + 详情请看:ref:`scopes-and-scope-selectors`。 ``description`` Used when showing the snippet in the Snippets menu. If not present, Sublime Text defaults to the name of the snippet. + 在代码片段目录显示代码片段时使用。如果没显示,Sublime Text默认使用代码片段名。 With this information, you can start writing your own snippets as described in the next sections. +根据之前的信息,现在可以开始按照下面的章节写自己的代码片段了。 .. note:: +注释: In the interest of brevity, we're only including the ``content`` element's text in examples unless otherwise noted. + 为了简洁,除非另外说明,这里的例子中只包含``content``元素。 Snippet Features +代码片段特性 **************** Environment Variables +环境变量 --------------------- Snippets have access to contextual information in the form of environment variables. Sublime Text sets the values of the variables listed below automatically. +代码片段根据环境变量获得上下文信息。Sublime Text会自动设定下面所述的变量值。 You can also add your own variables to provide extra information. These custom variables are defined in ``.sublime-options`` files. +你也可以加上自己的变量来提供额外的信息。这些自定义变量都在文件``.sublime-options`` +中定义。 ====================== ==================================================================================== **$PARAM1, $PARAM2…** Arguments passed to the ``insert_snippet`` command. (Not covered here.) +**$PARAM1, $PARAM2…** 传递给 ``insert_snippet`` 命令的各个参数。 **$SELECTION** The text that was selected when the snippet was triggered. +**$SELECTION** 代码片段被触发的时候选中的文本内容。 **$TM_CURRENT_LINE** Content of the line the cursor was in when the snippet was triggered. +**$TM_CURRENT_LINE** 代码片段被触发的时候光标所在行的内容。 **$TM_CURRENT_WORD** Current word under the cursor when the snippet was triggered. +**$TM_CURRENT_WORD** 代码片段被触发的时候光标所在的单词。 **$TM_FILENAME** File name of the file being edited including extension. +**$TM_FILENAME** 正在编辑的文件名称,包含文件扩展名。 **$TM_FILEPATH** File path to the file being edited. +**$TM_FILEPATH** 正在编辑的文件的文件路径。 **$TM_FULLNAME** User's user name. +**$TM_FULLNAME** 用户的用户名。 **$TM_LINE_INDEX** Column the snippet is being inserted at, 0 based. +**$TM_LINE_INDEX** 插入代码片段的列的位置,位置是从0开始计数的。 **$TM_LINE_NUMBER** Row the snippet is being inserted at, 1 based. +**$TM_LINE_NUMBER** 插入代码片段的行的位置,位置是从1开始计数的。 **$TM_SELECTED_TEXT** An alias for **$SELECTION**. +**$TM_SELECTED_TEXT** 与 ``$SELECTION`` 是等价的。 **$TM_SOFT_TABS** ``YES`` if ``translate_tabs_to_spaces`` is true, otherwise ``NO``. +**$TM_SOFT_TABS** 当 ``translateTabsToSpaces`` 选项是真的时候,值是 ``YES`` ,否则为 ``NO`` 。 **$TM_TAB_SIZE** Spaces per-tab (controlled by the ``tab_size`` option). +**$TM_TAB_SIZE** tab对应的空格数(受 ``tabSize`` 选项的控制)。 ====================== ==================================================================================== Let's see a simple example of a snippet using variables: +接下来,我们看一个使用变量的简单的例子: .. code-block:: perl @@ -123,11 +171,14 @@ Let's see a simple example of a snippet using variables: Fields +字域 ------ With the help of field markers, you can cycle through positions within the snippet by pressing the :kbd:`Tab` key. Fields are used to walk you through the customization of a snippet once it's been inserted. +有了字域标记,你可以通过在代码片段中的某一位置按下键盘的`Tab`键来循环。一旦添加 +了代码片段,字域可以通过自定义的信息帮助你走查。 .. code-block:: perl @@ -140,16 +191,23 @@ If you press :kbd:`Tab` a second time, it will advance to ``$2``, etc. You can a move backwards in the series with :kbd:`Shift+Tab`. If you press :kbd:`Tab` after the highest tab stop, Sublime Text will place the cursor at the end of the snippet's content so that you can resume normal editing. +上面的例子中,当你按下一次键盘`Tab`键时,光标会跳转到``$1``。当你连续按下`Tab`两次是,会跳转 +到``$2``等等。你也可以按下键盘的`Shift+Tab`键后退。如果你在最高制表位按下`Tab`键,Sublime Text +会将光标停留在代码片段内容的末尾,以便你可以重新开始编辑。 If you want to control where the exit point should be, use the ``$0`` mark. +如果你想控制退出点的位置,你可以使用``$0``标记。 You can break out of the field cycle any time by pressing :kbd:`Esc`. +你可以通过按下键盘的`Esc`键跳出字域循环。 Mirrored Fields +镜像字域 --------------- Identical field markers mirror each other: when you edit the first one, the rest will be populated with the same value in real time. +相同的字域标记会相互映射:当你输入了第一个,剩下的立刻填充相同的值。 .. code-block:: perl @@ -159,13 +217,17 @@ will be populated with the same value in real time. User name: $1 In this example, "User name" will be filled out with the same value as "First Name". +这个例子中,"User name"会填充"First Name"的值。 Place Holders +占位符 ------------- By expanding the field syntax a little bit, you can define default values for a field. Place holders are useful when there's a general case for your snippet but you still want to keep its customization convenient. +通过扩展一些字域的语法,你可以为每一个域设定默认值。如果在你的代码片段里需要设定 +一个一般的情况,你又希望不失去自定义的便捷,占位符是非常有用的。 .. code-block:: perl @@ -175,6 +237,7 @@ but you still want to keep its customization convenient. User name: $1 Variables can be used as place holders: +变量也可以用作占位符: .. code-block:: perl @@ -184,45 +247,60 @@ Variables can be used as place holders: User name: ${4:$TM_FULLNAME} And you can nest place holders within other place holders too: +你也可以在其他的占位符里嵌套占位符: .. code-block:: perl Test: ${1:Nested ${2:Placeholder}} Substitutions +替换 ------------- .. WARNING:: +.. 警告:: This section is a draft and may contain inaccurate information. + 这部分是一个草稿,可能会有不准确的内容。 In addition to the place holder syntax, tab stops can specify more complex operations with substitutions. Use substitutions to dynamically generate text based on a mirrored tab stop. +除了占位符语法,制表符的设置可以使用替换设定更多复杂的操作。使用替换可以根据映射的制表符 +设置动态地生成文本。 The substitution syntax has the following syntaxes: +替换的语法如下: - ``${var_name/regex/format_string/}`` - ``${var_name/regex/format_string/options}`` **var_name** The variable name: 1, 2, 3… + 变量名:1, 2, 3… **regex** Perl-style regular expression: See the `Boost library reference for regular expressions `_. + Perl风格的正则表达式:关于`正则表达式 `_ ,请参考Boost库的文档。 **format_string** See the `Boost library reference for format strings `_. + 参考Boost库文档的 `格式字符串 `_ 内容。 **options** Optional. May be any of the following: + 可选的。可以选择下面的任何一个: **i** Case-insensitive regex. + 忽略大小写敏感的正则。 **g** Replace all occurrences of ``regex``. + 替换所有匹配 ``regex`` 的内容。 **m** Don't ignore newlines in the string. + 在字符串中不要忽略换行符。 With substitutions you can, for instance, underline text effortlessly: +有了替换,比如,你可以如此简单地添加文本下划线: .. code-block:: perl From 30ea2d568a82a2ecfdb4f7a5dc4ad13bc861cc0d Mon Sep 17 00:00:00 2001 From: tonyhty Date: Thu, 11 Apr 2013 20:02:44 +0800 Subject: [PATCH 71/79] recommit command_palette --- source/extensibility/command_palette.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/extensibility/command_palette.rst b/source/extensibility/command_palette.rst index 81f3a86..a4d463b 100644 --- a/source/extensibility/command_palette.rst +++ b/source/extensibility/command_palette.rst @@ -20,8 +20,8 @@ The *command palette* is an interactive list bound to :kbd:`Ctrl+Shift+P` whose purpose is to execute commands. The command palette is fed entries with commands files. Usually, commands that don't warrant creating a key binding of their own are good candidates for inclusion in a ``.sublime-commands`` file. -*�������*��һ���󶨵�����`Ctrl+Shift+P`�Ľ����б�����Ŀ������ִ������������ -�������ļ��໥��ϵ��ͨ���������֤����һ�������󶨣�������``.sublime-commands`` +*�������*��һ���󶨵����� `Ctrl+Shift+P` �Ľ����б�����Ŀ������ִ������������ +�������ļ��໥��ϵ��ͨ���������֤����һ�������󶨣������� ``.sublime-commands`` ����ΪһЩ�ܺõĺ�ѡ�� File Format (Commands Files) @@ -29,7 +29,7 @@ File Format (Commands Files) ============================ Commands files use JSON and have the ``.sublime-commands`` extension. -�����ļ�ʹ��JSON��������һ��``.sublime-commands``����չ�� +�����ļ�ʹ��JSON��������һ�� ``.sublime-commands`` ����չ�� Here's an excerpt from ``Packages/Default/Default.sublime-commands``:: ���������� ``Packages/Default/Default.sublime-commands`` ��ʵ��:: @@ -67,5 +67,5 @@ How to Use the Command Palette The command palette filters entries by context, so whenever you open it, you won't always see all the commands defined in every ``.sublime-commands`` file. -�������ͨ���ı�����ѡ���������ʲôʱ��򿪣��㶼���ῴ��ÿһ��``.sublime-commands`` +�������ͨ���ı�����ѡ���������ʲôʱ��򿪣��㶼���ῴ��ÿһ�� ``.sublime-commands`` �ļ���������� \ No newline at end of file From 806d56d0f14968a65dd739220b87bd901ae8bb63 Mon Sep 17 00:00:00 2001 From: tonyhty Date: Thu, 11 Apr 2013 20:25:04 +0800 Subject: [PATCH 72/79] translated plugins part in extensibility --- source/extensibility/plugins.rst | 87 ++++++++++++++++++++++++++++---- 1 file changed, 77 insertions(+), 10 deletions(-) diff --git a/source/extensibility/plugins.rst b/source/extensibility/plugins.rst index fff055d..a36db17 100644 --- a/source/extensibility/plugins.rst +++ b/source/extensibility/plugins.rst @@ -1,64 +1,88 @@ Plugins +插件 ======= .. seealso:: +更多信息请参考: :doc:`API Reference <../reference/api>` More information on the Python API. + :doc:`API参考文档 <../reference/api>` + 有关Python API的更详细的信息。 :doc:`Plugins Reference <../reference/plugins>` More information about plugins. + :doc:`插件参考文档 <../reference/api>` + 有关插件的更详细的信息。 Sublime Text 2 is programmable with Python scripts. Plugins reuse existing commands or create new ones to build a feature. Plugins are rather a logical entity than a physical one. - +Sublime Text 2可以使用Python脚本进行编程。插件可以重用已有的命令或者新建新的特性。 +插件是指逻辑上的,而不是屋里存在的。 Prerequisites +预备知识 ************* In order to write plugins, you must be able to program in Python_. +要写一个插件,你必须要会用Python编程。 .. _Python: http://www.python.org Where to Store Plugins +插件放到哪里 ********************** Sublime Text 2 will look for plugins in these places: +Sublime Text 2会在以下目录中寻找可用的插件: * ``Packages`` * ``Packages//`` +* ``Packages/<包名称>`` Consequently, any plugin nested deeper in ``Packages`` won't be loaded. +所以,存放在 ``Packages`` 更深层次的目录结构中的插件不会被加载。 Keeping plugins right under ``Packages`` is discouraged, because Sublime Text sorts packages in a predefined way before loading them. Thus, you might get confusing results if your plugins live outside of a package. - +让插件都存放在 ``Packages``会有些让人失望,因为Sublime Text会在加载插件之前 +通过预先设定的方式排序包组。因此,如果你的插件在一个包的外面,可能会有意想不到的结果。 Your First Plugin +编写第一个插件 ***************** Let's write a "Hello, World!" plugin for Sublime Text 2: +下面,我们给Sublime Text 2写一个"Hello, World!"插件吧: #. Select **Tools | New Plugin…** in the menu. +#. 选择目录**Tools | New Plugin…**。 #. Save to ``Packages/User/hello_world.py``. +#. 保存到``Packages/User/hello_world.py``。 You've just written your first plugin. Let's put it to use: +你现在完成了你的第一个插件,下面将其投入使用: #. Create a new buffer (``Ctrl+n``). +#. 新建一个缓冲区(``Ctrl+n``)。 #. Open the python console (``Ctrl+```). +#. 打开python命令行(``Ctrl+```)。 #. Type: ``view.run_command("example")`` and press enter. +#. 输入:``view.run_command("example")``,然后按下回车。 You should see the text "Hello, World!" in your new buffer. - +你会看到你的新缓冲区内显示"Hello, World!"。 Analyzing Your First Plugin +分析你的第一个插件 *************************** The plugin created in the previous section should look roughly like this:: +前面我们编写插件大致如此: import sublime, sublime_plugin @@ -69,57 +93,79 @@ The plugin created in the previous section should look roughly like this:: The ``sublime`` and ``sublime_plugin`` modules are both provided by Sublime Text 2. +``sublime``和``sublime_plugin``是Sublime Text 2提供的。 New commands derive from the ``*Command`` classes defined in ``sublime_plugin`` (more on this later). +新命令继承定义在``sublime_plugin``的``*Command``类(后面会进行详细的描述)。 The rest of the code is concerned with particulars of the ``TextCommand`` or the API that we'll discuss in the next sections. +剩下的代码是来自于``TextCommand``的细节以及我们后面要讨论的API。 Before moving on, though, we'll look at how we called the new command: We first opened the python console, and then issued a call to ``view.run_command()``. This is a rather inconvenient way of using plugins, but it's often useful when you're in the development phase. For now, keep in mind that your commands can be accessed through key bindings or other means, just as other commands are. +在向下继续之前,嗯。。我们会看到如何调用新命令:首先,我们打开python命令行,然后 +调用``view.run_command()``。这样使用插件显然是很不方便的,但是在开发阶段还是比较 +有用的。目前为止,你要记住,自定义的命令可以通过按键绑定或者其他方式使用,就像其 +他命令一样。 Conventions for Command Names +命令名称的命名规则 ----------------------------- You might have noticed that our command is defined with the name ``ExampleCommand``, but we pass the string ``example`` to the API call instead. This is necessary because Sublime Text 2 normalizes command names by stripping the ``Command`` suffix and separating ``CamelCasedPhrases`` with underscores, like this: ``camel_cased_phrases``. +你可能已经注意到了我们的命令是以``ExampleCommand``命名的,但是我们向API传入的参数却是 +``example``。Sublime Text 2是通过截断``Command``的后缀,在``CamelCasedPhrases``中加入 +下弧线的方式,比如``camel_cased_phrases``,来统一命令名称的。 New commands should follow the pattern mentioned above for class names. - +新的命令必须要按照上面的方式命名类的名称。 Types of Commands +命令类型 ***************** You can create the following types of commands: +你可以新建以下类型的命令: * Application commands (``ApplicationCommand``) +* 应用程序命令(``ApplicationCommand``) * Window commands (``WindowCommand``) +* 窗口命令(``WindowCommand``) * Text commands (``TextCommand``) +* 文本命令(``TextCommand``) When writing plugins, consider your goal and choose the appropriate type of commands for your plugin. - +当你编写插件时,请根据你的目的选择合适的命令类型。 Shared Traits of Commands +命令之间的共享特性 ------------------------- All commands need to implement a ``.run()`` method in order to work. Additionally, they can receive and arbitrarily long number of keyword parameters. - +所有的命令都必须实现一个``.run()``方法才能运行。另外,所有命令都可以接受任意长度的 +关键字参数。 Application Commands +应用程序命令 -------------------- Application commands derive from ``sublime_plugin.ApplicationCommand`` and can be executed with ``sublime.run_command()``. +应用程序命令继承于``sublime_plugin.ApplicationCommand``,可以通过``sublime.run_command()`` +执行。 Window Commands +窗口命令 --------------- Window commands operate at the window level. This doesn't mean that you cannot @@ -127,26 +173,36 @@ manipulate views from window commands, but rather that you don't need views to exist in order for window commands to be available. For instance, the built-in command ``new_file`` is defined as a ``WindowCommand`` so it works too when no view is open. Requiring a view to exist in that case wouldn't make sense. +串口命令是在窗口级生效的。这并不意味着你不能通过窗口命令控制视图,但是这也并不 +是不需要你开启一些视图来让窗口命令生效。比如,内置命令 ``new_file`` 是一个 +``窗口命令`` ,然而没有视图一样可以生效。因为此时要求打开一个视图并没有意义。 Window command instances have a ``.window`` attribute pointing to the window instance that created them. +窗口命令实例有一个 ``.window`` 属性,指向创建它们的那个窗口实例。 The ``.run()`` method of a window command does not need to take any required arguments. +窗口命令的``.run()``方法不需要传入参数。 Text Commands +文本命令 ------------- Text commands operate at the buffer level and they require a buffer to exist in order to be available. +文本命令是在缓冲区级生效的,并且需要存在一个缓冲区使之生效。 View command instances have a ``.view`` attribute pointing to the view instance that created them. +视图命令实例有一个 ``.view`` 属性,指向创建它们的那个窗口实例。 The ``.run()`` method of a text command needs to take an ``edit`` instance as a first positional argument. +窗口命令的 ``.run()`` 方法需要一个 ``edit`` 实例作为第一个入参。 Text Commands and the ``edit`` Object +文本命令和 ``edit`` 对象 ------------------------------------- The edit object groups modifications to the view so undo and macros work in a @@ -154,20 +210,27 @@ sensible way. You are responsible for creating and closing edit objects. To do so, you can call ``view.begin_edit()`` and ``edit.end_edit()``. Text commands get passed an open ``edit`` object in their ``run`` method for convenience. Additionally, many ``View`` methods require an edit object. - +编辑``edit``对象组修改视图,以便撤销和宏命令是以合理的方式运行。你有责任新建和 +关闭edit对象。为此,你需要调用 ``view.begin_edit()`` 和 ``edit.end_edit()``。 +文本命令为了方便,在其 ``run`` 方法中获取传入的 ``edit`` 对象。另外,许多 ``View`` +方法都需要一个edit对象。 Responding to Events +事件响应 -------------------- Any command deriving from ``EventListener`` will be able to respond to events. - +任何继承自``EventListener``的命令都可以响应事件。 Another Plugin Example: Feeding the Completions List +其他插件的例子:添加补全列表 ---------------------------------------------------- Let's create a plugin that fetches data from Google Autocomplete service and feeds it to Sublime Text 2 completions list. Please note that as ideas for plugins go, this a very bad one. +接下来,我们做一个从Google自动完成服务获取数据的插件,然后添加到Sublime Text 2 +的补全列表。请注意对于将其作为一个插件,这并不是什么好主意。 :: @@ -189,11 +252,13 @@ plugins go, this a very bad one. return sugs .. note:: +.. 注意:: Make sure you don't keep this plugin around after trying it or it will interefere with the autocompletion system. - + 确保你在这次尝试以后,不要保留这个插件,否则会干扰Google的自动完成系统的。 Learning the API +学习API **************** In order to create plugins, you need to get acquainted with the Sublime Text @@ -201,4 +266,6 @@ API and the available commands. Documentation on both is scarce at the time of this writing, but you can read existing code and learn from it too. In particular, the ``Packages/Default`` folder contains many examples of undocumented commands and API calls. - +为了编写插件,你需要熟悉Sublime Text API和内置命令。在写这篇文档时,这些文档还是 +比较匮乏的,但是你还是可以从现有的代码中学习的。尤其是在 ``Packages/Default`` 文 +件中包含了许多非正式的例子和API调用。 From 92c3606122e21477210fddfc0331786acea5e1cf Mon Sep 17 00:00:00 2001 From: RubyYavin <740150701@qq.com> Date: Sat, 7 Feb 2015 08:52:00 +0800 Subject: [PATCH 73/79] Translate some Sentence. --- source/extensibility/commands.rst | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/source/extensibility/commands.rst b/source/extensibility/commands.rst index 8914c49..4e7bd9a 100644 --- a/source/extensibility/commands.rst +++ b/source/extensibility/commands.rst @@ -4,9 +4,13 @@ Commands Commands are ubiquitous in Sublime Text: key bindings, menu items and macros all work through the command system. They are found in other places too. +命令在Sublime Text中无处不在:按键绑定,菜单项包括宏等它们都是工作在命令系统里的。因此,命令随处可见。 + Some commands are implemented in the editor's core, but many of them are provided as python plugins. Every command can be called from a python plugin. +一些命令可以通过编辑器内核接口来实现,但是更多的是作为python的插件来提供。任何命令都可以通过python插件来调用。 + Command Dispatching ******************* @@ -15,12 +19,21 @@ view object. Window objects, however, will dispatch commands based on input focus, so you can issue a view command from a window object and the correct view instance will be found for you. +通常,命令都绑定在应用对象,窗口对象或者视图对象里。不过,窗口对象根据输入焦点来分发命令,因此你可以通过窗口对象发起一个 +命令并且会为你返回一个正确的视图实例。 + Anatomy of a Command ******************** Commands have a name separated by underscores, like ``hot_exit`` and can take a dictionary of arguments whose keys must be strings and whose values must -be JSON types. Here's a few examples of commands run from the Python console:: +be JSON types. Here's a few examples of commands run from the Python console: + +命令名通常被下划线所分割,就像``hot_exit``,而且是一个以字符串为关键字JSON类型为值的字典。下面是一些运行在python控制台下 +的命令例子: + +:: + view.run_command("goto_line", {"line": 10}) view.run_command('insert_snippet', {"contents": "<$SELECTION>"}) From de31cfdf3eee1692853692915751065d9900d625 Mon Sep 17 00:00:00 2001 From: note286 Date: Sun, 18 Feb 2018 11:33:17 +0800 Subject: [PATCH 74/79] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E7=9A=84=E5=8E=9F=E8=8B=B1=E6=96=87=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 如何安装便携版的Sublime Text中,原有的英文文档没有删除。 --- source/getting_started/install.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/getting_started/install.rst b/source/getting_started/install.rst index fa2b1df..962d480 100644 --- a/source/getting_started/install.rst +++ b/source/getting_started/install.rst @@ -45,8 +45,6 @@ Sublime Text在Windows平台提供了两种安装类型:一种是标准安装 如何安装便携版的Sublime Text ---------------------------------------------------- -Download the package and uncompress it to a folder of your choice. You will -find the *sublime_text.exe* executable inside that folder. 下载压缩包,并将其中的内容解压到你选择的路径。你能在解压的路径中找到 *sublime_text.exe* 的可执行文件。 From 4a42167c2d9f93dd2211c6b5d30ec217cfa7ceca Mon Sep 17 00:00:00 2001 From: note286 Date: Mon, 19 Feb 2018 09:59:22 +0800 Subject: [PATCH 75/79] =?UTF-8?q?=E5=88=A0=E9=99=A4Textmate=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=E6=80=A7=E4=B8=AD=E7=9A=84=E8=8B=B1=E6=96=87=E5=8E=9F?= =?UTF-8?q?=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/basic_concepts.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/basic_concepts.rst b/source/basic_concepts.rst index 97b37c2..c97c043 100644 --- a/source/basic_concepts.rst +++ b/source/basic_concepts.rst @@ -124,8 +124,6 @@ Sublime Text中的配置文件允许你调整编辑器的表现,添加宏和 Textmate兼容性 ====================== -This information is mainly useful for Textmate users who are now using Sublime -Text. Textmate was an editor for the Mac. 这部分信息主要是为从Textmate转型使用Sublime Text的用户准备的。Textmate,它是Mac平台的 一个编辑器。 From 88d1e10793d5c0905faac13d7a38f13ab33f6e6f Mon Sep 17 00:00:00 2001 From: note286 Date: Mon, 19 Feb 2018 10:28:10 +0800 Subject: [PATCH 76/79] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=EF=BC=88=E6=89=B9=E5=A4=84=E7=90=86=EF=BC=89?= =?UTF-8?q?=E8=8B=B1=E6=96=87=E5=8E=9F=E6=96=87=E5=B9=B6=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=BA=86=E6=9B=B4=E5=A4=9A=E4=BF=A1=E6=81=AF=E8=AF=B7=E5=8F=82?= =?UTF-8?q?=E8=80=83=E7=9A=84=E6=A0=B7=E5=BC=8F=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/file_processing/build_systems.rst | 35 +----------------------- 1 file changed, 1 insertion(+), 34 deletions(-) diff --git a/source/file_processing/build_systems.rst b/source/file_processing/build_systems.rst index 9a11efd..5abb4fe 100644 --- a/source/file_processing/build_systems.rst +++ b/source/file_processing/build_systems.rst @@ -2,30 +2,20 @@ 构建系统(批处理) ================================ -Build systems let you run your files through external programs like -:program:`make`, :program:`tidy`, interpreters, etc. 通过构建系统,你能够使用像 :program:`make`, :program:`tidy` 这样的外部程序以及各种解释器 来运行你的文件。 -Executables called from build systems must be in your :const:`PATH`. For more -information about making sure the :const:`PATH` seen by Sublime Text is set -correctly, see :ref:`troubleshooting-build-systems`. 在构建系统中调用的外部可执行程序一定要能够通过 :const:`PATH` 环境变量找到。请参考 :ref:`构建系统常见问题` 章节来了解有关如何正确设置 :const:`PATH` 环境变量的更多信息。 - -File Format 文件格式 =========== -Build systems are JSON files and have the extension *.sublime-build*. 构建系统是以 *.sublime-build* 作为文件扩展名的JSON文件。 -Example 示例 ------- -Here's an example of a build system: 下面是构建系统的一个小例子: .. code-block:: js @@ -37,57 +27,34 @@ Here's an example of a build system: } ``cmd`` - Required. This option contains the actual command line to be executed:: 必填内容。这个选项的内容是实际执行的命令行语句:: python -u /path/to/current/file.ext ``file_regex`` - A Perl-style regular expression to capture error information out of the - external program's output. This information is then used to help you - navigate through error instances with :kbd:`F4`. 存放一段用于捕获外部程序输出的错误信息的Perl风格的正则表达式。这部分信息用于帮助你在不同 的错误实例之间使用 :kbd:`F4` 快捷键进行跳转。 ``selector`` - If the **Tools | Build System | Automatic** option is set, Sublime Text - will automatically find the corresponding build system for the active file - by matching ``selector`` to the file's scope. 如果你勾选了 **Tools | Build System | Automatic** 选项,Sublime Text会自动从构建 系统中通过 ``selector`` 选项找到适合当前文件的构建方式。 -In addition to options, you can also use some variables in build systems, like -we have done above with ``$file``, which expands to the the active buffer's -file name. 除了这些选项,在构建系统中还可以使用一些变量,例如在前面使用的 ``$file`` 变量,就能自动扩充为 当前缓冲区对应的文件名。 - -Where to Store Build Systems 构建系统存储在哪里 ============================ -Build systems must be located somewhere under the *Packages* folder -(e. g. *Packages/User*). Many packages include their own build systems. 构建系统必须被放在 *包组* 文件夹下面的某个位置(例如 *Packages/User*)。许多包都含有它们自己 的构建系统。 - -Running Build Systems 运行构建系统 ===================== -Build systems can be run by pressing :kbd:`F7` or from **Tools | Build**. 可以使用 :kbd:`F7` 快捷键来运行构建系统,也可以从 **Tools | Build** 菜单中运行。 - -.. seealso:: - - :doc:`Reference for build systems <../reference/build_systems>` - Complete documentation on all available options, variables, etc. - -更多信息请参考 +.. 更多信息请参考:: :doc:`构建系统参考文档 <../reference/build_systems>` 记录所有可用选项、变量的完整文档。 From 5cd7150b471efa408fa7e6fc8ce60fe89f2004cb Mon Sep 17 00:00:00 2001 From: note286 Date: Mon, 19 Feb 2018 10:58:23 +0800 Subject: [PATCH 77/79] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=AF=BC=E8=88=AA=E4=B8=8E=E6=96=87=E4=BB=B6=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E4=B8=AD=E4=B8=80=E4=BA=9B=E7=AC=A6=E5=8F=B7=E6=95=88?= =?UTF-8?q?=E6=9E=9C=E6=97=A0=E6=B3=95=E6=98=BE=E7=A4=BA=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 中文需要前后加空格才能显示出那些样式效果 --- source/file_management/file_management.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/source/file_management/file_management.rst b/source/file_management/file_management.rst index 9d63524..69c1cd9 100644 --- a/source/file_management/file_management.rst +++ b/source/file_management/file_management.rst @@ -15,9 +15,10 @@ ghosts or something. “随意跳转” 可以让你方便的在文件之间切换,使用 :kbd:`Ctrl+P` 启动该功能。你在输入栏输入,ST则会 对已经打开的文件或者目录进行搜索,并给出匹配最佳的搜索结果的预览。如果你不进行任何操作,将不会 -真正加载这些文件。可以按:kbd:`Esc`取消预览界面。快捷预览界面形似鬼魅,你在使用ST的其他功能时也会遇到哦。 +真正加载这些文件。可以按 :kbd:`Esc` 取消预览界面。快捷预览界面形似鬼魅,你在使用ST的其他功能时也会遇到哦。 Goto Anything lives up to its name --there's more to it than locating files: + “随意跳转”正如其名,其功能不仅限于查找文件: To perform a **fuzzy search**, append ``#`` and then keep typing, like this: @@ -35,8 +36,7 @@ This instructs Sublime Text to perform a fuzzy search for *treasure* in the file whose name matches *island*. Pressing :kbd:`Ctrl+;` will open Goto Anything and type ``#`` for you. -Sublime Text会进行在所有文件名匹配 *island* 的文件中搜索 *treasure* 关键字。使用组合键 -:kbd:`Ctrl+;` 可以打开“随意跳转” 功能并输入 ``#`` +Sublime Text会进行在所有文件名匹配 *island* 的文件中搜索 *treasure* 关键字。使用组合键 :kbd:`Ctrl+;` 可以打开“随意跳转” 功能并输入 ``#`` And there's more: @@ -48,7 +48,7 @@ To **search symbols** in the active buffer, press :kbd:`Ctrl+R`. The operator To **go to a line number**, press :kbd:`Ctrl+G`. The operator ``:`` can be used as explained above too. -可以通过按下组合键 :kbd:`Ctrl+G`来跳转到指定的行号。操作符 ``:`` 与之前提到的用法相同。 +可以通过按下组合键 :kbd:`Ctrl+G` 来跳转到指定的行号。操作符 ``:`` 与之前提到的用法相同。 Searching for symbols will only work for file types that have symbols defined for them. @@ -75,8 +75,8 @@ it the **input focus** by pressing :kbd:`Ctrl+0`. To return input focus to the buffer, press :kbd:`Esc`. Alternatively, you can use the mouse to the same effect, but why would you? -在侧边栏可以使用方向键来在文件间切换,但是首先需要通过按组合键:kbd:`Ctrl+0` 使其获得**输入焦点**。 -如果希望缓冲区重新获得输入焦点,则需要按 :kbd:`Esc`键。同样,你也可以使用鼠标达到同样的效果,但是 +在侧边栏可以使用方向键来在文件间切换,但是首先需要通过按组合键 :kbd:`Ctrl+0` 使其获得 **输入焦点** 。 +如果希望缓冲区重新获得输入焦点,则需要按 :kbd:`Esc` 键。同样,你也可以使用鼠标达到同样的效果,但是 你有必要这么做吗? The sidebar also provides basic file management operations through the context @@ -107,8 +107,8 @@ Wherever there's a `.sublime-project` file, you will find an ancillary `.sublime-workspace` file too. The second one is used by Sublime Text and you shouldn't edit it yourself. -项目数据保存在一些以 `.sublime-project` 为扩展名的JSON文件中。只要有 `.sublime-project` -文件,相应的都会有一个`.sublime-workspace` 文件。后者是Sublime Text使用,用户请不要进行修改。 +项目数据保存在一些以 `.sublime-project` 为扩展名的JSON文件中。只要有 `.sublime-project` +文件,相应的都会有一个 `.sublime-workspace` 文件。后者是Sublime Text使用,用户请不要进行修改。 Project files can define settings specific to that project only. More on that in the `official documentation`_. From d7779c9c7c2d9bda15c0497ac4338a3e444ace30 Mon Sep 17 00:00:00 2001 From: howiezhao Date: Mon, 5 Nov 2018 23:21:46 +0800 Subject: [PATCH 78/79] remove excess english,translated all chapters and do some small changes --- README.md | 27 ++ source/basic_concepts.rst | 19 +- source/conf.py | 2 +- source/customization/customization.rst | 3 +- source/customization/indentation.rst | 1 + source/customization/key_bindings.rst | 35 -- source/customization/menus.rst | 3 +- source/customization/settings.rst | 75 ---- source/extensibility/command_palette.rst | 56 +-- source/extensibility/commands.rst | 24 +- source/extensibility/completions.rst | 121 +++---- source/extensibility/extensibility.rst | 22 +- source/extensibility/macros.rst | 38 +-- source/extensibility/packages.rst | 162 ++++----- source/extensibility/plugins.rst | 129 +------ source/extensibility/snippets.rst | 130 +------ source/extensibility/syntaxdefs.rst | 321 ++++++------------ source/file_management/file_management.rst | 71 +--- source/glossary/glossary.rst | 34 +- source/index.rst | 7 +- source/reference/api.rst | 12 +- source/reference/build_systems.rst | 206 ++--------- source/reference/command_palette.rst | 10 +- source/reference/commands.rst | 146 +------- source/reference/completions.rst | 57 +--- source/reference/key_bindings.rst | 69 ---- source/reference/keyboard_shortcuts_osx.rst | 13 +- source/reference/keyboard_shortcuts_win.rst | 12 +- source/reference/plugins.rst | 99 +----- source/reference/reference.rst | 11 +- source/reference/settings.rst | 104 ------ source/reference/snippets.rst | 48 +-- source/reference/syntaxdefs.rst | 57 +--- .../search_and_replace/search_and_replace.rst | 46 +-- .../search_and_replace_files.rst | 28 +- 35 files changed, 406 insertions(+), 1792 deletions(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..2e3f583 --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +# Sublime Text 非官方文档 + +本文档翻译自[Sublime Text Unofficial Documentation](http://docs.sublimetext.info/en/latest/),这是一个为填补[Sublime Text 官方文档](https://www.sublimetext.com/docs/3/)中空白所创建的项目,要在线查看翻译完成的文档请参见[Sublime Text 非官方文档](https://sublime-text.readthedocs.io/en/latest/)。 + +## 贡献 + +我们通过[Issus](https://github.com/void-main/UnofficialDocs/issues)项接受翻译错误报告和新内容请求,并鼓励您发送Pull requests(但我们无法保证它们将始终合并)。 + +此存储库包括具有预定义设置的`.sublime-project`和使用Sphinx构建HTML文档的构建系统。 + + +### 构建 (HTML 预览) + +为了构建和预览文档,您需要[Sphinx](http://sphinx-doc.org/)。 + + pip install sphinx + +默认情况下,文档的预览将显示标准的Sphinx主题,但如果您愿意,可以安装和使用ReadTheDocs的主题: + + pip install sphinx_rtd_theme + +如果这个主题可用,构建系统将提取它。 + +构建完成后,您可以在浏览器中打开`build/html/index.html`以查看指南。 + + +[issues]: https://github.com/guillermooo/sublime-undocs/issues diff --git a/source/basic_concepts.rst b/source/basic_concepts.rst index c97c043..51ac05e 100644 --- a/source/basic_concepts.rst +++ b/source/basic_concepts.rst @@ -10,8 +10,8 @@ 这份文档是从Windows用户的角度撰写的,但是文档中提到的大部分内容只需要很小的变化就能在其他 平台正常工作。 -除非特别说明,否则文档中所有的相对路径(例如 *Packages/User*)都是相对于*数据目录*的。 -后文将解释*数据目录*的含义。 +除非特别说明,否则文档中所有的相对路径(例如 :file:`Packages/User`)都是相对于 *数据目录* 的。 +后文将解释 *数据目录* 的含义。 在介绍快捷键的时候,我们假定你正在使用系统默认的按键设定。由于Submline Text按键与命令映射 的工作方式,**有些按键组合可能与你正在使用键盘的布局不同**。 @@ -39,9 +39,9 @@ Sublime Text是一款高度可扩展、可定制的文本编辑器。它已经 Sublime Text 2把几乎所有用户感兴趣的内容都存放在所谓的数据目录下。这个目录的位置是平台相 关的: -* **Windows平台**: *%APPDATA%\\Sublime Text 2* -* **OS X平台**: *~/Library/Application Support/Sublime Text 2* -* **Linux平台**: *~/.config/sublime-text-2* +* **Windows平台**: :file:`%APPDATA%\\Sublime Text 2` +* **OS X平台**: :file:`~/Library/Application Support/Sublime Text 2` +* **Linux平台**: :file:`~/.config/sublime-text-2` 对于使用 **portable installations(便携安装版)** 的用户,数据目录的位置则是 *Sublime Text 2/Data* 。这里 *Sublime Text 2* 部分指的是你把包含Sublime Text 2的压缩包 @@ -57,16 +57,15 @@ Sublime Text 2把几乎所有用户感兴趣的内容都存放在所谓的数据 Sublime Text而言有意义文件的文件夹就被叫做一个 *包* 。 你可以通过Sublime Text 2的菜单来访问这个目录(**Preferences | Browse Packages...**), -也可以通过调用``sublime.packages_path()``这个api来访问。在本文档中,我们使用 *包组*、 +也可以通过调用 ``sublime.packages_path()`` 这个api来访问。在本文档中,我们使用 *包组*、 *包组路径* 、*包组文件夹* 以及 *包组目录* 来指代这个文档。 -``User(用户)`` 包 +*User(用户)* 包 ^^^^^^^^^^^^^^^^^^^^^^^ *Packages/User* 这个目录是一个存放所有用户自定义的插件、代码片段、宏等等的大杂烩。请把这个 -目录看成是你在包组目录中的私人领地。Sublime Text 2在升级的过程中永远不会覆盖*Packages/User* -这个目录中的内容。 +目录看成是你在包组目录中的私人领地。Sublime Text 2在升级的过程中永远不会覆盖 ``Packages/User`` 这个目录中的内容。 Python控制台以及Python API @@ -131,7 +130,7 @@ Textmate兼容性 除了命令有些差距之外,Sublime Text 2与Textmate的bundles(包)能较好的兼容。更进一步的说, 为了识别为TM编写的bundles,Sublime Text要求所有的语法定义文件都包含 *.tmLanguage* 扩展名, -并且所有的配置文件都有 *.tmPreferences*扩展名。这意味着即使 *.plist* 文件保存在 *Syntaxes* +并且所有的配置文件都有 *.tmPreferences* 扩展名。这意味着即使 *.plist* 文件保存在 *Syntaxes* 或者 *Preferences* 目录下,它们也会被忽略。 diff --git a/source/conf.py b/source/conf.py index 191b1bf..9a52c94 100644 --- a/source/conf.py +++ b/source/conf.py @@ -91,7 +91,7 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'default' +html_theme = 'sphinx_rtd_theme' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the diff --git a/source/customization/customization.rst b/source/customization/customization.rst index 40d8758..5047a5a 100644 --- a/source/customization/customization.rst +++ b/source/customization/customization.rst @@ -1,8 +1,7 @@ +======================== 定制Sublime Text ======================== -Sublime Text is highly customizable. In the topics below, we'll explain you how -you can adapt it to your needs and preferences. Sublime Text是高度可定制的。在接下来的几节中,我们将向你介绍如何根据自己的需要和偏好来定制它。 .. toctree:: diff --git a/source/customization/indentation.rst b/source/customization/indentation.rst index 6db2320..cce3ce9 100644 --- a/source/customization/indentation.rst +++ b/source/customization/indentation.rst @@ -1,3 +1,4 @@ +=========== 缩进 =========== diff --git a/source/customization/key_bindings.rst b/source/customization/key_bindings.rst index 9dc5931..32fae34 100644 --- a/source/customization/key_bindings.rst +++ b/source/customization/key_bindings.rst @@ -1,36 +1,24 @@ ============ -Key Bindings 键位绑定 ============ .. seealso:: 更多信息请参考 - :doc:`Reference for key bindings <../reference/key_bindings>` - Complete documentation on key bindings. - :doc:`键位绑定参考文档 <../reference/key_bindings>` 有关键位绑定的完整文档。 -Key bindings let you map sequences of key presses to actions. 键位绑定使得你能够将按键与动作进行映射。 -File Format 文件格式 =========== -Key bindings are defined in JSON and stored in ``.sublime-keymap`` files. In -order to integrate better with each platform, there are separate key map files -for Linux, OSX and Windows. Only key maps for the corresponding platform will -be loaded. 键位绑定是以 ``.sublime-keymap`` 作为扩展名的JSON文件。为了让键位能够更好的与各平台融合,系统为 Linux,OSX以及Windows平台分别提供了不同的文件。只有与当前系统相符的键位映射文件才会生效。 -Example 示例 ******* -Here's an excerpt from the default key map for Windows:: 下面这段代码是从Windows平台默认的按键映射文件中截取出来的:: [ @@ -38,51 +26,33 @@ Here's an excerpt from the default key map for Windows:: { "keys": ["ctrl+o"], "command": "prompt_open_file" } ] -Defining and Overriding Key Bindings 定义与重载键位绑定 ==================================== -Sublime Text ships with a default key map (e. g. -:file:`Packages/Default/Default (Windows).sublime-keymap)`. In order to -override key bindings defined there or add new ones, you can store them in aseparate -key map with a higher precedence, for example -:file:`Packages/User/Default (Windows).sublime-keymap`. Sublime Text自带一套默认的键位绑定(一般对应这个文件: :file:`Packages/Default/Default (Windows).sublime-keymap)`)。如果你想重载其中的部分键位 或者添加新的键位绑定,你可以在具有更高文件优先级的位置重新存储一个文件,例如 :file:`Packages/User/Default (Windows).sublime-keymap`。 -See :ref:`merging-and-order-of-precedence` for more information about how -Sublime Text sorts files for merging. 请参考 :ref:`排序与优先级顺序` 来了解Sublime Text中关于文件优先级以及文件合并的更多信息。 -Advanced Key Bindings 高级键位绑定 ===================== -Simple key bindings consist of a key combination and a command to be executed. -However, there are more complex syntaxes to pass arguments and provide -contextual awareness. 对于简单的键位绑定,就是一个键位组合对应一个命令。除此之外,还有一些传递参数和上下文信息的复杂语法。 -Passing Arguments 参数传递 ***************** -Arguments are specified in the ``args`` key:: 通过 ``args`` 键可以指定需要的参数:: { "keys": ["shift+enter"], "command": "insert", "args": {"characters": "\n"} } -Here, ``\n`` is passed to the ``insert`` command when you press :kbd:`Shift+Enter`. 在这个例子中当你按下 :kbd:`Shift+Enter` 的时候, ``\n`` 将会作为参数传递给 ``insert`` 命令。 -Contexts 上下文 ******** -Contexts determine when a given key binding will be enabled based on the -caret's position or some other state. 利用上下文,可以通过插入符的位置及其他状态信息来决定某种键位组合是否可以发挥作用。 :: @@ -93,11 +63,6 @@ caret's position or some other state. ] } -This key binding translates to *clear snippet fields and resume normal editing -if there is a next field available*. Thus, pressing :kbd:`ESC` when you are not -cycling through snippet fields will **not** trigger this key binding (however, -something else might occur instead if :kbd:`ESC` happens to be bound to a -different context too ---and that's likely to be the case for :kbd:`ESC`). 这段代码的作用是 *当有下一个可用域的时候就清空当前代码片段,并返回正常编辑模式* 。因此,当你 没有在代码域中循环切换的时候,按下 :kbd:`ESC` 键就 *不会* 触发这个按键绑定(然而,如果 :kbd:`ESC` 恰巧与另外的上下文进行了绑定,那么那个动作仍然会被触发——事实上,对于 :kbd:`ESC` 来说,这种情况 diff --git a/source/customization/menus.rst b/source/customization/menus.rst index 6490301..291db67 100644 --- a/source/customization/menus.rst +++ b/source/customization/menus.rst @@ -1,8 +1,7 @@ +======= 菜单项 ======= -No documenation available about this topic. 关于这个主题没有任何可用文档。 -But here's `Bruce Lee screaming `_. 但是,可以参考 `李小龙的嘶吼 `_。 diff --git a/source/customization/settings.rst b/source/customization/settings.rst index b994528..befe9f5 100644 --- a/source/customization/settings.rst +++ b/source/customization/settings.rst @@ -1,74 +1,43 @@ ======== -Settings 设置项 ======== -Sublime Text stores configuration data in *.sublime-settings* files. -Flexibility comes at the price of a slightly complex system for applying -settings. However, here's a rule of thumb: Sublime Text把配置信息保存在 *.sublime-settings* 文件中。为了拥有较好的灵活性,作为代价, 需要一个略显繁琐的系统来管理设置项。我们先来说一条基本原则吧: -Always place your personal settings files under *Packages/User* to guarantee -that they will take precedence over any other conflicting settings files. 个人定义的设置项文件一定要保存到 *Packages/User* 目录下,这样就能保证在发生冲突的时候,你定 义的文件拥有较高的优先级。 -With that out of the way, let's unveil the mysteries of how settings work to -please masochistic readers. 这一点解释清楚之后,咱们就可以揭开设置项工作的具体原理了,从而满足部分喜欢受虐读者的需求。 (译者注:作者原文是masochistic,可以翻译成受虐狂,这里感觉也可以理解成求知若渴的人,求指正) -Format 文件格式 ========== -Settings files use JSON and have the *.sublime-settings* extension. 设置项文件是以 *.sublime-settings* 作为扩展名的的JSON文件。 -Types of Settings 设置项文件类型 ================= -The purpose of each *.sublime-settings* file is determined by its name. These -names can be descriptive (like *Preferences (Windows).sublime-settings* -or *Minimap.sublime-settings*), or they can be related to what the settings -file is controlling. For example, file type settings need to carry the name -of the *.tmLanguage* syntax definition for the file type. Thus, for the -*.py* file type, whose syntax definition is contained in *Python.tmLanguage*, -the corresponding settings files would be called *Python.sublime-settings*. 可以通过 *.sublime-settings* 文件的名字看出它的用途。这些文件的名字可能具有一定的描述性(例如 *Preferences (Windows).sublime-settings* 或者 *Minimap.sublime-settings*),亦或是跟 它所控制的内容有关联。以控制文件类型的设置项文件为例,命名时要求必须有与之对应的 *.tmLanguage* 语法定义文件。因此,对于 *.py* 文件类型,它的语法定义信息存放在 *Python.tmLanguage* 文件中, 那么对应的文件类型设置项文件就该被叫做 *Python.sublime-settings* 。 -Also, some settings files only apply for specific platforms. This can be -inferred from the file names: *Preferences (Windows).sublime-settings*, -*Preferences (Linux).sublime-settings*, etc. 除此之外,某些设置文件只能作用于某个特定的平台。可以通过文件名进行推断,例如: *Preferences (Windows).sublime-settings* 和 *Preferences (Linux).sublime-settings* 。 -This is **important**: Platform-specific settings files in the *Packages/User* -folder are ignored. This way, you can be sure a single settings file overrides -all the others. 有一点特别 **重要** :存放在 *Packages/User* 目录中的平台相关的设置文件将被忽略。通过这种方式, 就可以保证单个设置文件内容可以覆盖其他所有设置文件的内容了。 -How to Access and Edit Common Settings Files 如何访问并修改公共的设置项文件 ============================================ -Unless you need very fine-grained control over settings, you can access the main -configuration files through the **Preferences | Settings - User** and -**Preferences | Settings - More** menu items. Editing **Preferences - Settings Default** -isn't a smart thing to do, because changes will be reverted with every update -to the software. However, you can use that file for reference: it contains comments -explaining the purpose of all available global and file type settings. 除非你对设置项有非常精确的掌控力,否则,你只需要通过 **Preferences | Settings - User** 和 **Preferences | Settings - More** 菜单项来访问主要的配置文件。编辑 **Preferences - Settings Default** 这个文件并不是一件明智的事情,因为每次版本升级这些修改都 @@ -76,48 +45,28 @@ explaining the purpose of all available global and file type settings. 为你所用的全局设置项和文件类型设置项的说明注释。 -Order of Precedence of *.sublime-settings* Files *.sublime-settings* 文件的优先级顺序 ================================================== -The same settings file (such as *Python.sublime-settings*) can appear in multiple -places. All settings defined in identically named files will be merged together -and overwritten according to predefined rules. See -:ref:`merging-and-order-of-precedence` for more information. 名字相同的设置项文件(例如,都叫 *Python.sublime-settings* 的文件)可以在多个位置出现。以相同 名称命名的设置项文件中的内容都将按预定义的规则进行合并或者覆盖。请参考 :ref:`排序与优先级顺序` 这一小节以了解更多信息。 -Let us remember again that any given settings file in *Packages/User* ultimately -overrides every other settings file of the same name. 再说明一次,在 *Packages/User* 目录下的设置项文件拥有最高优先级,并且最终会覆盖其他同名设置项 文件中的相同内容。 -In addition to settings files, Sublime Text maintains *session* data --settings -for the particular set of files being currently edited. Session data is updated -as you work on files, so if you adjust settings for a particular file in any -way (mainly through API calls), they will be recorded in the session and will -take precedence over any applicable *.sublime-settings* files. 除了设置项文件以外,Sublime Text还维护 *会话* 数据 —— 一些针对正在编辑的文件集所应用的设置项。 会话数据是在你编辑文件的过程中发生变化的,所以,无论你通过何种方式调整了一个特定文件的设置项 (主要是通过API调用的方式),这些设置项的变更将被记录在当前的会话中,并且将拥有比所有符合条件的 *.sublime-settings* 文件更高的优先级。 -To check the value of a setting in effect for a particular file, use -*view.settings().get()* from the console. 如果想要检查针对特定文件当前正在发挥作用的设置项的值,可以在控制台中输入 *view.settings().get(<设置项名称>)* 命令。 -Lastly, it's also worth noting that some settings may be adjusted automatically -for you. Keep this is mind if you're puzzled about some setting's value. For -instance, this is the case for certain whitespace-related settings and the -``syntax`` setting. 最后需要注意的是,某些设置项的值可能会被系统自动进行调整。请记住这一点,这样一来你就能够解释某 些令你困惑的设置项内容了。举例来说,在查看某些与空格相关的设置项的值,以及某些 ``语法`` 设置项 内容的时候,就有可能遇到这种问题。 -Below, you can see the order in which Sublime Text would process a -hypothetical hierarchy of settings for Python files on Windows: 接下来你将看到Sublime Text是如何处理Windows平台上Python相关的设置项文件的,这里的设置项文件 目录结构是虚构的: @@ -135,62 +84,38 @@ hypothetical hierarchy of settings for Python files on Windows: < 由用户指定的语言相关的设置 < 会话数据 < 系统调整的数据) -Global Editor Settings and Global File Settings 全局编辑器设置以及全局文件设置 =============================================== -These settings are stored in *Preferences.sublime-settings* and -*Preferences ().sublime-settings* files. The defaults can be -found in *Packages/Default*. 这类全局设置项内容一般被保存在名为 *Preferences.sublime-settings* 和 *Preferences (<平台名称>).sublime-settings* 的文件中。默认的全局设置项存放在 *Packages/Default* 目录中。 -Valid names for ** are ``Windows``, ``Linux``, ``OSX``. 上面所说的 *<平台名称>* 可能是 ``Windows``, ``Linux`` 或者 ``OSX``。 -File Type Settings 文件类型设置项 ================== -If you want to target a specific file type, name the *.sublime-settings* file -after the file type's syntax definition. For example, if our syntax definition -was called *Python.tmLanguage*, we'd need to call our settings file -*Python.sublime-settings*. 如果你想针对某个特定的文件类型进行一些配置,那请根据这个文件类型的语法定义文件名称来对应的命名 *.sublime-settings* 文件。举例来说,如果我们的语法定义文件叫 *Python.tmLanguage* ,那么 设置项文件的名称就应该叫 *Python.sublime-settings* 。 -Settings files for specific file types usually live in packages, like -*Packages/Python*, but there can be multiple settings files for the same -file type in separate locations. 通常情况下,某个特定文件类型的设置项信息一般存放在包组文件夹的一个目录中,例如 *Packages/Python*, 但是,与同一个文件类型相关的多个设置项文件也有可能被存放在不同的位置。 -Similarly to global settings, one can establish platform-specific settings for -file types. For example, *Python (Linux).sublime-settings* would only be -consulted under Linux. 与全局设置项类似,也可以为文件类型设置项信息创建平台相关的内容。例如只有在Linux平台下,保存在 *Python (Linux).sublime-settings* 中的设置项内容才会被系统考虑。 -Also, let us emphasize that under *Pakages/User* only *Python.sublime-settings* -would be read, but not any *Python ().sublime-settings* variant. 需要特别指出的一点是,在 *Packages/User* 目录下,只有 *Python.sublime-settings* 文件会被 加载,所有以 *Python (<平台名称>).sublime-settings* 命名的平台相关的变种都不会被考虑。 -Regardless of its location, any file-type-specific settings file has precedence -over every global settings file affecting file types. 不管文件类型设置项信息保存在哪里,它拥有比保存在全局设置项文件中的、影响文件类型的设置项都高的 优先级。 -Where to Store User Settings (Once Again) (再说一次)用户指定的设置项信息应该保存到哪里 ============================================ -Whenever you want to save settings, especially if they should be preserved -between software updates, place the corresponding *.sublime-settings* file in -*Packages/User*. 无论何时,当你想要保存一些设置的时候,尤其是那些在软件升级前后应该被保留的设置,就把它们保存在 *Packages/User* 目录下的对应 *.sublime-settings* 文件中吧。 diff --git a/source/extensibility/command_palette.rst b/source/extensibility/command_palette.rst index a4d463b..3fc66a9 100644 --- a/source/extensibility/command_palette.rst +++ b/source/extensibility/command_palette.rst @@ -1,38 +1,26 @@ =============== -Command Palette -������� +命令面板 =============== .. seealso:: -������Ϣ��ο��� - :doc:`Reference for Command Palette <../reference/command_palette>` - Complete documentation on the command palette options. - :doc:`�������ο��ĵ� <../reference/command_palette>` - �й��������ѡ��������ĵ��� + :doc:`命令面板参考文档 <../reference/command_palette>` + 有关命令面板选项的完整文档。 -Overview -���� +概述 ======== -The *command palette* is an interactive list bound to :kbd:`Ctrl+Shift+P` whose -purpose is to execute commands. The command palette is fed entries with -commands files. Usually, commands that don't warrant creating a key binding of -their own are good candidates for inclusion in a ``.sublime-commands`` file. -*�������*��һ���󶨵����� `Ctrl+Shift+P` �Ľ����б�����Ŀ������ִ������������ -�������ļ��໥��ϵ��ͨ���������֤����һ�������󶨣������� ``.sublime-commands`` -����ΪһЩ�ܺõĺ�ѡ�� +*命令面板* 是一个绑定到键盘 `Ctrl+Shift+P` 的交互列表,其目的在意执行命令。命令面板 +与命令文件相互联系。通常,命令不保证产生一个按键绑定,可以在 ``.sublime-commands`` +中作为一些很好的候选。 -File Format (Commands Files) -�ļ���ʽ�������ļ��� +文件格式(命令文件) ============================ -Commands files use JSON and have the ``.sublime-commands`` extension. -�����ļ�ʹ��JSON��������һ�� ``.sublime-commands`` ����չ�� +命令文件使用JSON,并且有一个 ``.sublime-commands`` 的扩展。 -Here's an excerpt from ``Packages/Default/Default.sublime-commands``:: -���������� ``Packages/Default/Default.sublime-commands`` ��ʵ��:: +如下是来自 ``Packages/Default/Default.sublime-commands`` 的实例:: [ { "caption": "Project: Save As", "command": "save_project_as" }, @@ -47,25 +35,17 @@ Here's an excerpt from ``Packages/Default/Default.sublime-commands``:: ] ``caption`` - Text for display in the command palette. - ��ʾ����������еı���. + 显示在命令面板中的标题. ``command`` - Command to be executed. - ��ִ�е�����. + 待执行的命令. ``args`` - Arguments to pass to ``command``. - ���� ``command`` �IJ����� + 传给 ``command`` 的参数。 -How to Use the Command Palette -���ʹ��������� +如何使用命令面板 ============================== -#. Press :kbd:`Ctrl+Shift+P` -#. ���¼��̵�`Ctrl+Shift+P` -#. Select command -#. ѡ������ +#. 按下键盘的 `Ctrl+Shift+P` +#. 选择命令 -The command palette filters entries by context, so whenever you open it, you -won't always see all the commands defined in every ``.sublime-commands`` file. -�������ͨ���ı�����ѡ���������ʲôʱ��򿪣��㶼���ῴ��ÿһ�� ``.sublime-commands`` -�ļ���������� \ No newline at end of file +命令面板通过文本过滤选项,所以无论什么时候打开,你都不会看到每一个 ``.sublime-commands`` +文件的所有命令。 \ No newline at end of file diff --git a/source/extensibility/commands.rst b/source/extensibility/commands.rst index 4e7bd9a..23a9e5d 100644 --- a/source/extensibility/commands.rst +++ b/source/extensibility/commands.rst @@ -1,35 +1,21 @@ -Commands ======== - -Commands are ubiquitous in Sublime Text: key bindings, menu items and macros -all work through the command system. They are found in other places too. +命令 +======== 命令在Sublime Text中无处不在:按键绑定,菜单项包括宏等它们都是工作在命令系统里的。因此,命令随处可见。 -Some commands are implemented in the editor's core, but many of them are -provided as python plugins. Every command can be called from a python plugin. - 一些命令可以通过编辑器内核接口来实现,但是更多的是作为python的插件来提供。任何命令都可以通过python插件来调用。 -Command Dispatching +命令调度 ******************* -Normally, commands are bound to the application object, a window object or a -view object. Window objects, however, will dispatch commands based on input -focus, so you can issue a view command from a window object and the correct -view instance will be found for you. - 通常,命令都绑定在应用对象,窗口对象或者视图对象里。不过,窗口对象根据输入焦点来分发命令,因此你可以通过窗口对象发起一个 命令并且会为你返回一个正确的视图实例。 -Anatomy of a Command +命令剖析 ******************** -Commands have a name separated by underscores, like ``hot_exit`` and can take -a dictionary of arguments whose keys must be strings and whose values must -be JSON types. Here's a few examples of commands run from the Python console: - -命令名通常被下划线所分割,就像``hot_exit``,而且是一个以字符串为关键字JSON类型为值的字典。下面是一些运行在python控制台下 +命令名通常被下划线所分割,就像 ``hot_exit`` ,而且是一个以字符串为关键字JSON类型为值的字典。下面是一些运行在python控制台下 的命令例子: :: diff --git a/source/extensibility/completions.rst b/source/extensibility/completions.rst index 8e83d1f..14f664d 100644 --- a/source/extensibility/completions.rst +++ b/source/extensibility/completions.rst @@ -1,43 +1,35 @@ =========== -Completions +补全 =========== .. seealso:: :doc:`Reference for completions <../reference/completions>` - Complete documentation on all available options. + 有关所有可用选项的完整文档。 `Sublime Text Documentation `_ - Official documentation on this topic. + 关于此主题的官方文档。 -Completions provide functionality in the spirit of IDEs to suggest terms and -insert snippets. Completions work through the completions list or, optionally, -by pressing :kbd:`Tab`. +补全提供了IDE的精神功能,以建议术语和插入片段。补全通过补全列表工作,或者可选择按 :kbd:`Tab` 键。 -Note that completions in the broader sense of *words that Sublime Text will -look up and insert for you* are not limited to completions files, because other -sources contribute to the list of words to be completed, namely: +请注意,Sublime Text将查找并为您插入的更广泛意义上的单词的补全不仅限于补全文件,因为其他来源有助于补全单词列表,即: - * Snippets - * API-injected completions - * Buffer contents + * 代码片段 + * API注入的补全 + * 缓冲内容 -However, ``.sublime-completions`` files are the most explicit way Sublime Text -provides you to feed it completions. This topic deals with the creation of -``.sublime-completions`` files as well as with the interaction between all -sources for completions. +但是,``.sublime-completions`` 文件是Sublime Text为您提供的最明确的方式。本主题涉及 ``.sublime-completions`` 文件的创建以及所有补全源之间的交互。 -File Format +文件格式 =========== -Completions are JSON files with the ``.sublime-completions`` extension. -Entries in completions files can contain either snippets or plain strings. +补全是具有 ``.sublime-completions`` 扩展名的JSON文件。补全文件中的条目可以包含片段或纯字符串。 -Example +例如 ******* -Here's an excerpt from the HTML completions: +以下是HTML补全的摘录: .. code-block:: js @@ -53,14 +45,9 @@ Here's an excerpt from the HTML completions: } ``scope`` - Determines when the completions list will be populated with this - list of completions. See :ref:`scopes-and-scope-selectors` for more - information. + 确定何时使用此补全列表填充补全列表。有关更多信息,请参阅 :ref:`scopes-and-scope-selectors`。 -In the example above, we've used trigger-based completions only, but -completions files support simple completions too. Simple completions are just -plain strings. Expanding our example with a few simple completions, we'd end up -with a list like so: +在上面的示例中,我们仅使用基于触发器的补全,但补全文件也支持简单补全。简单的补全只是简单的字符串。通过一些简单的补全扩展我们的示例,我们最终得到一个如下列表: .. code-block:: js @@ -80,80 +67,56 @@ with a list like so: } -Sources for Completions +补全来源 ======================= -Completions not only originate in ``.sublime-completions`` files. This is the -exhaustive list of sources for completions: +补全不仅源自 ``.sublime-completions`` 文件。这是补全源的详尽列表: - * Snippets - * API-injected completions - * ``.sublime-completions`` files - * Words in buffer + * 代码片段 + * API注入的补全 + * ``.sublime-completions`` 文件 + * 缓冲区中的单词 -Priority of Sources for Completions +补全来源的优先顺序 *********************************** -This is the order in which completions are prioritized: +这是补全优先顺序的排列 - * Snippets - * API-injected completions - * ``.sublime-completions`` files - * Words in buffer + * 代码片段 + * API注入的补全 + * ``.sublime-completions`` 文件 + * 缓冲区中的单词 -Snippets will always win if the current prefix matches their tab trigger -exactly. For the rest of the completions sources, a fuzzy match is performed. -Also, snippets will always lose against a fuzzy match. Note that this is only -relevant if the completion is going to be inserted automatically. When the -completions list is shown, snippets will be listed along the other items, even -if the prefix only partially matches the snippets' tab triggers. +如果当前前缀与其制表符触发器完全匹配,则片段将始终获胜。对于其余的补全源,执行模糊匹配。此外,片段总是会在模糊匹配中丢失。请注意,这仅在要自动插入补全时才有意义。显示补全列表时,即使前缀仅部分匹配代码段的选项卡触发器,也会沿其他项列出代码段。 -How to Use Completions +如何使用补全 ====================== -There are two methods to use completions, and although the priority given to -completions when screening them is always the same, there is a difference in -the result that will be explained below. +有两种方法可以使用补全,虽然在补全筛选时给予补全的优先级总是相同的,但结果会有不同,下面将对此进行解释。 -Completions can be inserted in two ways: +可以通过两种方式插入补全: - * through the completions list (:kbd:`Ctrl+spacebar`); - * by pressing :kbd:`Tab`. + * 通过补全列表(:kbd:`Ctrl+spacebar`); + * 按 :kbd:`Tab`. -The Completions List +补全清单 ******************** -The completions list (:kbd:`Ctrl+spacebar`) may work in two ways: by bringing -up a list of suggested words to be completed, or by inserting the best match -directly. +补全列表(:kbd:`Ctrl+空格键`)可以以两种方式工作:通过调出要补全的建议单词列表,或直接插入最佳匹配。 -If the choice of best completion is ambiguous, an interactive list will be -presented to the user, who will have to select an item himself. Unlike other -items, snippets in this list are displayed in this format: -`` : ``, where ```` and ```` are -variable. +如果最佳补全的选择不明确,则将向用户呈现交互式列表,该用户必须自己选择项目。与其他项目不同,此列表中的片段以以下格式显示:````,其中 ```` 和 ```` 是可变的。 -The completion with :kbd:`Ctrl+spacebar` will only be automatic if the list of -completion candidates can be narrowed down to one unambiguous choice given the -current prefix. +使用 :kbd:`Ctrl+空格键` 补全只有在补全候选列表可以缩小到给定当前前缀的一个明确选择时才会自动完成。 -:kbd:`Tab`-completed Completions +:kbd:`Tab`-完成补全 ******************************** -If you want to be able to tab-complete completions, the setting -``tab_completion`` must be set to ``true``. By default, ``tab_completion`` is -set to ``true``. Snippet tab-completion is unaffected by this setting: they -will always be completed according to their tab trigger. +如果您希望能够通过制表符补全,则必须将设置 ``tab_completion`` 设置为 ``true``。默认情况下,``tab_completion`` 设置为 ``true``。片段标签完成不受此设置的影响:它们将始终根据其标签触发器完成。 -With ``tab_completion`` enabled, completion of items is always automatic, which -means that, unlike in the case of the completions list, Sublime Text will -always make a decision for you. The rules to select the best completion are the -same as above, but in case of ambiguity, Sublime Text will still insert the -item deemed most suitable. +启用 ``tab_completion`` 后,项目的补全始终是自动的,这意味着,与补全列表的情况不同,Sublime Text将始终为您做出决定。选择最佳补全的规则与上述相同,但如果含糊不清,Sublime Text仍将插入被认为最合适的项目。 -Inserting a Literal Tab Character +插入文字制表符 --------------------------------- -When ``tab_completion`` is enabled, you can press ``Shift+Tab`` to insert a -literal tab character. \ No newline at end of file +启用 ``tab_completion`` 后,可以按 ``Shift+Tab`` 键插入文字制表符。 \ No newline at end of file diff --git a/source/extensibility/extensibility.rst b/source/extensibility/extensibility.rst index 9b3d641..fb34ae6 100644 --- a/source/extensibility/extensibility.rst +++ b/source/extensibility/extensibility.rst @@ -1,17 +1,17 @@ -Extending Sublime Text +====================== +扩展 Sublime Text ====================== -As it can be seen from the long list of topics below, Sublime Text is a very -extensible editor. +从下面的一长串主题中可以看出,Sublime Text是一个非常易于扩展的编辑器。 .. toctree:: :maxdepth: 2 - commands - macros - snippets - completions - Command Palette - syntaxdefs - plugins - packages + 命令 + 宏 + 代码片段 + 补全 + 命令面板 + 语法定义 + 插件 + 包 diff --git a/source/extensibility/macros.rst b/source/extensibility/macros.rst index 5da9e60..57ca6c2 100644 --- a/source/extensibility/macros.rst +++ b/source/extensibility/macros.rst @@ -1,51 +1,37 @@ ====== -Macros +宏 ====== -Macros are a basic automation facility consisting in sequences of commands. Use -them whenever you need to repeat the exact same steps to perform an operation. +宏是一个基本的自动化设施,由命令序列组成。只要您需要重复完全相同的步骤来执行操作,请使用它们。 -Macro files are JSON files with the extension ``.sublime-macro``. Sublime Text -ships with a few macros providing core functionality, such as line and word -deletion. You can find these under **Tools | Macros**. +宏文件是JSON文件,扩展名为 ``.sublime-macro``。Sublime Text附带了一些提供核心功能的宏,例如行和字删除。你可以在 **Tools | Macros** 下找到这些宏。 -How to Record Macros +如何录制宏 ******************** -To start recording a macro, press :kbd:`Ctrl+q` and subsequently execute the -desired steps one by one. When you're done, press :kbd:`Ctrl+q` again to stop -the macro recorder. Your new macro won't be saved to a file, but kept in the -macro buffer instead. You will now be able to run the recorded macro by -pressing :kbd:`Ctrl+Shift+q` or save it to a file by selecting -**Tools | Save macro…**. +要开始录制宏,请按 :kbd:`Ctrl+q`,然后逐个执行所需的步骤。完成后,再次按 :kbd:`Ctrl+q` 停止宏录制器。您的新宏不会保存到文件中,而是保存在宏缓冲区中。现在,您可以通过按 :kbd:`Ctrl+Shift+q` 运行录制的宏,或通过选择 **Tools | Save macro…** 将其保存到文件中......。 -Note that the macro buffer will only remember the macro recorded latest. Also, -recorded macros only capture commands sent to the buffer: window level -commands, such as creating a new file, will be ignored. +请注意,宏缓冲区只会记住最新记录的宏。此外,记录的宏仅捕获发送到缓冲区的命令:窗口级命令(例如创建新文件)将被忽略。 -How to Edit Macros +如何编辑宏 ****************** -Alternatively to recording a macro, you can edit it by hand. Save a new file -with the extension ``.sublime-macro`` under :file:`Packages\User` and add -commands to it. This is how a macro file looks like:: +或者录制宏,您可以手动编辑它。在 :file:`Packages\User` 下保存扩展名为 ``.sublime-macro`` 的新文件,并向其添加命令。这是宏文件的样子: [ {"command": "move_to", "args": {"to": "hardeol"}}, {"command": "insert", "args": {"characters": "\n"}} ] -See the :doc:`../core/commands` section for more information on commands. +有关命令的更多信息,请参见 :doc:`../core/commands` 部分。 .. XXX: do we need to escape every kind of quotations marks? -If you're editing a macro by hand, you need to escape quotation marks, -blank spaces and backslashes by preceding them with ``\``. +如果您手动编辑宏,则需要通过在 ``\`` 前面加上引号,空格和反斜杠来转义。 -Where to Store Macros +存储宏的位置 ********************* -Macro files can be stored in any package folder, and they will show up -under **Tools | Macros | **. +宏文件可以存储在任何包文件夹中,它们将显示在 **Tools | Macros | ** 下。 diff --git a/source/extensibility/packages.rst b/source/extensibility/packages.rst index e3e168e..72b65ac 100644 --- a/source/extensibility/packages.rst +++ b/source/extensibility/packages.rst @@ -1,163 +1,119 @@ ======== -Packages +包 ======== -Packages are simply directories under ``Packages``. They exist mainly for -organizational purposes, but Sublime Text follows a few rules when dealing with -them. More on this later. +包只是 ``Packages`` 下的目录。它们主要用于组织目的,但Sublime Text在处理它们时遵循一些规则。稍后会详细介绍。 -Here's a list of typical resources living inside packages: +这是包含在包中的典型资源列表: - - build systems (``.sublime-build``) - - key maps (``.sublime-keymap``) - - macros (``.sublime-macro``) - - menus (``.sublime-menu``) - - plugins (``.py``) - - preferences (``.tmPreferences``) - - settings (``.sublime-settings``) - - syntax definitions (``.tmLanguage``) - - snippets (``.sublime-snippet``) - - themes (``.sublime-theme``) - -Some packages may include support files for other packages or core -features. For example, the spell checker uses :file:`Packages\Language - English` -as a data store for English dictionaries. - - -Types of Packages + - 构建系统 (``.sublime-build``) + - 快捷键 (``.sublime-keymap``) + - 宏 (``.sublime-macro``) + - 菜单 (``.sublime-menu``) + - 插件 (``.py``) + - 偏好 (``.tmPreferences``) + - 设置 (``.sublime-settings``) + - 语法定义 (``.tmLanguage``) + - 代码片段 (``.sublime-snippet``) + - 主题 (``.sublime-theme``) + +某些软件包可能包含其他软件包或核心功能的支持文件。例如,拼写检查器使用 :file:`Packages\Language - English` 作为英语词典的数据存储。 + + +包的类型 ***************** -In order to talk about packages in this guide, we'll divide them in groups. -This division is artificial and for the sake of clarity in this topic. Sublime -Text doesn't use it in any way. +为了讨论本指南中的软件包,我们将它们分组。这个划分是人为的,为了本主题的清晰起见。Sublime Text不以任何方式使用它。 -**core packages** - Sublime Text requires these packages in order to work. +**核心包** + Sublime Text需要这些包才能工作。 -**shipped packages** - Sublime Text includes these packages in every installation, although they are - not technically required. Shipped packages enhance Sublime Text out of the - box. They may have been contributed by users or third parties. +**运送包** + Sublime Text在每个安装中都包含这些包,尽管它们在技术上并不是必需的。运送包可以增强Sublime Text的功能。它们可能是由用户或第三方提供的。 -**user packages** - These packages are installed by the user to further extend Sublime Text. - They are not part of any Sublime Text installation and are always contributed - by users or third parties. +**用户包** + 这些包由用户安装,以进一步扩展Sublime Text。它们不是任何Sublime Text安装的一部分,并且始终由用户或第三方提供。 -**installed packages** - Any package that Sublime Text can restore if deleted. +**已安装包** + Sublime Text可以在删除时恢复的任何包。 -Let's emphasize again that you don't need to memorize this classification. -Also, it's worth noting that by *third party* we mainly refer to other editors' -users, like Textmate's. +让我们再次强调一点,你不需要记住这个分类。此外,值得注意的是,*第三方* 我们主要是指其他编辑的用户,如Textmate的用户。 -Installation of Packages +安装包 ************************ -There are two main ways to install packages: +安装包有两种主要方式: - - ``.sublime-package`` files - - version control systems + - ``.sublime-package`` 文件 + - 版本控制系统 -Ultimately, installing a package consists simply in placing a directory -containing Sublime Text resources under ``Packages``. The only thing that -changes from one system to another is how you copy these files. +最终,安装包只需要在 ``Packages`` 下放置一个包含Sublime Text资源的目录。从一个系统到另一个系统的唯一变化是如何复制这些文件。 -.. sidebar:: Installing Packages vs Installed Packages +.. sidebar:: 安装包与已安装包 - Note that installing a package doesn't actually make that package an - installed package. *Installed packages* are ``.sublime-package`` files - residing in the ``Installed Packages`` directory. In this guide, we use - *to install a package* to mean to copy a package to ``Packages``. + 请注意,安装包实际上并不会使该包成为已安装包。已安装包是驻留在 *Installed Packages* 目录中的 ``.sublime-package`` 文件。在本指南中,我们使用安装包来表示将包复制到 ``Packages``。 - Sublime Text can restore any package located in ``Installed Packages``, but - not every package located in ``Packages``. + Sublime Text可以恢复位于 ``Installed Packages`` 中的任何包,但不能恢复位于 ``Packages`` 中的每个包。 .. _installation-of-sublime-packages: -Installation of ``.sublime-package`` Files +安装 ``.sublime-package`` 文件 ------------------------------------------ -Copy the ``.sublime-package`` file to the ``Installed Packages`` directory -and restart Sublime Text. If the ``Installed Packages`` doesn't exist, you can -create it. +将 ``.sublime-package`` 文件复制到 ``Installed Packages`` 目录并重新启动Sublime Text。如果 ``Installed Packages`` 不存在,则可以创建它。 -Note that ``.sublime-package`` files are simply ``.zip`` archives with a custom -file extension. +请注意,``.sublime-package`` 文件只是带有自定义文件扩展名的 ``.zip`` 文件。 -Installation of Packages from a Version Control System +从版本控制系统安装包 ------------------------------------------------------ -Explaining how to use version control systems (VCSs) is outside the scope of -this guide, but there are many user packages available for free on public -repositories like Google Code, GitHub and Bitbucket. +解释如何使用版本控制系统(VCSs)超出了本指南的范围,但是在Google Code,GitHub和Bitbucket等公共存储库上有许多免费的用户包可用。 -Also, there is a `Sublime Text organization`_ at GitHub open to contributors. +此外,GitHub上还有一个向贡献者开放的 `Sublime Text组织`_。 -.. _Sublime Text organization: http://github.com/SublimeText +.. _Sublime Text组织: http://github.com/SublimeText -Packages and Magic +包与魔法 ****************** -There's little invisible magic involved in the way Sublime Text deals with packages. -Two notable exceptions are that macros defined in any package appear under -**Tools | Macros | **, and snippets from any package appear under -**Tools | Snippets | **. +Sublime Text处理包的方式中几乎没有隐形魔法。两个值得注意的例外是任何包中定义的宏都出现在 **Tools | Macros | **,以及任何包中的代码段显示在 **Tools | Snippets | **。 -As mentioned at the beginning, however, there are some rules for packages. -For instance, ``Package/User`` will never be clobbered during updates of the -software. +然而,正如开头所提到的,包有一些规则。 例如,在软件更新期间,``Package/User`` 永远不会被破坏。 -.. sidebar:: The ``User`` Package +.. sidebar:: ``User`` 包 - Usually, unpackaged resources are stored in ``Packages/User``. If you - have a few loose snippets, macros or plugins, this is a good place to keep - them. + 通常,未打包的资源存储在 ``Packages/User`` 中。如果你有一些松散的代码片段,宏或插件,这是一个保持它们的好地方。 .. _merging-and-order-of-precedence: -Merging and Order of Precedence +合并与优先顺序 ------------------------------- -``Packages/Default`` and ``Packages/User`` also receive a special treatment when -merging files (e. g. ``.sublime-keymap`` and ``.sublime-settings`` files). Before -the merging can take place, the files have to be arranged in an order. To that end, -Sublime Text sorts them alphabetically by name with the exception of files -contained in ``Default`` and ``User``: ``Default`` will always go to the front -of the list, and ``User`` to the end. +``Packages/Default`` 和 ``Packages/User`` 在合并文件时也会受到特殊处理(例如 ``.sublime-keymap`` 和 ``.sublime-settings`` 文件)。在合并之前,文件必须按顺序排列。为此,Sublime Text按名称按字母顺序对它们进行排序,但 ``Default`` 和 ``User`` 中包含的文件除外:``Default`` 将始终显示在列表的前面,而 ``User`` 将结束。 -Restoring Packages +恢复包 ****************** -Sublime Text keeps a copy of all installed packages so it can recreate them when -needed. This means it will be able to reinstall core packages, shipped packages -and user packages alike. However, only user packages installed as a ``sublime-package`` -are added to the registry of installed packages. Packages installed in alternative -ways will be completely lost if you delete them. +Sublime Text保留所有已安装软件包的副本,以便在需要时重新创建它们。这意味着它将能够重新安装核心软件包,随附的软件包和用户软件包。但是,只有作为 ``sublime-package`` 安装的用户软件包才会添加到已安装软件包的注册表中。如果删除它们,以其他方式安装的软件包将完全丢失。 -Reverting Sublime Text to Its Default Configuration +将Sublime Text恢复为默认配置 --------------------------------------------------- -To revert Sublime Text to its default configuration, delete the data directory -and restart the editor. Keep in mind, though, that the ``Installed Packages`` -directory will be deleted too, so you will lose all installed packages. +要将Sublime Text恢复为其默认配置,请删除数据目录并重新启动编辑器。但请记住,``Installed Packages`` 目录也将被删除,因此您将丢失所有已安装的软件包。 -Always make sure to back up your data before taking an extreme measure like this -one. +在采取像这样的极端措施之前,务必确保备份数据。 -The ``Installed Packages`` Directory +``Installed Packages`` 目录 ************************************ -You will find this directory in the data directory. It contains a copy of every -``sublime-package`` installed. Used to restore ``Packages``. +您将在数据目录中找到此目录。它包含每个安装的 ``sublime-package`` 的副本。用于恢复 ``Packages``。 -The ``Pristine Packages`` Directory +``Pristine Packages`` 目录 *********************************** -You will find this directoy in the data directory. It contains a copy of every -shipped and core package. Used to restore ``Packages``. \ No newline at end of file +您将在数据目录中找到此目录。它包含每个运送和核心包的副本。用于恢复 ``Packages``。 \ No newline at end of file diff --git a/source/extensibility/plugins.rst b/source/extensibility/plugins.rst index a36db17..e1c6c0c 100644 --- a/source/extensibility/plugins.rst +++ b/source/extensibility/plugins.rst @@ -1,87 +1,61 @@ -Plugins +======= 插件 ======= .. seealso:: 更多信息请参考: - :doc:`API Reference <../reference/api>` - More information on the Python API. :doc:`API参考文档 <../reference/api>` 有关Python API的更详细的信息。 - :doc:`Plugins Reference <../reference/plugins>` - More information about plugins. :doc:`插件参考文档 <../reference/api>` 有关插件的更详细的信息。 -Sublime Text 2 is programmable with Python scripts. Plugins reuse existing -commands or create new ones to build a feature. Plugins are rather a logical -entity than a physical one. Sublime Text 2可以使用Python脚本进行编程。插件可以重用已有的命令或者新建新的特性。 插件是指逻辑上的,而不是屋里存在的。 -Prerequisites 预备知识 ************* -In order to write plugins, you must be able to program in Python_. -要写一个插件,你必须要会用Python编程。 +要写一个插件,你必须要会用 Python_ 编程。 .. _Python: http://www.python.org -Where to Store Plugins 插件放到哪里 ********************** -Sublime Text 2 will look for plugins in these places: Sublime Text 2会在以下目录中寻找可用的插件: * ``Packages`` * ``Packages//`` * ``Packages/<包名称>`` -Consequently, any plugin nested deeper in ``Packages`` won't be loaded. 所以,存放在 ``Packages`` 更深层次的目录结构中的插件不会被加载。 -Keeping plugins right under ``Packages`` is discouraged, because Sublime Text -sorts packages in a predefined way before loading them. Thus, you might get -confusing results if your plugins live outside of a package. -让插件都存放在 ``Packages``会有些让人失望,因为Sublime Text会在加载插件之前 +让插件都存放在 ``Packages`` 会有些让人失望,因为Sublime Text会在加载插件之前 通过预先设定的方式排序包组。因此,如果你的插件在一个包的外面,可能会有意想不到的结果。 -Your First Plugin 编写第一个插件 ***************** -Let's write a "Hello, World!" plugin for Sublime Text 2: 下面,我们给Sublime Text 2写一个"Hello, World!"插件吧: -#. Select **Tools | New Plugin…** in the menu. -#. 选择目录**Tools | New Plugin…**。 -#. Save to ``Packages/User/hello_world.py``. -#. 保存到``Packages/User/hello_world.py``。 +#. 选择目录 **Tools | New Plugin…** 。 +#. 保存到 ``Packages/User/hello_world.py`` 。 -You've just written your first plugin. Let's put it to use: 你现在完成了你的第一个插件,下面将其投入使用: -#. Create a new buffer (``Ctrl+n``). #. 新建一个缓冲区(``Ctrl+n``)。 -#. Open the python console (``Ctrl+```). #. 打开python命令行(``Ctrl+```)。 -#. Type: ``view.run_command("example")`` and press enter. #. 输入:``view.run_command("example")``,然后按下回车。 -You should see the text "Hello, World!" in your new buffer. 你会看到你的新缓冲区内显示"Hello, World!"。 -Analyzing Your First Plugin 分析你的第一个插件 *************************** -The plugin created in the previous section should look roughly like this:: 前面我们编写插件大致如此: import sublime, sublime_plugin @@ -91,144 +65,84 @@ The plugin created in the previous section should look roughly like this:: self.view.insert(edit, 0, "Hello, World!") -The ``sublime`` and ``sublime_plugin`` modules are both provided by -Sublime Text 2. -``sublime``和``sublime_plugin``是Sublime Text 2提供的。 +``sublime`` 和 ``sublime_plugin`` 是Sublime Text 2提供的。 -New commands derive from the ``*Command`` classes defined in ``sublime_plugin`` -(more on this later). -新命令继承定义在``sublime_plugin``的``*Command``类(后面会进行详细的描述)。 +新命令继承定义在 ``sublime_plugin`` 的 ``*Command`` 类(后面会进行详细的描述)。 -The rest of the code is concerned with particulars of the ``TextCommand`` or -the API that we'll discuss in the next sections. -剩下的代码是来自于``TextCommand``的细节以及我们后面要讨论的API。 +剩下的代码是来自于 ``TextCommand`` 的细节以及我们后面要讨论的API。 -Before moving on, though, we'll look at how we called the new command: We first -opened the python console, and then issued a call to ``view.run_command()``. This -is a rather inconvenient way of using plugins, but it's often useful when -you're in the development phase. For now, keep in mind that your commands -can be accessed through key bindings or other means, just as other commands are. 在向下继续之前,嗯。。我们会看到如何调用新命令:首先,我们打开python命令行,然后 -调用``view.run_command()``。这样使用插件显然是很不方便的,但是在开发阶段还是比较 +调用 ``view.run_command()`` 。这样使用插件显然是很不方便的,但是在开发阶段还是比较 有用的。目前为止,你要记住,自定义的命令可以通过按键绑定或者其他方式使用,就像其 他命令一样。 -Conventions for Command Names 命令名称的命名规则 ----------------------------- -You might have noticed that our command is defined with the name ``ExampleCommand``, -but we pass the string ``example`` to the API call instead. This is necessary because -Sublime Text 2 normalizes command names by stripping the ``Command`` suffix and -separating ``CamelCasedPhrases`` with underscores, like this: ``camel_cased_phrases``. -你可能已经注意到了我们的命令是以``ExampleCommand``命名的,但是我们向API传入的参数却是 -``example``。Sublime Text 2是通过截断``Command``的后缀,在``CamelCasedPhrases``中加入 -下弧线的方式,比如``camel_cased_phrases``,来统一命令名称的。 +你可能已经注意到了我们的命令是以 ``ExampleCommand`` 命名的,但是我们向API传入的参数却是 +``example`` 。Sublime Text 2是通过截断 ``Command`` 的后缀,在 ``CamelCasedPhrases`` 中加入 +下弧线的方式,比如 ``camel_cased_phrases`` ,来统一命令名称的。 -New commands should follow the pattern mentioned above for class names. 新的命令必须要按照上面的方式命名类的名称。 -Types of Commands 命令类型 ***************** -You can create the following types of commands: 你可以新建以下类型的命令: -* Application commands (``ApplicationCommand``) * 应用程序命令(``ApplicationCommand``) -* Window commands (``WindowCommand``) * 窗口命令(``WindowCommand``) -* Text commands (``TextCommand``) * 文本命令(``TextCommand``) -When writing plugins, consider your goal and choose the appropriate type of -commands for your plugin. 当你编写插件时,请根据你的目的选择合适的命令类型。 -Shared Traits of Commands 命令之间的共享特性 ------------------------- -All commands need to implement a ``.run()`` method in order to work. Additionally, -they can receive and arbitrarily long number of keyword parameters. -所有的命令都必须实现一个``.run()``方法才能运行。另外,所有命令都可以接受任意长度的 +所有的命令都必须实现一个 ``.run()`` 方法才能运行。另外,所有命令都可以接受任意长度的 关键字参数。 -Application Commands 应用程序命令 -------------------- -Application commands derive from ``sublime_plugin.ApplicationCommand`` and -can be executed with ``sublime.run_command()``. -应用程序命令继承于``sublime_plugin.ApplicationCommand``,可以通过``sublime.run_command()`` -执行。 +应用程序命令继承于 ``sublime_plugin.ApplicationCommand`` ,可以通过 ``sublime.run_command()`` 执行。 -Window Commands 窗口命令 --------------- -Window commands operate at the window level. This doesn't mean that you cannot -manipulate views from window commands, but rather that you don't need views to -exist in order for window commands to be available. For instance, the built-in -command ``new_file`` is defined as a ``WindowCommand`` so it works too when no -view is open. Requiring a view to exist in that case wouldn't make sense. 串口命令是在窗口级生效的。这并不意味着你不能通过窗口命令控制视图,但是这也并不 是不需要你开启一些视图来让窗口命令生效。比如,内置命令 ``new_file`` 是一个 ``窗口命令`` ,然而没有视图一样可以生效。因为此时要求打开一个视图并没有意义。 -Window command instances have a ``.window`` attribute pointing to the window -instance that created them. 窗口命令实例有一个 ``.window`` 属性,指向创建它们的那个窗口实例。 -The ``.run()`` method of a window command does not need to take any required -arguments. -窗口命令的``.run()``方法不需要传入参数。 +窗口命令的 ``.run()`` 方法不需要传入参数。 -Text Commands 文本命令 ------------- -Text commands operate at the buffer level and they require a buffer to exist -in order to be available. 文本命令是在缓冲区级生效的,并且需要存在一个缓冲区使之生效。 -View command instances have a ``.view`` attribute pointing to the view instance -that created them. 视图命令实例有一个 ``.view`` 属性,指向创建它们的那个窗口实例。 -The ``.run()`` method of a text command needs to take an ``edit`` instance as -a first positional argument. 窗口命令的 ``.run()`` 方法需要一个 ``edit`` 实例作为第一个入参。 -Text Commands and the ``edit`` Object 文本命令和 ``edit`` 对象 ------------------------------------- -The edit object groups modifications to the view so undo and macros work in a -sensible way. You are responsible for creating and closing edit objects. To do -so, you can call ``view.begin_edit()`` and ``edit.end_edit()``. Text commands get -passed an open ``edit`` object in their ``run`` method for convenience. -Additionally, many ``View`` methods require an edit object. -编辑``edit``对象组修改视图,以便撤销和宏命令是以合理的方式运行。你有责任新建和 +编辑 ``edit`` 对象组修改视图,以便撤销和宏命令是以合理的方式运行。你有责任新建和 关闭edit对象。为此,你需要调用 ``view.begin_edit()`` 和 ``edit.end_edit()``。 文本命令为了方便,在其 ``run`` 方法中获取传入的 ``edit`` 对象。另外,许多 ``View`` 方法都需要一个edit对象。 -Responding to Events 事件响应 -------------------- -Any command deriving from ``EventListener`` will be able to respond to events. -任何继承自``EventListener``的命令都可以响应事件。 +任何继承自 ``EventListener`` 的命令都可以响应事件。 -Another Plugin Example: Feeding the Completions List 其他插件的例子:添加补全列表 ---------------------------------------------------- -Let's create a plugin that fetches data from Google Autocomplete service and -feeds it to Sublime Text 2 completions list. Please note that as ideas for -plugins go, this a very bad one. 接下来,我们做一个从Google自动完成服务获取数据的插件,然后添加到Sublime Text 2 的补全列表。请注意对于将其作为一个插件,这并不是什么好主意。 @@ -252,20 +166,11 @@ plugins go, this a very bad one. return sugs .. note:: -.. 注意:: - Make sure you don't keep this plugin around after trying it or it will - interefere with the autocompletion system. 确保你在这次尝试以后,不要保留这个插件,否则会干扰Google的自动完成系统的。 -Learning the API 学习API **************** -In order to create plugins, you need to get acquainted with the Sublime Text -API and the available commands. Documentation on both is scarce at the time of -this writing, but you can read existing code and learn from it too. In -particular, the ``Packages/Default`` folder contains many examples of -undocumented commands and API calls. 为了编写插件,你需要熟悉Sublime Text API和内置命令。在写这篇文档时,这些文档还是 比较匮乏的,但是你还是可以从现有的代码中学习的。尤其是在 ``Packages/Default`` 文 件中包含了许多非正式的例子和API调用。 diff --git a/source/extensibility/snippets.rst b/source/extensibility/snippets.rst index e8c6b0e..e6d62f3 100644 --- a/source/extensibility/snippets.rst +++ b/source/extensibility/snippets.rst @@ -1,36 +1,22 @@ -Snippets +======== 代码片段 ======== -Whether you are coding or writing the next vampire best-seller, you're likely to -need certain short fragments of text again and again. Use snippets to save yourself -tedious typing. Snippets are smart templates that will insert text for you and -adapt it to their context. 无论你是在敲代码还是撰写你的大作,你都会一遍一遍地写到一些小的重复片段。使用代码片段 保存这些冗长的部分。是一种很聪明的模板,它会根据你输入的上下文帮助你添加文本。 -To create a new snippet, select **Tools | New Snippet…**. Sublime Text will -present you with an skeleton for a new snippet. 要新建一个代码片段,选择目录 **Tools | New Snippet…**。Sublime Text会介绍给你一个 框架来新建一个代码片段。 -Snippets can be stored under any package's folder, but to keep it simple while -you're learning, you can save them to your ``Packages/User`` folder. 代码片段可以存储在任何一个包文件下,为了在你学习时方便,你可以将其保存在你的 -目录``Packages/User``下。 +目录 ``Packages/User`` 下。 -Snippets File Format 代码片段文件格式 ******************** -Snippets typically live in a Sublime Text package. They are simplified XML files -with the extension ``sublime-snippet``. For instance, you could have a -``greeting.sublime-snippet`` inside an ``Email`` package. -代码片段一般保存在Sublime Text的包里。这里使用了扩展``sublime-snippet``简化XML的 -文件。比如,你可以在包``Email``里保存``greeting.sublime-snippet``。 +代码片段一般保存在Sublime Text的包里。这里使用了扩展 ``sublime-snippet`` 简化XML的 +文件。比如,你可以在包 ``Email`` 里保存 ``greeting.sublime-snippet`` 。 -The structure of a typical snippet is as follows (including the default hints -Sublime Text inserts for your convenience): 典型的代码片段的结构如下(包括Sublime Text为方便你使用添加的默认提示): .. code-block:: xml @@ -45,111 +31,67 @@ Sublime Text inserts for your convenience): My Fancy Snippet -The ``snippet`` element contains all the information Sublime Text needs in order -to know *what* to insert, *whether* to insert it and *when*. Let's see all of -these parts in turn. -元素``snippet``包括Sublime Text需要的所有信息,以获取需要添加什么,是否添加以及 +元素 ``snippet`` 包括Sublime Text需要的所有信息,以获取需要添加什么,是否添加以及 什么情况下。接下来我们看一下每一个部分。 ``content`` - The actual snippet. Snippets can range from simple to fairly complex - templates. We'll look at examples of both later. 实际的代码片段。代码片段可以包括从最简单到相当复杂的模板。接下来,我们会看到 它们的例子。 - Keep the following in mind when writing your own snippets: 在编写你自己的代码片段时,你要记住以下内容: - - If you want the get a literal ``$``, you have to escape it like this: ``\$``. - - 如果你想输入``$``,你需要按照方式如下转义:``\$``。 + - 如果你想输入 ``$`` ,你需要按照方式如下转义:``\$``。 - - When writing a snippet that contains indentation, always use tabs. The - tabs will be transformed into spaces when the snippet is inserted if the - option ``translateTabsToSpaces`` is set to ``true``. - - 如果代码片段包括缩进,一般使用tab。选项``translateTabsToSpaces``为真时, + - 如果代码片段包括缩进,一般使用tab。选项 ``translateTabsToSpaces`` 为 ``true`` 时, 代码片段添加的tab会自动转换成空格。 - The ``content`` must be included in a ```` section. - Snippets won't work if you don't do this! - 标签``content``必须包含在块````中。如果不这么写,代码片段 + 标签 ``content`` 必须包含在块 ```` 中。如果不这么写,代码片段 可不好用哦~ ``tabTrigger`` - Defines the sequence of keys you will press to insert this snippet. The - snippet will kick in as soon as you hit the :kbd:`Tab` key after typing - this sequence. - 定义你在需要添加代码片段时按下的按键序列。在你按下按键序列后,再按下键盘上的`Tab` - 键,代码片段才会生效。 + 定义你在需要添加代码片段时按下的按键序列。在你按下按键序列后,再按下键盘上的 `Tab` 键,代码片段才会生效。 - A tab trigger is an implicit key binding. tab触发器是一个隐式的按键绑定。 ``scope`` - Scope selector determining the context where the snippet will be active. - See :ref:`scopes-and-scope-selectors` for more information. 作用域选择子决定了代码片段在哪个范围内生效。 - 详情请看:ref:`scopes-and-scope-selectors`。 + 详情请看 :ref:`scopes-and-scope-selectors` 。 ``description`` - Used when showing the snippet in the Snippets menu. If not present, Sublime Text - defaults to the name of the snippet. 在代码片段目录显示代码片段时使用。如果没显示,Sublime Text默认使用代码片段名。 -With this information, you can start writing your own snippets as described in -the next sections. 根据之前的信息,现在可以开始按照下面的章节写自己的代码片段了。 .. note:: 注释: - In the interest of brevity, we're only including the ``content`` - element's text in examples unless otherwise noted. - 为了简洁,除非另外说明,这里的例子中只包含``content``元素。 + 为了简洁,除非另外说明,这里的例子中只包含 ``content`` 元素。 -Snippet Features 代码片段特性 **************** -Environment Variables 环境变量 --------------------- -Snippets have access to contextual information in the form of environment variables. -Sublime Text sets the values of the variables listed below automatically. 代码片段根据环境变量获得上下文信息。Sublime Text会自动设定下面所述的变量值。 -You can also add your own variables to provide extra information. These custom -variables are defined in ``.sublime-options`` files. -你也可以加上自己的变量来提供额外的信息。这些自定义变量都在文件``.sublime-options`` +你也可以加上自己的变量来提供额外的信息。这些自定义变量都在文件 ``.sublime-options`` 中定义。 ====================== ==================================================================================== -**$PARAM1, $PARAM2…** Arguments passed to the ``insert_snippet`` command. (Not covered here.) **$PARAM1, $PARAM2…** 传递给 ``insert_snippet`` 命令的各个参数。 -**$SELECTION** The text that was selected when the snippet was triggered. **$SELECTION** 代码片段被触发的时候选中的文本内容。 -**$TM_CURRENT_LINE** Content of the line the cursor was in when the snippet was triggered. **$TM_CURRENT_LINE** 代码片段被触发的时候光标所在行的内容。 -**$TM_CURRENT_WORD** Current word under the cursor when the snippet was triggered. **$TM_CURRENT_WORD** 代码片段被触发的时候光标所在的单词。 -**$TM_FILENAME** File name of the file being edited including extension. **$TM_FILENAME** 正在编辑的文件名称,包含文件扩展名。 -**$TM_FILEPATH** File path to the file being edited. **$TM_FILEPATH** 正在编辑的文件的文件路径。 -**$TM_FULLNAME** User's user name. **$TM_FULLNAME** 用户的用户名。 -**$TM_LINE_INDEX** Column the snippet is being inserted at, 0 based. **$TM_LINE_INDEX** 插入代码片段的列的位置,位置是从0开始计数的。 -**$TM_LINE_NUMBER** Row the snippet is being inserted at, 1 based. **$TM_LINE_NUMBER** 插入代码片段的行的位置,位置是从1开始计数的。 -**$TM_SELECTED_TEXT** An alias for **$SELECTION**. **$TM_SELECTED_TEXT** 与 ``$SELECTION`` 是等价的。 -**$TM_SOFT_TABS** ``YES`` if ``translate_tabs_to_spaces`` is true, otherwise ``NO``. **$TM_SOFT_TABS** 当 ``translateTabsToSpaces`` 选项是真的时候,值是 ``YES`` ,否则为 ``NO`` 。 -**$TM_TAB_SIZE** Spaces per-tab (controlled by the ``tab_size`` option). **$TM_TAB_SIZE** tab对应的空格数(受 ``tabSize`` 选项的控制)。 ====================== ==================================================================================== -Let's see a simple example of a snippet using variables: 接下来,我们看一个使用变量的简单的例子: .. code-block:: perl @@ -170,14 +112,10 @@ Let's see a simple example of a snippet using variables: ==================================== -Fields 字域 ------ -With the help of field markers, you can cycle through positions within the -snippet by pressing the :kbd:`Tab` key. Fields are used to walk you through the -customization of a snippet once it's been inserted. -有了字域标记,你可以通过在代码片段中的某一位置按下键盘的`Tab`键来循环。一旦添加 +有了字域标记,你可以通过在代码片段中的某一位置按下键盘的 `Tab` 键来循环。一旦添加 了代码片段,字域可以通过自定义的信息帮助你走查。 .. code-block:: perl @@ -186,27 +124,17 @@ customization of a snippet once it's been inserted. Second Name: $2 Address: $3 -In the example above, the cursor will jump to ``$1`` if you press :kbd:`Tab` once. -If you press :kbd:`Tab` a second time, it will advance to ``$2``, etc. You can also -move backwards in the series with :kbd:`Shift+Tab`. If you press :kbd:`Tab` after the -highest tab stop, Sublime Text will place the cursor at the end of the snippet's -content so that you can resume normal editing. -上面的例子中,当你按下一次键盘`Tab`键时,光标会跳转到``$1``。当你连续按下`Tab`两次是,会跳转 -到``$2``等等。你也可以按下键盘的`Shift+Tab`键后退。如果你在最高制表位按下`Tab`键,Sublime Text +上面的例子中,当你按下一次键盘 `Tab` 键时,光标会跳转到 ``$1`` 。当你连续按下 `Tab` 两次是,会跳转 +到 ``$2`` 等等。你也可以按下键盘的 `Shift+Tab` 键后退。如果你在最高制表位按下 `Tab` 键,Sublime Text 会将光标停留在代码片段内容的末尾,以便你可以重新开始编辑。 -If you want to control where the exit point should be, use the ``$0`` mark. -如果你想控制退出点的位置,你可以使用``$0``标记。 +如果你想控制退出点的位置,你可以使用 ``$0`` 标记。 -You can break out of the field cycle any time by pressing :kbd:`Esc`. -你可以通过按下键盘的`Esc`键跳出字域循环。 +你可以通过按下键盘的 `Esc` 键跳出字域循环。 -Mirrored Fields 镜像字域 --------------- -Identical field markers mirror each other: when you edit the first one, the rest -will be populated with the same value in real time. 相同的字域标记会相互映射:当你输入了第一个,剩下的立刻填充相同的值。 .. code-block:: perl @@ -216,16 +144,11 @@ will be populated with the same value in real time. Address: $3 User name: $1 -In this example, "User name" will be filled out with the same value as "First Name". 这个例子中,"User name"会填充"First Name"的值。 -Place Holders 占位符 ------------- -By expanding the field syntax a little bit, you can define default values for -a field. Place holders are useful when there's a general case for your snippet -but you still want to keep its customization convenient. 通过扩展一些字域的语法,你可以为每一个域设定默认值。如果在你的代码片段里需要设定 一个一般的情况,你又希望不失去自定义的便捷,占位符是非常有用的。 @@ -236,7 +159,6 @@ but you still want to keep its customization convenient. Address: ${3:Main Street 1234} User name: $1 -Variables can be used as place holders: 变量也可以用作占位符: .. code-block:: perl @@ -246,60 +168,44 @@ Variables can be used as place holders: Address: ${3:Main Street 1234} User name: ${4:$TM_FULLNAME} -And you can nest place holders within other place holders too: 你也可以在其他的占位符里嵌套占位符: .. code-block:: perl Test: ${1:Nested ${2:Placeholder}} -Substitutions 替换 ------------- .. WARNING:: -.. 警告:: - This section is a draft and may contain inaccurate information. 这部分是一个草稿,可能会有不准确的内容。 -In addition to the place holder syntax, tab stops can specify more complex operations -with substitutions. Use substitutions to dynamically generate text based on a mirrored -tab stop. 除了占位符语法,制表符的设置可以使用替换设定更多复杂的操作。使用替换可以根据映射的制表符 设置动态地生成文本。 -The substitution syntax has the following syntaxes: 替换的语法如下: - ``${var_name/regex/format_string/}`` - ``${var_name/regex/format_string/options}`` **var_name** - The variable name: 1, 2, 3… 变量名:1, 2, 3… **regex** - Perl-style regular expression: See the `Boost library reference for regular expressions `_. - Perl风格的正则表达式:关于`正则表达式 `_ ,请参考Boost库的文档。 + Perl风格的正则表达式:关于 `正则表达式 `_ ,请参考Boost库的文档。 **format_string** - See the `Boost library reference for format strings `_. 参考Boost库文档的 `格式字符串 `_ 内容。 **options** - Optional. May be any of the following: 可选的。可以选择下面的任何一个: **i** - Case-insensitive regex. 忽略大小写敏感的正则。 **g** - Replace all occurrences of ``regex``. 替换所有匹配 ``regex`` 的内容。 **m** - Don't ignore newlines in the string. 在字符串中不要忽略换行符。 -With substitutions you can, for instance, underline text effortlessly: 有了替换,比如,你可以如此简单地添加文本下划线: .. code-block:: perl diff --git a/source/extensibility/syntaxdefs.rst b/source/extensibility/syntaxdefs.rst index 35d07ba..f569b0c 100644 --- a/source/extensibility/syntaxdefs.rst +++ b/source/extensibility/syntaxdefs.rst @@ -1,147 +1,94 @@ -Syntax Definitions +语法定义 ================== -Syntax definitions make Sublime Text aware of programming and markup languages. -Most noticeably, they work together with colors to provide syntax highlighting. -Syntax definitions define *scopes* in a buffer that divide the text in named -regions. Several editing features in Sublime Text make extensive use of -this fine-grained contextual information. +语法定义使Sublime Text能够识别编程和标记语言。最值得注意的是,它们与颜色一起使用以提供语法突出显示。语法定义定义将缓冲区中的文本划分为命名区域的范围。Sublime Text中的几个编辑功能广泛使用了这种细粒度的上下文信息。 -Essentially, syntax definitions consist of regular expressions used to find -text, and more or less arbitrary, dot-separated strings called *scopes* or *scope -names*. For every occurrence of a given regular expression, Sublime Text gives -the matching text its corresponding *scope name*. +本质上,语法定义包括用于查找文本的正则表达式,以及或多或少任意的点分隔字符串,称为 *scopes* 或 *scope names*。对于给定正则表达式的每次出现,Sublime Text都会为匹配的文本提供其对应的 *scope name*。 -Prerequisites +先决条件 ************* -In order to follow this tutorial, you will need to install AAAPackageDev_, a package -intended to ease the creation of new syntax definitions for Sublime Text. AAAPackageDev -lives on a public Mercurial_ repository at Bitbucket_. +为了学习本教程,您需要安装 PackageDev_,这是一个旨在简化Sublime Text新语法定义创建的软件包。按照README文件“Getting Started”部分中的安装说明进行操作。 -.. _AAAPackageDev: https://bitbucket.org/guillermooo/aaapackagedev -.. _Mercurial: http://mercurial.selenic.com/ -.. _Bitbucket: http://bitbucket.org +.. _PackageDev: https://github.com/SublimeText/PackageDev -Download the latest ``.sublime-package`` file and install it as described in -:ref:`installation-of-sublime-packages`. - -.. sidebar:: Mercurial and Bitbucket - - Mercurial is a distributed version control system (DVCS). Bitbucket is an - online service that provides hosting for Mercurial repositories. If you want - to install Mercurial, there are freely available command-line and graphical - `clients`_. - - .. _`clients`: http://mercurial.selenic.com/downloads/ - -File format +文件格式 *********** Sublime uses `property list`_ files (Plist) to store syntax definitions. Because editing XML files is a cumbersome task, though, we'll be using JSON_ instead and converting it to Plist afterwards. This is where the AAAPackageDev package mentioned above comes in. +Sublime Text使用 属性列表_(Plist)文件来存储语法定义。但是,因为编辑XML文件是一项繁琐的任务,所以我们将使用 YAML_,然后将其转换为Plist格式。这是PackageDev包(如上所述)的用武之地。 -.. _property list: http://en.wikipedia.org/wiki/Property_list -.. _JSON: http://en.wikipedia.org/wiki/JSON +.. _属性列表: http://en.wikipedia.org/wiki/Property_list +.. _YAML: http://en.wikipedia.org/wiki/YAML .. note:: - If you experience unexpected errors during this tutorial, chances are - AAAPackageDev is to blame. Don't immediately think your problem is due to a - bug in Sublime Text. + 如果您在本教程中遇到意外错误,则可能是PackageDev或YAML的责任。不要立即认为您的问题是由于Sublime Text中的错误造成的。 -By all means, do edit the Plist files by hand if you prefer to work in XML, but -keep always in mind the differing needs with regards to escape sequences, etc. +无论如何,如果您更喜欢使用XML,请手动编辑Plist文件,但始终牢记它们对转义序列,许多XML标记等的不同需求。 .. _scopes-and-scope-selectors: Scopes ****** -Scopes are a key concept in Sublime Text. Essentially, they are named text -regions in a buffer. They don't do anything by themselves, but Sublime Text peeks -at them when it needs contextual information. +Scopes是Sublime Text中的关键概念。实质上,它们在缓冲区中被命名为文本区域。他们自己不做任何事情,但Sublime Text在需要上下文信息时偷看他们。 -For instance, when you trigger a snippet, Sublime Text checks the scope the snippet's -bound to and looks at the caret's position in the file. If the caret's current -scope matches the snippet's scope selector, Sublime Text fires the snippet off. -Otherwise, nothing happens. +例如,当您触发代码片段时,Sublime Text会检查绑定到代码片段的scope并查看插入符号在文件中的位置。如果插入符号的当前位置与代码片段的scope选择器匹配,则Sublime Text会将其触发。否则,没有任何反应。 -.. sidebar:: Scopes vs Scope Selectors +.. sidebar:: Scopes与Scope选择器 - There's a slight difference between *scopes* and *scope selectors*: scopes are - the names defined in a syntax definition, whilst scope selectors are used in - items like snippets and key bindings to target scopes. When creating a new syntax - definition, you care about scopes; when you want to constrain a snippet to a - certain scope, you use a scope selector. + *scope* 和 *scope选择器* 之间存在细微差别:scope是语法定义中定义的名称,而scope选择器用于代码片段和目标scope的键绑定等项目。在创建新的语法定义时,您关心scope;如果要将代码片段限制到某个scope,可以使用scope选择器。 -Scopes can be nested to allow for a high degree of granularity. You can drill down -the hierarchy very much like with CSS selectors. For instance, thanks to scope -selectors, you could have a key binding activated only within single quoted strings -in python source code, but not inside single quoted strings in any other language. +Scopes可以嵌套以允许高度粒度。您可以像使用CSS选择器一样向下钻取层次结构。例如,由于scope选择器,您可以仅在Python源代码中的单引号字符串中激活键绑定,但不能在任何其他语言的单引号字符串中激活。 -Sublime Text implements the idea of scopes from Texmate, a text editor for Mac. -`Textmate's online manual`_ contains further information about scope selectors -that's useful for Sublime Text users too. +Sublime Text继承了Textmate的scope思想,Textmate是Mac的文本编辑器。`Textmate的在线手册`_包含有关scope选择器的更多信息,这些信息对Sublime Text用户也很有用。特别是,颜色方案广泛使用scope来设置所需颜色的语言的每个方面。 -.. _`Textmate's online manual`: http://manual.macromates.com/en/ +.. _`Textmate的在线手册`: http://manual.macromates.com/en/ -How Syntax Definitions Work +语法定义的工作原理 *************************** -At their core, syntax definitions are arrays of regular expressions paired with -scope names. Sublime Text will try to match these patterns against a buffer's text -and attach the corresponding scope name to all occurrences. These pairs of regular -expressions and scope names are known as *rules*. +语法定义的核心是与范围名称配对的正则表达式数组。Sublime Text将尝试将这些模式与缓冲区的文本进行匹配,并将相应的范围名称附加到所有实例。这些正则表达式和范围名称对称为 *规则*。 .. XXX: What are those exceptions mentioned below? -Rules are applied in order, one line at a time. Each rule consumes the matched -text region, which will therefore be excluded from the next rule's matching attempt -(save for a few exceptions). In practical terms, this means that you should take -care to go from more specific rules to more general ones when you create a new -syntax definition. Otherwise, a greedy regular expression might swallow parts -you'd like to have styled differently. +规则按顺序应用,一次一行。每个规则都会使用匹配的文本区域,因此将从下一个规则的匹配尝试中排除(除少数例外)。实际上,这意味着在创建新的语法定义时,应该注意从更具体的规则转到更一般的规则。否则,贪婪的正则表达式可能会吞下您希望以不同方式设置样式的部分。 -Syntax definitions from separate files can be combined, and they can be recursively -applied too. +可以组合来自单独文件的语法定义,也可以递归地应用它们。 -Your First Syntax Definition +你的第一个语法定义 **************************** -By way of example, let's create a syntax definition for Sublime Text snippets. -We'll be styling the actual snippet content, not the ``.sublime-snippet`` file. +举例来说,让我们为Sublime Text代码片段创建一个语法定义。我们将设计实际的代码片段内容,而不是 ``.sublime-snippet`` 文件。 .. note:: - Since syntax definitions are primarily used to enable syntax highlighting, - we'll use *to style* as in *to break down a source code file into - scopes*. Keep in mind, however, that colors are a different thing to syntax - definitions and that scopes have many more uses besides syntax highlighting. + 由于语法定义主要用于启用语法突出显示,因此我们将使用样式将源代码文件分解为范围。 但请记住,颜色与语法定义不同,除了语法高亮之外,范围还有更多用途。 -These are the elements we want to style in a snippet: +这些是我们想要在代码段中设置样式的元素: - - Variables (``$PARAM1``, ``$USER_NAME``\ …) - - Simple fields (``$0``, ``$1``\ …) - - Complex fields with place holders (``${1:Hello}``) - - Nested fields (``${1:Hello ${2:World}!}``) - - Escape sequences (``\\$``, ``\\<``\ …) - - Illegal sequences (``$``, ``<``\ …) + - 变量 (``$PARAM1``, ``$USER_NAME``\ …) + - 简单字段 (``$0``, ``$1``\ …) + - 带有占位符的复杂字段 (``${1:Hello}``) + - 嵌套字段 (``${1:Hello ${2:World}!}``) + - 转义序列 (``\\$``, ``\\<``\ …) + - 非法序列 (``$``, ``<``\ …) .. note:: - Before continuing, make sure you've installed the AAAPackageDev package - as explained further above. + 在继续之前,请确保已安装AAAPackageDev软件包,如上所述。 -Creating A New Syntax Definition +创建新的语法定义 -------------------------------- -To create a new syntax definition, follow these steps: +要创建新的语法定义,请按照下列步骤操作: - - Go to **Tools | Packages | Package Development | New Syntax Definition** - - Save the new file to your ``Packages/User`` folder as a ``.JSON-tmLanguage`` file. + - 前往 **Tools | Packages | Package Development | New Syntax Definition** + - 将新文件作为 ``.JSON-tmLanguage`` 文件保存到你的 ``Packages/User`` 文件夹中。 -You should now see a file like this:: +您现在应该看到这样的文件:: { "name": "Syntax Name", "scopeName": "source.syntax_name", @@ -151,30 +98,24 @@ You should now see a file like this:: "uuid": "ca03e751-04ef-4330-9a6b-9b99aae1c418" } -Let's examine now the key elements. +我们现在来看看关键元素。 ``uuid`` - Located at the end, this is a unique identifier for this syntax definition. - Each new syntax definition gets its own uuid. Don't modify them. + 位于末尾,这是此语法定义的唯一标识符。每个新的语法定义都有自己的uuid。不要修改它们。 ``name`` - The name that Sublime Text will display in the syntax definition drop-down list - Use a short, descriptive name. Typically, you will be using the programming - language's name you are creating the syntax definition for. + Sublime Text将在语法定义下拉列表中显示的名称使用简短的描述性名称。通常,您将使用要为其创建语法定义的编程语言名称。 ``scopeName`` - The top level scope for this syntax definition. It takes the form - ``source.`` or ``text.``. For programming languages, - use ``source``. For markup and everything else, ``text``. + 此语法定义的顶级范围。它采用表单 ``source.`` 或 ``text.``。对于编程语言,请使用 ``source``。对于标记和其他一切,``text``。 ``fileTypes`` - This is a list of file extensions. When opening files of these types, - Sublime Text will automatically activate this syntax definition for them. + 这是文件扩展名列表。打开这些类型的文件时,Sublime Text将自动为它们激活此语法定义。 ``patterns`` - Container for your patterns. + 您的模式的容器。 -For our example, fill in the template with the following information:: +对于我们的示例,请使用以下信息填写模板:: { "name": "Sublime Snippet (Raw)", "scopeName": "source.ssraw", @@ -185,32 +126,24 @@ For our example, fill in the template with the following information:: } .. note:: - JSON is a very strict format, so make sure to get all the commas and quotes right. - If the conversion to Plist fails, take a look at the output panel for more - information on the error. We'll explain later how to convert a syntax - definition in JSON to Plist. + JSON是一种非常严格的格式,因此请确保正确地获取所有逗号和引号。如果转换为Plist失败,请查看输出面板以获取有关错误的更多信息。稍后我们将解释如何将JSON中的语法定义转换为Plist。 -Analyzing Patterns +分析模式 ****************** -The ``patterns`` array can contain several types of elements. We'll look at some -of them in the following sections. If you want to learn more about patterns, -refer to Textmate's online manual. +``patterns`` 数组可以包含几种类型的元素。我们将在以下部分中介绍其中一些内容。如果您想了解有关模式的更多信息,请参阅Textmate的在线手册 -.. sidebar:: Regular Expressions' Syntax In Syntax Definitions +.. sidebar:: 语法定义中的正则表达式语法 - Sublime Text uses Oniguruma_'s syntax for regular expressions in syntax definitions. - Several existing syntax definitions make use of features supported by this regular - expression engine that aren't part of perl-style regular expressions, hence the - requirement for Oniguruma. + Sublime Text在语法定义中使用 Oniguruma_ 的正则表达式语法。一些现有的语法定义使用了这个正则表达式引擎支持的功能,这些功能不属于perl风格的正则表达式,因此需要Oniguruma。 .. _Oniguruma: http://www.geocities.jp/kosako3/oniguruma/doc/RE.txt -Matches +匹配 ------- -They take this form: +他们采取这种形式: .. code-block:: js @@ -220,15 +153,15 @@ They take this form: } ``match`` - A regular expression Sublime Text will use to try and find matches. + 正则表达式Sublime Text将用于尝试查找匹配项。 ``name`` - Name of the scope that should be applied to the occurrences of ``match``. + 应用于 ``match`` 事件的scope的名称。 ``comment`` - An optional comment about this pattern. + 关于此模式的可选注释。 -Let's go back to our example. Make it look like this: +让我们回到我们的例子。看起来像这样: .. code-block:: js @@ -240,10 +173,9 @@ Let's go back to our example. Make it look like this: "uuid": "ca03e751-04ef-4330-9a6b-9b99aae1c418" } -That is, make sure the ``patterns`` array is empty. +也就是说,确保 ``patterns`` 数组为空。 -Now we can begin to add our rules for Sublime snippets. Let's start with simple -fields. These could be matched with a regex like so: +现在我们可以开始为Sublime代码片段添加规则。让我们从简单的字段开始。这些可以与正则表达式匹配,如下所示: .. code-block:: perl @@ -251,14 +183,13 @@ fields. These could be matched with a regex like so: # or... \$\d+ -However, because we're writing our regex in JSON, we need to factor in JSON's -own escaping rules. Thus, our previous example becomes: +但是,因为我们正在用JSON编写正则表达式,所以我们需要考虑JSON自己的转义规则。因此,我们之前的例子变成: .. code-block:: js \\$\\d+ -With escaping out of the way, we can build our pattern like this: +随着逃避,我们可以像这样构建我们的模式: .. code-block:: js @@ -267,24 +198,15 @@ With escaping out of the way, we can build our pattern like this: "comment": "Tab stops like $1, $2..." } -.. sidebar:: Choosing the Right Scope Name +.. sidebar:: 选择正确的范围名称 - Naming scopes isn't obvious sometimes. Check the Textmate online manual - for guidance on scope names. It is important to re-use the basic categories - outlined there if you want to achieve the highest compatibility with existing - colors. + 命名范围有时并不明显。有关范围名称的指导,请查看Textmate在线手册。如果要实现与现有颜色的最高兼容性,重复使用其中概述的基本类别非常重要。 - Colors have hardcoded scope names in them. They could not possibly include - every scope name you can think of, so they target the standard ones plus some - rarer ones on occasion. This means that two colors using the same syntax - definition may render the text differently! + 颜色中包含硬编码的范围名称。它们不可能包含您能想到的每个范围名称,因此它们的目标是标准的以及一些罕见的。这意味着使用相同语法定义的两种颜色可能会以不同方式呈现文本! - Bear in mind too that you should use the scope name that best suits your - needs or preferences. It'd be perfectly fine to assign a scope like - ``constant.numeric`` to anything other than a number if you have a good - reason to do so. + 还要记住,您应该使用最适合您的需求或偏好的范围名称。如果你有充分的理由将一个像 ``constant.numeric`` 这样的范围分配给数字以外的任何东西,那就完全没问了。 -And we can add it to our syntax definition too: +我们也可以将它添加到我们的语法定义中: .. code-block:: js @@ -300,24 +222,18 @@ And we can add it to our syntax definition too: "uuid": "ca03e751-04ef-4330-9a6b-9b99aae1c418" } -We're now ready to convert our file to ``.tmLanguage``. Syntax definitions use -Textmate's ``.tmLanguage`` extension for compatibility reasons. As explained further -above, they are simply XML files in the Plist format. +我们现在准备将我们的文件转换为 ``.tmLanguage``。出于兼容性原因,语法定义使用Textmate的 ``.tmLanguage`` 扩展。如上所述,它们只是Plist格式的XML文件。 -Follow these steps to perform the conversion: +请按照以下步骤执行转换: - - Select ``Json to tmLanguage`` in **Tools | Build System** - - Press :kbd:`F7` - - A ``.tmLanguage`` file will be generated for you in the same folder as your - ``.JSON-tmLanguage`` file - - Sublime Text will reload the changes to the syntax definition + - 在 **Tools | Build System** 中选择 ``Json to tmLanguage`` + - 按下 :kbd:`F7` + - 将在与 ``.JSON-tmLanguage`` 文件相同的文件夹中为您生成 ``.tmLanguage`` 文件 + - Sublime Text会将更改重新加载到语法定义中 -You have now created your first syntax definition. Next, open a new file and save -it with the extension ``.ssraw``. The buffer's syntax name should switch to -"Sublime Snippet (Raw)" automatically, and you should get syntax highlighting if -you type ``$1`` or any other simple snippet field. +您现在已经创建了第一个语法定义。接下来,打开一个新文件并使用扩展名 ``.ssraw`` 保存。缓冲区的语法名称应自动切换到“Sublime Snippet(Raw)”,如果键入 ``$1`` 或任何其他简单的片段字段,则应该获得语法突出显示。 -Let's proceed to creating another rule for environment variables. +让我们继续为环境变量创建另一个规则。 .. code-block:: js @@ -326,17 +242,14 @@ Let's proceed to creating another rule for environment variables. "comment": "Variables like $PARAM1, $TM_SELECTION..." } -Repeat the steps above to update the ``.tmLanguage`` file and restart Sublime Text. +重复上述步骤以更新 ``.tmLanguage`` 文件并重新启动Sublime Text。 -Fine Tuning Matches +微调匹配 ------------------- -You might have noticed that the entire text in ``$PARAM1``, for instance, is styled -the same way. Depending on your needs or your personal preferences, you may want -the ``$`` to stand out. That's where ``captures`` come in. Using captures, -you can break a pattern down into components to target them individually. +您可能已经注意到,例如,``$PARAM1`` 中的整个文本的样式方式相同。根据您的需求或个人喜好,您可能希望 ``$`` 能够脱颖而出。这就是 ``captures`` 的来源。使用捕获,您可以将模式分解为组件以单独定位它们。 -Let's rewrite one of our previous patterns to use ``captures``: +让我们重写之前的一个模式来使用 ``captures``: .. code-block:: js @@ -348,30 +261,23 @@ Let's rewrite one of our previous patterns to use ``captures``: "comment": "Variables like $PARAM1, $TM_SELECTION..." } -Captures introduce complexity to your rule, but they are pretty straightforward. -Notice how numbers refer to parenthesized groups left to right. Of course, you can -have as many capture groups as you want. +捕获会为您的规则带来复杂性,但它们非常简单。请注意数字如何从左到右引用括号组。当然,您可以拥有任意数量的捕获组。 -Arguably, you'd want the other scope to be visually consistent with this one. -Go ahead and change it too. +可以说,您希望其他范围在视觉上与此范围保持一致。继续改变它。 -Begin-End Rules +始末规则 ---------------- -Up to now we've been using a simple rule. Although we've seen how to dissect patterns -into smaller components, sometimes you'll want to target a larger portion of your -source code clearly delimited by start and end marks. +到目前为止,我们一直在使用一个简单的规则。虽然我们已经看到如何将模式分解为更小的组件,但有时您会希望将源代码的大部分目标明确区分为开始和结束标记。 -Literal strings enclosed in quotation marks and other delimited constructs are -better dealt with with begin-end rules. This is a skeleton for one of these rules:: +用引号和其他分隔结构括起来的文字字符串最好用开始结束规则处理。这是其中一条规则的骨架:: { "name": "", "begin": "", "end": "" } -Well, at least in their simplest version. Let's take a look at one including all -available options:: +好吧,至少在他们最简单的版本中。让我们来看一个包括所有可用选项:: { "name": "", "begin": "", @@ -390,31 +296,27 @@ available options:: "contentName": "" } -Some elements may look familiar, but their combination might be daunting. Let's -see them individually. +有些元素可能看起来很熟悉,但它们的组合可能令人生畏。让我们分别看一下。 ``begin`` - Regex for the opening mark for this scope. + 正则表达式为此范围的开头标记。 ``end`` - Regex for the end mark for this scope. + 正则表达式为此范围的结束标记。 ``beginCaptures`` - Captures for the ``begin`` marker. They work like captures for simple matches. Optional. + 捕获 ``begin`` 标记。它们像捕捉简单匹配一样工作。可选的。 ``endCaptures`` - Same as ``beginCaptures`` but for the ``end`` marker. Optional. + 与 ``beginCaptures`` 相同但是结束标记。可选。 ``contentName`` - Scope for the whole matched region, from the begin marker to the end marker, - inclusive. This will effectively create nested scopes for ``beginCaptures``, - ``endCaptures`` and ``patterns`` defined within this rule. Optional. + 整个匹配区域的范围,从开始标记到结束标记,包括在内。这将有效地为此规则中定义的beginCaptures,endCaptures和模式创建嵌套作用域。可选的。 ``patterns`` - An array of patterns to match against the begin-end content **only** ---they are not - matched against the text consumed by ``begin`` or ``end``. + 仅与开始端内容匹配的模式数组 - 它们与开始或结束消耗的文本不匹配。 -We'll use this rule to style nested complex fields in snippets:: +我们将使用此规则来设置片段中嵌套的复杂字段的样式:: { "name": "variable.complex.ssraw", "begin": "(\\$)(\\{)([0-9]+):", @@ -431,30 +333,20 @@ We'll use this rule to style nested complex fields in snippets:: "end": "\\}" } -This is the most complex pattern we'll see in this tutorial. The ``begin`` and ``end`` -keys are self-explanatory: they define a region enclosed between ``${:`` and ``}``. -``beginCaptures`` further divides the begin mark into smaller scopes. +这是我们将在本教程中看到的最复杂的模式。``begin`` 和 ``end`` 键是不言自明的:它们定义了 ``${:`` 和 ``}`` 之间的区域。``beginCaptures`` 进一步将开始标记划分为较小的范围。 -The most interesting part, however, is ``patterns``. Recursion and the -importance of ordering have finally made an appearance here. +然而,最有趣的部分是 ``patterns``。递归和订购的重要性终于在这里出现了。 -We've seen further above that fields can be nested. In order to account for -this, we need to recursively style nested fields. That's what the ``include`` -rule does when furnished the ``$self`` value: it recursively applies our entire -syntax definition to the portion of text contained in our begin-end rule, excluding -the text consumed by both ``begin`` and ``end``. +我们在上面已经看到,字段可以嵌套。为了解释这一点,我们需要递归地设置嵌套字段的样式。这就是 ``include`` 规则在提供 ``$self`` 值时的作用:它递归地将我们的整个语法定义应用于我们的开始结束规则中包含的文本部分,不包括 ``begin`` 和 ``end`` 消耗的文本。 -Remember that matched text is consumed and is excluded from the next match -attempt. +请记住,匹配的文本已被使用,并在下次匹配尝试时被排除。 -To finish off complex fields, we'll style place holders as strings. Since -we've already matched all possible tokens inside a complex field, we can -safely tell Sublime Text to give any remaining text (``.``) a literal string scope. +为了完成复杂的字段,我们将占位符设置为字符串。由于我们已经在复杂字段中匹配了所有可能的标记,因此我们可以安全地告诉Sublime Text为任何剩余文本(``.``)提供文字字符串范围。 -Final Touches +最后的接触 ------------- -Lastly, let's style escape sequences and illegal sequences, and wrap up. +最后,让我们的样式转义序列和非法序列,并结束。 :: @@ -466,17 +358,13 @@ Lastly, let's style escape sequences and illegal sequences, and wrap up. "match": "(\\$|\\<|\\>)" } -The only hard thing here is getting the number of escape characters right. Other -than that, the rules are pretty straightforward if you're familiar with -regular expressions. +这里唯一的难点就是获得转义符号的数量。除此之外,如果您熟悉正则表达式,则规则非常简单。 -However, you must take care to put the second rule after any others matching -the ``$`` character, since otherwise you may not get the desired result. +但是,您必须注意将第二个规则放在与 ``$`` 字符匹配的任何其他规则之后,否则您可能无法获得所需的结果。 -Also, note that after adding these two additional rules, our recursive begin-end -rule above keeps working as expected. +另请注意,在添加这两个附加规则后,上面的递归始末规则将按预期工作。 -At long last, here's the final syntax definition:: +最后,这是最终的语法定义:: { "name": "Sublime Snippet (Raw)", "scopeName": "source.ssraw", @@ -524,5 +412,4 @@ At long last, here's the final syntax definition:: "uuid": "ca03e751-04ef-4330-9a6b-9b99aae1c418" } -There are more available constructs and code reuse techniques, but the above -explanations should get you started with the creation of syntax definitions. +有更多可用的构造和代码重用技术,但上面的解释应该让您开始创建语法定义。 diff --git a/source/file_management/file_management.rst b/source/file_management/file_management.rst index 69c1cd9..0c50a2e 100644 --- a/source/file_management/file_management.rst +++ b/source/file_management/file_management.rst @@ -5,121 +5,56 @@ 随意跳转 ============= -Goto Anything lets you **navigate files** swiftly. Open it with :kbd:`Ctrl+P`. -As you type into the input area, names of open files and files in open -directories will be searched, and a preview of the best match will be shown. -This preview is *transient*, that is, it won't become the actual active buffer -until you perform some operation on it. Transient views go away when you press -:kbd:`Esc`. You will find transient views in other situations. They are like -ghosts or something. - “随意跳转” 可以让你方便的在文件之间切换,使用 :kbd:`Ctrl+P` 启动该功能。你在输入栏输入,ST则会 对已经打开的文件或者目录进行搜索,并给出匹配最佳的搜索结果的预览。如果你不进行任何操作,将不会 真正加载这些文件。可以按 :kbd:`Esc` 取消预览界面。快捷预览界面形似鬼魅,你在使用ST的其他功能时也会遇到哦。 -Goto Anything lives up to its name --there's more to it than locating files: - “随意跳转”正如其名,其功能不仅限于查找文件: -To perform a **fuzzy search**, append ``#`` and then keep typing, like this: -:: - - island#treasure - -还可以在输入一些内容后接上 ``#`` 再接着输入来进行 **模糊搜索** ,,比如说: +还可以在输入一些内容后接上 ``#`` 再接着输入来进行 **模糊搜索** ,比如说: :: island#treasure - -This instructs Sublime Text to perform a fuzzy search for *treasure* in the -file whose name matches *island*. Pressing :kbd:`Ctrl+;` will open Goto -Anything and type ``#`` for you. - Sublime Text会进行在所有文件名匹配 *island* 的文件中搜索 *treasure* 关键字。使用组合键 :kbd:`Ctrl+;` 可以打开“随意跳转” 功能并输入 ``#`` -And there's more: - -To **search symbols** in the active buffer, press :kbd:`Ctrl+R`. The operator -``@`` can be used as explained above too. - 可以通过按下组合键 :kbd:`Ctrl+R` 在活动缓冲区中进行**符号搜索** 。操作符 ``@`` 与之前提到的用法相同。 -To **go to a line number**, press :kbd:`Ctrl+G`. The operator ``:`` can be -used as explained above too. - 可以通过按下组合键 :kbd:`Ctrl+G` 来跳转到指定的行号。操作符 ``:`` 与之前提到的用法相同。 -Searching for symbols will only work for file types that have symbols defined -for them. - 符号搜索的功能只能在那些已经定义了符号的文件类型中使用。 侧边栏 ======= -The sidebar gives you an overview of your project. Files and folders added to -the sidebar will be available in Goto Anything and project-wide actions. -Projects and the sidebar are closely related. There's always an open project, -whether it's implicit or explicit. - 侧边栏可以提供一个项目的概览视图。添加到侧边栏的文件和目录均可以通过“随意跳转”功能访问,并且响应 项目范围内的指令。项目与侧边栏是密切相关的。不管以显式或是隐式的方式,总是有一个项目存在于侧边栏中。 -To **open or close** the sidebar, press :kbd:`Ctrl+K, Ctrl+B`. - -可以通过组合键:kbd:`Ctrl+K, Ctrl+B`来打开或关闭侧边栏。 - -The sidebar can be navigated with the arrow keys, but first you need to give -it the **input focus** by pressing :kbd:`Ctrl+0`. To return input focus to the -buffer, press :kbd:`Esc`. Alternatively, you can use the mouse to the same -effect, but why would you? +可以通过组合键 :kbd:`Ctrl+K, Ctrl+B` 来打开或关闭侧边栏。 在侧边栏可以使用方向键来在文件间切换,但是首先需要通过按组合键 :kbd:`Ctrl+0` 使其获得 **输入焦点** 。 如果希望缓冲区重新获得输入焦点,则需要按 :kbd:`Esc` 键。同样,你也可以使用鼠标达到同样的效果,但是 你有必要这么做吗? -The sidebar also provides basic file management operations through the context -menu. - 侧边栏可以通过菜单的方式提供基本的文件管理操作。 项目 ======== -Projects group sets of files and directories you need to work on as a unit. -Once you've set up your project the way that suits you by adding folders, save -it and give it a name. - 项目可以将你需要的文件和目录组织成一个单元。当你将项目需要的目录均添加进来以后,你可以这些保存 成一个项目并命名该项目。 -To save a project, go to **Project | Save Project As...**. - 保存项目可以使用菜单中的 **项目 | 项目另存为...**. -To quickly switch between projects, press :kbd:`Ctrl+Alt+P`. - 可以使用组合键 :kbd:`Ctrl+Alt+P` 在项目间快速的切换。 -Project data are stored in JSON files with a `.sublime-project` extension. -Wherever there's a `.sublime-project` file, you will find an ancillary -`.sublime-workspace` file too. The second one is used by Sublime Text and you -shouldn't edit it yourself. - 项目数据保存在一些以 `.sublime-project` 为扩展名的JSON文件中。只要有 `.sublime-project` 文件,相应的都会有一个 `.sublime-workspace` 文件。后者是Sublime Text使用,用户请不要进行修改。 -Project files can define settings specific to that project only. More on that -in the `official documentation`_. - 项目文件可以根据项目进行特殊的设定。更多细节可以参考 `官方文档`_。 .. _官方文档: http://www.sublimetext.com/docs/2/projects.html -You can open a project from the **command line** by passing the *.sublime- -project* file as an argument. - -在命令行模式下,可以通过将 *.sublime-project* 文件做为参数来打开整个项目。 +在命令行模式下,你可以通过将 *.sublime-project* 文件做为参数来打开整个项目。 .. TODO: talk about settings related to projects diff --git a/source/glossary/glossary.rst b/source/glossary/glossary.rst index 2bd8df9..58af447 100644 --- a/source/glossary/glossary.rst +++ b/source/glossary/glossary.rst @@ -6,46 +6,26 @@ .. glossary:: - buffer - 缓冲区 - Data of a loaded file and additional metadata. Associated with one or - more views. The distinction between *buffer* and *view* is technical. - Most of the time, both terms can be used interchangeably. + 缓冲区(buffer) 存放已经加载文件的内容以及文件元数据的区域称为缓冲区。缓冲区一般与一个或多个视图相关联。 *缓冲区* 与 *视图* 只有一些细节上的差别。大多数情况下这两个术语是可以混用的。 - view - 视图 - Graphical display of a buffer. Multiple views can show the same buffer. + 视图(view) 显示缓冲区内容的图形区域。多个不同的视图可以显示同一块缓冲区内容。 - plugin - 插件 - A feature impemented in Python. It can consist of a single command - or multiple commands. It can be contained in one *.py* file or many - *.py* files. + 插件(plugin) 使用Python实现的一个功能称为插件。它可以包含一个或多个命令。它可以由一个或多个 *.py* 文件组成。 - package - 包 - This term in ambiguous in the context of Sublime Text, because it can - refer to a Python package (unlikely), a directory inside ``Packages`` - or a *.sublime-package* file. Most of the time, it means a directory - inside ``Packages`` containing resources that belong together to build - a new feature or provide support for a programming or markup language. - 在Sublime Text中这个术语的意义有点模糊,它可以指一个Python包(这种用法很少),或者 + 包(package) + 在Sublime Text中这个术语的意义有点模糊,它可以指一个Python包(这种用法很少),或者 是 ``Packages`` 目录下的一个文件夹,亦或是一个 *.sublime-package* 文件。大多数情况下, 包指的是 ``Packages`` 目录下的一个文件夹,这个文件夹中包含为某个特性或者某种语言服务的各 种资源。 译者注: Packages 目录保存在Sublime Text的安装目录中 - panel - 面板 - An input/output widget such as a search panel or the output panel. + 面板(panel) 像搜索或者输出这样的,用于进行输入/输出的窗体控件称为面板。 - overlay - 覆盖层控件 - An input widget of a special kind. Goto Anything is an overlay. + 覆盖层控件(overlay) 一种特殊的输入控件。快速跳转就是一种覆盖层控件。 diff --git a/source/index.rst b/source/index.rst index 913cfcf..fa5c256 100644 --- a/source/index.rst +++ b/source/index.rst @@ -3,9 +3,12 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. +===================================== Sublime Text非官方文档(中文翻译版) ===================================== +本文档翻译自 `Sublime Text Unofficial Documentation `_,译文如下: + .. toctree:: :maxdepth: 2 @@ -13,11 +16,11 @@ Sublime Text非官方文档(中文翻译版) 安装 基本概念 编辑 - 搜索和替换 //第一遍看完~ + 搜索和替换 构建系统(批处理) 文件导航与文件管理 自定义 - 可扩展性与自动化(尚未翻译) + 可扩展性与自动化 命令行 参考内容 词汇表 diff --git a/source/reference/api.rst b/source/reference/api.rst index 2c1a1de..2d50ed6 100644 --- a/source/reference/api.rst +++ b/source/reference/api.rst @@ -1,3 +1,4 @@ +========== Python API ========== @@ -9,19 +10,8 @@ Python API 浏览 API ***************** -A quick way to see the API in action: - 快速查看API的方法: -#. Add ``Packages\Default`` (**Preferences | Browse Packages…**) to your project. -#. ``CTRL + SHIFT + F`` -#. Enter ``*.py`` in the **In Files:** field -#. Check ``Use Buffer`` option -#. Search API name -#. ``F4`` -#. Study relevant source code - - #. 将 ``Packages\Default`` (**Preferences | Browse Packages…**) 添加到你的项目中. #. 按下组合键 ``CTRL + SHIFT + F`` #. 在 **In Files:** 栏中输入 ``*.py`` diff --git a/source/reference/build_systems.rst b/source/reference/build_systems.rst index bbd8f0e..58e9195 100644 --- a/source/reference/build_systems.rst +++ b/source/reference/build_systems.rst @@ -1,57 +1,30 @@ -Build Systems ============= - -Build systems let you run your files through external programs and see the -output they generate within Sublime Text. +构建系统 +============= 构建系统可以让您通过外部程序来运行文件,并可以在Sublime Text查看输出。 -Build systems consist of two --or optionally three-- parts: - -* configuration data in JSON format (the *.sublime-build* file contents) -* a Sublime Text command driving the build process -* optionally, an external executable file (script, binary file) - 构建系统包括两 -- 或者说三个 -- 部分 * 使用JSON格式保存配置文件 (*.sublime-build* 内容) * 使用Sublime Text命令来驱动构建过程 * 还包括一个外部的可执行程序(脚本或者二进制) -Essentially, *.sublime-build* files are configuration data for an external -program as well as for the Sublime Text command just mentioned. In them, you -specify the switches, options and environment information you want forwarded. - 从根本上来讲,*.sublime-build* 配置文件对于外部可执行程序与前面提到的Sublime Text命令是一样的。在配置文件中可以指定开关、配置以及环境变量。 -The Sublime Text command then receives the data stored in the *.sublime-build* -file. At this point, it can do whatever it needs to *build* the files. By -default, build systems will use the ``exec`` command, implemented in -*Packages/Default/exec.py*. As we'll explain below, you can override this -command. - -Sublime Text命令从 *.sublime-build* 中读取配置数据,然后根据需要*构建*这些文件。 -构建系统缺省会使用``exec`` 命令,该命令在 *Packages/Default/exec.py* 中实现。 +Sublime Text命令从 *.sublime-build* 中读取配置数据,然后根据需要 *构建* 这些文件。 +构建系统缺省会使用 ``exec`` 命令,该命令在 *Packages/Default/exec.py* 中实现。 在后续的讲解中,我们会重写这个命令。 -Lastly, the external program may be a shell script you've created to process -your files, or a well-known utility like ``make`` or ``tidy``. Usually, these -executable files will receive paths to files or directories, along with -switches and options to be run with. - 外部程序可能是你用来处理文件的脚本,也可以能是类似 ``make`` 或 ``tidy`` 这类的命令。通常,这些可执行文件从配置中获取文件路径或者目录以及运行是需要的开关及选项。 -Note that build systems need not call any external program at all if there -isn't any reason to; you could implement a build system entirely in a -Sublime Text command. - 注意,构建系统可以完全不依赖调用外部程序,完全可以通过Sublime Text 文件格式 *********** -*.构建系统* 文件使用JSON. 以下是一个例子: +*.build-system* 文件使用JSON. 以下是一个例子: .. sourcecode:: python @@ -65,160 +38,78 @@ Sublime Text command. 选项 ******* -``cmd`` - Array containing the command to run and its desired arguments. If you don't - specify an absolute path, the external program will be searched in your - :const:`PATH`, one of your system's environmental variables. - ``cmd`` - 包括命令及其参数数组。如果不指定绝对路径,外部程序会在你系统的:const:`PATH` 环境变量中搜索。 + 包括命令及其参数数组。如果不指定绝对路径,外部程序会在你系统的 :const:`PATH` 环境变量中搜索。 On Windows, GUIs are supressed. 在Windows 系统中,***TBT*** - ``file_regex`` - Optional. Regular expression (Perl-style) to capture error output of - ``cmd``. See the next section for details. + 可选。 Perl格式的正则表达式可以获取 ``cmd`` 的错误输出,详情参考下一节 -``file_regex`` - 可选。 Perl格式的正则表达式可以获取``cmd``的错误输出,详情参考下一节 - -``line_regex`` - Optional. If ``file_regex`` doesn't match on the current line, but - ``line_regex`` exists, and it does match on the current line, then - walk backwards through the buffer until a line matching ``file regex`` is - found, and use these two matches to determine the file and line to go to. - ``line_regex`` - 可选。当``file_regex``与该行不匹配,如果``line_regex``存在,并且确实与当前行匹配, - 则遍历整个缓冲区,直到与``file regex``匹配的行出现,并用这两个匹配决定最终要跳转的文件 + 可选。当 ``file_regex`` 与该行不匹配,如果 ``line_regex`` 存在,并且确实与当前行匹配, + 则遍历整个缓冲区,直到与 ``file regex`` 匹配的行出现,并用这两个匹配决定最终要跳转的文件 或行。 -``selector`` - Optional. Used when **Tools | Build System | Automatic** is set to ``true``. - Sublime Text uses this scope selector to find the appropriate build system - for the active view. - ``selector`` 可选。在选定 **Tools | Build System | Automatic** 时使用。Sublime Text使用这个 选择器自动为活动试图选择构建系统。 -``working_dir`` - Optional. Directory to change the current directory to before running ``cmd``. - The original current directory is restored afterwards. ``working_dir`` - 可选。在运行``cmd``前会切换到该目录。运行结束后会切换到原来的目录。 + 可选。在运行 ``cmd`` 前会切换到该目录。运行结束后会切换到原来的目录。 -``encoding`` - Optional. Output encoding of ``cmd``. Must be a valid python encoding. - Defaults to ``UTF-8``. ``encoding`` - 可选。输出``cmd``的编码。必须是合法的Python编码,缺省为``UTF-8``。 + 可选。输出 ``cmd`` 的编码。必须是合法的Python编码,缺省为 ``UTF-8`` 。 ``target`` - Optional. Sublime Text command to run. Defaults to ``exec`` (*Packages/Default/exec.py*). - This command receives the configuration data specified in the *.build-system* file. - - Used to override the default build system command. Note that if you choose - to override the default command for build systems, you can add arbitrary - variables in the *.sublime-build* file. - -``target`` - 可选。运行的Sublime Text命令,缺省为``exec`` (*Packages/Default/exec.py*)。该命令从 - *.build-system*中获取配置数据。 - - 用来替代缺省的构建系统命令。注意,如果你希望替代构建系统的缺省命令,请在*.sublime-build* - 文件中专门设置。 + 可选。运行的Sublime Text命令,缺省为 ``exec`` ( *Packages/Default/exec.py* )。该命令从 *.build-system* 中获取配置数据。 + 用来替代缺省的构建系统命令。注意,如果你希望替代构建系统的缺省命令,请在 *.sublime-build* 文件中专门设置。 ``env`` - Optional. Dictionary of environment variables to be merged with the current - process' before passing them to ``cmd``. + 可选。在环境变量被传递给 ``cmd`` 前,将他们封装成词典。 - Use this element, for example, to add or modify environment variables - without modifying your system's settings. - -``env`` - 可选。在环境变量被传递给``cmd``前,将他们封装成词典。 - - -``shell`` - Optional. If ``true``, ``cmd`` will be run through the shell (``cmd.exe``, ``bash``\ …). ``shell`` - 可选。如果该选项为``true`` ,``cmd``则可以通过shell运行。 - -``path`` - Optional. This string will replace the current process' :const:`PATH` before - calling ``cmd``. The old :const:`PATH` value will be restored after that. + 可选。如果该选项为 ``true`` ,``cmd`` 则可以通过shell运行。 - Use this option to add directories to :const:`PATH` without having to modify - your system's settings. ``path`` - 可选。该选项可以在调用``cmd``前替换当前进程的' :const:`PATH` 。原来的' :const:`PATH` + 可选。该选项可以在调用 ``cmd`` 前替换当前进程的 :const:`PATH` 。原来的 :const:`PATH` 将在运行后恢复。 使用这个选项可以在不修改系统设置的前提下将目录添加到' :const:`PATH` 中。 ``variants`` - Optional. A list of dictionaries of options to override the main build - system's options. Variant ``name``s will appear in the Command Palette for - easy access if the build system's selector matches for the active file. + 可选。用来替代主构建系统的备选。如果构建系统的选择器与激活的文件匹配,变量的 ``名称`` 则会出现在 Command Palette 中。 -``variants`` - 可选。用来替代主构建系统的备选。如果构建系统的选择器与激活的文件匹配,变量的``名称``则 - 会出现在 Command Palette 中。 - - -``name`` - **Only valid inside a variant** (see ``variants``). Identifies variant - build systems. If ``name`` is *Run*, the variant will show up under the - **Tools | Build System** menu and be bound to *Ctrl + Shift + B*. ``name`` - **仅在variant中是合法的** (详见 ``variants``)。用来标识系统中不同的构建系统。如果 - ``name``是*Run* ,则会显示在**Tools | Build System** 下,并且可以使用 - *Ctrl + Shift + B*调用。 + **仅在variant中是合法的** (详见 ``variants``)。用来标识系统中不同的构建系统。如果 ``name`` 是 *Run* ,则会显示在 **Tools | Build System** 下,并且可以使用 *Ctrl + Shift + B* 调用。 使用 ``file_regex``获取错误输出 ------------------------------------------ -The ``file_regex`` option uses a Perl-style regular expression to capture up -to four fields of error information from the build program's output, namely: -*file name*, *line number*, *column number* and *error message*. Use -groups in the pattern to capture this information. The *file name* field and -the *line number* field are required. - -``file_regex``选项用Perl的正则表达式来捕获构建系统的错误输出,主要包括四部分内容,分别是 -file name*, *line number*, *column number* and *error message*. Sublime Text -在匹配模式中使用分组的方式捕获信息。*file name* 和 *line number*域是必须的。 - +``file_regex`` 选项用Perl的正则表达式来捕获构建系统的错误输出,主要包括四部分内容,分别是 *file name* , *line number* , *column number* 和 *error message* 。Sublime Text +在匹配模式中使用分组的方式捕获信息。 *file name* 和 *line number* 域是必须的。 -When error information is captured, you can navigate to error instances in -your project's files with ``F4`` and ``Shift+F4``. If available, the captured -*error message* will be displayed in the status bar. -当错误信息被捕获时,你可以使用``F4`` 和 ``Shift+F4``在你的项目文件中跳转。被捕获的*错误 -信息*会显示在状态栏。 +当错误信息被捕获时,你可以使用 ``F4`` 和 ``Shift+F4`` 在你的项目文件中跳转。被捕获的 *错误信息* 会显示在状态栏。 平台相关选项 ------------------------- -The ``windows``, ``osx`` and ``linux`` elements let you provide -platform-specific data in the build system. Here's an example:: - ``windows``, ``osx`` 以及 ``linux``元素可以帮助你在构建系统中设定平台相关 的选项,举例如下: @@ -235,11 +126,8 @@ platform-specific data in the build system. Here's an example:: } } -In this case, ``ant`` will be executed for every platform except Windows, -where ``ant.bat`` will be used instead. - -在这个例子中,``ant``在除了Windows之外的平台中都是执行 ant ,而在Windows中则执行 -``ant.bat`` +在这个例子中,``ant`` 在除了Windows之外的平台中都是执行 ant ,而在Windows中则执行 +``ant.bat``。 构建系统备选项 -------- @@ -268,21 +156,14 @@ where ``ant.bat`` will be used instead. } -Given these settings, *Ctrl + B* would run the *date* command, *Crtl + Shift + -B* would run the Python interpreter and the remaining variants would appear -in the Command Palette whenever the build system was active. - -根据以上的设定,按 *Ctrl + B* 会运行*date*命令, 按 *Crtl + Shift + B* 会运行Python -解释器,并且在构建系统激活时将剩余的备选项显示在Command Palette中。 +根据以上的设定,按 *Ctrl + B* 会运行 *date* 命令, 按 *Crtl + Shift + B* 会运行Python解释器,并且在构建系统激活时将剩余的备选项显示在Command Palette中。 .. _构建系统变量: 构建系统变量 ********************** -Build systems expand the following variables in *.sublime-build* files: - -在*.sublime-build* 中包括如下构建系统变量。 +在 *.sublime-build* 中包括如下构建系统变量。 ====================== ===================================================================================== ``$file_path`` 当前文件所在路径, 比如 *C:\\Files*. @@ -301,66 +182,39 @@ Build systems expand the following variables in *.sublime-build* files: 变量用法 --------------------------- -Features found in snippets can be used with these variables. For example:: - 可以在代码片段上中使用以上变量。例如:: ${project_name:Default} -This will emit the name of the current project if there is one, otherwise ``Default``. - -如果当前项目存在则使用该项目名称,否则则使用``Default``替代 +如果当前项目存在则使用该项目名称,否则则使用 ``Default`` 替代 :: ${file/\.php/\.txt/} -This will emit the full path of the current file, replacing *.php* with *.txt*. -该例会获取当前文件的完整路径,并用*.txt*替换路径中的*.php* +该例会获取当前文件的完整路径,并用 *.txt* 替换路径中的 *.php*。 运行构建系统 ********************* -Select the desired build system from **Tools | Build System**, and then select -**Tools | Build** or press ``F7``. - -从**Tools | Build System**选择构建系统,然后选择**Tools | Build** ,再按``F7``。 +从 **Tools | Build System** 选择构建系统,然后选择 **Tools | Build** ,再按 ``F7``。 .. _构建系统常见问题: 构建系统常见问题 ***************************** -Build systems will look for executables in your :const:`PATH`, unless you specify -an absolute path to the executable. Therefore, your :const:`PATH` variable must be -correctly set. - 如果你没有为构建系统指定一个可执行文件的绝对路径,构建系统怎么会在你的 :const:`PATH` 中进行查找。 所以,你需要正确设置 :const:`PATH` 。 -On some operating systems, the value for :const:`PATH` will vary from a terminal -window to a graphical application. Thus, even if the command you are using in -your build system works in the command line, it may not work from Sublime Text. -This is due to user profiles in shells. - 在某些操作系统中,终端和图形化应用的 :const:`PATH` 值会有所不同。所以即便你的构建系统在命令行下 可以正常工作,在Sublime Text也不见得能够正常。这与Shell中的用户设置有关。 -To solve this issue, make sure you set the desired :const:`PATH` so that graphical -applications such as Sublime Text can find it. See the links below for more -information. - 为了解决这个问题,请确认你正确设置了 :const:`PATH` ,以便类似Sublime Text一类的图形化应用 可以正确找到。更多内容,请参考一下链接 -Alternatively, you can use the ``path`` element in *.sublime-build* files -to override the :const:`PATH` used to locate the executable specified in ``cmd``. -This new value for :const:`PATH` will only be in effect for as long as your -build system is running. After that, the old :const:`PATH` will be restored. - -另外,你也可以在 *.sublime-build* 文件中设定 ``path`` 来替代:const:`PATH` ,并在 ``path`` -指定的路径中查找 ``cmd`` 可执行文件。新设定的值,仅在构建系统运行期间有效,过后将会恢复为原始的 - :const:`PATH` +另外,你也可以在 *.sublime-build* 文件中设定 ``path`` 来替代 :const:`PATH` ,并在 ``path`` +指定的路径中查找 ``cmd`` 可执行文件。新设定的值,仅在构建系统运行期间有效,过后将会恢复为原始的 :const:`PATH` .. seealso:: diff --git a/source/reference/command_palette.rst b/source/reference/command_palette.rst index 3cf9eda..0a4ebca 100644 --- a/source/reference/command_palette.rst +++ b/source/reference/command_palette.rst @@ -28,12 +28,7 @@ ``command`` 代执行的命令. ``args`` - Arguments to pass to ``command``. Note that to locate the packages folder - you need to use a snippet-like variable: ``${packages}`` or $packages. This - different to other areas of the editor due to different implementations of - the lower level layers. - -传给 ``command`` 的参数。 需要注意的是,要定位包所在目录,需要使用 ``${packages}`` 或 $packages。由于底层的实现不同,这与在编辑器的其他区域的用法略有不同。 + 传给 ``command`` 的参数。 需要注意的是,要定位包所在目录,需要使用 ``${packages}`` 或 $packages。由于底层的实现不同,这与在编辑器的其他区域的用法略有不同。 如何使用命令面板 @@ -42,7 +37,4 @@ #. 按 :kbd:`Ctrl+Shift+P` #. 选择命令 -Entries are filtered by current context. Not all entries will be visible at all -times. - 显示的选项会根据上下文不同有所区别,并不是在任何时候都会显示所有选项。 diff --git a/source/reference/commands.rst b/source/reference/commands.rst index cc5f072..ed6f20a 100644 --- a/source/reference/commands.rst +++ b/source/reference/commands.rst @@ -1,85 +1,59 @@ -Commands +======= 命令 -******** +======= -Overview 概览 ======== .. named actions, used everywhere, take json arguments -This list of commands is a work in progress. 对命令列表的整理仍在进行中。 -About Paths in Command Arguments 关于命令参数中的路径信息 ================================ -Some commands take paths as parameters. Among these, some support snippet-like -syntax, while others don't. A command of the first kind would take a parameter -like *${packages}/SomeDir/SomeFile.Ext* whereas a command of the second kind -would take a parameter like *Packages/SomeDir/SomeFile.Ext*. 有些命令把路径作为参数。这些命令中,有些支持代码片段那样的语法,有些则不支持。第一中类型的命令 可以接受类似 *${packages}/SomeDir/SomeFile.Ext* 这样的参数,而第二种类型的命令可以接受类似 *Packages/SomeDir/SomeFile.Ext* 这样的参数。 -Generally, newer commands support the snippet-like syntax. 大体上来说,较新引入的命令支持类似代码片段的语法。 -Often, relative paths in arguments to commands are assumed to start at the -``Data`` directory. 通常情况下,认为命令参数中的相对路径是相对与 ``数据`` 目录来说的。 -Variables in Paths as Arguments 参数中路径包含的变量 ------------------------------- -The same variables available to build systems are expanded in arguments to -commands. See :ref:`build-system-variables` for more information. 构建系统中使用的变量在参数中也可以使用。参考 :ref:`构建系统变量` 来了解更多信息。 -Commands 命令列表 ======== **build** - Runs a build system. 运行某个构件系统。 - - **variant** [String]: Optional. The name of the variant to be run. - **variant** [String]: 可选参数。要运行配置的名称。 **run_macro_file** - Runs a *.sublime-macro* file. 运行一个 *.sublime-macro* 文件。 - - **file** [String]: Path to the macro file. - **file** [String]: 宏文件路径。 **insert_snippet** - Inserts a snippet from a string or *.sublime-snippet* file. 从字符串或者 *.sublime-snippet* 文件中插入一个代码片段。 - - **contents** [String]: Snippet as a string to be inserted. - **contents** [String]: 要插入的代码片段的字符串内容。 - - **name** [String]: Path to the *.sublime-snippet* file to be inserted. - **name** [String]: 要插入的 *.sublime-snippet* 文件的路径。 **insert** - Inserts a string. 插入一个字符串。 - - **characters** [String]: String to be inserted. - **characters** [String]: 要插入的字符串内容。 **move** - Advances the caret by predefined units. 根据指定的单位移动光标。 - - **by** [Enum]: Values: *characters*, *words*, *word_ends*, *subwords*, *subword_ends*, *lines*, *pages*, *stops*. - **by** [Enum]: 可选值: *characters*, *words*, *word_ends*, *subwords*, *subword_ends*, *lines*, *pages*, *stops* 。 - - **forward** [Bool]: Whether to advance or reverse in the buffer. - **forward** [Bool]: 在缓冲区中向前或向后移动。 - **word_begin** [Bool] - **empty_line** [Bool] @@ -87,170 +61,122 @@ Commands - **separators** [Bool] **move_to** - Advances the caret to predefined locations. 将光标移动到指定位置。 - - **to** [Enum]: Values: *bol*, *eol*, *bof*, *eof*, *brackets*. - **to** [Enum]: 可选值: *bol*, *eol*, *bof*, *eof*, *brackets*. - - **extend** [Bool]: Whether to extend the selection. Defaults to ``false``. - **extend** [Bool]: 是否扩展选择内容。默认值是 ``false`` 。 **new_window** - Opens a new window. 打开一个新的窗口。 **close_window** - Closes the active window. 关闭当前活跃窗口。 **switch_file** - Switches between two files with the same name and different extensions. 在有相同文件名、不同扩展名的两个文件之间进行切换。 - - **extensions** [[String]]: Extensions (without leading dot) for which switching will be enabled. - **extensions** [[String]]: 切换可以发生的文件扩展名(不包括点号)。 **close** - Closes the active view. 关闭当前视图。 **close_file** - Closes the active view and, under certain circumsances, the whole application. 关闭当前视图,在某些情况下关闭整个应用程序。 - XXX Sounds kinda wrong. XXX 看上去好像不对。 **toggle_sidebar** - Shows or hides the sidebar. 开启或关闭侧边栏。 **toggle_full_screen** - Toggles full screen mode on or off. 开启或退出全屏模式。 **toggle_distraction_free** - Toggles distraction free mode on or off. 开启或退出免打扰模式。 **left_delete** - Deletes the character right before the caret. 删除光标前的那个字符。 **right_delete** - Deletes the character right after the caret. 删除光标后的那个字符。 **undo** - Undoes the latest action. 撤销上次操作。 **redo** - Reapplies the latest undone action. 重做上次撤销的操作。 **redo_or_repeat** - Performs the latest action again. 再次执行上次的动作。 **soft_undo** - Undoes each action stepping through granular edits. 先移动到编辑位置再进行撤销操作。 **soft_redo** - Redoes each action stepping through granular edits. 先移动到编辑位置再进行重做操作。 **cut** - Removes the selected text and sends it to the system clipboard. Put - differently, it cuts. 把当前选中的文字从缓冲区中移除,并送到系统剪贴板中。换句话说,执行剪切操作。 **copy** - Sends the selected text to to the system clipboard. 把当前选中的文字送到系统剪贴板中。 **paste** - Inserts the clipboard contents after the caret. 把剪贴板中的内容插入到光标后。 **paste_and_indent** - Inserts the clipboard contents after the caret and indents contextually. 把剪贴板中的内容插入到光标后同时根据上下文进行缩进。 **select_lines** - Adds a line to the current selection. 在当前选择的内容中添加一行。 - - **forward** [Bool]: Whether to add the next or previous line. Defaults to - ``true``. - **forward** [Bool]: 添加下一行还是上一行。默认值是 ``true`` 。 **scroll_lines** - Scrolls lines in the view. 在视图中滚动行。 - - **amount** [Float]: Positive values scroll lines down and negative values scroll lines up. - **amount** [Float]: 正值向下滚动,负值向上滚动。 **prev_view** - Switches to the previous view. 切换到上一个视图。 **next_view** - Switches to the next view. 切换到下一个视图。 **next_view_in_stack** - Switches to the most recently active view. 切换到最近的活跃视图。 **previous_view_in_stack** - Switches to the view that was active before the most recently active view. - I don't think this is very clear or even true. 切换到最近活跃视图的前一个活跃视图。我不认为这种说法非常确切,这么说甚至是不正确的。 **select_all** - Select the view's content. 选择视图的全部内容。 **split_selection_into_lines** - Unsurprisingly, it splits the selection into lines. 不出所料的,把当前的选择切散成不同行。 **single_selection** - Collapses multiple selections into a single selection. 把多重选择整合成单一选择。 **clear_fields** - Breaks out of the active snippet field cycle. 跳出活跃代码片段域的选择。 **hide_panel** - Hides the active panel. 隐藏当前活跃面板。 - - **cancel** [Bool]: Notifies the panel to restore the selection to what it - was when the panel was opened. (Only incremental find panel.) - **cancel** [Bool]: 当面板打开的时候恢复它之前选择的内容。(仅对增量搜索面板有效。) **hide_overlay** - Hides the active overlay. Show the overlay using the show_overlay command. 隐藏覆盖控件。使用 show_overlay 命令打开覆盖控件。 **hide_auto_complete** - Hides the auto complete list. 隐藏自动补全列表。 **insert_best_completion** - Inserts the best completion that can be inferred from the current context. - XXX Probably useless. XXX 插入根据当前上下文能推断出的最佳补全内容。 XXX 可能没什么用。 XXX - - **default** [String]: String to insert failing a best completion. - **default** [String]: 当没有找到最佳补全内容时插入的字符串。 **replace_completion_with_next_completion** - XXX Useless for users. XXX XXX 对用户来说没什么用。 XXX **reindent** @@ -259,190 +185,135 @@ Commands (译者注:重新进行缩进操作,常用于整理文件缩进。) **indent** - Increments indentation. 增加缩进。 **next_field** - Advances the caret to the text snippet field in the current snippet field - cycle. 将光标移动到下一个代码片段中的可修改区域。 **prev_field** - Moves the caret to the previous snippet field in the current snippet field - cycle. 将光标移动到上一个代码片段中的可修改区域。 **commit_completion** - Inserts into the buffer the item that's currently selected in the auto - complete list. XXX Probably not useful for users. XXX 向缓冲区中插入自动补全列表中当前选中项的内容。 XXX 对用户来说没很么用。 XXX **unindent** - Unindents. 取消缩进。 **toggle_overwrite** - Toggles overwriting on or off. 开启关闭覆盖插入选项。 **expand_selection** - Extends the selection up to predifined limits. 将选择内容扩展到预定义的边界。 - - **to** [Enum]: Values: bol, hardbol, eol, hardeol, bof, eof, brackets, line. - **to** [Enum]: 可选值: bol, hardbol, eol, hardeol, bof, eof, brackets, line. **find_under_expand** - Adds a new selection based on the current selection or expands the - selection to the current word. 根据当前选中的内容增加一个新的选择或者把选择项扩展到当前单词。 **close_tag** - Surrounds the current inner text with the appropiate tags. 为当前内部文本添加适当的标签。 **toggle_record_macro** - Starts or stops the macro recorder. 开始或关闭宏录制器。 **run_macro** - Runs the macro stored in the macro buffer. 运行宏缓冲区中存储的宏脚本。 **show_overlay** - Shows the requested overlay. Use the **hide_overlay** command to hide it. 显示请求的覆盖控件。使用 **hide_overlay** 命令来隐藏覆盖控件。 - **overlay** [Enum]: - The type of overlay to show. Possible values: 要显示的覆盖控件的类型。可选值: - - *goto*: Show the `Goto Anything `_ overlay. - *goto*: 显示 `Goto Anything(快速跳转) `_ 覆盖控件。 - - *command_palette*: Show the `command palette `_. - *command_palette*: 显示 `命令面板 `_. - - **show_files** [Bool]: If using the goto overlay, start by displaying files rather than an empty widget. - **show_files** [Bool]: 如果显示快速跳转面板,开始的时候显示文件列表,而不是显示一个空的控件。 - - **text** [String]: The initial contents to put in the overlay. - **text** [String]: 放到覆盖控件中的初始值。 **show_panel** - Shows a panel. 显示面板。 - - **panel** [Enum]: Values: incremental_find, find, replace, find_in_files, console - **panel** [Enum]: 可选值: incremental_find, find, replace, find_in_files, console - - **reverse** [Bool]: Whether to search backwards in the buffer. - **reverse** [Bool]: 在缓冲区中是否后向搜索内容。 - - **toggle** [Bool]: Whether to hide the panel if it's already visible. - **toggle** [Bool]: 当面板已经可见时,是否隐藏面板。 **find_next** - Finds the next occurrence of the current search term. 找到当前搜索内容的下一个匹配项。 **find_prev** - Finds the previous occurrence of the current search term. 找到当前搜索内容的上一个匹配项。 **find_under** - Finds the next occurrence of the current selection or the current word. 找到与当前选中内容或光标所在位置档次匹配的下一个内容。 **find_under_prev** - Finds the previous occurrence of the current selection or the current word. 找到与当前选中内容或光标所在位置档次匹配的上一个内容。 **find_all_under** - Finds all occurrences of the current selection or the current word. 选中与当前选择内容或光标所在位置单词匹配的所有内容。 **slurp_find_string** - Copies the current selection or word into the "find" field of the find - panel. 复制当前选中内容或当前单词到搜索面板中的 "find" 域。 **slurp_replace_string** - Copies the current selection or word into the "replace" field of the find - and replace panel. 复制当前选中内容或当前单词到搜索域替换面板中的 "replace" 域。 **next_result** - Advance to the next captured result. 移动到下一个搜索到的结果。 **prev_result** - Move to the previous captured result. 移动到上一个搜索到的结果。 **toggle_setting** - Toggles the value of a boolean setting. 修改布尔型设置项的值。 - - **setting** [String]: The name of the setting to be toggled. - **setting** [String]: 要修改的设置项的名称。 **next_misspelling** - Advance to the next misspelling 移动到下一个错误拼写的单词的位置。 **prev_misspelling** - Move to the previous misspelling. 移动到上一个错误拼写的单词的位置。 **swap_line_down** - Swaps the current line with the line below. 交换当前行与下一行。 **swap_line_up** - Swaps the current line with the line above. 交换当前行与上一行。 **toggle_comment** - Comments or uncomments the active lines. 为当前行添加或取消注释。 - - **block** [Bool]: Whether to use a block comment. - **block** [Bool]: 是否使用块注释。 **join_lines** - Joins the current line with the next one. 把当前行与下一行连接起来。 **duplicate_line** - Duplicates the current line. 重复当前行内容。 **auto_complete** - Opens the auto comeplete list. 打开自动补全列表。 **replace_completion_with_auto_complete** - XXX Useless for users. XXX XXX 对用户来说没什么用。 XXX **show_scope_name** - Shows the name for the caret's scope in the status bar. 在状态栏中显示光标所在作用域的名称。 **exec** - Runs an external process asynchronously. 异步运行一个外部进程。 - XXX Document all options. XXX 为所有选项添加文档。 **transpose** - Makes stuff dance. 移动内容。 **sort_lines** - Sorts lines. 对行进行排序。 - - **case_sensitive** [Bool]: Whether the sort should be case sensitive. - **case_sensitive** [Bool]: 排序时是否考虑大小写。 **set_layout** @@ -458,39 +329,29 @@ Commands XXX **next_bookmark** - Select the next bookmarked region. 选择下一个被标记的区域。 **prev_bookmark** - Select the previous bookmarked region. 选择上一个被书签标记的区域。 **toggle_bookmark** - Sets or unsets a bookmark for the active region(s). (Bookmarks can be - accessed via the regions API using ``"bookmarks"`` as the key.) 对活跃区域设置书签或取消书签。(在区域API中使用 ``"bookmarks"`` 作为键可以访问书签内容。) **clear_bookmarks** - Removes all bookmarks. 清楚所有书签。 **select_all_bookmarks** - Selects all bookmarked regions. 选择所有被书签标记过的区域。 **wrap_lines** - Wraps lines. By default, it wraps lines at the first ruler's column. 环绕行。默认情况下,在第一个标尺所在的列进行环绕。 - - **width** [Int]: Specifies the column at which lines should be wrapped. - **width** [Int]: 设置环绕开始的列坐标。 **upper_case** - Makes the selection upper case. 把选择的内容改成大写。 **lower_case** - Makes the selection lower case. 把选择的内容改成小写。 **set_mark** @@ -512,11 +373,9 @@ Commands XXX **increase_font_size** - Increases the font size. 增加字体大小。 **decrease_font_size** - Decreases the font size. 较少字体大小。 **fold** @@ -529,7 +388,6 @@ Commands XXX **context_menu** - Shows the context menu. 显示上下文菜单。 .. Some regex-related and search-related commands missing. they don's seem to diff --git a/source/reference/completions.rst b/source/reference/completions.rst index 68bda8a..0e73d77 100644 --- a/source/reference/completions.rst +++ b/source/reference/completions.rst @@ -1,32 +1,23 @@ -Completions +=========== 补全 =========== -Completions provide an IDE-like functionality to insert dynamic content through -the completions list or by pressing :kbd:`Tab`. 补全提供了像IDE那样的使用补全列表或者 :kbd:`Tab` 键插入动态内容的功能。 -File Format 文件格式 *********** -Completions are JSON files with the ``.sublime-completions`` extension. 补全信息是以 ``.sublime-completions`` 作为扩展名的JSON文件。 -Structure of a Completions List 补全列表的结构 ******************************* ``scope`` - Determines whether the completions are to be sourced from this file. See - :ref:`scopes-and-scope-selectors` for more information. 控制补全是否应该在这个文件中发挥作用。参考 :ref:`作用域与作用域选择子` 来了解更多信息。 ``completions`` - Array of completions. 补全的数组。 -Here's an excerpt from the html completions:: 下面是从html补全列表中截取出来的一部分:: { @@ -42,16 +33,12 @@ Here's an excerpt from the html completions:: } -Types of Completions 补全的类型 ******************** -Plain Strings 纯文本字符串 ------------- -Plain strings are equivalent to an entry where the ``trigger`` is identical to -the ``contents``:: 当某个补全项 ``trigger`` 的内容与 ``contents`` 的内容完全一样的时候,纯文本字符串与这个补全项 是等价的。 @@ -62,31 +49,24 @@ the ``contents``:: { "trigger": "foo", "contents": "foo" } -Trigger-based Completions 基于触发内容的补全 ------------------------- ``trigger`` - Text that will be displayed in the completions list and will cause the - ``contents`` to be inserted when validated. 在补全列表中显示的文本,在被确认后,对应的 ``contents`` 内容被插入到缓冲区中。 ``contents`` - Text to be inserted in the buffer. Can use snippet features. 要插入到缓冲区中的文本。可以使用代码片段的特性。 -Sources for Completions 补全的来源 *********************** -These are the sources for completions the user can control: 用户可以控制的补全来源包括: * ``.sublime-completions`` * ``EventListener.on_query_completions()`` -Additionally, other completions are folded into the final list: 除此之外,其他在最终补全列表中可以显示的内容包括: * Snippets @@ -94,81 +74,48 @@ Additionally, other completions are folded into the final list: * 代码片段 * 缓冲区中的单词 -Priority of Sources for Completions 补全来源的优先级 ----------------------------------- - * Snippets - * API-injected completions - * ``.sublime-completions`` files - * Words in buffer * 代码片段 * 使用API插入的补全内容 * ``.sublime-completions`` 文件 * 缓冲区中的单词 -Snippets will only be automatically completed against an exact match of their -tab trigger. Other sources for completions are filtered with a case insensitve -fuzzy search instead. 代码片段只有在与设置的tab触发器精确匹配时才会被插入。其他类型的补全则是使用大小写不敏感的模糊 搜索进行匹配。 -The Completions List 补全列表 ********************* -To use the completions list: 要使用补全列表需要: - * Press :kbd:`Ctrl+spacebar` to open - * Optionally, press :kbd:`Ctrl+spacebar` again to select next entry - * Press :kbd:`Enter` or :kbd:`Tab` to validate selection * 按 :kbd:`Ctrl+空格` 来打开补全列表 * 可选的, 再次按下 :kbd:`Ctrl+空格` 来选择下一个候选项 * 按下 :kbd:`回车` or :kbd:`Tab` 来确认选择 .. note:: - The current selection in the completions list can actually be validated with - any punctuation sign that isn't itself bound to a snippet. -.. 注释:: 补全列表中被选中的当前项可以用任何没有被绑定到代码片段触发器中的标点符号来确认插入。 -Snippets show up in the completions list following the pattern: -`` : ``. For the other completions, you will just see the -text to be inserted. 代码片段以如下形式出现在补全列表中:`` : <名称>`` 。对于其他补全项,你只能看到要被 插入的文本。 -If the list of completions can be narrowed down to one choice, the autocomplete -dialog will be bypassed and the corresponding content will be inserted straight -away according to the priority rules stated above. 当补全列表被缩减到只有一个候选项时,系统就会绕开自动补全对话框,根据之前介绍的优先级,对应内容 会被直接插入。 -Enabling and Disabling Tab Completion for Completions 为补全列表启用或禁用Tab补全 ***************************************************** -The ``tab_completion`` setting is ``true`` by default. Set it to ``false`` if -you want :kbd:`Tab` to stop sourcing the most likely completion. This setting -has no effect on triggers defined in ``.sublime-snippet`` files, so snippets -will always be inserted after a :kbd:`Tab`. ``tab_completion`` 选项默认是 ``true`` 。如果你想停止 :kbd:`Tab` 键对最可能选项的索引功能, 就把这个值设置为 ``false`` 。这个设置项对定义在 ``.sublime-snippet`` 文件中的触发器没有效果, 因此按下 :kbd:`Tab` 时,代码片段一定会被插入。 -With ``tab_completion`` on, The same order of priority as stated above applies, -but, unlike in the case of the completions list, Sublime Text will always -insert a completion, even if faced with an ambiguous choice. -当 ``tab_completion`` 选项开启的时候,上面介绍的优先级顺序仍然有效,但是,与补全列表不同的是, +选项开启的时候,上面介绍的优先级顺序仍然有效,但是,与补全列表不同的是, Sbulime Text总会插入一个补全项,及时选择项存在模糊内容。 -Inserting a Literal Tab 插入一个Tab(缩进)字符 ----------------------- -If ``tab_completion`` is ``true``, you can press ``Shift+Tab`` after a prefix -to insert a literal tab character. 如果 ``tab_completion`` 值为 ``true`` ,你可以使用 ``Shift+Tab`` 来插入一个缩进字符。 diff --git a/source/reference/key_bindings.rst b/source/reference/key_bindings.rst index e3fa5de..9ffdfaf 100644 --- a/source/reference/key_bindings.rst +++ b/source/reference/key_bindings.rst @@ -1,68 +1,48 @@ ============ -Key Bindings 按键绑定 ============ -Key bindings map key presses to commands. 按键绑定为按键与动作建立了映射关系。 -File Format 文件格式 *********** -Key bindings are stored in ``.sublime-keymap`` files and defined in JSON. All -key map file names need to follow this pattern: ``Default ().sublime-keymap``. -Otherwise, Sublime Text will ignore them. 对于按键绑定的配置存储于后缀为 ``.sublime-keymap`` 的文件中,文件中记录的是JSON内容。所有按键绑定 配置文件都需要按照如下模式命名: ``Default ().sublime-keymap`` 。否则,Sublime Text 将忽略这些文件。 -Platform-Specific Key Maps 平台相关的键位设置 -------------------------- -Each platform gets its own key map: 每一个平台都有它自己的按键配置文件: * ``Default (Windows).sublime-keymap`` * ``Default (OSX).sublime-keymap`` * ``Default (Linux).sublime-keymap`` -Separate key maps exist to abide by different vendor-specific `HCI `_ guidelines. 也有针对不同的硬件提供商指定的 `HCI `_ 指导文档准备的按键配置文件。 -Structure of a Key Binding 一个按键绑定项的结构 -------------------------- -Key maps are arrays of key bindings. Below you'll find valid elements in key bindings. 键位表是一个按键绑定项的数组。接下来将要解释的是按键绑定中的有效构成元素: ``keys`` - An array of case-sensitive keys to be pressed. Modifiers can be specified - with the ``+`` sign. Chords are built by adding elements to the array, - e. g. ``["ctrl+k","ctrl+j"]``. Ambiguous chords are resolved with a timeout. 一组大小写敏感的按键组合。可以用 ``+`` 指定修饰符。向数组中添加元素可以设置组合键,例如: ``["ctrl+k","ctrl+j"]``。 ``command`` - Name of the command to be executed. 要执行的命令的名称。 ``args`` - Dictionary of arguments to be passed to ``command``. Keys must be the names - of parameters to ``command``. 传递给 ``command`` 命令的参数字典。字典中键的名称是 ``command`` 命令的参数名称。 ``context`` - Array of contexts to selectively enable the key binding. All contexts must - be true for the key binding to trigger. See :ref:`context-reference` below. 选择性控制按键绑定是否起效的上下文内容数组。只有当所有上下文都为真时,按键绑定才能被触发。 请参考下面的 :ref:`上下文参考` 内容来了解更多内容。 -Here's an example illustrating most of the features outlined above:: 下面是一个说明上面提到的大部分特性的例子:: { "keys": ["shift+enter"], "command": "insert_snippet", "args": {"contents": "\n\t$0\n"}, "context": @@ -78,112 +58,84 @@ Here's an example illustrating most of the features outlined above:: .. _上下文参考: -Structure of a Context 上下文的结构 ---------------------- ``key`` - Name of a context operand to query. 要请求的上下文操作符的名称。 ``operator`` - Type of test to perform against ``key``. 对 ``key`` 进行测试的类型。 ``operand`` - Value against which the result of ``key`` is tested. 与 ``key`` 的结果进行测试的值。 ``match_all`` - Requires the test to succeed for all selections. Defaults to ``false``. 需要多所有选择都进行测试。默认值为 ``false`` 。 -Context Operands 上下文操作子 ^^^^^^^^^^^^^^^^ ``auto_complete_visible`` - Returns ``true`` if the autocomplete list is visible. 如果自动不全列表可见就返回 ``true`` 。 ``has_next_field`` - Returns ``true`` if there's a next snippet field available. 当下一个代码片段域可用时返回 ``true`` 。 ``has_prev_field`` - Returns ``true`` if there's a previous snippet field available. 当上一个代码片段域可用时返回 ``true`` 。 ``num_selections`` - Returns the number of selections. 返回当前选中的数目。 ``overlay_visible`` - Returns ``true`` if any overlay is visible. 当覆盖控件可见时返回 ``true`` 。 ``panel_visible`` - Returns ``true`` if any panel is visible. 当有面板可见时返回 ``true`` 。 ``following_text`` - Restricts the test to the text following the caret. 限制测试只对脱字号后的文本进行。 ``preceding_text`` - Restricts the test to the text preceding the caret. 限制测试只对脱字号前的文本进行。 ``selection_empty`` - Returns ``true`` if the selection is an empty region. 当没有选中内容的时候返回 ``true`` 。 ``setting.x`` - Returns the value of the ``x`` setting. ``x`` can be any string. 返回 ``x`` 设置项的值。 ``x`` 可以为任意字符串。 ``text`` - Restricts the test to the selected text. 限制测试只对选中的文本有效。 ``selector`` - Returns the current scope. 返回当前作用域。 -Context Operators 上下文操作符 ^^^^^^^^^^^^^^^^^ ``equal``, ``not_equal`` - Test for equality. 测试是否相等。 ``regex_match``, ``not_regex_match`` - Match against a regular expression. 与一个正则表达式进行匹配。 ``regex_contains``, ``not_regex_contains`` - Match against a regular expression (containment). 与一个正则表达式进行匹配(检测是否包含)。 -Command Mode 命令模式 ************ -Sublime Text provides a ``command_mode`` setting to prevent key presses from -being sent to the buffer. This is useful to emulate Vim's modal behavior. Sublime Text提供一个称为 ``command_mode`` (命令模式)的设置项,启用这个设置可以阻止按键内容 被送往缓冲区。这个设置项在模拟Vim的模式功能的时候很有用处。 -Bindable Keys 可绑定的按键 ************* -Keys may be specified literally or by name. Below you'll find the list of -valid names: 按键可以通过字面值或者名字来指定。你可以在下面找到一个有效名称的列表: * ``up`` @@ -250,7 +202,6 @@ valid names: * ``browser_favorites`` * ``browser_home`` -Modifiers 修饰符 --------- @@ -260,58 +211,38 @@ Modifiers * ``super`` (Windows key, Command key…) * ``super`` (在Windows平台为Windows键,在OS X平台为Command键……) -Warning about Bindable Keys 关于可绑定按键的警告 --------------------------- -If you're developing a package, keep this in mind: 如果你正在开发一个包,请谨记下面几点: -* ``Ctrl+Alt+`` should not be used on any Windows key bindings. * 在Windows平台上,不要使用 ``Ctrl+Alt+`` 进行任何键位绑定。 -* ``Option+`` should not be used on any OS X key bindings. * 在OS X平台上,不要使用 ``Option+`` 进行任何键位绑定。 -In both cases, the user's ability to insert non-ascii characters would be -compromised. 在以上两种情况下,用户都将在插入非ascii字符时遇到问题。 -If you are the end-user, you are free to remap those key combinations. 如果你是终端用户,你可以随意重新映射这些按键组合。 -Keeping Key Maps Organized 让按键映射井井有条 ************************** -Sublime Text ships with default key maps under ``Packages/Default``. Other -packages may include their own key map files. The recommended storage location -for your personal key map is ``Packages/User``. Sublime Text自带的按键组合存放在 ``Packages/Default`` 目录下。其他包组可以包含它们特有的按键 映射文件。对于你自己的键位映射设置而言,推荐的文件存放地址是 ``Packages/User`` 目录。 -See :ref:`merging-and-order-of-precedence` for information about how Sublime -Text sorts files for merging. 请参考 :ref:`排序与优先级顺序` 以了解关于Sublime Text排序文件并进行合并的更多信息。 - -International Keyboards 国际化键盘 *********************** -Due to the way Sublime Text maps key names to physical keys, there might be a -mismatch between the two. 根据Sublime Text将按键名称与物理按键进行映射的方式,此二者在不同平台上可能有不同的配对。 -Troubleshooting 常见问题解答 *************** .. TODO: fix formatting for API cross-ref. -See `sublime.log_commands(flag)`_ to enable command logging. It may help when -debugging key maps. 使用 `sublime.log_commands(flag)`_ 开启命令日志。这对于调试按键映射有所帮助。 .. _sublime.log_commands(flag): http://www.sublimetext.com/docs/2/api_reference.html diff --git a/source/reference/keyboard_shortcuts_osx.rst b/source/reference/keyboard_shortcuts_osx.rst index 069e5e6..8cf910b 100644 --- a/source/reference/keyboard_shortcuts_osx.rst +++ b/source/reference/keyboard_shortcuts_osx.rst @@ -1,16 +1,12 @@ .. sublime: wordWrap false -Keyboard Shortcuts - OSX +================================== OSX平台快捷键 ================================== .. warning:: - This topic is a draft and may contain wrong information. - -.. 警告:: 本文处于草稿阶段,而且可能包含错误信息。 -Editing 编辑 ------- @@ -62,7 +58,6 @@ Editing | | undoing change when repeated 再次按键执行撤销操作 | +-----------------+-----------------------------------------------------------+ -Navigation/Goto Anywhere 导航/快速跳转 ------------------------ @@ -78,7 +73,6 @@ Navigation/Goto Anywhere | ⌃ + G | Goto line in current file 跳转到当前文件中的某一行 | +-----------------+-----------------------------------------------------------+ -General 通用快捷键 ------------------------ @@ -92,7 +86,6 @@ General | ⌃ + ⇧ + P | Show scope in status bar 在状态栏中显示作用域 | +-----------------+-----------------------------------------------------------+ -Find/Replace 查找/替换 ------------------------ @@ -106,7 +99,6 @@ Find/Replace | ⌘ + ⇧ + F | Find in files 在文件中查找 | +-----------------+-----------------------------------------------------------+ -Tabs 标签页 ------------------------ @@ -122,7 +114,6 @@ Tabs | | Find in files 文件中搜索 | +-----------------+-----------------------------------------------------------+ -Split window 分割窗口 ------------------------ @@ -140,7 +131,6 @@ Split window | ⌃ + ⇧ + [NUM] | Move file to specified group where num is 1-4 把文件移动到1-4组中的某一组 | +-----------------+-----------------------------------------------------------+ -Bookmarks 书签 ------------------------ @@ -156,7 +146,6 @@ Bookmarks | ⇧ + ⌘ + F2 | Clear bookmarks 清空书签 | +-----------------+-----------------------------------------------------------+ -Text manipulation 文本操作 ------------------------ diff --git a/source/reference/keyboard_shortcuts_win.rst b/source/reference/keyboard_shortcuts_win.rst index eb37862..3994f88 100644 --- a/source/reference/keyboard_shortcuts_win.rst +++ b/source/reference/keyboard_shortcuts_win.rst @@ -1,15 +1,12 @@ .. sublime: wordWrap false -Keyboard Shortcuts - Windows/Linux +================================== Windows/Linux平台快捷键 ================================== .. warning:: - This topic is a draft and may contain wrong information. -.. 警告:: 本文处于草稿阶段,而且可能包含错误信息。 -Editing 编辑 ------- @@ -61,7 +58,6 @@ Editing | | undoing change when repeated 再次按键执行撤销操作 | +-----------------+-----------------------------------------------------------+ -Navigation/Goto Anywhere 导航/快速跳转 ------------------------ @@ -77,7 +73,6 @@ Navigation/Goto Anywhere | Ctrl + G | Goto line in current file 跳转到当前文件中的某一行 | +-----------------+-----------------------------------------------------------+ -General 通用快捷键 ------------------------ @@ -91,7 +86,6 @@ General | Ctrl + ⇧ + Alt + P | Show scope in status bar 在状态栏中显示作用域 | +-----------------------+-----------------------------------------------------+ -Find/Replace 查找/替换 ------------------------ @@ -105,7 +99,6 @@ Find/Replace | Ctrl + ⇧ + F | Find in files 在文件中查找 | +-----------------+-----------------------------------------------------------+ -Tabs 标签页 ------------------------ @@ -123,7 +116,6 @@ Tabs | Alt + [NUM] | Switch to tab number [NUM] where [NUM] <= number of tabs 跳转到第 [NUM] 个标签页,这里 [NUM] 指标签的页数 | +-----------------+-----------------------------------------------------------+ -Split window 分割窗口 ------------------------ @@ -141,7 +133,6 @@ Split window | Ctrl + ⇧ + [NUM]| Move file to specified group where num is 1-4 把文件移动到1-4组中的某一组 | +-----------------+-----------------------------------------------------------+ -Bookmarks 书签 ------------------------ @@ -157,7 +148,6 @@ Bookmarks | Ctrl + ⇧ + F2 | Clear bookmarks 清空书签 | +-----------------+-----------------------------------------------------------+ -Text manipulation 文本操作 ------------------------ diff --git a/source/reference/plugins.rst b/source/reference/plugins.rst index 6963758..44f64a6 100644 --- a/source/reference/plugins.rst +++ b/source/reference/plugins.rst @@ -1,65 +1,44 @@ -Plugins +======= 插件 ======= .. seealso:: - :doc:`API Reference <../reference/api>` - More information on the Python API. - -更多信息请参考: - :doc:`API参考文档 <../reference/api>` 有关Python API的更详细的信息。 -Plugins are Python scripts implementing ``*Command`` classes from -``sublime_plugin``. 插件是实现了 ``sublime_plugin`` 模块中 ``*Command`` 类的Python脚本。 -Where to Store Plugins 插件放到哪里 ********************** -Sublime Text 2 will look for plugins in these places: Sublime Text 2在以下这些目录中寻找可用插件: * ``Packages`` * ``Packages/`` * ``Packages/<包名称>`` -Any plugin nested deeper in ``Packages`` won't be loaded. 存放在 ``Packages`` 更深层次的目录结构中的插件不会被加载。 -All plugins should live inside a directory of their own and not directly -under ``Packages``. 任何插件都应该又自己单独的目录,而不应该直接放在 ``Packages`` 目录下。 -Conventions for Command Names 命令名称的命名规则 ***************************** -Sublime Text 2 command class names are suffixed by convention with ``Command`` -and written as ``CamelCasedPhrases``. Sublime Text 2遵循 ``CamelCasedPhrases`` 命名规则来定义命令类,同时用 ``Command`` 作为后缀。 -However, Sublime Text 2 transforms the class name from ``CamelCasedPhrases`` -to ``camel_cased_phrases``. So ``ExampleCommand`` would turn into ``example`` -and ``AnotherExampleCommand`` would turn into ``another_example``. 然而,Sublime Text 2将类名从 ``CamelCasedPhrases`` 形式自动转换成 ``camel_cased_phrases`` 。 举例来说, ``ExampleCommand`` 将被转换为 ``example`` ,而 ``AnotherExampleCommand`` 将 转换为 ``another_example`` 。 -For class definition names, use ``CamelCasedPhrasesCommand``; to call a -command from the API, use the normalized name (``camel_cased_phrases``). 对于类定义名称,可以使用 ``CamelCasedPhrasesCommand`` 命名方式;要从API中调用一个命令,请使用 标准化后的名称( ``camel_cased_phrases`` )。 -Types of Commands 命令类型 ***************** @@ -68,24 +47,16 @@ Types of Commands * ``sublime_plugin.TextCommand`` * ``sublime_plugin.EventListener`` -Instances of ``WindowCommand`` have a ``.window`` attribute pointing to the -window instance that created them. Similarly, instances of ``TextCommand`` -have a ``.view`` attribute. ``WindowCommand`` 类的实例都有一个 ``.window`` 属性,指向创建他们的那个窗口实例。于此类似, ``TextCommand`` 类的实例拥有 ``.view`` 属性。 -Shared Traits for Commands 命令之间的共享特性 -------------------------- -All commands must implement a ``.run()`` method. 所有命令都必须实现一个 ``.run()`` 方法。 -All commands can receive and arbitrarily long number of keyword arguments, -but they must be valid JSON types. 所有命令都可以接受任意长度的关键字参数,但是这些参数一定要是有效的JSON类型。 -How to Call Commands from the API 如何利用API调用命令 ********************************* @@ -97,134 +68,74 @@ to ``command_name``. :: window.run_command("echo", {"Tempus": "Irreparabile", "Fugit": "."}) - Command Arguments - ***************** +命令参数 +***************** - All user-provided arguments to commands must be valid JSON types. Only - Sublime Text can pass other types of arguments to commands (such as edit - objects, view instances, etc.). + 用户提供给命令的所有参数都必须是有效的JSON类型。只有Sublime Text可以给命令传递其他类型的参数(例如修改对象,视图实例等等)。 -Use a reference to a ``View`` or a ``Window``, or ``sublime`` depending on -the type of command, and call ``object.run_command('command_name')``. 根据命令的类型来选择对 ``View`` 、 ``Window`` 或者 ``sublime`` 的引用,然后通过 ``object.run_command('command_name')`` 来调用。 -In addition, you can pass a dictionary where keys are names of parameters -to ``command_name``. :: 除此之外, 你可以用字典作为参数,字典中的键就是要传给 ``command_name`` 的参数名称:: window.run_command("echo", {"Tempus": "Irreparabile", "Fugit": "."}) - Command Arguments - 命令参数 - ***************** - - All user-provided arguments to commands must be valid JSON types. Only - Sublime Text can pass other types of arguments to commands (such as edit - objects, view instances, etc.). - 用户提供给命令的所有参数都必须是有效的JSON类型。只有Sublime Text可以给命令传递其他类型的参数 - (例如修改对象,视图实例等等)。 - -Text Commands and the ``edit`` Object 文本命令以及 ``修改`` 对象 ************************************* -The two API functions of interest are ``view.begin_edit()``, which takes an -optional command name and an optional dictionary of arguments, and -``view.end_edit()``, which finishes the edit. 关于两个文本命令的两个较为重要的API是 ``view.begin_edit()`` 和 ``view.end_edit()`` 。 其中 ``view.begin_edit()`` 可以接受一个可选的命令名称和可选的参数字典;而 ``view.end_edit()`` 用来结束编辑过程。 -All actions done within an edit are grouped as a single undo action. Callbacks -such as ``on_modified()`` and ``on_selection_modified()`` are called when the -edit is finished. 在修改过程中发生的所有动作都被整合成一个单一的撤销动作。当编辑过程结束的时候,类似与 ``on_modified`` 和 ``on_selection_modified()`` 的回调函数会被触发。 -It's important to call ``view.end_edit()`` after each ``view.begin_edit()``, -otherwise the buffer will be in an inconsistent state. An attempt will be made -to fix it automatically if the edit object gets collected, but that often -doesn't happen when you expect, and will result in a warning printed to the -console. In other words, you should always bracket an edit in a -``try..finally`` block. 有一点非常重要,每次调用 ``view.begin_edit()`` 之后必须调用 ``view.end_edit()`` 方法,否则 缓冲将处于一种不一致状态。在不匹配发生时,系统将尝试自动进行修正,但是这种自动修正的发生频率并 没有你想象的那么多,同时会在控制台输出一条警告信息。换句话说,你应该始终使用 ``try..finally`` 来包裹代码快。 -The command name passed to ``begin_edit()`` is used for repeat, macro -recording, and for describing the action when undoing/redoing it. If you're -making an edit outside of a ``TextCommand``, you should almost never supply a -command name. 传递给 ``begin_edit()`` 的命令名称用于重复、宏录制以及撤销/重复过程中的动作描述。如果你在 ``TextCommand`` 外面做修改,你就不该指定命令名称。 -If you have created an edit object, and call a function that creates another -one, that's fine: the edit is only considered finished when the outermost call -to ``end_edit()`` runs. 你可以在开始的时候创建一个修改对象,然后调用了一个方法又创建了另外的一个修改对象:只有当最外层 的修改对象执行了 ``end_edit()`` 方法之后,系统才认为整个修改都完成了。 -As well as grouping modifications, you can use edit objects for grouping -changes to the selection, so they're undone in a single step. 与群组修改类似,你也可以使用修改对象把对选中文本做的修改组合成一个群组,对它们的修改只要一步就 能撤销。 -Responding to Events 对事件的响应 ******************** -Any subclass of ``EventListener`` will be able to respond to events. You -cannot make a class derive from both ``EventListener`` and any other type of -command. 任何 ``EventListener`` 的子类都能够响应事件。对于任何一个类,不能同时继承 ``EventListener`` 和其他任何的命令类。 -.. sidebar:: A Word of Warning about ``EventListener`` - - Expensive operations in event listeners can cause Sublime Text 2 to become - unresponsive, especially in events triggered frequently, like - ``on_modified`` and ``on_selection_modified``. Be careful of how much work - is done in those and do not implement events you don't need, even if they - just ``pass``. - .. sidebar:: 关于 ``EventListener`` 的注意事项 + 在事件监听器中,尤其是处理 ``on_modified`` 和 ``on_selection_modified`` 这样的经常被 触发的事件的监听器中,执行开销很大的操作可能会导致Sublime Text 2没有响应。所以请注意监听器 中所编写的代码,另外,不要实现你不需要的方法,即使这个方法只有一个 ``pass``语句。 -Python and the Standard Library Python与标准库 ******************************* -Sublime Text ships with a trimmed down standard library. Notable missing -modules are the *Tkinter*, *multiprocessing* and *sqlite3* modules. Sublime Text集成了一个精简版的标准库。被裁剪掉的模块包括 *Tkinter* , *multiprocessing* 以及 *sqlite3* 。 -Automatic Plugin Reload 自动插件重载 *********************** -Sublime Text will automatically reload top-level Python modules from packages -as they change (perhaps because you are editing a *.py* file). Note that -Python subpackages won't be reloaded; this can lead to confusion while -developing plugins. Generally, it's best to restart Sublime Text after you've -made changes to plugin files so all changes take effect. 当你对插件做修改的时候(比如你正在修改一个 *.py* 文件),Sublime Text会自动加载包中的顶级 Python模块。值得注意的是Python的子模块不会被自动重新加载;这一点在插件开发中可能会产生一些挺 奇葩的问题。一般来说,当你对插件文件做修改之后,最好重启以下Sublime Text,这样能保证你做的修 改能发挥作用。 -Multithreading 多线程 ************** -Only the ``.set_timeout()`` function is safe to call from different threads. 只有 ``.set_timeout()`` 方法可以安全的从其他线程调用。 diff --git a/source/reference/reference.rst b/source/reference/reference.rst index 99443a4..a6c99ac 100644 --- a/source/reference/reference.rst +++ b/source/reference/reference.rst @@ -1,12 +1,9 @@ -Reference +========= 参考内容 ========= -In this section you will find concise information about many aspects of Sublime Text. 在这一部分中,你可以找到Sublime Text中许多内容的详细信息。 -If you're looking for a slow-paced introduction to any of these topics, try -the general index. 如果你只是想找找关于这些主题的介绍性质的内容,可以去文档的主页看看。 .. toctree:: @@ -17,10 +14,10 @@ the general index. 构建系统 按键绑定 设置项 - 命令面板 自动补全 + 命令面板 插件 - API + Python API 命令 - Windows 平台快捷键 + Windows/Linux 平台快捷键 OSX 平台快捷键 diff --git a/source/reference/settings.rst b/source/reference/settings.rst index 9705315..9a3f75c 100644 --- a/source/reference/settings.rst +++ b/source/reference/settings.rst @@ -1,279 +1,175 @@ ==================== -Settings (Reference) 设置项(参考内容) ==================== -Global Settings 全局设置项 =============== -**Target file:** ``Global.sublime-settings``. **对应文件:** ``Global.sublime-settings`` 。 ``theme`` - Theme to be used. Accepts a file base name (e. g.: ``Default.sublime-theme``). 系统使用的主题文件。接受主题文件的名称(例如: ``Default.sublime-theme`` )。 ``remember_open_files`` - Determines whether to reopen the buffers that were open when Sublime Text was last closed. 设置Sublime Text启动时是否需要打开上次关闭时打开了的缓冲区。 ``folder_exclude_patterns`` - Excludes the matching folders from the side bar, GoTo Anything, etc. 与匹配模式相符的目录将不会出现在侧边栏、快速跳转面板等位置。 ``file_exclude_patterns`` - Excludes the matching files from the side bar, GoTo Anything, etc. 与匹配模式相符的文件将不会出现在侧边栏、快速跳转面板等位置。 ``scroll_speed`` - Set to ``0`` to disable smooth scrolling. Set to a value between ``0`` and - ``1`` to scroll slower, or set to a value larger than ``1`` to scroll faster. 如果把值设为 ``0`` ,将禁止平滑滚动。取 ``0`` 到 ``1`` 之间的数值将使滑动变的比较缓慢,取大于 ``1`` 的值使得滑动更加迅速。 ``show_tab_close_buttons`` - If ``false``, hides the tabs' close buttons until the mouse is hovered over - the tab. 如果设置为 ``false`` ,通常情况下就不会显示标签页的关闭按钮,只有当鼠标移动到标签上时才显示。 ``mouse_wheel_switches_tabs`` - If ``true``, scrolling the mouse wheel will cause tabs to switch if the - cursor is in the tab area. 如果设置为 ``true`` ,在标签区域滑动鼠标滚轮会触发标签页之间的切换。 ``open_files_in_new_window`` - OS X only. When filters are opened from Finder, or by dragging onto the - dock icon, this controls if a new window is created or not. 仅在OS X平台有效。当用户从Finder中开打文件,或者把文件拖拽到dock面板的图标上,这个设置项将决定 是否需要创建一个新窗口。 -File Settings 文件设置项 ============= -**Target files:** ``Base File.sublime-settings``, ``.sublime-settings``. **对应文件:** ``Base File.sublime-settings``, ``.sublime-settings``。 -Whitespace and Indentation 空格与缩进 ************************** ``auto_indent`` - Toggles automatic indentation. 开/关自动缩进选项。 ``tab_size`` - Number of spaces a tab is considered to be equal to. 设置tab键对应的空格数。 ``translate_tabs_to_spaces`` - Determines whether to replace a tab character with ``tab_size`` number of - spaces when :kbd:`Tab` is pressed. 设置当用户按下 :kbd:`Tab` 键时,是否需要用 ``tab_size`` 选项所指定数目的空格进行替换。 ``use_tab_stops`` - If ``translate_tabs_to_spaces`` is ``true``, will make :kbd:`Tab` and - :kbd:`Backspace` insert/delete ``tab_size`` number of spaces per key press. 如果 ``translate_tabs_to_spaces`` 选项为 ``true`` ,设置这个选项就使得每次按下 :kbd:`Tab` 与 :kbd:`Backspace` 键时,将插入/删除 ``tab_size`` 选项所指定数目的空格。 ``trim_automatic_white_space`` - Toggles deletion of white space added by ``auto_indent``. 开/关对由 ``auto_indent`` 选项自动添加的只有空格的行的检测。 ``detect_indentation`` - Set to ``false`` to disable detection of tabs vs. spaces whenever a buffer - is loaded. If set to ``true``, it will automatically modify - ``translate_tabs_to_spaces`` and ``tab_size``. 如果设置为 ``false`` ,当系统加在缓冲区内容的时候,就会停止对tab与空格的检测。如果设置为 ``true`` 则会自动修改 ``translate_tabs_to_spaces`` 以及 ``tab_size`` 的值。 ``draw_white_space`` - Valid values: ``none``, ``selection``, ``all``. 有效值: ``none``, ``selection``, ``all`` 。 ``trim_trailing_white_space_on_save`` - Set to ``true`` to remove white space on save. 将这个选项设置为 ``true`` 就会在文件保存时候自动去处行为的空格。 -Visual Settings 显示设置项 *************** ``color_scheme`` - Sets the colors used for text highlighting. Accepts a path rooted at the - data directory (e. g.: ``Packages/Color Scheme - Default/Monokai Bright.tmTheme``). 设置文本高亮的配色方案。接受从数据目录开始的相对路径(例如: ``Packages/Color Scheme - Default/Monokai Bright.tmTheme``)。 ``font_face`` - Font face to be used for editable text. 设置可编辑文本的字体样式。 ``font_size`` - Size of the font for editable text. 设置可编辑字体的字体大小。 ``font_options`` - Valid values: ``bold``, ``italic``, ``no_antialias``, ``gray_antialias``, - ``subpixel_antialias``, ``directwrite`` (Windows). 有效值:``bold``, ``italic``, ``no_antialias``, ``gray_antialias``, ``subpixel_antialias``, ``directwrite`` (对Windows平台有效)。 ``gutter`` - Toggles display of gutter. 开/关侧边栏选项。 ``rulers`` - Columns in which to display vertical rules. Accepts a list of numeric values - (e. g. ``[79, 89, 99]`` or a single numeric value (e. g. ``79``). 设置标尺所在的列坐标。接受一个数字值的列表(例如 ``[79, 89, 99]`` 或者一个单一的数字值 ``79``)。 ``draw_minimap_border`` - Set to ``true`` to draw a border around the minimap's region corresponding - to the the view's currently visible text. The active color scheme's - ``minimapBorder`` key controls the border's color. 如果将这个值设置为 ``true`` ,就将根据视图当前可见文本的内容在迷你地图区域画一个边框。当前选中的 配色方案中的 ``minimapBorder`` 键对应的值用于控制边框的颜色。 ``highlight_line`` - Set to ``false`` to stop highlighting lines with a cursor. 将这个值设置为 ``false`` 来阻止高亮当前光标所在行。 ``line_padding_top`` - Additional spacing at the top of each line, in pixels. 每行文字与上一行的额外距离,以像素为单位。 ``line_padding_bottom`` - Additional spacing at the bottom of each line, in pixels. 每行文字与下一行的额外距离,以像素为单位。 ``scroll_past_end`` - Set to ``false`` to disable scrolling past the end of the buffer. If ``true``, - Sublime Text will leave a wide, empty margin between the last line and the - bottom of the window. 设置为 ``false`` 以关闭超出缓冲区的滚动。如果设置为 ``true`` ,Sublime Text将在文本的最后一行 与窗口下边界之间添加一大块空白区域。 ``line_numbers`` - Toggles display of line numbers in the gutter. 开/关对行号的显示。 ``word_wrap`` - If set to ``false``, long lines will be clipped instead of wrapped. Scroll - the screen horizontally to see the clipped text. 如果设置为 ``false`` 那么对于内容很多的行,文本将被截取,而不会自动换行。在水平方向拖动滚动条可以 查看被截取的文字。 ``wrap_width`` - If greater than ``0``, wraps long lines at the specified column as opposed - to the window width. Only takes effect if ``wrap_width`` is set to ``true``. 如果这个值大于 ``0`` , 系统就会在这个指定的列进行换行切分;否则会根据屏幕的宽度进行换行。这个值 只有在 ``wrap_width`` 设置为 ``true`` 的时候才有效果。 ``indent_subsequent_lines`` - If set to ``false``, wrapped lines will not be indented. Only takes effect - if ``wrap_width`` is set to ``true``. 如果这个值设置为 ``false`` ,被转换的行就不会进行缩进。只有在 ``wrap_width`` 为 ``true`` 时 才有效。 ``draw_centered`` - If set to ``true``, text will be drawn centered rather than left-aligned. 如果设置为 ``true`` ,文本将居中对齐,否则为左对齐。 ``match_brackets`` - Set to ``false`` to disable underlining the brackets surrounding the cursor. 当值设置为 ``false`` 时,光标放在括号周围的时候就不会显示下划线。 ``match_brackets_content`` - Set to ``false`` is you'd rather only highlight the brackets when the cursor - is next to one. 设置光标在括号周围时,是否要高亮括号中的内容。 ``match_brackets_square`` - Set to ``false`` to stop highlighting square brackets. Only takes effect if - ``match_brackets`` is ``true``. 如果设置项值为 ``false`` ,就停止对方括号的配对显示。只有在 ``match_brackets`` 值为 ``true`` 时有效。 ``match_bracktets_braces`` - Set to ``false`` to stop highlighting curly brackets. Only takes effect if - ``match_brackets`` is ``true``. 如果设置项值为 ``false`` ,就停止对花括号的配对显示。只有在 ``match_brackets`` 值为 ``true`` 时有效。 ``match_bracktets_angle`` - Set to ``false`` to stop highlighting angle brackets. Only takes effect if - ``match_brackets`` is ``true``. 如果设置项值为 ``false`` ,就停止对尖括号的配对显示。只有在 ``match_brackets`` 值为 ``true`` 时有效。 -Automatic Behavior 自动行为设置项 ****************** ``auto_match_enabled`` - Toggles automatic pairing of quotes, brackets, etc. 开/关自动配对引号、括号等符号。 ``save_on_focus_lost`` - Set to true to automatically save files when switching to a different file - or application. 如果这个值为真,那么当用户切换到一个不同的文件,或不同的应用程序时,文件的内容将会自动保存。 ``find_selected_text`` - If ``true``, the selected text will be copied into the find panel when it's - shown. 如果设置为 ``true`` ,那么当打开搜索面板时,当前选中的文字会被自动的复制到搜索面板中。 ``word_separators`` - Characters considered to separate words in actions like advancing the cursor, - etc. They are not used in all contexts where a notion of a word separator is - useful (e. g.: word wrapping). In such other contexts, the text might be - tokenized based on other criteria (e. g. the syntax definition rules). 设置在动作中用于分割单词的字符,例如光标跨单词移动的时候来界定单词的分隔符。这个单词分隔符并 不用于所有需要区分单词的情况(例如:换行时不切分单词)。在这种情况下,文本是基于其他标准来界 定的(例如:语法定义规则)。 ``ensure_newline_at_eof_on_save`` - Always adds a new line at the end of the file if not present when saving. 如果文本末尾没有空行,那么当保存文件的时候,会自动在文件末尾添加一个空行。 -System and Miscellaneous Settings 系统与其他设置项 ********************************* ``is_widget`` - Returns ``true`` if the buffer is an input field in a dialog as opposed to - a regular buffer. 当缓冲区为输入对话框中的输入域的时候,返回 ``true`` 。 ``spell_check`` - Toggles the spell checker. 开/关拼写检查选项。 ``dictionary`` - Word list to be used by the spell checker. Accepts a path rooted at the - data directory (e. g.: ``Packages/Language - English/en_US.dic``). You can - `add more dictionaries `_. 拼写检查器可选的单词列表。接受从数据目录开始的一个路径(例如: ``Packages/Language - English/en_US.dic`` )。 你也可以 `添加更多目录 `_ 。 ``fallback_encoding`` - The encoding to use when the encoding can't be determined automatically. - ASCII, UTF-8 and UTF-16 encodings will be automatically detected. 控制当无法自动判断编码的时候选用的默认编码。系统可以自动检测的编码包括ASCII,UTF-8以及UTF-16. ``default_line_ending`` - Determines what characters to use to designate new lines. Valid values: - ``system`` (OS-dependant), ``windows`` (``CRLF``) and ``unix`` (``LF``). 控制系统使用的换行符的字符。有效选项: ``system`` (OS相关), ``windows`` (即 ``CRLF`` )以及 ``unix`` ( ``LF`` )。 ``tab_completion`` - Determines whether pressing :kbd:`Tab` will insert completions. 控制按下 :kbd:`Tab` 时是否进行补全。 -Build and Error Navigation Settings 构建与错误导航设置项 *********************************** ``result_file_regex`` - Regular expression used to extract error information from some output dumped - into a view or output panel. Follows the same rules as error capturing in - build systems.º 用于过滤视图或输出面板中的错误信息的正则表达式。这里的正则表达式遵循与构建系统中的错误捕获相同的规则。 ``result_line_regex`` - Regular expression used to extract error information from some output dumpºed - into a view or output panel. Follows the same rules as error capturing in - build systems. 用于过滤视图或输出面板中的错误信息的正则表达式。这里的正则表达式遵循与构建系统中的错误捕获相同的规则。 ``result_base_dir`` - Directory to start looking for offending files in based on information - extracted with ``result_file_regex`` and ``result_line_regex``. 设置基于 ``result_file_regex`` 以及 ``result_line_regex`` 抽取出来的信息开始搜索的文件路径。 ``build_env`` - List of paths to add to build systems by default. 默认添加到构建系统中的路径列表。 -File and Directory Settings 文件与目录设置项 *************************** ``default_dir`` - Sets the default save directory for the view. 设置视图对应的默认保存路径。 -Input Settings 输入设置项 ************** ``command_mode`` - If set to ``true``, the buffer will ignore key strokes. Useful to emulate - Vim. 如果将这个值设为 ``true`` ,则缓冲区将忽略用户按键。这对模拟Vim很有帮助。 diff --git a/source/reference/snippets.rst b/source/reference/snippets.rst index be9da0b..f59a193 100644 --- a/source/reference/snippets.rst +++ b/source/reference/snippets.rst @@ -1,21 +1,17 @@ .. sublime: wordWrap false -Snippets +======== 代码片段 ======== -Compatibility with Textmate 与Textmate的兼容性 *************************** -Sublime Text snippets are generally compatible with Textmate snippets. Sublime Text的代码片段与Textmate的代码片段基本兼容。 -File Format 文件格式 *********** -Snippet files are XML files with the ``sublime-snippet`` extension. 代码片段文件是有 ``sublime-snippet`` 后缀的XML文件。 .. code-block:: xml @@ -28,22 +24,17 @@ Snippet files are XML files with the ``sublime-snippet`` extension. ``content`` - Actual snippet content. 实际的代码片段内容。 ``tabTrigger`` - Implicit keybinding for this snippet. Last key (implicit) is ``TAB``. 与这段代码片段关联的隐式按键绑定。最后一个(隐式的)按键式 ``TAB`` 。 ``scope`` - Scope selector to activate this snippet. 适用于这段代码片段的作用域选择子。 ``description`` - User friendly description for menu item. 为了菜单项准备的用户友好的说明性文字。 -Escape Sequences 转义序列 **************** @@ -53,70 +44,46 @@ Escape Sequences ``\$`` 常量 ``$`` 。 -Environment Variables 环境变量 ********************* ====================== ===================================================================== -``$PARAM1 .. $PARAMn`` Arguments passed to the ``insertSnippet`` command. ``$PARAM1 .. $PARAMn`` 传递给 ``insertSnippet`` 命令的各个参数。 -``$SELECTION`` The text that was selected when the snippet was triggered. ``$SELECTION`` 代码片段被触发的时候选中的文本内容。 -``$TM_CURRENT_LINE`` Content of the line the cursor was in when the snippet was triggered. ``$TM_CURRENT_LINE`` 代码片段被触发的时候光标所在行的内容。 -``$TM_CURRENT_WORD`` Current word under the cursor when the snippet was triggered. ``$TM_CURRENT_WORD`` 代码片段被触发的时候光标所在的单词。 -``$TM_FILENAME`` File name of the file being edited including extension. ``$TM_FILENAME`` 正在编辑的文件名称,包含文件扩展名。 -``$TM_FILEPATH`` File path to the file being edited. ``$TM_FILEPATH`` 正在编辑的文件的文件路径。 -``$TM_FULLNAME`` User's user name. ``$TM_FULLNAME`` 用户的用户名。 -``$TM_LINE_INDEX`` Column the snippet is being inserted at, 0 based. ``$TM_LINE_INDEX`` 插入代码片段的列的位置,位置是从0开始计数的。 -``$TM_LINE_NUMBER`` Row the snippet is being inserted at, 1 based. ``$TM_LINE_NUMBER`` 插入代码片段的行的位置,位置是从1开始计数的。 -``$TM_SELECTED_TEXT`` An alias for ``$SELECTION``. ``$TM_SELECTED_TEXT`` 与 ``$SELECTION`` 是等价的。 -``$TM_SOFT_TABS`` ``YES`` if ``translateTabsToSpaces`` is true, otherwise ``NO``. ``$TM_SOFT_TABS`` 当 ``translateTabsToSpaces`` 选项是真的时候,值是 ``YES`` ,否则为 ``NO`` 。 -``$TM_TAB_SIZE`` Spaces per-tab (controlled by the ``tabSize`` option). ``$TM_TAB_SIZE`` tab对应的空格数(受 ``tabSize`` 选项的控制)。 ====================== ===================================================================== -Fields 字域 ****** -Mark positions to cycle through by pressing ``TAB`` or ``SHIFT + TAB``. 标记代码片段中可以通过 ``TAB`` 或 ``SHIFT + TAB`` 循环的各个位置。 -Syntax: ``$1`` .. ``$n`` 语法: ``$1`` .. ``$n`` ``$0`` - Exit mark. Position at which normal text editing should be resumed. By default, - Sublime Text implicitly sets this mark at the end of the snippet's ``content`` element. 退出标记。当循环到这个标记的时候,编辑器应该返回至正常的编辑模式。默认情况下,Sublime Text在 ``content`` 元素内容的结尾位置隐式的添加这个标记。 -Fields with the same name mirror each other. 有相同名字的字域互相映射。 -Place Holders -站位符 +占位符 ************* -Fields with a default value. 带有默认值的字域。 -Syntax: ``${1:PLACE_HOLDER}`` .. ``${n:PLACE_HOLDER}`` 语法: ``${1:PLACE_HOLDER}`` .. ``${n:PLACE_HOLDER}`` -Fields and place holders can be combined and nested within other place holders. -字域和站位符可以遇其他的站位符进行组合和嵌套。 +字域和占位符可以遇其他的站位符进行组合和嵌套。 -Substitutions 替换 ************** @@ -127,23 +94,16 @@ Syntax: - ``${var_name/regex/format_string/options}`` ``var_name`` - The field's name to base the substitution on: 1, 2, 3… 替换展开所以来的字域的名字:1,2,3…… ``regex`` - Perl-style regular expression: See the Boost library documentation for `regular expressions `_. - Perl风格的正则表达式:关于`正则表达式 `_ ,请参考Boost库的文档。 + Perl风格的正则表达式:关于 `正则表达式 `_ ,请参考Boost库的文档。 ``format_string`` - See the Boost library documentation for `format strings `_. 参考Boost库文档的 `格式字符串 `_ 内容。 ``options`` - Optional. Any of the following: 可选的。可以选择下面的任何一个: ``i`` - Case-insensitive regex. 忽略大小写敏感的正则。 ``g`` - Replace all occurrences of ``regex``. 替换所有匹配 ``regex`` 的内容。 ``m`` - Don't ignore newlines in the string. 在字符串中不要忽略换行符。 diff --git a/source/reference/syntaxdefs.rst b/source/reference/syntaxdefs.rst index 08e254e..9a86524 100644 --- a/source/reference/syntaxdefs.rst +++ b/source/reference/syntaxdefs.rst @@ -1,28 +1,20 @@ .. sublime: wordWrap false -Syntax Definitions +================== 语法定义 ================== .. warning:: - This topic is a draft and may contain wrong information. -警告: 这部分内容仍处于草稿阶段,并可能包含错误信息。 -Compatibility with Textmate 与Textmate的兼容性 *************************** -Sublime Text syntax definitions are generally compatible with Textmate language -files. Sublime Text的语法定义内容基本上与Textmate的语法定义文件是相互兼容的。 -File Format 文件格式 *********** -Syntax definitions are files in the Plist format with the ``tmLanguage`` extension. -In this reference files, however, JSON is used instead and converted into Plist. 语法定义文件是以 ``tmLanguage`` 作为扩展名的Plist(属性列表)文件。然而,在本文档中,我们将使用 JSON文件来进行讲解,然后再将JSON文件转换为Plist文件。 @@ -71,81 +63,56 @@ JSON文件来进行讲解,然后再将JSON文件转换为Plist文件。 } ``name`` - Descriptive name for the syntax definition. Shows up in the syntax definition dropdown menu - located in the bottom right of Sublime Text interface. It's usually the name of the programming - language or equivalent. 所定义语法的描述性名称。这个名称显示在Sublime Text界面右下角的下拉菜单中。通常情况下, ``name`` 表示的是 编程语言或其他标记语言的名称。 ``scopeName`` - Name of the top-level scope for this syntax definition. Either ``source.`` or ``text.``. - Use ``source`` for programming languages and ``text`` for everything else. 语法定义文件起效的顶级坐拥域名称。这个名称一般是 ``source.<语言名称>`` 或者 ``text.<语言名称>`` 。 如果是在定义编程语言的语法,那么就使用 ``source`` 这个名称,否则使用 ``text`` 作为名称。 ``fileTypes`` - And array of file type extensions for which this syntax should be automatically activated. - Include the extensions without the leading dot. 记录适用于这个语法文件的文件扩展名的数组。数组中的每项是去掉"."的文件扩展名称。 ``uuid`` - Unique indentifier for this syntax definition. Currently ignored. 这个语法定义的唯一标示符。目前被忽略。 ``foldingStartMarker`` - Currently ignored. Used for code folding. 目前被忽略,用于标示折叠内容的开始。 ``foldingStopMarker`` - Currently ignored. Used for code folding. 目前被忽略,用于标示折叠内容的结束。 ``patterns`` - Array of patterns to match against the buffer's text. 记录与缓冲区中的文字进行匹配的模式的数组。 ``repository`` - Array of patterns abstracted out from the patterns element. Useful to keep - the syntax definition tidy as well as for specialized uses like recursive - patterns. Optional. 从模式元素中抽象出来的数组。定义这个数组一方面有助于保持语法定义文件整洁,另一方面也能为像 递归模式这样的功能服务。这个内容是可选的。 -The Patterns Array 模式数组 ****************** -Elements contained in the ``patterns`` array. 在 ``patterns`` 数组中包含的元素。 ``match`` - Contains the following elements: 包含下列原素: ============ ================================================== - ``match`` Pattern to search for. ``match`` 用于搜索的模式。 - ``name`` Scope name to be assigned to matches of ``match``. ``name`` 设置被 ``match`` 匹配到的内容所具有的作用域。 - ``comment`` Optional. For information only. ``comment`` 可选。只是为了提供信息。 - ``captures`` Optional. Refinement of ``match``. See below. ``captures`` 可选。是对 ``match`` 的精炼。见下文解释 ============ ================================================== - In turn, ``captures`` can contain *n* of the following pairs of elements: ``captures`` 内容可以包含 *多* 组下面要说明的元素对: ======== ================================== - ``0..n`` Name of the group referenced. ``0..n`` 被索引的组的名字。 - ``name`` Scope to be assigned to the group. ``name`` 组内元素具有的作用域。 ======== ================================== - Examples: 示例: .. code-block:: js @@ -168,21 +135,16 @@ Elements contained in the ``patterns`` array. } ``include`` - Includes items in the repository, other syntax definitions or the current one. 在仓库中包含其他的语法定义内容或者当前定义的内容。 References: ========= =========================== - $self The current syntax definition. $self 当前的语法定义。 - #itemName itemName in the repository. #itemName 仓库中名为 "itemName" 的内容。 - source.js External syntax definitions. source.js 外部的语法定义。 ========= =========================== - Examples: 示例: .. code-block:: js @@ -197,30 +159,20 @@ Elements contained in the ``patterns`` array. { "include": "source.js" } ``begin..end`` - Defines a scope potentially spanning multiple lines 定义一个可以跨多行的作用域。 - Contains the following elements: 包含下面的一些元素: ================= ================================================ - ``begin`` The start marker pattern. ``begin`` 模式的开始标志。 - ``end`` The end marker pattern. ``end`` 模式的终止标志。 - ``name`` Scope name for the whole region. ``name`` 整个区域的作用域名称。 - ``beginCaptures`` ``captures`` for ``begin``. See ``captures``. ``beginCaptures`` 为 ``begin`` 准备的 ``captures``。请参考 ``captures``。 - ``endCaptures`` ``captures`` for ``end``. See ``captures``. ``endCaptures`` 为 ``end`` 准备的 ``captures``。请参考 ``captures``。 - ``patterns`` ``patterns`` to be matched against the content. ``patterns`` 与正文内容进行配对的 ``patterns`` 。 - ``contentName`` Scope name for the content excluding the markers. ``contentName`` 除掉标志符之后的内容的作用域名称。 ================= ================================================ - Example: 示例: .. code-block:: js @@ -240,17 +192,13 @@ Elements contained in the ``patterns`` array. "end": "\\}" } -Repository 仓库 ********** -Can be referenced from ``patterns`` or from itself in an ``include`` element. -See ``include`` for more information. 在 ``include`` 元素中,既可以从 ``patterns`` 中饮用,也可以从自身引用。请参考 ``include`` 章节来了解更多信息。 -The repository can contain the following elements: 仓库可以包含下列元素: - Simple elements: @@ -277,7 +225,6 @@ The repository can contain the following elements: ] } -Examples: 示例: .. code-block:: js @@ -313,11 +260,9 @@ Examples: } -Escape Sequences 转义序列 **************** -Be sure to escape JSON/XML sequences as needed. 请确保对JSON/XML序列内容进行正确的转义。 .. EXPLAIN diff --git a/source/search_and_replace/search_and_replace.rst b/source/search_and_replace/search_and_replace.rst index df45f3e..1b66a95 100644 --- a/source/search_and_replace/search_and_replace.rst +++ b/source/search_and_replace/search_and_replace.rst @@ -4,27 +4,18 @@ .. _snr-search-buffer: -Searching 搜索 ========= -To open the **search panel** for buffers, press ``Ctrl + F``. Some options in -the search panel and search actions can be controlled with the keyboard: 按下 ``Ctrl + F`` 键就可以打开当前缓冲区的 **搜索面板** 。搜索面板里的一些选项和搜索动作 有着对应的快捷键: ========================== =========== -Toggle Regular Expressions ``Alt + R`` -开/关正则表达式选项 ``Alt + R`` -Toggle Case Sensitivity ``Alt + C`` -开/关大小写敏感选项 ``Alt + C`` -Toggle Exact Match ``Alt + W`` -开/关精确匹配选项 ``Alt + W`` -Find Next ``Enter`` +开/关正则表达式选项 ``Alt + R`` +开/关大小写敏感选项 ``Alt + C`` +开/关精确匹配选项 ``Alt + W`` 查找下一个 ``Enter`` -Find Previous ``Shift + Enter`` 查找上一个 ``Shift + Enter`` -Find All ``Alt + Enter`` 查找全部 ``Alt + Enter`` ========================== =========== @@ -32,15 +23,9 @@ Find All ``Alt + Enter`` .. _snr-incremental-search-buffer: -Incremental Search 增量查找 ================== -The **incremental search panel** can be brought up with ``Ctrl + I``. The only -difference with the regular search panel lies in the behavior of the ``Enter`` -key: in incremental searches, it will select the next match in the buffer and -dismiss the search panel for you. Choosing between this panel or the regular -search panel is mainly a matter of preference. 按下 ``Ctrl + I`` 可以呼出 **增量搜索面板** 。与正常的搜索面板相比,唯一的区别在于 ``回车`` 键的作用:在增量搜索中,按下回车键将选中缓冲区中下一段与搜索条件匹配的文字,并自动关闭面板。 一般来说,可以根据个人的喜好来决定是选择增量搜索面板还是普通搜索面板。 @@ -48,62 +33,49 @@ search panel is mainly a matter of preference. .. _snr-replace-buffer: -Replacing Text 替换文本 ============== -You can open the replace planel with ``Ctrl + H``. 可以通过 ``Ctrl + H`` 来打开替换面板。 -========================== ====================== -Replace All: ``Ctrl + Alt + Enter`` -替换全部内容: ``Ctrl + Alt + Enter`` -========================== ====================== +========================== ======================= +替换全部内容: ``Ctrl + Alt + Enter`` +========================== ======================= .. xxx no key binding for replacing once? .. _snr-tips-buffer: -Tips 小技巧 ======== -Other Ways of Searching in Buffers 搜索文本的其他方法 ---------------------------------- .. todo: link to goto anything section -Goto Anything provides the operator ``#`` to search in the current -buffer. The search term will be the part following the ``#`` operator. 可以在Goto Anything(快速跳转)(译者注:ctrl+P唤出,或者菜单栏->Goto->Goto Anything)面板中使用 ``#`` 操作符在当前缓冲区中进行搜索。跟在 ``#`` 操作符后面的内容将被识别为搜索关键字。 -Other Key Bindings to Search in Buffers 文本搜索的其他快捷键 --------------------------------------- -These keybindings work when the search panel is hidden. 下面的这些快捷键在搜索面板不可见的情况下仍然有效。 =============================================== ============== Search Forward Using Most Recent Pattern ``F3`` -使用最近一次的搜索模式进行前向搜索 ``F3`` +使用最近一次的搜索模式进行前向搜索 ``F3`` Search Backwards Using Most Recent Pattern ``Shift + F3`` -使用最近一次的搜索模式进行后向搜索 ``Shift + F3`` +使用最近一次的搜索模式进行后向搜索 ``Shift + F3`` Select All Matches Using Most Recent Pattern ``Alt + F3`` -使用最近一次的搜索模式进行全搜索 ``Alt + F3`` +使用最近一次的搜索模式进行全搜索 ``Alt + F3`` =============================================== ============== .. search under cursor ?? -Multiline Search 多行搜索 ---------------- -You can type a multiline search pattern. To enter a newline character, press -``Ctrl + Enter`` in the search panel. Note that the search panel is resizable -too. 你可以输入一个多行搜素模式。在搜索面板中使用 ``Ctrl + 回车`` 键来输入换行符。值得一提的是, 搜索面板的大小是可以调整的。 diff --git a/source/search_and_replace/search_and_replace_files.rst b/source/search_and_replace/search_and_replace_files.rst index 76360da..2745990 100644 --- a/source/search_and_replace/search_and_replace_files.rst +++ b/source/search_and_replace/search_and_replace_files.rst @@ -4,49 +4,37 @@ .. _snr-search-files: -Searching 搜索 ========= -To open the search panel for files, press ``Ctrl + Shift + F``. You can use the -keyboard to control the search panel and some search actions: 使用 ``Ctrl + Shift + F`` 键可以打开多文件搜索面板。搜索面板与搜索动作可以使用快捷键进行操作: ========================== =========== Toggle Regular Expressions ``Alt + R`` -开/关正则表达式选项 ``Alt + R`` +开/关正则表达式选项 ``Alt + R`` Toggle Case Sensitivity ``Alt + C`` -开/关大小写敏感选项 ``Alt + C`` +开/关大小写敏感选项 ``Alt + C`` Toggle Exact matches ``Alt + W`` -开/关精确匹配选项 ``Alt + W`` +开/关精确匹配选项 ``Alt + W`` Find Next ``Enter`` -查找下一个 ``Enter`` +查找下一个 ``Enter`` ========================== =========== .. _snr-search-scope-files: -Search Scope 搜索作用域 ============ -The **Where** field in the search panel determines where to search. You can -define the scope of the search in several ways: 搜索面板中的 **Where** 字段决定搜索文件的范围。你可以通过以下几种方式来确定文件的搜索作用域: -* Adding individual directories (Unix-style paths, even on Windows) * 添加一个独立的目录 (需要使用 Unix风格的文件路径,在Windows平台也是如此) -* Adding/excluding files based on a pattern * 使用某种模式来添加/删除某些文件 -* Adding symbolic locations (````, ````) * 添加链接位置(````, ````) -You can combine these filters separing them with commas, for example: 你可以在一次搜索中组合使用以上确定作用域的方式,并且在不同方式之间用逗号分隔,例如: /C/Users/Joe/Top Secret,-*.html, -Press the **...** button in the search panel to display a menu containing -these options. 通过在搜索面板中按 **...** 按钮来显示包含这些选项的菜单。 (译者注:Unix风格的文件路径指的是使用 */* 来区分目录结构,例如 */Users/voidmain/* ,在 @@ -59,29 +47,21 @@ Windows平台上,可以使用 */C/Users/* 来指定盘符) .. _snr-results-format-files: -Results Format 搜索结果显示方式 ================== -In the search panel, you can find the following options to customize the -results format: 在搜索面板中,可以使用下面的选项来自定义搜索结果的显示方式: -* Show in Separate Buffer/Output Panel * 在单独的缓冲区/输出面板中显示 -* Show Context * 显示上下文 .. _snr-results-navigation-files: -Navigating Results 搜索结果跳转 ================== -If the search yields matches, you can move through the sequence using the -following key bindings: 一旦找到了符合要求的内容,你就可以使用以下的快捷键进行结果之间的跳转: ================ ============== From 6948f83ca00ba501a2c7f4609b99ac74c6286513 Mon Sep 17 00:00:00 2001 From: howiezhao Date: Thu, 1 Aug 2019 18:58:28 +0800 Subject: [PATCH 79/79] Update translation --- source/_includes/command_line.g.txt | 71 ++++++++ source/basic-concepts-console.png | Bin 0 -> 23880 bytes source/basic_concepts.rst | 130 +++++--------- source/command_line/command_line.rst | 10 +- source/conf.py | 6 +- source/customization/customization.rst | 2 +- source/customization/indentation.rst | 5 +- source/editing/editing.rst | 55 ++++-- source/extensibility/command_palette.rst | 36 ++-- source/extensibility/commands.rst | 17 +- .../images/command-palette-0001.png | Bin 0 -> 22831 bytes .../images/completions_contents.gif | Bin 0 -> 67464 bytes .../extensibility/images/completions_hint.png | Bin 0 -> 28273 bytes source/extensibility/macros.rst | 20 +-- source/extensibility/plugins.rst | 115 ++++++------ source/extensibility/snippets.rst | 39 ++-- .../file-management-goto-anything.png | Bin 0 -> 27712 bytes ...file-management-transient-views-detail.png | Bin 0 -> 11574 bytes source/file_management/file_management.rst | 61 +------ .../file_management/file_management.rst.orig | 83 --------- source/file_management/file_navigation.rst | 120 +++++++++++++ source/file_management/projects.rst | 93 ++++++++++ source/file_processing/build_systems.rst | 29 +-- source/getting_started/install.rst | 166 +++++++++++++----- source/glossary/glossary.rst | 10 +- source/index.rst | 2 +- source/intro.rst | 17 +- source/reference/build_systems.rst | 3 +- source/reference/keyboard_shortcuts_osx.rst | 162 ++++++++--------- source/reference/keyboard_shortcuts_win.rst | 114 ++++++------ source/sample-intro.png | Bin 0 -> 99468 bytes .../search-and-replace-multiline.png | Bin 0 -> 19180 bytes .../search-and-replace-regex-sample.png | Bin 0 -> 32656 bytes .../search-and-replace-results-buttons.png | Bin 0 -> 5149 bytes .../search-and-replace-search-results.png | Bin 0 -> 55307 bytes .../search-in-files-with-filters.png | Bin 0 -> 8971 bytes .../search_and_replace/search_and_replace.rst | 65 ++++--- .../search_and_replace_files.rst | 30 ++-- .../search_and_replace_overview.rst | 31 ++-- 39 files changed, 862 insertions(+), 630 deletions(-) create mode 100644 source/_includes/command_line.g.txt create mode 100644 source/basic-concepts-console.png create mode 100644 source/extensibility/images/command-palette-0001.png create mode 100644 source/extensibility/images/completions_contents.gif create mode 100644 source/extensibility/images/completions_hint.png create mode 100644 source/file_management/file-management-goto-anything.png create mode 100644 source/file_management/file-management-transient-views-detail.png delete mode 100644 source/file_management/file_management.rst.orig create mode 100644 source/file_management/file_navigation.rst create mode 100644 source/file_management/projects.rst create mode 100644 source/sample-intro.png create mode 100644 source/search_and_replace/search-and-replace-multiline.png create mode 100644 source/search_and_replace/search-and-replace-regex-sample.png create mode 100644 source/search_and_replace/search-and-replace-results-buttons.png create mode 100644 source/search_and_replace/search-and-replace-search-results.png create mode 100644 source/search_and_replace/search-in-files-with-filters.png diff --git a/source/_includes/command_line.g.txt b/source/_includes/command_line.g.txt new file mode 100644 index 0000000..ba0042c --- /dev/null +++ b/source/_includes/command_line.g.txt @@ -0,0 +1,71 @@ +.. This file was generated. Don't edit it. + +================================ ======================= +``subl [options] [files]`` 打开给定文件。 +``subl [options] [directories]`` 打开给定目录。 +``subl [options] -`` 编辑标准输入。 +================================ ======================= + +文件名可以给出 ``:line`` 或 ``:line:column`` 后缀以在特定位置打开。 ``line`` 和 ``column`` 说明符是基于1的偏移量。 + +从标准输入读取仅适用于OS X。 + +选项 +------- + +``subl`` 命令行帮助程序接受一些选项。有关详细信息,请参阅下面的摘要。 + +======================== ====================================================== +``--project `` 加载给定的项目。 +``--command `` 执行给定的命令。 +``--new-window``, ``-n`` 打开一个新窗口。 +``--add``, ``-a`` 将文件夹添加到当前窗口。 +``--wait``, ``-w`` 在返回之前等待文件关闭。 +``--background``, ``-b`` 不要激活该应用程序。 +``--stay``, ``-s`` 关闭文件后保持应用程序激活。 +``--help``, ``-h`` 显示帮助。 +``--version``, ``-v`` 显示版本信息。 +======================== ====================================================== + +``--project `` + 加载给定的项目。 + + **project** 参数指定要加载的 :file:`.sublime-project` 或 :file:`.sublime-workspace` 文件。 + +``--command `` + 执行给定的命令。 + + **command** 参数指定要运行的命令。 + + 如果Sublime Text尚未运行,则只有 ``ApplicationCommand``\s在从命令行调用时才能工作。如果Sublime Text已在运行,则从命令行调用时,``WindowCommand``\s也可以正常工作。 + + 您还可以将参数传递给命令。参数必须通过空格与命令名分隔,并表示为JSON对象。像往常一样,你必须转义shell所要求的引号和其他字符。例如,这种语法可以在bash和PowerShell中使用: ``subl --command 'echo {\"foo\": 100}'`` 。 + +``--new-window (-n)`` + 打开一个新窗口。 + + Sublime Text的实例已在运行时应使用此选项。 + +``--add (-a)`` + 将文件夹添加到当前窗口。 + + 将文件夹添加到当前窗口而不是打开新窗口。 + +``--wait (-w)`` + 在返回之前等待文件关闭。 + + 例如,将Sublime Text用作版本控制系统(如git)的编辑器非常有用。如果从标准输入读取则隐含。 + +``--background (-b)`` + 不要激活该应用程序。 + +``--stay (-s)`` + 关闭文件后保持应用程序激活。 + + 仅与 ``--wait`` 结合使用。 + +``--help (-h)`` + 显示帮助。 + +``--version (-v)`` + 显示版本信息。 diff --git a/source/basic-concepts-console.png b/source/basic-concepts-console.png new file mode 100644 index 0000000000000000000000000000000000000000..e75b1fc0ed74c418bc6fe7af67bcd7ffc7677966 GIT binary patch literal 23880 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 - Sublime Text的官方文档 +在使用 ``subl`` 之前,请确保它在您的 ``PATH`` 中。要将 ``subl`` 放在 ``PATH`` 中,您可能需要将目录添加到 ``PATH`` 或使用符号链接。 + +调用 +------ +.. include:: ../_includes/command_line.g.txt \ No newline at end of file diff --git a/source/conf.py b/source/conf.py index 9a52c94..d9c3c69 100644 --- a/source/conf.py +++ b/source/conf.py @@ -40,8 +40,8 @@ master_doc = 'index' # General information about the project. -project = u'Sublime Text非官方文档' -copyright = u'2012, Sublime Text社区' +project = u'Sublime Text 非官方文档' +copyright = u'2012, Sublime Text 社区' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the @@ -54,7 +54,7 @@ # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. -#language = None +language = 'zh_CN' # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: diff --git a/source/customization/customization.rst b/source/customization/customization.rst index 5047a5a..ac3e253 100644 --- a/source/customization/customization.rst +++ b/source/customization/customization.rst @@ -2,7 +2,7 @@ 定制Sublime Text ======================== -Sublime Text是高度可定制的。在接下来的几节中,我们将向你介绍如何根据自己的需要和偏好来定制它。 +Sublime Text是高度可定制的。在接下来的几节中,我们将向你介绍如何根据自己的需要和偏好来定制它。特别地,我们 **不涉及** 主题,这是一个极其可配置的Sublime Text区域。 .. toctree:: :maxdepth: 2 diff --git a/source/customization/indentation.rst b/source/customization/indentation.rst index cce3ce9..b261e5a 100644 --- a/source/customization/indentation.rst +++ b/source/customization/indentation.rst @@ -2,8 +2,7 @@ 缩进 =========== -更多信息请参考 +.. seealso:: `缩进 `_ - 官方Sublime Text文档 - + Sublime Text官方文档 diff --git a/source/editing/editing.rst b/source/editing/editing.rst index d1f8fec..a46c9b8 100644 --- a/source/editing/editing.rst +++ b/source/editing/editing.rst @@ -11,26 +11,60 @@ Sublime Text具有多种多样的编辑特性。本主题只简单展示其中 多重选择 =================== -多重选择特性让你可以高效的在文档中进行批量修改。任何对这个特性的赞誉都不为过。接下来我们就展示 -这么说的原因: +多重选择特性让你可以高效的在文档中进行批量修改。任何对这个特性的赞誉都不为过。接下来我们就展示这么说的原因: -首先选中一些文本,然后按 ``Ctrl + D`` 的组合键来 **添加更多** 实例。如果你想 **跳过当前实例**, -可以按 ``Ctrl + K, Ctrl + D``。 +首先选中一些文本,然后按 ``Ctrl + D`` 的组合键来 **添加更多** 实例。如果你想 **跳过当前实例**,可以按 ``Ctrl + K, Ctrl + D``。 如果你按键太快,导致误添加了一个实例,可以用 ``Ctrl + U`` 来 **取消** 对当前实例的选择。 把多重选择的内容扩展到行 =========================================== -使用 ``Ctrl + L`` 可以把多重选择的内容从单词扩展到整行。使用 ``Ctrl + Shift + L`` 可以把 -选中的多行文本分成多个独立的行。 +使用 ``Ctrl + L`` 可以把多重选择的内容从单词扩展到整行。使用 ``Ctrl + Shift + L`` 可以把选中的多行文本分成多个独立的行。 -(译者注:这里多个独立的行指的是每行末尾都有单独的光标。平时选中多行文字之后只会有一个光标,这 -时按 ``Ctrl + Shift + L`` 后,每一行末尾都有一个光标,可以按左方向键查看效果。这种选择适用 -于在 *每行* 都添加/删除相同的内容) +(译者注:这里多个独立的行指的是每行末尾都有单独的光标。平时选中多行文字之后只会有一个光标,这时按 ``Ctrl + Shift + L`` 后,每一行末尾都有一个光标,可以按左方向键查看效果。这种选择适用于在 *每行* 都添加/删除相同的内容) 你可以复制多重选择的行到一个单独的缓冲区,在那里编辑他们,并将编辑后的结果贴回到第一个缓冲区。 +列选择 +======= +你可以选择文件的矩形区域。列选择使用多重选择。 + +可以在选择中添加或删除文本块。 + +使用鼠标 +--------- +Windows + +================== ===================================== +选择块 Right Mouse Button + :kbd:`⇧` +添加到选中项 Ctrl + Right Mouse Button + :kbd:`⇧` +从选中项里删除 Alt + Right Mouse Button + :kbd:`⇧` +================== ===================================== + +Linux + +================== ===================================== +选择块 Right Mouse Button + :kbd:`⇧` +添加到选中项 Ctrl + Right Mouse Button + :kbd:`⇧` +从选中项里删除 Alt + Right Mouse Button + :kbd:`⇧` +================== ===================================== + +macOS + +============== ======================================= +选择块 Right Mouse Button + :kbd:`⌥` +添加到选中项 :kbd:`⌘` + Right Mouse Button + :kbd:`⇧` +从选中项里删除 :kbd:`⌘` + :kbd:`⇧` + Right Mouse Button + :kbd:`⇧` +============== ======================================= + +使用键盘 +--------- +===================== ============================================= +Windows Ctrl + Alt + Up and Ctrl + Alt + Down +Linux Alt + :kbd:`⇧` + Up and Alt + :kbd:`⇧` + Down +OS X :kbd:`⌃` + :kbd:`⇧` + Up and :kbd:`⌃` + :kbd:`⇧` + Down +===================== ============================================= 文本选择的其他方法 ============================ @@ -51,5 +85,4 @@ Sublime Text具有多种多样的编辑特性。本主题只简单展示其中 其他内容 ====================== -在 **Edit**, **Selection**, **Find** 和 **Goto** 菜单中可以找到很多好用的编辑工具。平常 -你可能只需要其中的部分功能,当你遇到问题的是后看看这些菜单项,也许其他功能能够帮助你解决问题。 +在 **Edit**, **Selection**, **Find** 和 **Goto** 菜单中可以找到很多好用的编辑工具。平常你可能只需要其中的部分功能,当你遇到问题的时候看看这些菜单项,也许其他功能能够帮助你解决问题。 diff --git a/source/extensibility/command_palette.rst b/source/extensibility/command_palette.rst index 3fc66a9..f489a4e 100644 --- a/source/extensibility/command_palette.rst +++ b/source/extensibility/command_palette.rst @@ -15,12 +15,22 @@ 与命令文件相互联系。通常,命令不保证产生一个按键绑定,可以在 ``.sublime-commands`` 中作为一些很好的候选。 -文件格式(命令文件) -============================ +.. figure:: images/command-palette-0001.png -命令文件使用JSON,并且有一个 ``.sublime-commands`` 的扩展。 + 命令面板 +默认情况下,命令面板包含许多有用的命令,可以方便地访问各个设置以及设置文件。 -如下是来自 ``Packages/Default/Default.sublime-commands`` 的实例:: +要使用命令面板: + +1. 按下 ``Ctrl+Shift+P`` 。 +2. 选择一个命令 +3. 按下 ``Enter``。 + +命令面板通过文本过滤选项。这意味着无论何时打开它,您都不会总是看到每个 ``.sublime-commands`` 文件中定义的所有命令。 + +``.sublime-commands`` 文件的示例 +================================= +以下是 ``Packages/Default/Default.sublime-commands`` 的摘录:: [ { "caption": "Project: Save As", "command": "save_project_as" }, @@ -32,20 +42,4 @@ { "caption": "Preferences: Default Global Settings", "command": "open_file", "args": {"file": "${packages}/Default/Global.sublime-settings"} }, { "caption": "Preferences: User Global Settings", "command": "open_file", "args": {"file": "${packages}/User/Global.sublime-settings"} }, { "caption": "Preferences: Browse Packages", "command": "open_dir", "args": {"dir": "$packages"} } - ] - -``caption`` - 显示在命令面板中的标题. -``command`` - 待执行的命令. -``args`` - 传给 ``command`` 的参数。 - -如何使用命令面板 -============================== - -#. 按下键盘的 `Ctrl+Shift+P` -#. 选择命令 - -命令面板通过文本过滤选项,所以无论什么时候打开,你都不会看到每一个 ``.sublime-commands`` -文件的所有命令。 \ No newline at end of file + ] \ No newline at end of file diff --git a/source/extensibility/commands.rst b/source/extensibility/commands.rst index 23a9e5d..585ed81 100644 --- a/source/extensibility/commands.rst +++ b/source/extensibility/commands.rst @@ -1,22 +1,17 @@ ======== 命令 ======== +命令在Sublime Text中无处不在:按键绑定,菜单项和宏都通过命令系统工作。它们也可以在其他地方找到。 -命令在Sublime Text中无处不在:按键绑定,菜单项包括宏等它们都是工作在命令系统里的。因此,命令随处可见。 - -一些命令可以通过编辑器内核接口来实现,但是更多的是作为python的插件来提供。任何命令都可以通过python插件来调用。 +一些命令在编辑器的核心中实现,但其中许多命令都是作为Python插件提供的。可以从Python插件调用每个命令。 命令调度 ******************* - -通常,命令都绑定在应用对象,窗口对象或者视图对象里。不过,窗口对象根据输入焦点来分发命令,因此你可以通过窗口对象发起一个 -命令并且会为你返回一个正确的视图实例。 +通常,命令绑定到应用程序对象,窗口对象或视图对象。但是,窗口对象将根据输入焦点调度命令,因此您可以从窗口对象发出视图命令,并为您找到正确的视图实例。 命令剖析 ******************** - -命令名通常被下划线所分割,就像 ``hot_exit`` ,而且是一个以字符串为关键字JSON类型为值的字典。下面是一些运行在python控制台下 -的命令例子: +命令的名称由下划线(snake_case)分隔,如 ``hot_exit`` ,并且可以使用参数字典,其键必须是字符串,其值必须是JSON类型。以下是从Python控制台运行的一些命令示例: :: @@ -28,5 +23,5 @@ .. seealso:: - :doc:`Reference for commands <../reference/commands>` - Command reference. + :doc:`命令参考文档 <../reference/commands>` + 命令参考内容 diff --git a/source/extensibility/images/command-palette-0001.png b/source/extensibility/images/command-palette-0001.png new file mode 100644 index 0000000000000000000000000000000000000000..59cc39c54f5c45160932ec7738697ec1137a8bad GIT binary patch literal 22831 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

w*6eZLxXG&IoNp;k{0_KMhmd$H9rf>;F&8 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 IJ?$3%J0W>E2><{9 literal 0 HcmV?d00001 diff --git a/source/extensibility/images/completions_contents.gif b/source/extensibility/images/completions_contents.gif new file mode 100644 index 0000000000000000000000000000000000000000..c897e8c51a0869bfecfa4d2167faac0ce91239e2 GIT binary patch literal 67464 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­o`oV&@oJHd? z-W(>hff~fu*=Y1M6O_@GjoEmW8GTgxEK!l@X@t2z9X2))>PxPN1#&7O!~(fv>u?ap zfH((n+32yQ;L<{WCn(lS_k$K-0khUHlsyb80@y0dEjbH^8vfmMN4`l{Oj#nONy!X7 zPiRfQqNZ~Ib;p&fVPxXi8F$PHO=V)dc^lis{mXL;hxp)@(Oy<*+XxYBTOu@pSB%fW z!)Z_|i7z>6MH=W{tVG@3Fl6vu;`nSy&o$##PNEGJ3Op?t$Wx+qPOzF7ipgn~m@&p7 zKdl=7NF}in(##1f+bhfcn*OqF`aMSd7;85W{lJqSGnY!bqHoN`lIa0TzkGBgN1m;nv@7VSLToR}Mn+19yjU&74gcu5khKk)6X z>NYcqZXg^d7r5eUs9lyx^Tm5ED%$oH33J_#Yi-#BLa`!5?laD4DzaY`GFGqU!_%X0 z@Ugae$5o`XEjb$Efb?yIY!wM_({^Yl(kQMJpUuX?)4Sc?46gTSys zJSrjB1L0^Lq5Fvt?K=s7fINrT(FZ5I_By>*I=!ko&8;TPY~A6%OnBjSnggnAm#fgV z`pwA)0|D`HRzR{84Kp|ii;P<@6LCTIJt&(jC@M|#*K@&URZvih76cdoXH4`SqM#)J zI(w}*mura79cniKFvf)TrW4)<6JU0RqL`E%WnVaQb z4M6MYx5+hpmZ%w-tZDm_9c6gd_Cf=ij0idlJ1UDSGEvea&+=I=QB;m3^w*t$F?ZBW zOi;ZV4y-4FpcynxJTwsq8qL#Fc2@G`o)@Mk8jd6U0T3177^qL-r8j|gh~f2M9!P-* zSOvVrnFtaQW+1kVVMH_+ku={^4BmANwxbB_gg5*7&h?j}C$Eql#Ax0?Tb&SVxa8Bgi&-V9`}PmG3}S^3 z?(!k!(6+Gf50F~Jsj&~dW1pUrC;>!l!YC>1T8FZcu7;z<&VWf8lWpK@ZRm?5J22g9 ztB~2OfTb8VBg|;Hif9wFQDlyZr16Q;+|cvtz>v;F_^U*j4~Y_AqRO%Dss=qi?|A@k z2<_LQ48KF^6Ct1@21=3#zT%1*9gG=D4YEOct1ph~hZ)jQm3+u#E+!l!G>_(xo1zVG ze)rAcTccyJ6?zU<%w9z9XV_zJgZ8Di_Z9Cw{!{g04C4I=QwBQCH0Xi_yhA`r(JS=H<^Ah6$U^Uaju%^#uX{kX;F#WvQDBT)K(Ah4?p=f>PtlCZE>cf0)SkE=MfhQ;tw;5v*kkXLckChPw!*$_|Hiv;qmxVr06zzbEQ=Rp!b{$@&6E;Mr zQC1PIy7O5h2<>vmRI%Tasj=S3-4Vyf+%ilrA3#pGQOxOUR0;HMVhZK*x+Tci)@-z9dw;DSNNNS+_8Z)uZTL)C~Lo7P2HAvH4`Y? zAY^^RM)|W=c?`HoUbtzUwpp+Y-25TjVoTfdQk(u6-1?jL%?CKzPUsz<_PywK+N$=W zrS|P%=%cju{UzwDQs~f5^hu^SJKUfq0CsCU%2bu<;)Ln&YqMmZ&Sw^SGoek&Vrm`* zPH*O#xUZVB9=Kn^$ZxP&<}ab_g*4Y>sb?6M?q|pAZ{;*Mf9wga<+Kp5_i6FHu5Dhj z$_OjtKgjj;-aSJX)$JAc?G;CTCf(Y5W*8~|*sF-wr_9%< zs@vyN+5t_4(+ETm$%4^;?9<1C6;g!t??g$05rM%&9}d-%$=9>zlTu5PEkx*&))d*e z&Q85l!?NXZpJdJ!k_T73{CE)BJX4KdHzbDgp_HQRqhTVA8+%K|_fi?!vYPL;ayn(a zJaz342{S6LKvF-c6l*H4*52>dBU)Ok&Uk7=<*UdQ6(dyJizxd%!}VWz>V1bFXmL70 zC{r75d#t1_6R2O;g`xRmVPn(=W7KA9M`lCh)+R)j^SH%o2N2(Pxz>mhld_Or;!=Em zL;GG{ugKDdSjwkR4Z=6e$7|YTZLG8y}4!$MTmh8}<&Zysi)L z$}oFFJ%@&}N!MzIv<}K!&W0-ShHGVq8}PnrwkEy(j2b(I8h?pOC(4}?+`oABHTS^# z6`#Jhuc+@Q$|6>TYAkMI;nM$@6?0716eP45#YozW6OEPZY;YAg$!1u1xIQPwdltHBBEb zs>a3AW9pa|&iJPGAxZ0vIdkFrN!dhPdDG!KsHwNz`OD2L3EdnFmn_M~VuCgwg>}Zr zTc;Qor#cb7-1c^N9dw`jPG8{l^dD%n>4eLnwQ|w5YG3kCdiw#(^1et-aK9T`SH|-z zpD;kHK&PMGlb&t-)K~Zw_kFf7ZLcs+{SppqAwDbReCs6L=xD^dxvH1EIv?{@X{d*) z=|`1FKSX?*1uNsHI*Xmw<%E|{MU4)MzY%|VF<6fCh0QuQiEkmvZh^&iTxKQVJ07u^ zg(B(q1>Y@+@lDqm?ZsE>6A0ytWy?e5Xv5pcOV#vC*=MQ%`QY7B&qctP`8~wr~bq>4QSljFTDt~vNh6&y+hb`vEdYfq#3KhV~V=-2CH*I%wQ^t6qZ zC9DULEJK@Y_a0C7k5auB!0Yc?UaHx^mtUDyoUp{djrxcy;W! zxE)1*?~WaCn5?OOlGwISh+vEYsA>AB+C1;g5f zn!zRKI4pOjN^>u+uE7nO0sQ6qGvc!|_e^NlwOjumw;;khV89KRA=Jw(7%n0x7Q<`1 zA2+<1x24RtIE=7O090SbD@)KVddF?h+V_kf-?IeI zV3|8_G%GKi1I}<6Ve6{knjF6qj-$<1owbicy9qvPCA{wscpOx?Rjq>0>wvcdgYIb^ zphU9}odK#wXK?fZ*Y=s$2@Vf$6u$S3pLacb>~OeUT7L#MLfXdhOw$Qad~qxu zmwh+rJ4v8aBDE~+3$_SHVv%q`dgI5)euIceD_Mc92qno@3@e3MA8rMDogBC0)xI>1 zQ~mZAdNcdHU#ZZL()O6#kkx3^N?}n5WE-o9Cn|+B>=RK;?UqKUzKwy&-)LT0PUg#H zhTTyo?stVg2 zx>O(E)2GxvL)f1i9%b6&Y|U~v^pzA|u0`ygnQ%Cv0oeCmEUvkr!qeTPEWW{`T!Ey) z9G3|Q^GuXUs6Eezo_PVg=Y+YO3b^T*h@2pz)F-9}WW8Qy349MeG;xITZ;UN3J{X1Z62ytJNRfM8R5w47Oxxp-yw$Cd zrmYmMk;185I^ZDrU==1kz1~?P%Q`+HCG))e-~|gw8q%eB`rsXyA@%h{FRKE7pz_N> zk3~_$G4oH)Us4k5LfNAk>7GT7@DqlzeG$lfeD`7LQ`a<(=hjwnjA2+bo2t^~r&q#4 zX-%)DERHr@3)xY>fBC9pk^j0&xpH{=!&1hE+l;!)#j9!UaB_|Toe!YGIg6Tua1Bde zIP13xf$!=xZ7S)HHGL9~ceDI+pg3{W1Kz1?+K!7g2-syCaelPNy5m@O^2vGGDn8Z6 zxt3jvHmB#152g9h>zcgL5WOzR95;0BSi&e2!Ms8{n6iM2#120r%*d9bAAU1R5Z;U1 zj=NvnBvz}9#4Jg}yvZ!Zz+a0bQltQ9#pLu0#jY*(Y=MQ{3D^kQJUg6%XZvFu$DMg* zozdN!!Vair%i=-~o}3Q}{U2vd&cDOsRpQ(%+V}<)G}~r}i#>~|{oL<;=(vg*zTvb( zKuK6LD!-5z7=)B(`@!Nm+^#EbG#szzi%}z9-*EMt(`1?F;wUBMXu4-*aWeyWqoZDP znXVI1dYLWw3QdVdkM)ZT_UgM7n90UQ`0;Zl0TI`;q3h;c_NLFuoQD(o`S9JsZg+_S z!U*+UCo8ePwG1i^pm@v$4yNa?7&PeLuo)+`yRTOatmwA+{%G4Vxz(b4a*HzPBy?Z3 zu*m!>m7;!8{Da^C)gGHZIE}6-Q{NF95%%ePJb*4?1qbZUjC+y9Xu2Cr$UDCq=dN0X z|CpNjt=}-ZeT9*6$ww0RCcNc`P)NvgsO)R(y0$asi9iWnOhLN&Sfuuzu+z@<3)KRu z2Pw1wVW}QyvBpj?Gct*oXf{SuH4qw1g4X&{4#q&U8hiB&pS{%xo&65qkk7%{Yk%#9 z5VmM!JTr-r>*keXgW#m3Q`F07V!kcQIHbj%*qc2Gc(*;F2;F1ud)jQ2HN+Z|>u<5H zY^%hVjS>Uoh#rcswup*7GxvKf<-%IO!Jbxs@u7Q{VE$m_TVa9ADXnY}y0yj6=Jm{X zoiwgsT9Vr6LxpgCP14KSeA)mrX|1sf-Ov#U+Dq{Hvu_JE?^_a08U4JnMN^sP#uof5)Z=gyQyF(;yRspQ(eziBna|3VfpF4_-m5RO1)1T9X<(FM zrIFK!pDkUFC=8&ZqO3fuq#B6ml>#-TjxHadb9OUHP_V&pJ z*G#5kLeff|siX_@WacJG5t~|($XlKn*y_s+CVDExOlh?W=vT#pi{m_W2UDp$Zl!u+ zHliIRqa|f9SeW@mTH_zpn+f(c?fq;RHlx7NI?KXEZg6EXbIs%w>(?1h$E60@xSIVX zHdQv=hdR%FP;?&as#ExBjA)S5`$aLaUdh>-VYQ^(gus6;%pcTqFjAjTuE$JXi4;SG zF3pPQt1arI$2hT$p7D3jsPH?sBo$W8Mhy2R_(E^)F|4zOd4*XAVz6}+Ue1asbl;X@ zFgevm(K*Acoj|KlFhxP-RpTT(&CZaic{6|Pe2e+24$jpo8+}7LPZ!9HBBmX*dhLE) zQM+D2Pldeteb$4-bg(b|1p0;R&0I$u+&dlss$S56NIM*66g4I}!I8d(FM7d2H5s3g zA6{>FEs)u-&qn2wdPC1LkRf89#u)qxrm+`gLgFnmoe9DFuzvP-r&uLEl-IZOgMQD? z=|Hxd#4i^*CBkat-j$hZ!+ya0-094dfoH}LfY|*Y6;4;BYeq3Hj9D|`oH9d~XcDS5 z@)?mOdHmB3`&<*{fbhVFK0FK7VQ74vdY6=QJQV%`t?>YK*BmG3G8c^d5usTZx-lqA zF~SdDs~p+#%$}o2sWeaWx3d+PL0QT77*A%3yIFUPq`I_1W2S~(mC7COtMaCPt?+k? zmwAd(nOmHTaqpwmEkD$_{5ab_c2Yg^+|~%8X}(|Fy*y4WR-I{Sq1!!_I~Lz=Sw8Lc zjDKI9LBg?}%R}v|y;$9)k+ChfAqQ`p2jR;=r-qYD$}V3oDWL?FcLs9A65nes z&gQIy3fB*uetQax-qX>|E{clyn<5%;vvp(JCXpiS(&3FX-3&L?B27o>d)`!&1n#Q9 zwqtPtbuJDlk0zM(lOk-1+0)gpt*1{fvpNwb|<_#!>4b=!v^s^0;u-=BW_NFf~XT`^w&vOr_Ey7M{GxCO~ok!9PV(KF)(&Y+um zg!?_WjtB6~>TOb^-=UC__a>#!*7{!XDQSYQBHfSc(aij#2aKnE7`^YAh5|P&Pmjm6 zInT3yv~yK3`b!ZUzF9gACYc~aRs;n+9R=h*JOKi(=6<|980a{kDzhaib2tlrI)oYO zLAZYikq2}F_!<%(;Q4`_K3oxSwm^hdK}0&j+bJ02BN!B2fNxQU`~(nPl>zCo6XunW z?_CHMpU^8?y4#-M*S12~F+w<|j7Yt~xYNOJ*t+CAf%vd=w=Ka0k6kDuK;mT}iR~LC zzHVIGE+SK5N;9`;^HZPHR=>`bxZ`vn5n_-N-GFsSp9`Ico34bJt%Q1r zgjZfaHMmOL$5&Lccfgmd)z5dplWZUWb5<<;PGK5^+IN%Q-`C{xLpJQzFC{`azlk+PBjufD{PNpbl~rRq|AfR&2&730R1 z@}-hWf27P%{bB?wo%Txl6Pr{{+3VaqDeuJKVp}N_Q|ZE(w#1mB=ugsFu3rjzhm-<` z;uD7|9*3%G3#zZA?DnL&xnydu$m?{!)ceXbhLAUjN`J1E)`pd7@qN`wH(YEh^yQmO zN2^RZ*>E(UL_;gEn@^+%kE~O5#Kv^wd17yO$jG4RNS*FTSE6Xdh%Cap5zwmwNNC}?M;w9gF%xKq#(T}xqzMZ4e6Qe7wpH}k*co3!c zqeC{xZ6t?PTNRIHL}Y!N$6P8@i6$7=`)|lc)rq^=Vs5>wRp)JZ`<`5-&QGXYP%J&9gC`Ak-rMQ(^yP9^Gtf}o+w z^V;x=JQ%LGQ+dn^j$A;Vx+$)R;Ns~ie)80>A?<=_(?UtX!tB$&Les}4UBOidLinl@ ze$zG=leln_d+$|wLt$k4re&Y<1wuP8@>IDHXSlG{l*PWtZObdH2q@~!sJqP=N2=cC zs;Ti$QJ>8iz|9)Io;4z$HD;eR5t}ttn>90=HFuk}2%WV|nzhQGwXU1B=~K5dgLYJe z)ss_G3k_yXDs>{Cb7r4&5u0;Wn{zXpb9bBb2%Ymxn)Aw^^RAoo>6`PN(eMMWsEeIx zsOkZH0CSFJK?kh!!D90vYV)CH^I>lD;i2;pN%N8U^HFv4(S7s5eW5Yi^Rd_SZ?EU$ zUu#9L%!;3Bh|Q}7;V&eaEhM`wq=afk!7ZfbYsI85eC%6@rq_C()Zwr_6EwPz^?EUz zd@-SIAxBJGk!vx}Y%!f(Yv`q>BmWdu-eO7JVrk!E+00`3_F~2LVkO*C)$65d@}(N~ zrINnT&uU9`W=pkZOAVnqHExTSms&yWLNB*Munb{Z?SfjampY!7FhQU$a+uDxB|26Dzv97%O1;PEc~To{=t^(?%F>fA1!A~lM95jlVj#at2YaX& zHvCIAIB%wq@wedtRjbb}SJ{fSQueO*$u?-@e;RheQjyzLayEa?9xz=4m zTRDD02p|gUc+&5Af;mn%FpgN=htrd{L^`9_yK^&mNJlt)9rZojd7#H zniWn#U`QOMzk6&HunxzlzG2j85WjBRleB)8w*-1UojKZb$}R$*5pGwdZ(9HJnKxuxlHUW!BWnf5&bW7Kvl^#Kc6& zENFZr^h=|<*vugwkvpq1sI-uV<~mC_i1)-r`#ORe*O3w!4|ylx4xe{2D@1v z;t-}SV>aWIY!MH(;9k`?0a>mMTKI5;`h)j8^-aV3cd9b1;{|rZ;cfE74{OyA>&Eue z$E;k&pr7y$KAT&fw81upF@q`&O2L3wE+`Hz>jrb12z2Y0_Eses2B`!`(dyO(1*(Mt zQxyz{Rq&R!>PHdD=Eg*}-b_$o$*ZzdpzX-{ZUlApZHNp)6LXzPpP{Yb2TMnUU&zDw z&D)*FB6y&$pStV+AP74{KRYsq>ad5tuZKrGdwXks2Jdl(5PpW3a)wlRhTPzYJP?W^ z=x}y}hPZbctLXSRd-4T;`JUsr76c&1KD`J7+||RwBRHVVouH;Tp~N{sjoSk%&+!Ev z@@G#DF{fEq&W`KCl(P_wnVgO1!6&4ZAzt!Fcv#jVMIjFYA-7<&lNEbd^$W6aheNk; zQiTg91Q&|ki=*}nEW%UD-E($}OAZegoI)p@-3#Tj3ucG#Cw>RYfeW%q{X;lYO3n?q zfK!&rbFKgvY>Nv#1y^Q`3y}s#!f|_|fCGnuE9r(SnSm?G^)TbXEBV_i1%zuwtZOC8 zYh})B6^Uzy{!mqmYjuxnHIHk}6gQP{*DW7gr;KZ9PG^z9YyI161B4sHaaT>O8)FGK zW6m2>!E5c5D^|4|i|`xElp9@%8>@yJ$)X#ZId}7pYa$D1cKBOItXn6_TW8K&7l~U} zjaxU1TX&CJkMLVhEDv39{H=Gxtxw^t&)ltFfQS7v3y0lX5Y}BFEe_+?UPWXYSrt+}>9jd@L*UE_#Mg!1?f5;-OaKq0Zu=-s7Pm{Gp!m zp{ekpnepCgBJ^WJC-okjMm$U*{9|Waa3J|(w}&-f=p>9OL6-9N z{nMOE-=pA+FGrm+n1oyz1J3V}lnVZ)0U3bEQ-ceDq1es(#D$E-qKmjo+#B%%ha^!XTt1!0gJbh+?tnsOyx%K!>sQ4u zhGc2f?5+1N$YoP#ElNbKrp)s`@wg-(74H?2BnXG!oSR$~DaA>jGnqA?Q%@J-6zZ30 z*OAPIX}^&U0ZTsL=!;SK;15gvF7M0xB=h#8tsDB~M(5qha+_O*)mCSdi{ryvM#GOm z2rn7v8gZ)N(?Crm093rPU>(YVed{J-%@|y6cQ)^OQ~5MDr~x|P%bl@wei>*u=|rl@ zT1B0B<8n!_QZp`X)@Xbk^}X?0YK{Ks!$1Q_wG zI68|~UG}Wb!&QEtgSpQRr(k~HtBc*Kl(~1ULC`f47f~P_t|pN$63zT- z;5F18QOI*?F5=MF+MdK=II9CFaA;T0Q5dF}dSqzR=^RO-s7o42qUoFONMe|WxJci! zFM5*3zT!S;B#q<0zaxzog2#~{uUVgz0sa*KLLmTHeiQ#f0iXck5D_pG6cjWxGz<(3 zEG#S>92`7kfC+s_^+^NuyEON@ql;) z(gZ|mL?rqoWR_$Ujuez$lvE%png|-&I9j@7I{Gwvh8zZlLI%b%M#d^eraC63MkeM~ zX66oN=5A)@US{S2X68X=<{@V0VP@u$pRkOwu#Eg-n1yACg=LV1Wq^gHkAFJv}{reSHH114BbY zqu-?DCO^gGW@cs(J-LO2#ZO7Om6f$ML{)BMYx`4JZf|ez;NSp}mpeH*K@{dLE-tPR zmARXnySuxG2V{=%^z!oZ_V)Ji`6)T~^Yir9u^iJ z9u85VM@B|Mgy_-H(GV^A+qZ9HV`Jmu;^O1u6A}{My?gim{rkkkzv<6YQc_Y=AtLk- zA3y%op?~`HDLow`M$gF1%*@Kl%Fc#}(sOcibMx}@^7Hcx3JMAf3yX@1ii?X&N=iyg zOUug2Ama3jii*n0%BrfW>gwv>r0KP_wZEy;8yXrQ0`;b*CWuD8rKRQXGWGV3j=w3@ zySux4dU|?$d;9wO`uqC_1_lNP2fuvzGBh+aJUl!yGBP?kIyN>oK0ZD%G4b{5*U8Dr zsi~>y>FJr7nc3Odxw*Od`T2!~1&Eq`X=&*e|{GMAp8sv9YSZpI=;DTwY#YU0q#YU*Fu^ z+}_^a-Q9iv{{8;`{^8-_@$vEL=?M%5|M>9(5f)$u3;Wl=_-kPNH8B4Dz|aKHc>wqz z`Qq7s&KQtffsBmw;splo8!S>%LMm!9I(kY*CTb>TT4okH7FIe|Hu^sg8yo$fgq@8Z z0tXud=P$U}7`WLOc-RR5*8T88LZ1?yV}8(0S!*#sHe2AbLjnmd3j9YNO40k*CI4sHR?o&j#&0iM48 zJ^_$6rN1)9|J{s%3eZ5r8|+7p4TOP#{#)iC{x<{U|LB(L<;$0^UcGw#`ZXpdCf47& z5h1OJKRXfe@bK{Q@rj6t$jC_P=xEs3nfdv-g+&C!C4{7;MWkiKWMsu<<;3OWCH_3} z@)Ca%1$hYwit>^Wl;kCq9P{3p~DB-Iop)s-aGl_fP)BsEnfHPt1xG$ggP zBz1Hob@e3m3?%i9Bn?d^jVz^1Y^BT`q%B=!tUY9GePrzeWF0_q4uNuxL2{14@=hTT z6r4kU5vJ%2AzaBhT-hZ8f{II|s%w;*Ym~Zcw5D5(mfKrx_qV$4vHBiyh92?8o(X1N z2^QY(tbN|w`6fE~y?6G1@8bX7E#RFy=$&WKJMZ9kz9H}Y!xBId3Bi#GVKMI_W8cNZ zzl;0pmg>LfmI@URjfjVBIhy#p0RmZb{9y+9?;Rin1O$YHgpgqZ>9U2i*Ft)0$;ima z$;l}wC@3i@si>%^si|pbXlQ9^>HgkJ%g6|6o&DK6%fiCK%F4>d#>URh&cVUK$;rvZ z#l_9d&BMdP%gf8h$H&jlFCZWwC@2U7{%o8T78Vu}5fK#?6%&Ir$Nub&{YPu;Z+)?H za&o`*#s1b5``4P|pVl0Z)kb}NZA(j2XJ=b~U-$6vz{L3Q)YRzg?8N;1wdV|IP>7vE+#AZ-1e?b(g(+08#-Zgcw= zJ9C>m^WT1BcVTOHacggBdv9rHe`WVzb?<2X;CS=sbnEzR7ZC+ej)WHxx6&C51@#|G zkH5ypUu*I|zb0>PZfb9D?eFg$A0M8b{kpt7yRosjwY9vvySlfxzQ4bIaIo>;#o^(` zAF+9O_;-#r4}Wn4`Hla^$>!0&aD1})&zx=^{|DcWPk#a#AALx8cX4ZfjgMcx3V-E~ z|2cbBv$HcxOADKuYy11#r>Faumq*vvC%3n!|258TZ~uV1yR$z85fN~UgeO^L_`40= zzmmsa$>Xo&@mKPYmi}w;@n;Gie=R+@=v@ab6c>)Qz!ISU%Q2%5M7 zP27Q|9ztfGLgrq==H9~QJ`hAKe1G95YT+kl=?_8NGC;x-BxwbbvI>;34wAJFma`5~ zunASN2~)NWQ?(1%u#3>LkJNRD(sztDc8W1`jy89Wws48Ibd9odjk0lzv~`cP_l$J( zigfmlaP^IF_mA)ji0}=H2ndM?3X2H+t04IQM?nx3;Dm^0i7*oXyWOk5>K}jAKmKX= z>i^w}`5)CkAbxWHSb>m{5t5S=ky8*+P!j)1C@G2mJXDm#5U43hXedc&DM{!kN$4p_ z7^p}X{{_g&e?Sj8rY2#eC1Ii`VP+&@VIg5-BVp$x;p8FV79imjCgm3=1ImzzD3Xh- zQb=e}NNG{Z=u*iUP|F)pE11wIn$akk(s6=u~VW(5u=psM<5C zIxwj@FsnJTs5!BzJF~01aB8@6Yq;@fy7Osz2x@r>X?uz4_(H8__`zaat zDI55z82YFh`KTLtYZ!ZLnRscNdFh&a>RWgkT6vh*c$nL|TROPgIJrBxxI6zPDfu5Q zDM1AYBH~dMNJalHgP;TG)Bq#^dZ-RS_)m4yD9dk3r{Ba*|2Y1qgWo^x_m}?N`G33{ zOCK9+EjxQYCs!g5Zx}zn4^YrqSja|H*j!x9Kt@tqURpy*R!v1-MNL6PO-@luT3%N| z#!ytsL|DR1P|TbcXvr^Z!Y^dV2h`&i)Z!OZdOH218EBv!G+YiEEeDO4gT9u7rprM~ z<)F=S&~7>CupD$+4!S4@U6+Gy%R%3N5_nf0c>9Z+^1!R|z>D(0v+|&$@}T{S;GK%# zt%{J%im>&H@YRaQrOKFvs<_#zcT?3#6Ez=3Kc^4X<@DDV^)yy=w$!z@HMjj&HCMCK zvx~EHD|7Sf^9!2`i(89JJ4=gu%S(qVD@SV^N9&u%8(Sxv+oxOmr`w08J13{RXD53X zC;L|?2iK<=SSBU$JbXU*Vm^vH^1=*n^%w>t$*3PI={R73B+&|9}%*DmDTkJ zhNCY+_vRbFA@oBGN2BnhY9P{0!)R!%Mwwx-_8?G;3YH<8E^wV&3rN#5|U}dasy`8A4Znd4HXYY^6WUHMI zmIcK-A8qURchVgDsdqoQ&RXrJd+z*ZIJ%n&f~VQb3c%?QWg(dP+q+T+@3b(`b5dGpfa`epaS zdsj98zIrj~^Fm7PQfmG3$A;CkrnU6uwTzav%+}@X_T}u3_3ZY|oQ`j~om+WbTZKJ4 zMSZ)){d*7!2lf+(Zo>MWK9hx z)&IB8`ooX=-@Fy%`Tz71$de&6H2LpmXhq@Buz#|I{?-{z@Y@V66~bX(r2C~NfB2Ur zH1%ibUzX5+o1uNsi4?Oyfw>6iM4BIgfhs`)IsY+3w`pgW##Owo|J@9&<8Jvi7yccC z*u>R7kl+tzX#J7KYJ&#xINWp{4X7^sR92hSk)M{(ncM)VC+;4^$s(0fh$VF0;T*&g z8jQNo34oG-!^k?EzUaj33`QZ8Z*4sP)^FvA7{u4KzcZ05lPTZUe0@0o*+vlE3*uym z#Q+xN0%oxY;q6V88jQEMJ=~rop#&1Hu{}N9T^_EDcXa%KIE~(A=)e#G^gUln8mcbie13nLww=!7T2c%GAL`tf^U ziXko(5Rs)3sW3$kx7s{~)wIg|t?)=^4yx}?6J@kltYHWO(?s#V&d}aS+kuGs)PP`^ zKBAH$oFFb?RMOZe8h~(-_CW}^kYim472S2Bq$JlK2wg$f-)Vu`2FA6m#L+#2s`%F# zn!YAYS<5Ua)0(;qWxZWdG=dTIJ*aFWDB8a9o4+ChfV7nt7C@9|Q(19Sa|fNtxHnwc zasSc$V;d}%?O7KhW!YIbD(BHz4~7I?b=!inRX*&>Jw-eUUJDZgA_Eh^VUWOegc*k1 z03C~U#@ztM za2vMMUcmyb->ipV+23tMP*&V+#&Dk8eT#o7a9ywF)6)H$CG;nUjBJebaEAN6ycGNU z{i4E(`-8HEljg(s2A`OPXr}ESjvIF?cu%ZPP99D>5f~rOda)cH&j%?hA1_7*#>!`2 z|^jgk5(a*hJud=!H9JNw!e^Ir&z*~glvQ= z4+1b|B?ovGouccS(4g#90IQydv4XbW-soWua6@0jN62oW*}!1IDE_bZ-U2AfzU})* zxdq#Hy)q(Pdc7Z6xdkXA%MKthr3&IOT93F%PS`+urecwhH*z0Y&U zJoA6wXV3Y}4!g6=FvA>kp1S zJ~ERU3+_{nHC8FIKCR%x_@_H9q*guQ`<{#O?zqF0IXvOGK8u(nNU{|9__t}xE7Mv{ zEh!G{2DDcBGScIU1p=YU4Q_{tJOXPsBzr?{$}g$U9j|8@mku%`(O~BDFpIusRUuZf zM3Ho363=n#$Hi>Ll7&~wqRU?l`9y}|DDf0ZDquyJXpCVi>~9E=^o@||KTHWyqZ4U* zGiXo^NevTcQjod`(PEHE0wm0Jq;iVVe)W+?+5h$sh>j}`TK7Vtl~7^si0$rtY2 zlB13uyp?(P$?U2FPDEeZ(_A7XDPgu-~E87*g)=QOmCHvBxMRD1ES%6im>C-G=h4EoHh zXkmTsL)4VG%5Ff8Jm9{62 zmhM<@UNN24J~4%t`=UQnxNApLS3k%}WcxvxdF;-s#_JVsk9$7kit=L7I^~BqMolb< zo;7fD>>1^&e*9FS-56h6;q~T)!p>M))8h441n*wR9%P=q6=8UVI?_LXime^zR>frf zKDKAFq7uR>exLtjdmgSs*bEBUbOEeVOy0a7W$T9n+JN^F-$np=2QNRlIn*3@tR;gY0Fh9gF8%IS+SRom_jwN zKUwQH%`66<5;yG(IoeM`*i8lMYG2&vO!yKJOMF)U0%xl`VZ8kXk^5U!+-2?AThFO6B-&O~CJ$$I%Fj3sLzj7ndw?~P~9m$!mdnUs9>CBwIbcx=`!!jP9i6V$lAOWY6Y2aKSrVNAz` z6$-2egm94qR{Oa=oq6Fbv7!AjO{uv@6^@RYqDQ;b)vFGXUor!4KNfDv-W*#HuTROo zu&!IU^49fmXLLwie~1Dz4flF5Y9I7PNn?-*`-{NCS&ZO0`+%-nj!?bea&O1XB1cQb zz?N|1dmH}SXKFKNkBLA^>E3d->7l!|p?3Y!xA>a zA~C`T(8J^n?PM{1l%Ot(_2GVL;m^F4E^8lrj11KvRaPgJzk1`4>>V-sBtlx((~MMq zcgpe*-QS+Yf5pbCmd}$R!k;ePA6Wr)Kp?Uc!%NjWVDL?Vl%1OllkHH6n}UAOvhA(}e-pL^fSWAf(FmkIx- z(rBMeudYWH_f-J#m5QQNuoAwSwLmwQ{rd@o!;qJ|*Gn=ML}c z6Uyx3_h4b0hCZK26E)BiPeJ$2d*tpx6H{vv#U>Iri(`yE{rWK>5G9C?4W!91@->M+ z{+8>rj>r^Y--m`#Z|(0kW2mwF&ikTp|qD z%Evc!cL+S_KxOU;;;LfmW&v%D?6wi59!Vqcxdv>86S4URJx0X67`zC_da%g`%*WU;hlTyn=c*7xoN z7()KY1kR$L86BUqm9gt%DqJrsYUrNNs-BsVSy`J|o?%#Vk!gJ^t6Dj-z$oiVAuGEG zQr{bYuofqXsfat1b+0gsS0KA1TB(4{@pD?_P2~rb6Okwls=W-!3N0J!N%v^A8dZ!-Tb__ zxxcsdolgg!0k$!*kY)hMIb`uYU_|t*i3p-P5SsI!HRrEhRn*i}H#OC_wKezjv<(b& z4h?mWjP(3_^p1@D38SOE{|Cm#`p3rxC&!1UCPtxVSvOyt=Tmwz#&ww7#*tvAMFjxw^Hr`e}Q8XJ=yDTI@N8osipcGUrz{SNO zA|e1xMW|^g=oxPRQ(D5mkR1LVstlwnGqe25&;uqXtZadp6u}3N1P$fo~expVhG6e+Klle+grRD6PHlZFxZoMgekKeiAA!A_~@@a@4+9eq9UUJX{T4bpB{mi<9xemXO%56gHU{dyxSi1cd<$V=r3aqCxOun$ z8H z6#Pm82AZY`Tgf&RSSxL}MN$4R+%u`wRk+QP8s_K0;b!QDNI~{#< zeG^k7Qxo8j{wu(V{l{fwWTJ0yPvfq&s)n<&3gC+PKvLm>kitU_1s`hp5E7-hTWV>< zcXMwUm)x?fAhNBdc6!6^(kOhtNy@oV(Vn95$E|a|+2}#h8pPcZDc&6q>QB2nmTxgz?y^whx%w_}r6+2AIAL!p{pv#w ze7*p_SOi}#`A#W(r3}9M0=`uV|6B_{dk??tgu?-SS~nct1Bds);UjQ33=W@z!x0Mkz+=1NFN zU;(8tuVR>Y5e!ghk^QXDs?2YX`dy)Q9lbTFs-XK94ehF|pp4q{-xXTQuZw?HXoX?_ z=QOmiqRKY#quUw-_3O)B5KGAfHQ%+>KB$t}&_KiTZMjYStFSi>uN}eu$5k@Sj+$HJ zl_Y!7s8I{IrmG%`W#9XH>in?uG0@p7Jt!dU*O=q7M z*WmY~b}HUp9BqD#e~{h$?jrv)eU~})_`9$9`-iFnHxirG;7I70i&_UnEZQLl=Ol!o zxPm=2nuaZ-A*i%2mEGbHaoQ0n6p_OYLXsi+WiT!T^emJ;zH~W;?a;FmEx|Lm`_{t| zYkHLDSRH88$Yo23@y9$!s}P}Q^#n;Ef~{rB1hxGe@h3j#v=nHQuREnqY@hwJ3Va_}(l5pcg+Q@zw)Ib1eXdN{(?BUkMl1^^ISgE*|t-}%t zn4ZJWa5(@CtykvpX5o|hcKei|A@@XL>eB;^1U<}&E-8r4EK5OBg6`JyG^QeBDR|j( z`0zIkExV-3JMwMyugBjsw0kM+6qS3%cPo3oIB}TwGBxd(4bpurHyhCXrlIBIzi&3< z<-A+x|$pO*A=Ghh-=FCS?aM%ca`^ zD#Z+sbxb6#cxy4BJ;=sGInoJu`3`f*|3D+l)J+A$&&5NDGu)l0-hSk)EC%NJ|S#(x*9yJj=n^aBiS-t#BB}*t#O-yLcURPUjd{7IotsRLMoTPXi zSUdcno0AU(UudAZ-x|l$tu30r(x)l-Z*ja+Mq;+uZO9>Q#ft}x*C*GR&Lns@Z&}_> z<$gkWCGv@=4DYLP^>D8KZr#%e|2^B?p|6I`+q!!VHd3vg?=I+uI=9~2b2MtU7jWWl z58Qn!(lKBle^uAIVRLc(M3)*4`k?tiLjCLMS8mZe{40IbSp3$3>$nVq(gy=dSH2S^ zgf2X71;XTGR(9n_gN4@AI5Rye>yqaongKJ`(ieN_5(b{McEoWrea&?OSP8=c!~MNe zt5eNq83SSX96hKg^-&>l&mwZN3^B0yT5ZX+nCOX&u&BUoArqBRa8x5h9CKj^-q1)C zb->hh>*V&N*0@L6C{`P0XVPI%o-l9|4chf(k-Z3fW_6n`7S!d$cA)gx0 z%26L=BN&pkgF@KMt6*~%GsCpf?(+SrM1u=@niq6EG8#pY$inn40xV*AzA@GW8|A~H zTlFnhsQ%s2t19!I%3DS1EKq?2CcS0l4ck5cL`p{Gu?_BER!yrMcG!vyQ%e*XZUW}P z0>_0x2diy?9r$4$mq^L`p}kX` zL&H)L62YcsMG_6uMDF8H6m(pksgBgN9vXGV6F0Qj=suiNhln`lu!h4q!=bGWj3Th*5aK1fk zoJWeu`=D&#fg+DnpAG#6@+Oa~({VhZKRp*on$&ZTC-m$1ly4;~s@`ibgI$brDgy z)wqIGh-KaD#~)oj(QVwY+u@-oH(hAFO))bQT}Nj{4`)G9CsjuaB5-jk$ac*-Gmb%p z(3IR?zCZ3&HE>w*ri$LtZKr+9t&4#h410-(t}XMiI9XC%+okX zcyI_*6v?5qX*n+H4ZVwNwI{7Otc+|V97ece+|N;$Y@P10z7Aa+&JJJv1b6M#$n_OY z_wO-A|LEO1dmE2-ZQBG#8ACIwdbbn3w;0Eovd+`yj79{V^^!bBl!ipU2iccaH$GsV zg8m{5ZLmw_p4eh~C0CcsJDT|S?lxfzGd5GH?C|vQM#7g&14Pf-j53nIT^#&JSbDdz zQ}{#saJ(B@Msv1vMf%O8UT3tZk_kL3`?{e(Q8${P!BI#*2$QoeY?Uc?19QIpIDlQt zL|K<&&U=WNq4sGvWrYe0j|4Ey6++pV1+^gQ>=ZJvum&9k22mRUzc&!W-gutdknT) zG!M_EXey!}a0XBoy4iN2tbYnYd7JqZy`meAb6fX(#wVoch{Ym}WsOd5#)?p0NT}a? z9okiF+2W@*pSQVwVgVm> zta*7zH4yaRYDhTDJa=c>7QW6hbs0kvZdHO&?f#S^XBXMXf0m7V&mCHaLZKxJvvKB2 z4hsci_VN+SgjA+KZ{ShYHJo|AW>+P7VjRexg|V%68t$$~9lluuEI3_L!c{-I|GxbV z_`#*SmJ8t`oMP|flV&wj$51ExE4M1R-&D)-n<>HkCV9-KIbTDmCumYY8q=?h-rc_M zlzuNucJ9^J1ZnCcT%@Zvu|o>BH^Si$k11mm9r1XBQ86v!AE9E`2jjwm@y>(sNka&P zLx>DRh<$*pr4aJ^5K36c?eh>CFg}fND1%`rlTRoMG?cAAl*9p_b3c@aG>lI;Ou#Tq z&?ih78YWsFCJqaeJP(s54VM)Tmp2UO1>q|~!&U0T)nMTo=iyqU5rW`w9m5EHp9n)} zgt0?}ZheH=IS?5hX~hz8PdL)fC(;2L>0lV?1dDV%k92bgcOi}PG>r0chMY?VJbEY{keAMh}8qPew}83_&Ls!6S)IQcptHg5eiXLfeBdv_}})BMj{kNe_sm2Sm~XA_4^wf$|@T zK#4$z-VoV9|8_P|Yiny~XGdQjp#A|Iy+;9++sBX7i;FWWD|74XfJHH&bpu?A|1G)O zubQ@BOo(^3mv;enR`zyQKJTvX|Jz{VB6S0@p3hHZ!hTPB0H(8u0zv5Be%8JHsTEjV zU0qXCV@peOM@L&vPbc7RKQz=gHujslJz#A=@sHN_|NJLYfb;inUiR}JrvMh_rxxd@ zmgc9I7rwEw09##ztu4aV7iZR&W;T{)HkW3%mS;cxcUYPI^oD>F44Gd1w~kAqZ3CR#w*Lr+V6n~absRKI3}iI4YuM=5 zP_d9P@Q`tCBI6OG5i;Fk;HBdgW)c$P6q68;kP?-W`iI#m5Xm4fC$FRkQd810RMm6P zF!Ru~2+}f-($+}Q6;HJiPIi(CjNvtU!Nvy!%>51!GY7o=HE-_s&wu{T&tLfMoBy*v z{FaFK`=9zJe*jmz5J#;vdzm6@o*GlC9z&cdU4#`)u>I`-CyGaIBo91E>|<`(BoSGs z6WQdF*%eSZmeD#_GPpLdKWO9j=;rep5b_%p51f(=g2_CdRS22W2%pr89yLuIGfSSZ zO#5J)wdU}2+okyU{`1oZ6{qf1CmywD-c9HJEf=9(Ut} z6JIh053@SAp1y?@)%KLXYN&o*R$rX;t{}0cAhI*xrzh8~Khu6N-Fo0FlCe2&>-p7~0FrVSN2C$j>oTEPTqK&z4O25iu^hVxg1ZwoXWU@ zWnIl=UCrjeKjgya^57ry;Pd(L`DgHj0{Bufe5Dk=_5!|H0pG5M@6^EeYT=*Xzz-YY z$IbBb4)~Wo_}5|h*J=3W2l(au)#dWl<=W*XFdg3hJ|I50yga_TI={O53WtBojQi~Z z-T)r~6XEUeL*+#{eEz#v3Sfx>0L+^K>l9#0`|+=*v^R2lAiqy(8QO^`{->t2rPso? zvDu4#>n)Z$A?AWi=fc&tsVNxx%>za@b|G0}v3ut;>YJmb>~(H;%Tl+AOYZhZ_Jq>V z8CKbEn;AAGZR^*2<9PSTh85$vx^CPaGNr+huYed}&%gC+oqcKYvc6{S%ih?>ckp3! z?s>6`!{2-~_E-9!YQAs2`YL9Q1#MZl88pESs_cE7{;p*K6`6oEBP70lDHJu61v4Wg zbrT~$Ja()5DJ`iycqxh|l4Tjpkmj%)%~A|ZX*ujX)v=2hh=#DQNRO@JaNijgsPpf^ ztdxZMKn3wUf`u#U5^$JK@-3>~6^IIxz;G-R6n{nhXjNwo>&nK+menwlteAp-Oox%# z(8;k#nt#?~T^!AQD-vp$Jl+=aWWbu4@huH(I5$vbelvYN zPDR{{KHD#PdwON#loFInDBgnHVsb(qkOxtp@N9F`pfdW$@D?K)}c6QaNF?)`39~&ImN9vTmn$;&-_6SQ@3)f@+SqrYSUQ*1Zu+I{_Pix%!c0lPD=Qe^tca`b z+a*_X^e@B9jwx!`%i=E=&-(hR`I>i`_4Bm8GPm&p*#KVnI5MaDNS$93?FlNy-Q7Bh zHv`FnlO`MSrPHkbf$Rx8gDC@PFV~xFrPA~-7|W05Vnkl$nqUdECS@*mvCGYW6v~H| zzO8`<-RRgtt$Ioa!I_|AXzb@P*YKTUAPn%|+f|(3d#>`+x7FVIj-+vyX->=Ist77PWkAgTMCC(29VgUF73Ofja2O55OR`X9VV? z9gN?7G@cQaoOdwk9K;w706rS^^6VZ5u@<-mr0tuXyqO1a4r(hm`b)b68xP_i*w9mM z06rR4+6i6*1-H+H<;4#V5`%FWaIaW;WXY2g!^I2fNVdA<`3{pHs0H-jd^A+tlhXzY znc~5{>VAhQqB{&MO3HmQ1cgsZ)rzhwl=bNcC8t)z6){?}_8Utkr_~J<(YlxQo57RP zn{kV&LRbf^x(=RnsTI>jmkrp(BxMZ6trO?74m#;1Wljy)-AXDObS=J_HIK`Dvz2wo z;}nv;uEvZvS~lc01j*TpE5TV}9ri1R|W>Ny=0Q7Cm)Q~smUOI=fKDReALRLrl9qb1?0~B^_khB09M{vEsW z(evq)!`fGDSL_xhY_QfgfnczDxfMx2tV{H?3KCy#!>l^fXM9=>9W1vK>Yo|%JAIw^ zG8T!P20|D<#a5D+ilgQ~Tb74}=Bg!$D(p0FT$Y!2?Ya-DpuU#L2QMr#GK>2U@(+!* zKqz(Xfql-}Ekz^@)2weg?=x2Bhi(X>p@}u#@_3n*5{&fwmJMQS8FAY9FHakYs9r>d zH6p_rkzxHk+&vD_z(q80|J4R=b8~ZBTWen*u(&xmISKS_Cw}y8mzO^P>2hmp-`14> zDqwE=)6zf1&ZnjCEbo5$3x2e8|M^#-1-!Sj3It_s{V^yD@i>KeoI*TKee-zzg9!}c zu7N0we=Ll;x>_J+w4%+gFGG6g z=O%x!FgFRX_?@M>$>q7JKjGul@;}egw_llFo`8?mcMa_%ksa6#T_mH z^E+H-cew7|;WD|yWpsy2Pmo(%h(}eJPhLz=T2e$>T3l96T0uchSy@R-8ufF50Hzne-9Z3n3#!{>fVl+?EhQZt6+QiJdIoBSzYfj%Egb86@D(sq zr)6WNWoM@4V5a3{rsZa)S zTp$SF3xw|l!uR5rGsqtf=ZLNq;&A?thjSpry0WtJ-#4P{?(XjC>FMq5{lCCW3{e;e z>te*A{7(+$KNkij5(h5el$3F;HkK5alL)C>#%8gg(0S~tu zH-{Ss`vW#MCl*#KdS*QuCQT|v6)Hw0Dn?l1ar4s7Zk{J~=r#DH#PZF%==v?VAKtw{B69l2K7m-o8yu4G4b$6TUz2 z%}@z&<^y1&<7A{0V4{^^qLF8&QDvo7=VZ|0XVn(t(v%fcQxsKE5?4`@Q2ve@NKzLh zsi!QVt0JzaC9ZEEp=TeweLU|Op?ZLU}imN<3h z1P$h79gcLPJ2}>hd5#*-TyzWW>wm*lztB~`=z(6TyWR^A-3m|5T5pA>0Oj^jP#;)% zC|+$8qB)XmG?ZdBnCje?`1oyXd>uHeISXE(gYhLh3R`5sYd9}WqGrw79`LgDEV@c8)4;DQV9nzILO#}0!Bwxj#jV>^~(>*ixi zrehzB$48Au`}BuX(k|6$kfe z@YOc>W;=YV6aKm9YQOL5aOiS>;>+iy^Zo6!(_=8?(U6 z<>lr1<=3OjuX~qYH?A(0u1;ZB$K&vWVfbbTe6<1ou@XL23?I#f52eEgQsMo{@ZLmt zZ!)04z4_M~Tz;o;uw1MXCuOqFjt6?YvH;^Sjr21{Rbp;&!M^O@oRSsh zC3wh)M$iim<+=AI9&3HWM<=^EuddaiiXU^7&54ni*UCuItR*qWNnsYAQ3ZVwiOLH& zo;jNf{Td&Yg0_8K7Q%swUT=zWhUAdvjn4+94m%O)nE>BhW(Z+XEwoyaCa|~*jtoM( z+aIrmNfgIdH&GpX19Jzqk|;B8sG87uK8Au!GN98b(>Y=p%PqL>K%amKYU$?@l4ON& zq+@na1zc|6oTtt(L=smt~_9{5PDXvwD8t( zd86-zGJca*OU31di_8Eq5vL6AkRhkpx>M$TnYlLTr{e491lO8Y(qbJ;$x>9Ro1S;6 z@_2F|#jL+#cuscIay({?!M?|uJrW~FW5JOZiA}^SL)c#bsnh!o#EFN3aN?j;laS1Y zuO!XIwN%3%`=n8tPR^#&%B~fedSvaB8QYg z>YR5p2YKfVr5p_Sc#jBb`Z0mek&vd16t_`XmZtob3|O!mS#0*<=c~)<5Sjsz;-m2V zi{u#=He?At9Zt|2$O+Y|IGP{zWu4M{bVUp?U74=^^J!vA!@tY2qt>OlG;|AHf$oR1 zpkBlLS%cdn(>DTS*{$YbDq)6Ee$TSQeTE<9BS%4S0H(ExBABU4aIegZ0>uFuTu>(~ zc~y)K(URzxJD!vH&F>oA?)p~tWL_}#+_K1kHlAa^L7ZD$0p&x7E|K~DKqnh|k)CVu zLbKmAxT|Q}EIlOEG>L1l72&P}Tw)?XgG)(IOOGW>>^4d{4x`5rY*1DKG`RBF3@k!D zp?5UG(4M-{5h?Zd=?`f=si>jB;koG8xx<%MKd^>jNv2AiT^+^Y(8c{odBAEpIK5(y zfyi=E)n0fEI^xO57u}0&FTav8Ih)yeadR8Ch z?4v#tTTveNYjXoMxC14U&cYdiUyhz~budd~kZXnz9Or!!V38#u*NEUd&hPSMk!Oxk zjn+ASR#3yDC`7It?{QoZa?Ao!VpB>=J}yk&VOBAiRY|EnF4Fd7RkLT4&lo!{_S9w7 z@HW=TIXo_5O~uuUVpGf_I4Qj>%+pElnN>(=xpH*HMjkOXf z7K3kvOpF$t&aCH#l{kc|z5bdlD~f`ospZ#X7>#^TRro^=2pI`#7oiuQT)0{|76z?EE!-W z`ren;PXkQ(wn|>TKH~;DR*f`~L^yg}`w)8?nwS7D#E3(iKn*<>!klbNzv4?{gx*cC zax*%VC6h)&I+8#+a1$I%N_H6R8CLanO>$avG+gl^E%Ln$8Fua45qXM?eR;S6`?Q_( z(n#oYE?^>j>}&e_*Wx&Xk#LVJPz)emaqQxDc=AXT;gv{W`nYTOM~ky2q;1Jklr>n1 zCNs7pM^N68RZM@1xrtowcXyFOq;O^zCedFvuTd=p$r%$L`go?Nb3{BKMD9V$Zx_aw zNK=0}+h*G%7xg;8KDPVope^{c1}-(fLnLiVL-4qxSgzcablhY?K2NBWTKakf33SST z{o&BX<(9(Ve92B1PqI#MkBzkG(7HFfNzeffxAJ>H8ZK8 zt@qB*owF9j1wy(!F!}hyQm|XdzPtJyu*Y>Zg|SS5K|1$k}A5n z9|VN2Uj7XqOhIH0KeCV}kEVHSxsML3L|qjMLUjnfV#fL#NpOsP5H4o$d3sPPM#y!C zpeJ>>hrzxW`9Z4TSYNv_i7|s|!6BG=A(W({XqKVgqgEI_$lQ+S}rH`|r z;HSd))r+A*(6E&#B+HgCnbMdt5WWOylpom6o-`)VJD9KjM!YcUYb3wK`p}J=^x+Uk z{Co>Da9G881o~2x2S!*1)Y-%Sv1J}QY#(z~DL9G-@NjYofS^BvdCzUe#|6jd2}i*& zqb^Hgsx58=jD&6XV63u4ZGgiLN<&v!@K;$9Q1WqCTk!NYqoE|BXPA(S^XMEf(gpN7 z#0`RcfQ0QEL$nlD4h!pbz{ensT4ITr*@QqKaVy^FZTg|gQHd}&OcY+!G;pGQH(p^^ z0LDSstu1)cD=dS6c@DBrE=;NX`IjcHc}^(J7zi%tCJvu9`SiUPVS64XmdS>41Nc_@hs6<9)Tp9kc zQEsF1Q~psjhDQB+_~x$e&rZ-t8J<6LTzhtv`izCml*iBZzIFi@mZ>REflE~ZJDaIw zrn&3QLS8mvgn1Rhyb57ng)px|m{%dps}SZ@2=gk0lH^}glKedO02Cx+h}|c|?$bZB z`_$Oj*xU>R2(@%}w)gaO_4oG-4)%?V42+EpO#tC>(}22tYJPs^`})(z_4S2~jm6E) zrSHyFza%aG!G`Ml+m-F@-`Uv#A{YMzz^ZC@_h(jjcYk4Tcl8H=k=3uP?eG4PgWa{i z0uv9ZgjZFG=i~cObSyp`%-;Jr%+eC<2g^${04qx~tIIQM%d-IM%d;CR-`M=dhb@5B51;;m?bQzem^YB3 zt^*~K(;T`5ze!1q|4WT9{}0|qfMpOMzmb)dnS%pJlj8u=NGmJ<9V#l)KTuPX)zFaF)Kt*XR=Rsv zSx-;Zz(C!|P{Y_*%hW{s-o3l#X1W#@`c{?(Hr7UVwk8ht_Z%I}{u7uxI+!~-nmd2z zzN5LTlewFd`9o)OFBfy)`{n_z<{=Nv!`;lI+|6S>%o87)Lp;rsJk66InLl}Cp8Ci< z&C3GnZI$U`ljUod{a~OyEquY zr#RTRB*d>I#J?mIAfO~Hup}&~B>ZtnL~wCrXmM0{adc#H47fNhwm2cKI5ECBDX};? zspLsYNm^=22DBtAvotrSG(WGbu;6(~$%_{+%FE0D)Z*=bh3NuNBbSD9Zi9KD&P+Ei zZ~j^%j6c-~K0Xd1;dNr-8>FN+$;b#OCsIMP@B$Yvu zDj-Q!kffTjq=vGjwu+>#s-%IMq=~wug@&Z9mZX!mq^pjkhpwczo}{n7q@TWIfPrM7 zfn<=OWU!%Bh>=vNk#wlBbcBgql&NC$J>^(4)i`tYcni%03++TpokUArh?QQFl|hoV zVY0PRvb9OFjcJO_y%bxs6kGEYJBt)M%M^R76npCw2b*L^+hj+(WG9CtXQ!n5E)Z82 z$b-_kH z4GlRxJtZUKZ6+pa78V*-R$4YTI(Bw?4h|sUodJN0>t`6bxc&}qZpJ^r%gfBq&nhU$ zAtJ&pAD>kC-vt@!f{b-R zrg|WAeUOy_$j%VtYy@&O26>o(yi7rUW}wIBpkQ-Qs0Ap@0u*5hinLUYvQh?HDMwqY z#M-FE+iE7-X+!LFlO6O^91Wj18mBs$q&eM7b2dwNHcxl4gt}NkU92Kt0`|UJui~AEo0jo*EUI8XcV)7nhotn3|l7Xi)9!?Cky<4Jrd@o-71AD^&LjzQAuyT*SQm ze_MkJ*qkjb1!fx0D=NyXs$SL9RMpkJuCK3YYI@V$+|b(E)ZYHCv-5pdS4&S1VENY8 z-`_Df*f})RH9QO$g7%D#eq(H`_Xp$Sz&!AGCMNoSFgZE!gQ+PX@8(}&dV25=z@`TQ zW~PS#W~YZfz=q~vL-Vkqg_+^Snc*dX*^%Yhk(FZ1uy>jIVw8&fLV>+{8M- z$I11NQycTsn+q^t80bFpMRDJxDRklVX3edinz)F8IpP894-Z&~f%z{3bNDTFOB-7n XZ%0oDn!DB>wzjUi50o73ki`B!1ljPg literal 0 HcmV?d00001 diff --git a/source/extensibility/images/completions_hint.png b/source/extensibility/images/completions_hint.png new file mode 100644 index 0000000000000000000000000000000000000000..e7029e5d82c13f556bbf163da2d3c2000c498ba0 GIT binary patch literal 28273 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 a9de-DdxG{2`V9U+r=wx0UZHyb>Hh** 下。 +宏的按键绑定 +************* +通过将宏文件路径传递给 *run_macro_file* 命令,可以将宏文件绑定到组合键,如下所示:: +{"keys": ["super+alt+l"], "command": "run_macro_file", "args": {"file": "res://Packages/User/Example.sublime-macro"}} \ No newline at end of file diff --git a/source/extensibility/plugins.rst b/source/extensibility/plugins.rst index e1c6c0c..2b267a3 100644 --- a/source/extensibility/plugins.rst +++ b/source/extensibility/plugins.rst @@ -3,7 +3,6 @@ ======= .. seealso:: -更多信息请参考: :doc:`API参考文档 <../reference/api>` 有关Python API的更详细的信息。 @@ -11,52 +10,47 @@ :doc:`插件参考文档 <../reference/api>` 有关插件的更详细的信息。 +本节适用于具有编程技能的用户。 -Sublime Text 2可以使用Python脚本进行编程。插件可以重用已有的命令或者新建新的特性。 -插件是指逻辑上的,而不是屋里存在的。 +Sublime Text可以通过Python插件扩展。插件通过重用现有命令或创建新命令来构建功能。插件是一个逻辑实体,而不是物理实体。 -预备知识 +先决条件 ************* - -要写一个插件,你必须要会用 Python_ 编程。 +为了编写插件,您必须能够使用 Python_ 编程。在撰写本文时,Sublime Text使用Python 3。 .. _Python: http://www.python.org -插件放到哪里 +存储插件的位置 ********************** +Sublime Text会在以下目录中寻找可用的插件: -Sublime Text 2会在以下目录中寻找可用的插件: - +* ``Installed Packages`` (只有 *.sublime-package* 文件) * ``Packages`` * ``Packages//`` -* ``Packages/<包名称>`` 所以,存放在 ``Packages`` 更深层次的目录结构中的插件不会被加载。 -让插件都存放在 ``Packages`` 会有些让人失望,因为Sublime Text会在加载插件之前 -通过预先设定的方式排序包组。因此,如果你的插件在一个包的外面,可能会有意想不到的结果。 +不鼓励将插件直接保存在 ``Packages`` 下。Sublime Text在加载包之前以预定义的方式对包进行排序,因此如果您直接在 ``Packages`` 下保存插件文件,则可能会产生令人困惑的结果。 -编写第一个插件 +你的第一个插件 ***************** - -下面,我们给Sublime Text 2写一个"Hello, World!"插件吧: +让我们给Sublime Text写一个"Hello, World!"插件吧: #. 选择目录 **Tools | New Plugin…** 。 #. 保存到 ``Packages/User/hello_world.py`` 。 -你现在完成了你的第一个插件,下面将其投入使用: +你刚刚编写了第一个插件!我们来使用它: #. 新建一个缓冲区(``Ctrl+n``)。 -#. 打开python命令行(``Ctrl+```)。 +#. 打开Python控制台(``Ctrl+```)。 #. 输入:``view.run_command("example")``,然后按下回车。 -你会看到你的新缓冲区内显示"Hello, World!"。 +你应该会在新创建的缓冲区内看到文本"Hello, World!"。 分析你的第一个插件 *************************** - -前面我们编写插件大致如此: +前面我们编写插件大致如此:: import sublime, sublime_plugin @@ -65,112 +59,105 @@ Sublime Text 2会在以下目录中寻找可用的插件: self.view.insert(edit, 0, "Hello, World!") -``sublime`` 和 ``sublime_plugin`` 是Sublime Text 2提供的。 +``sublime`` 和 ``sublime_plugin`` 模块都是由Sublime Text提供的;它们不是Python标准库的一部分。 + +正如我们前面提到的,插件重用或创建 *命令* 。命令是Sublime Text中必不可少的构建块。它们只是Python类,可以通过类似的方式从不同的Sublime Text工具调用,如插件API,菜单文件,宏等。 新命令继承定义在 ``sublime_plugin`` 的 ``*Command`` 类(后面会进行详细的描述)。 -剩下的代码是来自于 ``TextCommand`` 的细节以及我们后面要讨论的API。 +我们示例中的其余代码涉及 ``TextCommand`` 或API的详细信息。我们将在后面的章节中讨论这些主题。 -在向下继续之前,嗯。。我们会看到如何调用新命令:首先,我们打开python命令行,然后 -调用 ``view.run_command()`` 。这样使用插件显然是很不方便的,但是在开发阶段还是比较 -有用的。目前为止,你要记住,自定义的命令可以通过按键绑定或者其他方式使用,就像其 -他命令一样。 +然而,在继续之前,我们将看看我们如何调用新命令:首先我们打开Python控制台,然后我们发出了对 ``view.run_command()`` 的调用。这是一种调用命令的相当不方便的方法,但是当你处于插件的开发阶段时它通常很有用。现在,请记住,你可以通过键绑定和其他方式访问你的命令,就像其他命令一样。 -命令名称的命名规则 +命令名称约定 ----------------------------- - 你可能已经注意到了我们的命令是以 ``ExampleCommand`` 命名的,但是我们向API传入的参数却是 -``example`` 。Sublime Text 2是通过截断 ``Command`` 的后缀,在 ``CamelCasedPhrases`` 中加入 +``example`` 。Sublime Text是通过截断 ``Command`` 的后缀,在 ``CamelCasedPhrases`` 中加入 下弧线的方式,比如 ``camel_cased_phrases`` ,来统一命令名称的。 -新的命令必须要按照上面的方式命名类的名称。 +新命令应遵循相同的命名模式。 命令类型 ***************** - 你可以新建以下类型的命令: -* 应用程序命令(``ApplicationCommand``) -* 窗口命令(``WindowCommand``) -* 文本命令(``TextCommand``) +* 窗口命令(``sublime_plugin.WindowCommand``) +* 文本命令(``sublime_plugin.TextCommand``) 当你编写插件时,请根据你的目的选择合适的命令类型。 -命令之间的共享特性 +命令之间的共同特征 ------------------------- - 所有的命令都必须实现一个 ``.run()`` 方法才能运行。另外,所有命令都可以接受任意长度的 关键字参数。 -应用程序命令 --------------------- - -应用程序命令继承于 ``sublime_plugin.ApplicationCommand`` ,可以通过 ``sublime.run_command()`` 执行。 +注意:命令的参数必须是有效的JSON值,因为ST内部如何序列化它们。 窗口命令 --------------- - -串口命令是在窗口级生效的。这并不意味着你不能通过窗口命令控制视图,但是这也并不 -是不需要你开启一些视图来让窗口命令生效。比如,内置命令 ``new_file`` 是一个 -``窗口命令`` ,然而没有视图一样可以生效。因为此时要求打开一个视图并没有意义。 +窗口命令是在窗口级生效的。这并不意味着你不能通过窗口命令控制视图,但是这也并不是不需要你开启一些视图来让窗口命令生效。比如,内置命令 ``new_file`` 是一个 ``WindowCommand`` ,然而没有视图一样可以生效。因为此时要求打开一个视图并没有意义。 窗口命令实例有一个 ``.window`` 属性,指向创建它们的那个窗口实例。 窗口命令的 ``.run()`` 方法不需要传入参数。 +窗口命令能够将文本命令路由到其窗口的活动视图。 + 文本命令 ------------- +文本命令是在视图级生效的,并且需要存在一个视图使之生效。 -文本命令是在缓冲区级生效的,并且需要存在一个缓冲区使之生效。 - -视图命令实例有一个 ``.view`` 属性,指向创建它们的那个窗口实例。 +文本命令实例有一个 ``.view`` 属性,指向创建它们的那个视图实例。 -窗口命令的 ``.run()`` 方法需要一个 ``edit`` 实例作为第一个入参。 +文本命令的 ``.run()`` 方法需要一个 ``edit`` 实例作为第一个参数。 文本命令和 ``edit`` 对象 ------------------------------------- +编辑 ``edit`` 对象组修改视图,以便撤销和宏命令是以合理的方式运行。 -编辑 ``edit`` 对象组修改视图,以便撤销和宏命令是以合理的方式运行。你有责任新建和 -关闭edit对象。为此,你需要调用 ``view.begin_edit()`` 和 ``edit.end_edit()``。 -文本命令为了方便,在其 ``run`` 方法中获取传入的 ``edit`` 对象。另外,许多 ``View`` -方法都需要一个edit对象。 +注意:你有责任新建和关闭edit对象。为此,你需要调用 ``view.begin_edit()`` 和 ``edit.end_edit()``。文本命令为了方便,在其 ``run`` 方法中获取传入的 ``edit`` 对象。另外,许多 ``View``方法都需要一个edit对象。 事件响应 -------------------- - 任何继承自 ``EventListener`` 的命令都可以响应事件。 -其他插件的例子:添加补全列表 +另一个插件示例:添加补全列表 ---------------------------------------------------- - -接下来,我们做一个从Google自动完成服务获取数据的插件,然后添加到Sublime Text 2 -的补全列表。请注意对于将其作为一个插件,这并不是什么好主意。 +接下来,我们做一个从Google自动填充服务获取数据的插件,然后添加到Sublime Text的补全列表。请注意对于将其作为一个插件,这并不是什么好主意。 :: import sublime, sublime_plugin from xml.etree import ElementTree as ET - from urllib import urlopen + import urllib GOOGLE_AC = r"http://google.com/complete/search?output=toolbar&q=%s" class GoogleAutocomplete(sublime_plugin.EventListener): def on_query_completions(self, view, prefix, locations): elements = ET.parse( - urlopen(GOOGLE_AC % prefix) - ).getroot().findall("./CompleteSuggestion/suggestion") + urllib.request.urlopen(GOOGLE_AC % prefix) + ).getroot().findall("./CompleteSuggestion/suggestion") sugs = [(x.attrib["data"],) * 2 for x in elements] return sugs .. note:: - 确保你在这次尝试以后,不要保留这个插件,否则会干扰Google的自动完成系统的。 + 确保你在这次尝试以后,不要保留这个插件,否则会干扰自动补全系统。 + +.. seealso:: + + .. py:currentmodule:: sublime_plugin + + :py:meth:`EventListener.on_query_completions` + 有关此示例中使用的API事件的文档。 学习API **************** +API参考文献记录在 `www.sublimetext.com/docs/3/api_reference.html `_ 上。 + +要熟悉Sublime Text API和可用命令,阅读现有代码并从中学习可能会有所帮助。 -为了编写插件,你需要熟悉Sublime Text API和内置命令。在写这篇文档时,这些文档还是 -比较匮乏的,但是你还是可以从现有的代码中学习的。尤其是在 ``Packages/Default`` 文 -件中包含了许多非正式的例子和API调用。 +特别是,``Packages/Default`` 包含许多未记录的命令和API调用的示例。请注意,如果要查看其中的代码,首先必须将其内容提取到文件夹中 - `PackageResourceViewer `_ 对此有所帮助。 \ No newline at end of file diff --git a/source/extensibility/snippets.rst b/source/extensibility/snippets.rst index e6d62f3..18cbbb4 100644 --- a/source/extensibility/snippets.rst +++ b/source/extensibility/snippets.rst @@ -1,21 +1,15 @@ ======== 代码片段 ======== +无论您是在敲代码或撰写下一个吸血鬼畅销书,您都可能需要一次又一次地使用某些短文本片段。使用代码片段(Snippets)来节省自己繁琐的打字。代码片段是智能模板,可以为您插入文本并使其适应其上下文。 -无论你是在敲代码还是撰写你的大作,你都会一遍一遍地写到一些小的重复片段。使用代码片段 -保存这些冗长的部分。是一种很聪明的模板,它会根据你输入的上下文帮助你添加文本。 +要创建新代码片段,请选择 **Tools | New Snippet…** 。Sublime Text将为您呈现框架。 -要新建一个代码片段,选择目录 **Tools | New Snippet…**。Sublime Text会介绍给你一个 -框架来新建一个代码片段。 - -代码片段可以存储在任何一个包文件下,为了在你学习时方便,你可以将其保存在你的 -目录 ``Packages/User`` 下。 +代码片段可以存储在任何一个包文件下,为了在你学习时方便,你可以将其保存在你的 ``Packages/User`` 文件夹下。 代码片段文件格式 ******************** - -代码片段一般保存在Sublime Text的包里。这里使用了扩展 ``sublime-snippet`` 简化XML的 -文件。比如,你可以在包 ``Email`` 里保存 ``greeting.sublime-snippet`` 。 +代码片段通常存在于Sublime Text包中。它们是带有 ``.sublime-snippet`` 扩展名的简化XML文件。例如,您可以在 ``Email`` 包中包含 ``greeting.sublime-snippet`` 。 典型的代码片段的结构如下(包括Sublime Text为方便你使用添加的默认提示): @@ -31,39 +25,32 @@ My Fancy Snippet -元素 ``snippet`` 包括Sublime Text需要的所有信息,以获取需要添加什么,是否添加以及 -什么情况下。接下来我们看一下每一个部分。 +``snippet`` 元素包含Sublime Text需要的所有信息,以便知道要插入什么,是否插入以及何时插入。让我们依次看看这些部分。 ``content`` - 实际的代码片段。代码片段可以包括从最简单到相当复杂的模板。接下来,我们会看到 - 它们的例子。 + 实际的代码片段。代码片段可以包括从最简单到相当复杂的模板。接下来,我们会看到它们的例子。 在编写你自己的代码片段时,你要记住以下内容: - - 如果你想输入 ``$`` ,你需要按照方式如下转义:``\$``。 - - - 如果代码片段包括缩进,一般使用tab。选项 ``translateTabsToSpaces`` 为 ``true`` 时, - 代码片段添加的tab会自动转换成空格。 - - 标签 ``content`` 必须包含在块 ```` 中。如果不这么写,代码片段 - 可不好用哦~ + - 如果你想输入 ``$`` ,你需要按照这样转义:``\$``。 + - 如果代码片段包括缩进,一般使用tab。选项 ``translateTabsToSpaces`` 为 ``true`` 时,代码片段添加的tab会自动转换成空格。 + - ``content`` 必须包含在块 ```` 中。如果不这么写,代码片段将不起作用。 + - 您的代码片段的 ``content`` 不得包含 ``]]>`` ,因为此字符串会过早地关闭 ```` 部分,从而导致XML错误。要解决这个陷阱,可以在字符串中插入一个未定义的变量,像这样: ``]]$NOT_DEFINED>`` 。这个修改过的字符串通过XML解析器而不关闭内容元素的 ```` 部分,但Sublime Text会在将代码片段插入文件之前用空字符串替换 ``$NOT_DEFINED`` 。 换句话说,当您触发代码片段时,您的代码片段文件 ``content`` 中的 ``]]$NOT_DEFINED>`` 将被写为 ``]]>`` 。 ``tabTrigger`` - 定义你在需要添加代码片段时按下的按键序列。在你按下按键序列后,再按下键盘上的 `Tab` 键,代码片段才会生效。 + 定义你在需要添加代码片段时按下的按键序列。在你按下按键序列后,再按下键盘上的 ``Tab`` 键,代码片段才会生效。 tab触发器是一个隐式的按键绑定。 ``scope`` - 作用域选择子决定了代码片段在哪个范围内生效。 - 详情请看 :ref:`scopes-and-scope-selectors` 。 + 范围选择器决定了代码片段在哪个范围内生效。详情请看 :ref:`scopes-and-scope-selectors` 。 ``description`` - 在代码片段目录显示代码片段时使用。如果没显示,Sublime Text默认使用代码片段名。 + 在代码片段菜单显示代码片段时使用。如果不定义,Sublime Text默认显示代码片段名。 根据之前的信息,现在可以开始按照下面的章节写自己的代码片段了。 .. note:: -注释: 为了简洁,除非另外说明,这里的例子中只包含 ``content`` 元素。 代码片段特性 diff --git a/source/file_management/file-management-goto-anything.png b/source/file_management/file-management-goto-anything.png new file mode 100644 index 0000000000000000000000000000000000000000..6b1ada5a4ea7fce1d6ba2daec5130573976d2845 GIT binary patch literal 27712 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 Z@0NmpA=^0ud?*V?MM3>}xx87x{{dgNzt;c& literal 0 HcmV?d00001 diff --git a/source/file_management/file-management-transient-views-detail.png b/source/file_management/file-management-transient-views-detail.png new file mode 100644 index 0000000000000000000000000000000000000000..dc50826a91087eeca225e83edb22ea8703ca4a91 GIT binary patch literal 11574 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 + 有关所有可用选项,变量等的完整文档。 + +.. warning:: + + 构建系统选项目前正在开发频道中进行重构。以下信息可能已过时。 + + 有关详情,请参阅 `此论坛主题 `_。 + +通过构建系统,你能够使用像 :program:`make`, :program:`tidy` 这样的外部程序以及各种解释器来运行你的文件。 + +在构建系统中调用的外部可执行程序一定要能够通过 :const:`PATH` 环境变量找到。请参考 :ref:`构建系统常见问题` 章节来了解有关如何正确设置 :const:`PATH` 环境变量的更多信息。 文件格式 =========== @@ -32,22 +41,18 @@ python -u /path/to/current/file.ext ``file_regex`` - 存放一段用于捕获外部程序输出的错误信息的Perl风格的正则表达式。这部分信息用于帮助你在不同 - 的错误实例之间使用 :kbd:`F4` 快捷键进行跳转。 + 存放一段用于捕获外部程序输出的错误信息的Perl风格的正则表达式。这部分信息用于帮助你在不同的错误实例之间使用 :kbd:`F4` 快捷键进行跳转。 ``selector`` - 如果你勾选了 **Tools | Build System | Automatic** 选项,Sublime Text会自动从构建 - 系统中通过 ``selector`` 选项找到适合当前文件的构建方式。 + 如果你勾选了 **Tools | Build System | Automatic** 选项,Sublime Text会自动从构建系统中通过 ``selector`` 选项找到适合当前文件的构建方式。 -除了这些选项,在构建系统中还可以使用一些变量,例如在前面使用的 ``$file`` 变量,就能自动扩充为 -当前缓冲区对应的文件名。 +除了这些选项,在构建系统中还可以使用一些变量,例如在前面使用的 ``$file`` 变量,就能自动扩充为当前缓冲区对应的文件名。 构建系统存储在哪里 ============================ -构建系统必须被放在 *包组* 文件夹下面的某个位置(例如 *Packages/User*)。许多包都含有它们自己 -的构建系统。 +构建系统必须被放在 ``Packages`` 文件夹下面的某个位置(例如 ``Packages/User``)。许多包都含有它们自己的构建系统。 运行构建系统 ===================== diff --git a/source/getting_started/install.rst b/source/getting_started/install.rst index 962d480..74f6359 100644 --- a/source/getting_started/install.rst +++ b/source/getting_started/install.rst @@ -13,83 +13,169 @@ Sublime Text并不是免费的,使用前请务必阅读官方网站上的 `使 请根据操作系统的不同,做出对应选择。如果你正在使用64位的系统,就请下载64位的版本,否则就下载32位的版本。 -在 **Windows** 平台,如果你不知道如何查看操作系统的版本,就请下载32位版。现在的64位Windows -操作系统可以正常运行32位的软件。 +macOS +********* +对于OS X的用户,你不必关心此部分内容,因为Sublime Text在OS X平台上只有一个版本。 -在 **Linux** 平台,请在终端中输入下面的命令来查看操作系统的类型:: +Windows +******** +如果您使用的是现代版Windows,则应该能够运行64位版本。如果您在运行64位版本时遇到问题,请尝试使用32位版本。 - uname -m +Linux +******* +在Linux平台,请在终端中输入下面的命令来查看操作系统的类型:: -对于 **OS X** 的用户,你不必关心此部分内容,因为Sublime Text在OS X平台上只有一个版本。 + uname -m Windows ======= 选择便携版还是非便携版? ---------------------------- +*********************** -Sublime Text在Windows平台提供了两种安装类型:一种是标准安装,另外一种则是便携安装。只有 -当你确信自己要使用便携版的时候才选择便携安装,否则就请选择标准安装。 +Sublime Text在Windows平台提供了两种安装类型:一种是标准安装,另外一种则是便携安装。只有当你确信自己要使用便携版的时候才选择便携安装,否则就请选择标准安装。 -**标准安装** 会将数据分散到两个文件夹:正确的安装目录,以及 *数据目录* 。这些概念将在稍后 -的文档中进行解释。标准安装也会将Sublime Text的选项与Windows的快捷菜单进行整合。 +**标准安装** 会将数据分散到两个文件夹:正确的安装目录,以及 *数据目录* 。这些概念将在稍后的文档中进行解释。标准安装也会将Sublime Text的选项与Windows的快捷菜单进行整合。 -**便携安装** 会将所有Sublime Text需要的文件放到一个目录中。这样你就可以通过介质随身携带 -这个目录,而编辑器仍然可以正常工作。 +**便携安装** 会将所有Sublime Text需要的文件放到一个目录中。这样你就可以通过介质随身携带这个目录,而编辑器仍然可以正常工作。 如何安装标准版的Sublime Text -------------------------------------------------- +***************************** 很简单,下载安装器,双击运行,然后跟着屏幕上的指令一步一步操作就可以了。 如何安装便携版的Sublime Text ----------------------------------------------------- +****************************** 下载压缩包,并将其中的内容解压到你选择的路径。你能在解压的路径中找到 *sublime_text.exe* 的可执行文件。 -OS X -==== +macOS +====== -下载并打开 *.dmg* 文件,将其中的Sublime Text 2拖拽到 *应用程序* 文件夹即可。 +下载并打开 *.dmg* 文件,将其中的Sublime Text 3拖拽到 *应用程序* 文件夹即可。要创建可以在命令行使用的 `符号链接`,请在终端输入以下命令:: + + ln -s "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl" /usr/local/bin/subl Linux ===== -你可以手动下载并解压包文件。或者,你可以使用下面的几行命令: +你可以下载软件包并手动解压缩。或者,你可以使用命令行。 + +Ubuntu +******* + +**对于i386** + +:: + + cd ~ + wget http://c758482.r82.cf2.rackcdn.com/sublime-text_build-3083_i386.deb + +**对于x64** + +:: + + cd ~ + wget http://c758482.r82.cf2.rackcdn.com/sublime-text_build-3083_amd64.deb + +其他Linux发行版 +**************** + +**对于i386** + +:: + + cd ~ + wget http://c758482.r82.cf2.rackcdn.com/sublime_text_3_build_3083_x32.tar.bz2 + tar vxjf sublime_text_3_build_3083_x32.tar.bz2 + +**对于x64** + +:: + + cd ~ + wget http://c758482.r82.cf2.rackcdn.com/sublime_text_3_build_3083_x64.tar.bz2 + tar vxjf sublime_text_3_build_3083_x64.tar.bz2 + +现在我们应该将解压缩后的文件移动到适当的位置。 :: - cd /path/to/your/apps - wget http://url/to/sublime.tar.bz2 - tar vxjf sublime.tar.bz2 + sudo mv Sublime\ Text\ 3 /opt/ -如果你愿意的话,也可以使用下面的命令来创建一个可以方便使用的符号连接:: +最后,我们创建一个在命令行使用的 `符号链接`。 - sudo ln -s /path/to/sublime_text /usr/bin/subl +:: + + sudo ln -s /opt/Sublime\ Text\ 3/sublime_text /usr/bin/sublime + +在Ubuntu中,如果你还想将Sublime Text添加到Unity luncher,请继续阅读。 + +首先,我们需要创建一个新文件。 + +:: + + sudo sublime /usr/share/applications/sublime.desktop + +然后将以下内容复制到其中。 + +:: + + [Desktop Entry] + Version=1.0 + Name=Sublime Text 3 + # Only KDE 4 seems to use GenericName, so we reuse the KDE strings. + # From Ubuntu's language-pack-kde-XX-base packages, version 9.04-20090413. + GenericName=Text Editor + + Exec=sublime + Terminal=false + Icon=/opt/Sublime Text 3/Icon/48x48/sublime-text.png + Type=Application + Categories=TextEditor;IDE;Development + X-Ayatana-Desktop-Shortcuts=NewWindow -尝试冒险或选择稳定的版本 + [NewWindow Shortcut Group] + Name=New Window + Exec=sublime -n + TargetEnvironment=Unity + +如果你已经注册了Sublime Text的副本,但每次打开它时都会要求你输入许可证,你应该尝试运行此命令。 + +:: + + sudo chown -R username:username /home/username/.config /sublime-text-3 + +只需用你帐户的用户名替换 `username` 即可。如果你在首次输入许可证时以root身份打开Sublime Text,则应该修复权限错误。 + +发布通道 ============================ -Sublime Text有三个发布 *通道* : +在撰写本文时,存在两个主要版本的Sublime Text:Sublime Text 2和Sublime Text 3。一般来说,Sublime Text 3是更好的选择。虽然它在技术上处于测试阶段,但它与Sublime Text 2一样稳定,并且具有更多功能。 + +仅当你发现运行Sublime Text 3有问题或依赖的任何软件包不适用于Sublime Text 3时,才建议使用Sublime Text 2。 + +获得Sublime Text 3 +******************** + +Sublime Text 3目前有两个发布 *通道*: + +* `Beta`_ (默认的,建议的) +* `Dev`_ + +.. _Beta: http://www.sublimetext.com/3 +.. _Dev: http://www.sublimetext.com/3dev -* `稳定版`_ (默认选择) -* `开发版`_ -* `日更新版`_ +与开发版本相比,**Beta版本** 在日常使用中经过了更好的测试且更可靠。**大多数用户应该只使用Beta版**。 -.. _稳定版: http://www.sublimetext.com/2 -.. _开发版: http://www.sublimetext.com/dev -.. _日更新版: http://www.sublimetext.com/nightly +*开发* 通道不稳定:开发版可能包含错误而无法可靠地工作。Dev版本比beta版本更常更新。 -如果你正在为NASA(译者注:或者中国航天部)的项目工作,或者正在赶一个截止日期紧迫的项目。请使用稳定发行版,并且没必要继续 -阅读了。**稳定发行版** 受过更加完整的测试,而且比其他版本更可信赖,更适宜日常的工作。稳定 -发行版基本是每月更新一次。 **大部分的用户都只需要使用稳定版。** +**Dev版本仅适用于注册用户**。 -*开发* 或者 *日更新* 通道都不是稳定通道,这意味着通过这些通道发布的版本可能包含更多的bug, -或者可能无法可靠的运行。但是它们的更新速度比稳定版要快得多。 +获得Sublime Text 2 +******************** -每个人都能用免费使用 **开发发行版**。 总的看来,开发版每月发布两次。尽管它们可能还不能完美承担 -每天的工作,但是这些发行版的确较为稳定的展示了接下来要发放的新版本特性。 +我们推荐Sublime Text 3, 但如果你选择使用Sublime Text 2 你可以在 `这里`_ 下载它。 -最后,使用 **日更新版** 真是站在悬崖峭壁旁,这些发行版发布频率很高,同时也包含大量严重程度 -不一的问题。试用这些版本很好玩,但是风险请自负。需要注意的是日更新版 **只对注册用户开放** 。 +.. _这里: http://www.sublimetext.com/2 \ No newline at end of file diff --git a/source/glossary/glossary.rst b/source/glossary/glossary.rst index 58af447..88628e4 100644 --- a/source/glossary/glossary.rst +++ b/source/glossary/glossary.rst @@ -18,10 +18,7 @@ 文件组成。 包(package) - 在Sublime Text中这个术语的意义有点模糊,它可以指一个Python包(这种用法很少),或者 - 是 ``Packages`` 目录下的一个文件夹,亦或是一个 *.sublime-package* 文件。大多数情况下, - 包指的是 ``Packages`` 目录下的一个文件夹,这个文件夹中包含为某个特性或者某种语言服务的各 - 种资源。 + 在Sublime Text中这个术语的意义有点模糊,它可以指一个Python包(这种用法很少),或者是 ``Packages`` 目录下的一个文件夹,亦或是一个 *.sublime-package* 文件。大多数情况下,包指的是 ``Packages`` 目录下的一个文件夹,这个文件夹中包含为某个特性或者某种语言服务的各种资源。 译者注: Packages 目录保存在Sublime Text的安装目录中 面板(panel) @@ -29,3 +26,8 @@ 覆盖层控件(overlay) 一种特殊的输入控件。快速跳转就是一种覆盖层控件。 + + 文件类型(file type) + 在Sublime Text的上下文中,*文件类型* 是指由适用的 ``.tmLanguage`` 语法定义确定的文件类型。 + + 然而,这是一个含糊不清的术语,在某些情况下,它也可以用于技术文本中更广泛的含义。 \ No newline at end of file diff --git a/source/index.rst b/source/index.rst index fa5c256..a8b2af2 100644 --- a/source/index.rst +++ b/source/index.rst @@ -4,7 +4,7 @@ contain the root `toctree` directive. ===================================== -Sublime Text非官方文档(中文翻译版) +Sublime Text 非官方文档(中文翻译版) ===================================== 本文档翻译自 `Sublime Text Unofficial Documentation `_,译文如下: diff --git a/source/intro.rst b/source/intro.rst index b8801dd..50fad96 100644 --- a/source/intro.rst +++ b/source/intro.rst @@ -2,15 +2,20 @@ 关于本文档 ======================== -这是由ST党拥护者们维护的Sublime Text编辑器的非官方文档。希望能对您有所帮助! +欢迎来到Sublime Text编辑器的非官方文档! -*sublime是什么?你在说什么东西啊?* +.. image:: sample-intro.png -`Sublime Text`_ 是一款为编写代码和文稿而准备的多功能编辑器。它能为你做很多重复性的工作, -从而让你的精力更专注在编写的内容上面。更重要的是,它会给你带来愉悦感! - -.. _Sublime Text: http://www.sublimetext.com +`Sublime Text`_ 是一款为编写代码和文稿而准备的多功能编辑器。它能为你做很多重复性的工作,从而让你的精力更专注在编写的内容上面。更重要的是,它会给你带来愉悦感!它适用于OS X,Windows和Linux。 在你继续阅读之前,我们鼓励你通读一下 :doc:`基本概念 ` 章节。 学的开心哦! + +贡献文档 +========= +如果您想参与此文档,请转到 `GitHub仓库`_。本指南是使用 `Sphinx`_ 创建的。 + +.. _Sublime Text: http://www.sublimetext.com +.. _GitHub仓库: https://github.com/void-main/UnofficialDocs +.. _Sphinx: http://sphinx-doc.org/ \ No newline at end of file diff --git a/source/reference/build_systems.rst b/source/reference/build_systems.rst index 58e9195..b5b2d7f 100644 --- a/source/reference/build_systems.rst +++ b/source/reference/build_systems.rst @@ -110,8 +110,7 @@ Sublime Text命令从 *.sublime-build* 中读取配置数据,然后根据需 平台相关选项 ------------------------- -``windows``, ``osx`` 以及 ``linux``元素可以帮助你在构建系统中设定平台相关 -的选项,举例如下: +``windows``, ``osx`` 以及 ``linux`` 元素可以帮助你在构建系统中设定平台相关的选项,举例如下:: { diff --git a/source/reference/keyboard_shortcuts_osx.rst b/source/reference/keyboard_shortcuts_osx.rst index 8cf910b..37fa98c 100644 --- a/source/reference/keyboard_shortcuts_osx.rst +++ b/source/reference/keyboard_shortcuts_osx.rst @@ -1,7 +1,7 @@ .. sublime: wordWrap false ================================== -OSX平台快捷键 +macOS 平台快捷键 ================================== .. warning:: @@ -10,149 +10,151 @@ OSX平台快捷键 编辑 ------- -+-----------------+-----------------------------------------------------------+ -| Keypress 按键 | Command 对应命令 | -+=================+===========================================================+ -| ⌘ + X | Delete line 删除行 | -+-----------------+-----------------------------------------------------------+ -| ⌘ + ↩ | Insert line after 行后插入 | -+-----------------+-----------------------------------------------------------+ -| ⌘ + ⇧ + ↩ | Insert line before 行前插入 | -+-----------------+-----------------------------------------------------------+ -| ⌘ + ⌃ + ↑ | Move line/selection up 上移文本/选择 | -+-----------------+-----------------------------------------------------------+ -| ⌘ + ⌃ + ↓ | Move line/selection down 下移文本/选择 | -+-----------------+-----------------------------------------------------------+ -| ⌘ + L | Select line - Repeat to select next lines 选择行 - 重复按键可以继续选择接下来的行 | -+-----------------+-----------------------------------------------------------+ -| ⌘ + D | Select word - Repeat select others occurrences 选择单词 - 重复按键选择单词的其他出现实例 | -+-----------------+-----------------------------------------------------------+ -| ⌃ + M | Jump to closing parentheses 跳转到闭合括号 | -| | Repeat to jump to opening parentheses 再次按键将跳转到对应的起始括号 | -+-----------------+-----------------------------------------------------------+ -| ⌃ + ⇧ + M | Select all contents of the current parentheses 选择当前括号中的所有内容 | -+-----------------+-----------------------------------------------------------+ -| ⌘ + K, ⌘ + K | Delete from cursor to end of line 删除光标位置到行尾的全部内容 | -+-----------------+-----------------------------------------------------------+ -| ⌘ + K + ⌫ | Delete from cursor to start of line 删除光标位置到行首的全部内容 | -+-----------------+-----------------------------------------------------------+ -| ⌘ + ] | Indent current line(s) 向后缩进选中行(可以为多行) | -+-----------------+-----------------------------------------------------------+ -| ⌘ + [ | Un-indent current line(s) 向前缩进当前行(可以为多行) | -+-----------------+-----------------------------------------------------------+ -| ⌘ + ⇧ + D | Duplicate line(s) 重复当前行内容(可以为多行) | -+-----------------+-----------------------------------------------------------+ -| ⌘ + J | Join line below to the end of the current line 把下一行内容连接到当前行末尾 | -+-----------------+-----------------------------------------------------------+ -| ⌘ + / | Comment/un-comment current line 为当前行添加/删除注释 | -+-----------------+-----------------------------------------------------------+ -| ⌘ + ⌥ + / | Block comment current selection 为当前选中内容增加块注释 | -+-----------------+-----------------------------------------------------------+ -| ⌘ + Y | Redo, or repeat last keyboard shortcut command 恢复,或者重复执行上个快捷键对应的命令 | -+-----------------+-----------------------------------------------------------+ -| ⌘ + ⇧ + V | Paste and indent correctly 粘贴的同时完成自动缩进 | -+-----------------+-----------------------------------------------------------+ -| ⌃ + Space | Select next auto-complete suggestion 选择下一个自动补全提示 | -+-----------------+-----------------------------------------------------------+ -| ⌃ + U | soft undo; jumps to your last change before 软撤销,即在撤销之前先跳转到上次修改的位置 | -| | undoing change when repeated 再次按键执行撤销操作 | -+-----------------+-----------------------------------------------------------+ ++-----------------+-------------------------------------------------------+ +| 按键 | 对应命令 | ++=================+=======================================================+ +| ⌘ + X | 删除行 | ++-----------------+-------------------------------------------------------+ +| ⌘ + ↩ | 行后插入 | ++-----------------+-------------------------------------------------------+ +| ⌘ + ⇧ + ↩ | 行前插入 | ++-----------------+-------------------------------------------------------+ +| ⌘ + ⌃ + ↑ | 上移文本/选择 | ++-----------------+-------------------------------------------------------+ +| ⌘ + ⌃ + ↓ | 下移文本/选择 | ++-----------------+-------------------------------------------------------+ +| ⌘ + L | 选择行 - 重复按键可以继续选择接下来的行 | ++-----------------+-------------------------------------------------------+ +| ⌘ + D | 选择单词 - 重复按键选择单词的其他出现实例 | ++-----------------+-------------------------------------------------------+ +| ⌃ + M | 跳转到闭合括号 | +| | 再次按键将跳转到对应的起始括号 | ++-----------------+-------------------------------------------------------+ +| ⌃ + ⇧ + M | 选择当前括号中的所有内容 | ++-----------------+-------------------------------------------------------+ +| ⌘ + K, ⌘ + K | 删除光标位置到行尾的全部内容 | ++-----------------+-------------------------------------------------------+ +| ⌘ + K + ⌫ | 删除光标位置到行首的全部内容 | ++-----------------+-------------------------------------------------------+ +| ⌘ + ] | 向后缩进选中行(可以为多行) | ++-----------------+-------------------------------------------------------+ +| ⌘ + [ | 向前缩进当前行(可以为多行) | ++-----------------+-------------------------------------------------------+ +| ⌘ + ⇧ + D | 重复当前行内容(可以为多行) | ++-----------------+-------------------------------------------------------+ +| ⌘ + J | 把下一行内容连接到当前行末尾 | ++-----------------+-------------------------------------------------------+ +| ⌘ + / | 为当前行添加/删除注释 | ++-----------------+-------------------------------------------------------+ +| ⌘ + ⌥ + / | 为当前选中内容增加块注释 | ++-----------------+-------------------------------------------------------+ +| ⌘ + Y | 恢复,或者重复执行上个快捷键对应的命令 | ++-----------------+-------------------------------------------------------+ +| ⌘ + ⇧ + V | 粘贴的同时完成自动缩进 | ++-----------------+-------------------------------------------------------+ +| ⌃ + Space | 选择下一个自动补全提示 | ++-----------------+-------------------------------------------------------+ +| ⌃ + U | 软撤销,即在撤销之前先跳转到上次修改的位置 | +| | 再次按键执行撤销操作 | ++-----------------+-------------------------------------------------------+ + 导航/快速跳转 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress 按键 | Command 对应命令 | +| 按键 | 对应命令 | +=================+===========================================================+ -| ⌘ + P | Quick-open files by name 根据名称快速打开文件 | +| ⌘ + P or ⌘ + T | 根据名称快速打开文件 | +-----------------+-----------------------------------------------------------+ -| ⌘ + R | Goto symbol 跳转到指定符号 | +| ⌘ + R | 跳转到指定符号 | +-----------------+-----------------------------------------------------------+ -| | Goto word in current file 跳转到当前文件中的某个单词 | +| | 跳转到当前文件中的某个单词 | +-----------------+-----------------------------------------------------------+ -| ⌃ + G | Goto line in current file 跳转到当前文件中的某一行 | +| ⌃ + G | 跳转到当前文件中的某一行 | +-----------------+-----------------------------------------------------------+ 通用快捷键 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress 按键 | Command 对应命令 | +| 按键 | 对应命令 | +=================+===========================================================+ -| ⌘ + ⇧ + P | Command prompt 命令提示 | +| ⌘ + ⇧ + P | 命令提示 | +-----------------+-----------------------------------------------------------+ -| ⌘ + K, ⌘ + B | Toggle side bar 开/关侧边栏 | +| ⌘ + K, ⌘ + B | 开/关侧边栏 | +-----------------+-----------------------------------------------------------+ -| ⌃ + ⇧ + P | Show scope in status bar 在状态栏中显示作用域 | +| ⌃ + ⇧ + P | 在状态栏中显示作用域 | +-----------------+-----------------------------------------------------------+ + 查找/替换 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress 按键 | Command 对应命令 | +| 按键 | 对应命令 | +=================+===========================================================+ -| ⌘ + F | Find 查找 | +| ⌘ + F | 查找 | +-----------------+-----------------------------------------------------------+ -| ⌘ + ⌥ + F | Replace 替换 | +| ⌘ + ⌥ + F | 替换 | +-----------------+-----------------------------------------------------------+ -| ⌘ + ⇧ + F | Find in files 在文件中查找 | +| ⌘ + ⇧ + F | 在文件中查找 | +-----------------+-----------------------------------------------------------+ 标签页 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress 按键 | Command 对应命令 | +| 按键 | 对应命令 | +=================+===========================================================+ -| ⌘ + ⇧ + t | Open last closed tab 打开最后关闭的标签页 | +| ⌘ + ⇧ + t | 打开最后关闭的标签页 | +-----------------+-----------------------------------------------------------+ -| ^ + Tab | Cycle up through tabs 在标签页之间循环 | +| ^ + Tab | 在标签页之间循环 | +-----------------+-----------------------------------------------------------+ -| ⇧ + ^ + Tab | Cycle down through tabs 在标签页之间循环 | +| ⇧ + ^ + Tab | 在标签页之间循环 | +-----------------+-----------------------------------------------------------+ -| | Find in files 文件中搜索 | +| | 文件中搜索 | +-----------------+-----------------------------------------------------------+ 分割窗口 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress 按键 | Command 对应命令 | +| 按键 | 对应命令 | +=================+===========================================================+ -| ⌘ + ⌥ + 2 | Split view into two columns 把窗口分割成两栏 | +| ⌘ + ⌥ + 2 | 把窗口分割成两栏 | +-----------------+-----------------------------------------------------------+ -| ⌘ + ⌥ + 1 | Revert view to single column 把窗口恢复成一栏 | +| ⌘ + ⌥ + 1 | 把窗口恢复成一栏 | +-----------------+-----------------------------------------------------------+ -| ⌘ + ⌥ + 5 | Set view to grid (4 groups) 把窗口分割成网格(4组) | +| ⌘ + ⌥ + 5 | 把窗口分割成网格(4组) | +-----------------+-----------------------------------------------------------+ -| ⌃ + [NUM] | Jump to group where num is 1-4 跳转到1-4组中的某一组 | +| ⌃ + [NUM] | 跳转到1-4组中的某一组 | +-----------------+-----------------------------------------------------------+ -| ⌃ + ⇧ + [NUM] | Move file to specified group where num is 1-4 把文件移动到1-4组中的某一组 | +| ⌃ + ⇧ + [NUM] | 把文件移动到1-4组中的某一组 | +-----------------+-----------------------------------------------------------+ 书签 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress 按键 | Command 对应命令 | +| 按键 | 对应命令 | +=================+===========================================================+ -| ⌘ + F2 | Toggle bookmark 开/关书签 | +| ⌘ + F2 | 开/关书签 | +-----------------+-----------------------------------------------------------+ -| F2 | Next bookmark 下一个书签 | +| F2 | 下一个书签 | +-----------------+-----------------------------------------------------------+ -| ⇧ + F2 | Previous bookmark 上一个书签 | +| ⇧ + F2 | 上一个书签 | +-----------------+-----------------------------------------------------------+ -| ⇧ + ⌘ + F2 | Clear bookmarks 清空书签 | +| ⇧ + ⌘ + F2 | 清空书签 | +-----------------+-----------------------------------------------------------+ 文本操作 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress 按键 | Command 对应命令 | +| 按键 | 对应命令 | +=================+===========================================================+ -| ⌘ + K, ⌘ + U | Transform to Uppercase 将文本转换为大写 | +| ⌘ + K, ⌘ + U | 将文本转换为大写 | +-----------------+-----------------------------------------------------------+ -| ⌘ + K, ⌘ + L | Transform to Lowercase 将文本转换为小写 | +| ⌘ + K, ⌘ + L | 将文本转换为小写 | +-----------------+-----------------------------------------------------------+ diff --git a/source/reference/keyboard_shortcuts_win.rst b/source/reference/keyboard_shortcuts_win.rst index 3994f88..5755ee4 100644 --- a/source/reference/keyboard_shortcuts_win.rst +++ b/source/reference/keyboard_shortcuts_win.rst @@ -11,150 +11,150 @@ Windows/Linux平台快捷键 ------- +-----------------+-----------------------------------------------------------+ -| Keypress 按键 | Command 对应命令 | +| 按键 | 对应命令 | +=================+===========================================================+ -| Ctrl + X | Delete line 删除行 | +| Ctrl + X | 删除行 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ↩ | Insert line after 行后插入 | +| Ctrl + ↩ | 行后插入 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ⇧ + ↩ | Insert line before 行前插入 | +| Ctrl + ⇧ + ↩ | 行前插入 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ⇧ + ↑ | Move line/selection up 上移文本/选择 | +| Ctrl + ⇧ + ↑ | 上移文本/选择 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ⇧ + ↓ | Move line/selection down 下移文本/选择 | +| Ctrl + ⇧ + ↓ | 下移文本/选择 | +-----------------+-----------------------------------------------------------+ -| Ctrl + L | Select line - Repeat to select next lines 选择行 - 重复按键可以继续选择接下来的行 | +| Ctrl + L | 选择行 - 重复按键可以继续选择接下来的行 | +-----------------+-----------------------------------------------------------+ -| Ctrl + D | Select word - Repeat select others occurrences 选择单词 - 重复按键选择单词的其他出现实例 | +| Ctrl + D | 选择单词 - 重复按键选择单词的其他出现实例 | +-----------------+-----------------------------------------------------------+ -| Ctrl + M | Jump to closing parentheses 跳转到闭合括号 | -| | Repeat to jump to opening parentheses 再次按键将跳转到对应的起始括号 | +| Ctrl + M | 跳转到闭合括号 | +| | 再次按键将跳转到对应的起始括号 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ⇧ + M | Select all contents of the current parentheses 选择当前括号中的所有内容 | +| Ctrl + ⇧ + M | 选择当前括号中的所有内容 | +-----------------+-----------------------------------------------------------+ -| Ctrl + KK | Delete from cursor to end of line 删除光标位置到行尾的全部内容 | +| Ctrl + KK | 删除光标位置到行尾的全部内容 | +-----------------+-----------------------------------------------------------+ -| Ctrl + K + ⌫ | Delete from cursor to start of line 删除光标位置到行首的全部内容 | +| Ctrl + K + ⌫ | 删除光标位置到行首的全部内容 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ] | Indent current line(s) 向后缩进选中行(可以为多行) | +| Ctrl + ] | 向后缩进选中行(可以为多行) | +-----------------+-----------------------------------------------------------+ -| Ctrl + [ | Un-indent current line(s) 向前缩进当前行(可以为多行) | +| Ctrl + [ | 向前缩进当前行(可以为多行) | +-----------------+-----------------------------------------------------------+ -| Ctrl + ⇧ + D | Duplicate line(s) 重复当前行内容(可以为多行) | +| Ctrl + ⇧ + D | 重复当前行内容(可以为多行) | +-----------------+-----------------------------------------------------------+ -| Ctrl + J | Join line below to the end of the current line 把下一行内容连接到当前行末尾 | +| Ctrl + J | 把下一行内容连接到当前行末尾 | +-----------------+-----------------------------------------------------------+ -| Ctrl + / | Comment/un-comment current line 为当前行添加/删除注释 | +| Ctrl + / | 为当前行添加/删除注释 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ⇧ + / | Block comment current selection 为当前选中内容增加块注释 | +| Ctrl + ⇧ + / | 为当前选中内容增加块注释 | +-----------------+-----------------------------------------------------------+ -| Ctrl + Y | Redo, or repeat last keyboard shortcut command 恢复,或者重复执行上个快捷键对应的命令 | +| Ctrl + Y | 恢复,或者重复执行上个快捷键对应的命令 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ⇧ + V | Paste and indent correctly 粘贴的同时完成自动缩进 | +| Ctrl + ⇧ + V | 粘贴的同时完成自动缩进 | +-----------------+-----------------------------------------------------------+ -| Ctrl + Space | Select next auto-complete suggestion 选择下一个自动补全提示 | +| Ctrl + Space | 选择下一个自动补全提示 | +-----------------+-----------------------------------------------------------+ -| Ctrl + U | soft undo; jumps to your last change before 软撤销,即在撤销之前先跳转到上次修改的位置 | -| | undoing change when repeated 再次按键执行撤销操作 | +| Ctrl + U | 软撤销,即在撤销之前先跳转到上次修改的位置 | +| | 再次按键执行撤销操作 | +-----------------+-----------------------------------------------------------+ 导航/快速跳转 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress 按键 | Command 对应命令 | +| 按键 | 对应命令 | +=================+===========================================================+ -| Ctrl + P | Quick-open files by name 根据名称快速打开文件 | +| Ctrl + P | 根据名称快速打开文件 | +-----------------+-----------------------------------------------------------+ -| Ctrl + R | Goto symbol 跳转到指定符号 | +| Ctrl + R | 跳转到指定符号 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ; | Goto word in current file 跳转到当前文件中的某个单词 | +| Ctrl + ; | 跳转到当前文件中的某个单词 | +-----------------+-----------------------------------------------------------+ -| Ctrl + G | Goto line in current file 跳转到当前文件中的某一行 | +| Ctrl + G | 跳转到当前文件中的某一行 | +-----------------+-----------------------------------------------------------+ 通用快捷键 ------------------------ +-----------------------+-----------------------------------------------------+ -| Keypress 按键 | Command 对应命令 | +| 按键 | 对应命令 | +=======================+=====================================================+ -| Ctrl + ⇧ + P | Command prompt 命令提示 | +| Ctrl + ⇧ + P | 命令提示 | +-----------------------+-----------------------------------------------------+ -| Ctrl + KB | Toggle side bar 开/关侧边栏 | +| Ctrl + KB | 开/关侧边栏 | +-----------------------+-----------------------------------------------------+ -| Ctrl + ⇧ + Alt + P | Show scope in status bar 在状态栏中显示作用域 | +| Ctrl + ⇧ + Alt + P | 在状态栏中显示作用域 | +-----------------------+-----------------------------------------------------+ 查找/替换 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress 按键 | Command 对应命令 | +| 按键 | 对应命令 | +=================+===========================================================+ -| Ctrl + F | Find 查找 | +| Ctrl + F | 查找 | +-----------------+-----------------------------------------------------------+ -| Ctrl + H | Replace 替换 | +| Ctrl + H | 替换 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ⇧ + F | Find in files 在文件中查找 | +| Ctrl + ⇧ + F | 在文件中查找 | +-----------------+-----------------------------------------------------------+ 标签页 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress 按键 | Command 对应命令 | +| 按键 | 对应命令 | +=================+===========================================================+ -| Ctrl + ⇧ + t | Open last closed tab 打开最后关闭的标签页 | +| Ctrl + ⇧ + t | 打开最后关闭的标签页 | +-----------------+-----------------------------------------------------------+ -| Ctrl + PgUp | Cycle up through tabs 在标签页之间循环 | +| Ctrl + PgUp | 在标签页之间循环 | +-----------------+-----------------------------------------------------------+ -| Ctrl + PgDn | Cycle down through tabs 在标签页之间循环 | +| Ctrl + PgDn | 在标签页之间循环 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ⇆ | Find in files 文件中搜索 | +| Ctrl + ⇆ | 文件中搜索 | +-----------------+-----------------------------------------------------------+ -| Alt + [NUM] | Switch to tab number [NUM] where [NUM] <= number of tabs 跳转到第 [NUM] 个标签页,这里 [NUM] 指标签的页数 | +| Alt + [NUM] | 跳转到第 [NUM] 个标签页,这里 [NUM] 指标签的页数 | +-----------------+-----------------------------------------------------------+ 分割窗口 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress 按键 | Command 对应命令 | +| 按键 | 对应命令 | +=================+===========================================================+ -| Alt + ⇧ + 2 | Split view into two columns 把窗口分割成两栏 | +| Alt + ⇧ + 2 | 把窗口分割成两栏 | +-----------------+-----------------------------------------------------------+ -| Alt + ⇧ + 1 | Revert view to single column 把窗口恢复成一栏 | +| Alt + ⇧ + 1 | 把窗口恢复成一栏 | +-----------------+-----------------------------------------------------------+ -| Alt + ⇧ + 5 | Set view to grid (4 groups) 把窗口分割成网格(4组) | +| Alt + ⇧ + 5 | 把窗口分割成网格(4组) | +-----------------+-----------------------------------------------------------+ -| Ctrl + [NUM] | Jump to group where num is 1-4 跳转到1-4组中的某一组 | +| Ctrl + [NUM] | 跳转到1-4组中的某一组 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ⇧ + [NUM]| Move file to specified group where num is 1-4 把文件移动到1-4组中的某一组 | +| Ctrl + ⇧ + [NUM]| 把文件移动到1-4组中的某一组 | +-----------------+-----------------------------------------------------------+ 书签 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress 按键 | Command 对应命令 | +| 按键 | 对应命令 | +=================+===========================================================+ -| Ctrl + F2 | Toggle bookmark 开/关书签 | +| Ctrl + F2 | 开/关书签 | +-----------------+-----------------------------------------------------------+ -| F2 | Next bookmark 下一个书签 | +| F2 | 下一个书签 | +-----------------+-----------------------------------------------------------+ -| ⇧ + F2 | Previous bookmark 上一个书签 | +| ⇧ + F2 | 上一个书签 | +-----------------+-----------------------------------------------------------+ -| Ctrl + ⇧ + F2 | Clear bookmarks 清空书签 | +| Ctrl + ⇧ + F2 | 清空书签 | +-----------------+-----------------------------------------------------------+ 文本操作 ------------------------ +-----------------+-----------------------------------------------------------+ -| Keypress 按键 | Command 对应命令 | +| 按键 | 对应命令 | +=================+===========================================================+ -| Ctrl + KU | Transform to Uppercase 将文本转换为大写 | +| Ctrl + KU | 将文本转换为大写 | +-----------------+-----------------------------------------------------------+ -| Ctrl + KL | Transform to Lowercase 将文本转换为小写 | +| Ctrl + KL | 将文本转换为小写 | +-----------------+-----------------------------------------------------------+ diff --git a/source/sample-intro.png b/source/sample-intro.png new file mode 100644 index 0000000000000000000000000000000000000000..df956cc60723bd914efff4f01107b1e6c24f0a55 GIT binary patch literal 99468 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

#?bqmsIMVchp}4)hRdaph073lq+6o>pS_KC= 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

  • %v5< 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 literal 0 HcmV?d00001 diff --git a/source/search_and_replace/search-and-replace-multiline.png b/source/search_and_replace/search-and-replace-multiline.png new file mode 100644 index 0000000000000000000000000000000000000000..3d33b1c43b52d398ab5f2cfdce0892e652eeeb01 GIT binary patch literal 19180 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 literal 0 HcmV?d00001 diff --git a/source/search_and_replace/search-and-replace-regex-sample.png b/source/search_and_replace/search-and-replace-regex-sample.png new file mode 100644 index 0000000000000000000000000000000000000000..48a0947835582555785c858d0e9ff454763237b4 GIT binary patch literal 32656 zcmbq*1yogCyETY_C?y~rf}}J@I;D{gLAp60-QA!x0uqOmmhSHE?nb&ny7~9P_kF*6 zzwiG4xMTcdz!2A7d+&ADUVAwfFfg#n&k%qX z);Vl2@DGxexT-A-3~D>{7dDy}l>lf&w3Cn)L0ozYk4jJDzt%wd*d+4F?!CR8v84@6 zPGP?|(1dIUGzlBp>f4xD*_l{cz+fVgz5&{wL)(Qct(YM2TU2R~hn#;q1=4a4m z6S6S6cnH?**WIq#2Y0@@Iu-IPr1%nV_E z9*k1Kz`TZ$5Pq-Zl(@IxX{C6Pv~^ciosM9j zeG%LS$gY(|&3oAk^r=;c@A3`YoN9pXp)EiLxqXT{0BfrywYRI%-y?i`TGQ35n`puXJ(x0Qkl%^;MZAse> zJE#2_(C&WJ7^dDsc*qE?zmBp4xhdkX9#4bhPu$<3`L-PKxBWUI(R2L3L<0=s87YhE zi(AAaes5326(0#_qd#}=hgd))Yzr`N`h}yAFYG{eL}ZxJmJET;wny)h?}J@FiaZW- zOSnqMrhZAtKt7>#2VuwYqb-fm%JH&SzRMfvwM)j=ixO@+QB+~Ypxx8Dw>V&^j3hd? zbzN##>q?{@sARa?9lc*bXCok!oWGAIe%ESNx7jwbJ$WB`L3Y{fd8)@zVo&*_Q6|F* zMig0b+*G1}wS!19m<{?R+^L_&Za>v$j0qdK`Yqu*zrhxyRY9-tusppUV)5u#g9_KTzY-mCC z_^P9@&F9MQdP&iOkzO@=Gya*plZBLL<@87BZT;*L%j=oG$Kk31XE3pmyXBdQ zD_sZC55>S49qW;)%`}BBTi_#5Gt}DKF5PT~pA64-=Ou*Pub?b8;hlW3AqeNa6*0fK zIej2&mVQ3m3^TB&f4k#wK)c2g>s56BBkBmPaHOOzlsQKdxq!G(Myqu5Fh9CbYt}fm z7pKfR-*+_?M)LqEH{Q)8{1x!=$n0KF7TxxlYK+`BT@N`Z)(!N2Rco$({PSGsy6(;& zPoT5fZu_m-eEE;}+MO)4l_!%E`!Ad-DKgT!=d|Pn_RFd{cH-7JO>LUDOh4;_mth95 zN%n(DOn{|9ZFRM~(a2f=A0~RxL?Sx0!Hk(>&xn7(<@YNBGf}#VG3&+gsN_B_&~SD2 zx_)EiyvvdE{&>Id7Wm~5uG5-07)0H_w9{OrnTs6|aO`E#-;GpC@iUDXKTFB# zmnwDO9xCfswFh@4(rzc3@G(Z5@SZ8`-S1r}-$|8^+%nYPI<4{U+esN%++@biIcQp5aFN6n^5enk!#9;PI7E9ZAH;G)kr zg5R*LnxnUe54sJRtK zm-LUDi(7urCT{w0qnta&|LMY@gqE$vc0CcxK7M6Yo zem1iw-cRj^PDVhKjqu#Mk~`zRYQ9q+g>CWRJWq2ekEEI9%+_Pl9gcPD)|R+B@?d^@G%Y zf+^&OQ5!Ko!NuaU6L(52k6Uy`{sZz`-}Y2|yxzpJI2PK2Y>!=}P9Fi0PG6QvT?U3E z{EfZUiuzZamK_es?zc}HnC+cMSx*S}R6K_{i}?AJ@Cr9q6E5El2M1njnl6v`7xrH~ z(~0bZ)E0M9#u;$$(xG3-+$Q{}mY}}p^eRX*HGXDb@;3ZJSJ{2hySx#RJQEkl+&3)>R}!?* z+ki=t+slu$3zC*U#z(8gfcGxwy@yZFvCSl~l+Y}nuv1+HAXYbN%vH?>8SYE-B}{J5 zXYm`()wSJ*BYBzHz3bpnG+t_tI!soc>05@Qs7H(VXcWXkiu;?DUHj6MHOQJwgYC zfDL0mO-s(?P`)PKUaCvsy>sqfCJzV*Fl62`3-h0+&ieZWN)#XFm+#6B6>lcGocDC? zFUE_s$FhS7e&}%*@$rXTMF_ovlWp8s>*-n=b5K4WRljjsix9#kJ6x&_|ILp51~XFz zZS1!2{P?#}eaJPTX6LrvTb2sTu(#s}b4|m&^XIpG$srC!l;etd`sWApQu}?A=ViAd zr}9rR_bpk${7YuD=#Gv1Jaxa(H|k{Cu_{A7YiFBPpqr6tQ^${Jyd24MDTi~{n~B4N zRe!NrCLaC-8(SU{(8bSJFeH}O>YSfUQ{Cz8wH*!j9YXF^Mv;f10oe$b*uz-Ssf4yf z4r6K~=9N`@K8l^b6Ctb9INRMy5$f+&_aO>oJ=OR$$+v16r}hvI3-b>zncmtVprV`2 z(<;IN(P_CA5pxJ8wOfUQ@Selr;aDA3EI<`6^MciBxiOPOyc2JCIiM<$&C$lQV#T6k z!&Bsm1hB$5X?FU_*Z8@w#x+0V7?oZ*Xfo{AZoN-Ar*M2}>Dt&`8p(|1=#>PgjCz$u zfLnsry~7TSH?7o=5_n+BSkg=o8IzvejzS;wUcg-f^aO8eX})D8P~&xx zIqKi$NwPtmqN88!BXpl0tQg_FwOVsuhTXX@4QJh)`W-bam_*+439(BEwsszqvcc_Kln1$_t zfI4jUyQf@EFhI3u2_}(%y*gRXR`o2F3I5@gY;MvE9p)zzK&&5NJDFX=0G)l?Ef2uGRHgIMP>;Z|FjP)lwh;k$CzWYmSsOC3^T;n0X zNIZ9+s$ZCd6IKuE+QLfNWIB_yAYHbCHjCYyv+6a%Zq{gL`ZPdi`UlfEIYW$ib7TEf zvz%DjaP^@%D$ap5I3-h{)rJ8FlF{!FiM=ZYkFX6nBL|Y>{sXkA%1OSu@U{t1(NN`P z+|}G~bl(BTF7w*sYnY|uMWwp0+-$;SkP<^^FR^TfVh2xyhc3doJGMI{`#|2#z3Gm= z8=qmYq?B2&cf~tx_?L|H*Jpnssb_LAPD(j|#;jlR@hrmGalV?R z;HL45gD3Ls0iK}a&jp9Ewo^N8sjK9I1l?+?iAMhtT!=))oPs_8tJXz-XR4Wy#|VN= zITuCq;$O+lhY%v$kmHM6Y)ToVbckrHFb=HlJf{d6YcU9p<}JIrA}MUg(IP={BOAnZ z;WQAp7ihOQaE!Libbir-G~Qgw*S?iU^7CdkRO(6~4 zkHAS#8QtefMX=>2)+@fpW)z0&spH(`YN=un>z(gVi~@NtRepA|xj^b1@#!NP_T+M} zx~{&!VqKJ4n0K^wn&Ted^H6{BmVVr2$>>S7ppF)>O|zL$bgs-Vtq(w)!;&=)onZ%dzgas zaFbLTB9)Y^5X1GhxxZ4>T1V2>5GH)zzg_oH+IHl%@F=?DXV970ao{vuUf-2e8`U>k|pG1*NfG2-Qs}gS^$L{7I^2gg$SI=35P3_ z_Bl!JATM$H2WPqnUElY;mRVeRP78KGaTn%4qORh&$xAqjhG=3cR&mVNhqss?%AK?d z8odTpTZg=tkyn`|T(G-naF~>GHhR)b(1n|Ljf$3!U;%@CRHoffcu>dL!decwksQcx z8PpGrb*59B6+V{DDnX*08RU9#?H=ZbE<(k>Fu#iVbYFXAkR{;UKK5goe z*7Eh%X6rqw<6b(fTwUUl5h2sA>H>V05sy6F4m+`5>h06$HWCER>*lGAt4-?SS|8Sw zJ6_L|6Mbh_1jT11ZfoGruWjM8wqM8Uv3%PoNT5Nw&*N%U7jqtxQhOVa6e4cT75Suc zysL)8_;l2`LctLDN!l(X+~*hScJMNi>~}RM^$AR0a+g+ObwQfho5>Dg4oS=3GE{6; z*$}|^X`FVOOmcFNOn-S{*3u;A&iB%*W$gAK*-|fG!tn_4_Wn)v>S8F8p|WsF$il=&z$`-+BTk_v^+at2QS>a4Yr$b6labQ<&lJ6 zHvydsK8uK#f%L>}QoMIHvN1M-kx^w;ml~@DQ|P{AiBiL{BX7e!cKJO=rXuKmKJYS7 z9C$CvMG=&Z6>XmqGW%aS56=2o=KJ!}Q;M#X#zg3VQl-X^?fSk-S3_>M2-R;I@yeK4 ziq}yF*;S5oTn(6zzkSQO&DibwUiI*%(wzzPsdHe>vJr2<;r>^9_|-yesCBlqyT-Zu zb`E6Ow*q^%%jR}~Gr?7|@Pc#`LtyR=V=k};dg<8s`!%WA^xpH!jjO=n+8=N5 zI%$ivm(A?SK{^!P-~OXuFW zMcAgvbl4v9g4EM&r5NOcxSI#P1&8qIKlW(0_t?G*63MQ{D?!5=@nR-z7wnCJ&|T{& zC^tV+PH}aHO9S-Yf7lR@Aig+_+P`2SR%03(B@R6ZudvX?I=uyQZxVo z(RIT+!fM}_OYn2)<3Q#CX<=Ei8aJ{N+0B&V?k&cIA&$K&3V7s653;GY%CYluIy@5j zi&4R%o4c8(`FHq^;q{D?El{2ao|50x7H+;ewZO|ZX?vT8yBZm<{OU(+79_)I z000QqGIAXa2-1yBQWmx5oOi}qv(T6KSV9bn?Z`|VhFumsF^Qpcy!~VLOS+-wHm6e& zA?qHEBcJ*z6u$YC2H`KLE{&l-4we%;Ywa8?YXhrgG9I~^s`W-h9J#q(mxB}km+ z4DDLg^&;XR$fX&}!4?6EzX#7;9ceqBF&O@viQOGfOPQah1aRNuReh7X z@EL8(f3t`YJdnJ_9NIKZ>wT*VO}NMs{?Lx)o`KwbFb8c)715&-)P_x zB?n1XtL?6MIx5f1{6h03bYC{T-2C`L#~$94@5c3hW3y`wPYSrXUh*-B_1n3|TIQB* z1cjOo()VbE-gjduJGMJ%-O#{i?!VH{3^K8{9^T3v`JCAc{M53?2mV{wgKa1Z%oSxM zO-O?8lgIxuZBQ*9;A*5|^b_;pt?N7V`^#RKsmV?QT1hm;G6x^i8R9nNGf?dgce@Pr zH{rggIPFT3z~d5z9isu^oz#;X4@sfsz*!ZdS%01uc5jFpm_1nb5{r$PF9wkFnR5#j z86)r%7!&oFdd))Yt>zB{jBtgt7(LY2b|~|=7w~m5SXtt-9vMYgF)3Y-XnAKH3UitXPmT!+6nDPZZW^OgyNVIK`?x1i-QX0|j!R7?} z`R|o5PVCwP4=wjq($C2uI%VQ1rWAmbN&`k z_K94qTczc~UHxo{w<~P5NYySDqvoJ)%3p~YrFKGE0|Teqh9ghA&dI{gLpH?|lmE)8;}5>}(-+b$8_MDt zY&-GY^-7(JXu0XXQPF_2^IR&tYaUY3JRWJB;5oaCzO}nRx*qWu@qF-*@x0(!#k(+Z z;A!uhsN&$RUw6~k~;R3?W?eN>?tc$1SM)(W=b?lD4_dU+I>65^z_2Bwxys~1DIV4VR~EEbSX$5Fh>{<^*0$Whj(PsgWIn&3Dcm>%KnT;PC0o7KL6rCyGPcs z3C@zIyD}9vIq{lhXt56eQ%5inLELBlmZ~&wLpLK`^%FjX1X4{EsSWXirb>hFIdc(y@5T?lG_sfwb3q(w_v$&f<8~Q5N0BfyCGHhr@}7 zBjqzS)Rfq(d&2(HyVybF2RuPd2Q0TT4GR@IN?^)@PhHDlMm4^Usb=#LaC$^0a})e@ zQJ6u|P04KT0yvL1us#Dz8AmEvZ_&Hw)Iq z>R{puSCh7JuIw2~4c|f}UdIM|+G94RnJ-zR&1Eqh8T69W?=XIgEmtw>V$eEp3K%}< zKx(JVvaqgpCh?t%OquWr=fs|2a}K6$f7%{6`v<7YL@_bjqz4C1B6AqYXzs$|_uu8+S2==EX zKO%lcCoqQhM18+r&k_|3zEvTyHGEjWoq`QM>a(494Z>%fWvoF|M1>K@-uB>5HH?h} z75NJmo#*(HS(vX7%CmkBDWoO8z0n^Dxq`ZMXcD7!<*%V+y1{JIeX8P@W=GnZv!%u zs$Y@QscBtiz8^)qzE&-~&#XnKw6r$dU)cMExC6IJFp4UiV?N*9ph#lNHKm;xq@H3D z_ph{)Z=kF8V>@bVzPZ#=qpJFo{RH#ZNJqfpl`G>uW)-;jetr8%y3o4?qluwph3_Ob zo1+hbFv3IwV3DTsz|1fPNE)#mv$heSr9)b<&km64=AjU(qNd^tQD86Z$&R`9r|m=_X>R{!k#WYX zMxO+wdFI@aW6mwS5~TYfq}@cW6b}uf^~*q^mt~_0g|kao**;b2gIA+latf;Xa`9y2 zU&-bw`iUFv&zbKV8YK1EM{`vN9?1($7@vB6v7cLWWX*#qL3@3f`w+VIT^p`3@I58t zUDb>F*_X}^GQ5n>b^^*e^SL>ZS?=5?KR0|N9f>w;$`CjKOVf{3N^Z?nOp$I;Jk^}=DvCkjK zB)F9gfSt@6~!SB@1CBdvfhp&*==)ve z1KW-Q_kwD;(;Dp0Ndk`_;C7Tg?%mYE54%exg$w(cBnqolgeh3tf+!coZ@*rDUsTPK ztPyy4uC*w6xsy1MA(M(E z3ff~R`sSq!#gS#%vP>q0ZG$GYAf9I?h4y-z?~)Hl`6eeM@Upo zFs$#Zy;I%h@*3d(=I$)eM%^2v#YW*q#A3iLmkL7f=6ac5)YJPij0IyWQ&sN+bo~83 z3~*MtRk*3`0b@1#M(GQIwtY;zn_0RisFlbU%Xqb@->tzk^KrxAr!uL$pzRYUPN)2s zUeuoju!p}0jc(9XR$df!#T8$Lkg5x8uYQ}zb||WoAdnNCTq`W?eMb0rk1&RoHMy#< zsattK0=GlMiGw%Lko=>;Z(CCB$k^lC00k*Rry@41B|Lk)YkmrdFjLukKk=71!|wzj zdVR}@;wl>nl=zwR17p;|9%nCp9(aC!)W)^4DBt(U?szlbjdRZ+3uhsW(!|i^3t)IL z&xXsgjP5i8dBP>(pCy>uC&c6oWW=(qS){eRLODx~&Dd{1+oq*P9;l;J!qNGLjL9emj4EYgXPRtzX~}6$6RT(j72cGapo~a+ zA}*U*e%yeWKXhp5dU!QQE$tuy>f=|aU-`op7$MMX5m>Nb5fZ6hP}F0mYnp2vo8K%^ zc_v}1*TXnk4b&BK^ATq)aCUEJmYQCduakf)=2r>nKRlXJUS_&7sVXmcjcsR45>`d; zAb^ARUs#T?MEwfoX%WFM&qRCGHXxGorKsmabj3@{2ukDN26x~-!l`5I!1|Q8jHl!v zsk8aZb^cmoha-A`$4q&e3 z->60g#74HcepAojXrUUZpu#`o#~)z|0gCs+jCpP86>Az|ampXMiijFx2Inr&-?=4I zmG5G*Aa8sx8F0P9I2Q?*pl086fzGRlR8@aQjRRt4TQ+WO;S`=t)M5YHPhBr*S{D<#YHvMTphB(;kI=;klWvxXvA;$URB$3 zfBEB&e6wGT%`fG`iGfmHX`97d*{>B(&pB==!kD0pe2hkOvDkt6>xJ4}ksh*Te`@lT zWeOC5ve*t*|1oD-pY}+_?-twQ4-MP@kcw4Y%l#&5t73yA$}mjaGl?g9CGW(`t-om7 z$%Ma;e^IbC5Fh9i7g-OpcHJ7G?=-WCI@Q?ziHCdu2)I)S;y~noOxAVcaNO5~Ii6|4!X!OCJ$vu9^ z8tJieGF<@OVA(#B8T!S7zRR^b9VX>>zvqo8_j&FnesNw`tzjHsNO=|!#sKL7$ReQ; z6+dU#UXGuAJ$QG+=X=!o5X6j=3N7v&l_F?LJso(nQ>SWEiGL$pSRu;mb zzFs?9sS+tH^xtS?AdFZu1Gt^ZZk;I9u&+<-;Qx)BE@vV2tFpF4-E}O=x^h5~71sK4 zajeB*{aPlqiV@0LlN&*~0EMWEnpoP70dd;TR<9PYmUW6tI1m!CT%m7W08d0kP4GRW z$3N|n5a_@+e)Z=-2Pve-khX@K-Gr}$qF{OsYD!xZtL!%bHVOE%Kfb$mjIzDD8j43D z-EUYHICAA-q>wxUy=%LT!fA^^BPc337O7%*K3jU2=-KdQukOB3DgmJ8g1Dw?1i`Ok zDPDu^zl0dRJ%9`ef^*qbHBKq^$I_D_h6P~evg)l}Tlt#lGhm#~qr7o+c^1vvb_%9p zbK<^ZIR)Rw1S-P%R_GG?GgjKYV>=D2l21jYJYBIm6x|lymw~!dbtCH<14>%jUeb5+UVWqtAZ#2lq9~r&&(ep2ER!w7dHKtj zn`KC!ZdeZnS83d(=`YO@jbp-|0@ux2ea^9)QxVHFZ~NQ2cnW9)3%{- z@U(DOF4!%6WANhYt!9HAXUJ@xvgnfnVHKD6sUV%rf$sJN=#D}e*0uM-rO(>9i%KRb zy&A53hOFq;8q^=;aY^shy0pP7u_oofW3ka0*P@iR{0=zD^oC+>B)U1jLw2u5lR;jrNvFS}(*$sd>jP{B=2bddVMr37};2G9rkt;(rdW!*F=DxJtRXJ^>w!x*j7 zzz$9%%GVtKw|TNR9s9!Da&V%+B119PE^LjyY~4+7T7FZ?m|dN4qq(kOvM6Zvgta&y zjrn>9ai`JYO_Xb;G3=bh!6CP|i494M%Ed2F`!`ulcVY)y@^BrW{x_nu4;Qmb04Q0h zB{r1J^~J}@tPInA(;(GCXu8%Hx-xd)`$rK) z8yB+=t51{*EMgTA-fb7M(y&F9C<$>xOa9R_pYe_Y1r)b zKKG`&tQVm5u3_0{4va`UE}4P{zJn=Y>a9asat@E0KQALR|KYG36EHP|2ILez8=*K5 zo7VU1kBm}As`In8kk6@tRlTlXkhYTzQ^e&j>iJ>3k=YD`ggQ_S(gT(UG;1PzoiKdy zxyq&tzc`wpW;GoUMlS%7f1cccn>OC5n772p z|1~LGHg6F6%O0Ne>IpI2+Z>->!I&EN?SCV`eGbx7zVaj6oO%}xfY#uZRf;#tnl>#x zJVL_Dng9khhE5Y<8QDJ1*L1vy_)9h^$8t;5rT|9Fi19&r??eb9c6>NzJLXX? zRaXN6W^aA~pFYx&f2U<5T;m7 z3cJ3(N(XP9iJOhN_NX-jDn8hV>SyVooo@Jf3Mm%1aR(3)>4lljzxJ5z;?a%=dPei& zmwUJwdYPIgjYoeb`0$5DXD^E$8`{b})L}PrP64vvay)YY(zHcO=E$7?1?dSUFz zP&t^}S~Uwbp+>A94@!MTyD*(e`Zg836d|c>9CFSZIy{w$vIVP&xGeSmExpc^|B+rp zkfD)w+SMRET{{aRps}7 zFu1i1&uJKxm5Fz*JzxuCDa*K91W`!-}@>ZXa&Pl&w1Rm&rLmdO4nqXxDB03HinHNjOC zOc|T|AL41jGpe*gyE7IHSwU=k2OHBci=vZkZmd6y3OOda)ED!s!`4(sL2 zky+-t)u7qW@s?9My|uZr$p1H=+qbZfP!IR9z>?0WhFF71{IZ?I{06|w+pYiY>6cI^ z0;kd^jLhRrb`-9iG>es?K6{M$a=6|Z#Je7wV_?kUbJKa=<3_py02!tI+`^RtDjKv} zt%hi(4Kv8c)Ggri5(an+2NNQCGFBoF|%#up%QC^N=-p-RH3`TsLL{G z+v_0GIW9-j?Rs~#_idZbf^~e>T@>H(IKlI0$cO6O;q~;3HwXkNV-O z>sAx$goG;~E6;l)>A1ut9{}YL`l<$$?zAqyMQXM6E5q>-rm;|b7>Z3glw{UJ9riMF zg~;eDP5^1-qX^o@?Ao-Wt(ZXpa5G_AKHLzbQLUs14*eTOZ-tttc9clZ+6I*^!HTn7&$A4E)dXYjV*)@@oy>|3ZEh z_V_Qc?+0B60ieXz;JO!$sdjm7l5^1wG|;g``F9N2Ml9R%h*RU=(*U-!BQ^%Jpglln zW%L7(HaS!O%*W)=#s_TD@eq9qN8PnnsjLyE-tgAlnHu!yhX1vJX&jj%(`Zs>v!t_+ z2b zGT5H#nnxMD1;#}8L^a`2;uOrFFtufjePsn@H%PJH13Av|UqweyTgdnS%inb8{TT*= z(4DX(4(JB_cWt!SPtEw?1rx@z{?GS99lSUCHq`IbHpEkCxen7CSLT*BOV`%(ft&ax z+o4ecwhk+wXu{d3y{XUW=2O%gF(ALfxmWH&q< zJY!V_$Gm?`K+-Qu=_`H?&!~k}jeNMl{jB56)EyDVToCeK;d0Tn3&Udq5H(3QRB5+v z+@+PvHU6Wt@AUac=`z)$kuPoIg3%M%l|>VQqp4ark2ymMbVkHakpSWqaAJVBxa4AP z_=vD>X6LW8UudiYY~+4n64F!m`fbZ~odW;!66Uv>h{adhzvLL;-vWfTc?md9Vde;Ns0T(Jx-24~oBzT;YRIrf_Y zq=5yVQON0yOYPU{#%6n(b1B{b;3qYFlKha-F9xuSs93r-I4;vMtz>yW`@ z{m0riYNOhxQ9=vEU($+te_H&^UQ7IXZ|#*Dm#DbX=&!N|X$4raEY`^(yfB5lW`{v5 z@>sebnLakJe>Ny3qJ{w3EKGkmNU$kXJHF0Kt0`Up!zJ88W{b1_(+(L5f8V>2xY{3Y*ULju@wwk z;$N5_DG!z??D(5nE8$K&K-e>Zhf->d|DdgZv*evPX(_Nj8k##Q7XYm2@MkyZ5dZOU zE~`SbsTb;MkU$13|9&`i7%p#td$$-;f=Y+y9kEau<>Ub0mk9-fm%=-25z=amXpdyu#>c$&{2;PEjT++9NaEKANV_RFkaciqyuNtrHuu zX2rsf{pK40OANDrk#%ly4XQXhbbR9~acI3BjId9lZF8t?qn!x-)liRvP~E|g3xwYM z%#(B8dOVfR4;~o}GM;>A)jxin@T5i)u^^}6S{PaS0^-S!SQ{~e9YTBiXvspY+RuZ- zxS*bke5&U_=^v@^$nZW;T?qvfvdnh8XC6@tflyk{>_@Fsks941C~B_F$_YwFo*vUV zmVl6pV+N0adzmkluV_A-GeK>8Hq~{?H^*&8*+!Zn1b$~*2OBnk|WqykJFI47hW`+7efVU^z{|I$t zoY}kWa0U`LECx?>xC2z?!2Ff+>1Vu-kGM6#H~@_E-{Q7>Ilk-W6`z?HluX;+o7i_s zlG4L>9iOiT;afbdvMHVvyqU(0E`*!DEwVDcmxcz7c8m;3Ce?PQ>IwEXXL5PqP7HlD^gChgGa{kBeU!^$m7NM z;%DeVKUobxMCNcdz^N59O7z7XD8f-l#^D=tajMsRdrk}D>>zD> z>ox+*CLowK3a;+1YGXx$v&uTcWg8}f5|_{L7;GpLT^-L_3DWN_$=?*9-qKG}BpE`H zb^C4i?4yE#PDT%e(Z4K}!_q+P^dIY>fBYD3KvaajY<}q15juZY;6DAM8|V$jI5Xu8 z<5_Li*XwxnmJiS4=#c;LIIE$XL8HOPo3*eW!Fe{!IrYNSdL(wtz2^ZeXgyTUX?UYh zsTuCFA&0};f4#Ufc3ust#@vAxGW=B^+OCj!!xLpVfiiB%K+5rr$)u(RHGARbz4m4e zWh_=lARJ@pWY{{p=PHYNU9D0kl!BE~h{aXo4O8d*-X#(P@N(rNf*ba^^&$@J&`l*Kqk zKNl*gYWOw_wzeK;?y;R*^BS2NZw2hI@$`JNh7(kzegUH;39h^q=NMmP8`|tz&w<*E zOC?xCvR971g%i^ZO&J#a1*Qz!^g?%D7@4DZ{)2)5$Pd z`^HNL@|dzq%^k>Ga?UQR+9&K>}+ zW%P$Sz@09<-#()Gg7K!aRN+ImubYcDoJ=-m_Lzi_Jw$7w+dGu)2IiwO?MHf#5LECf zPEt`%u0@qv&gWBwMf?-V;ccB#L!*b}u#&`HDKOMIs7xEWh<>SFZj&&2s~~CN+jjb) z_k`xaYt|6QL`(_-)C-DMV=Ms{+}NWD&T#whr4^bDXrWGuGI;TY`_Gd!nfFakF?wr6 z{eMHcGxtYW2pX0-@JY-J=|J`bql#N*^j&ktp_SeejAC4!<1huL++ckDz7VuqGgd2M z?oC?{0`BPkeMNrE9S6_T_=C`%XIV|jqF)2q3+ONVh|JK~Mz>JpwNjNSPk0rkO=A(*IUBqsSzrdyFcro`-k&cG<=gBsi8h{mw|)BpVV4MO=jo zo0gIiG}={Q$}p0e&+#ZQpjO1$9?ZVCIdxI^ngM*yFS=Mz#Rj7h6>mfS&RJs2p(D(E zR5CtmDA#J;{BJKnffRM|kgya)|1J^oPLE~N>eCmtevv;Fd`3?ipw`jV-4%Ym6T{U>%iMfgA;>Pqg1E*bo&o{IHxxg0sU;3j`r_Ckbyg+P%u zS+`N8XeqYggc-9m=q`tt6@n-UUy|oSJNOQdP&?}Sh3Z9NkvLns;7N%_nZ)W-s?eE~ z-|^A}&ly0FPN#2jR}P=S?gK2;)kDG>hF0HioI&cHjL-tl%|EJ6O`q!iH80axfjQtI z#U|rOt}G`EwdNEq4|aK<*&wD`8W!`sx6F{yA6*YJ;{N%E!4w`BtCUa!X13-62H_Do zzk1Cy;7>nr9G-mD4D0vk;xM4u`A!iQx6}(joUkGGL4UOH3mDB3d+Rk8>pt9lSNznX z;0OWJj4U3od63LQWD{HeM?qe7padb;eqj0|7off#o^P?9RFyAVRty!rt#zXWDx1~k z%%QeSSfE0sn*HX=XzWY%iHYJWv|hm^CG!szH3HN?p;i7{FQrofyWevC6E(ns?ZV*3^cxvH$j!g)SGfKK;|Vk~vQ2*!k3_IPhT2=TtIMbd zfoWbj(pFA;ivnA`m*F?a9`e)T%z4lfLs_O~tQ&1cC60pT=?~eP$hrWbMY6sRopSTA z4yf%sA5x)~d}!HbfFX^#Q7HhApwQ?Uv*YN%W8fgQd-FHl1p4diAlehR`GyRj@jF5C z8LHD3$=`L9A{T!=s}w^2VtRV|EB{r%sN_Vu{0O}Q^6mCEv}6k!{C+7OG9~@egqruT zZl_v-ved^82AO|vY&mrAS6nJBzWj1z-1&&|IJnd|?f_Fl-)vpcy1- zOmPPUT$&$GpJn2#{1_|s0s&3$@tCk$DO(k^lizUYKjD-7uh42s`JZzo@zlBalp58@f40|j(hk_zkA{&ye5-wTQ}>Tgt| zdY=N(c*=i0(ig1hZ@53V<5QWz+LpF}cq-yAOjI}H7b*|>E8V_s6He-56-QFrK`>jtm_#2nH0-NCjF7R-wQcg;8e zu&pUJiG|r1Y}~~^60G_PXREz33j$nl1??5ZBD^Z+?hcC~;(!)W<=oc?6bvSexkZj8upj&H z*mz7SHhYsFWv|mNw><=)k*j*&0To%=_a{v!#7EgnjlS9UyCl~40)ovD**_{Xc;Hy* zNVfT%?hp1ZJ!waLj*kKFKZM*IBDbABAIzR95+fLFI!pQKM(erRM?QANG6AxrY#3QC z1g2Z18HKrJM9M3gZj7%(E3B%c@7%XS$sxp~WpzFT%Gbh0`qU?qBfM*P7cTZBJI)>+c3^M*%56McV zkLhb60$)wiMnp*+fGw0S5~j+!tf;gad>5}9NK&tnO|4<+SC8sU=_zZW z5(i&nGVEh$jDQQTK=eb>$jdt|c{q8PtM&)^=_Dfiej+cQClH zzDFbT;uzOe$n-9@OloNFZH#lFHTsnBFTC24z^6z1gbe@QEk;_6mG72J+Dya7l%)ma z($4cGQ0mHOA?cAR(7XldiF?amoqayd6gESK2>pe3bL6e?f=8G6adYL^HGJ|3hPc6^ zrb8FIYr3=M1kG7tBx9BJ25(Z%yyksn2bonp8^ir>AxHYolIa2K3`T`#gMa{jiB-+H zbJyaKoxVk2KJayuV*3;EU5Kyt^fSjQcup8Pq*2acL6sSp|TFo~2Xj;bV zJ7LPmY}VZU##OSO6>anpeFPLme~}Fz!)Sc9_rwbb$($RzuG>9wb;XLw$+io!kA(f? zc!`N9FfdfKN9omuRE0>jxJSi)uR8}jf553`UL*EBmyWkd`U`aL>f+iw+f1XTQa!q;dSG@4kUA-6nZ!0 z>znAVRzW@)x&uQQ6Oi(0Xaii*|#@-9?#9B|Z{gdxW|)I6M@_ys@;# zuY6U217@K#lI6$sZVA=y{`nW}K_|gOiFc&r28FRhSawo!@3taMgVef`~hLwBiYSmh`j5K)ncV?g5%DUw{?}CYGgqI1`kyP2#h6+UChcX2`@< zKLQ0=To3}P4QZ(%M%On2feXJYv_7IHD#%?NN9PbnG zQrqawI;G?HT)A+5GWUvF`IcDE;jld7^R?1*^*+{zsw2Eg@qkMkJ@1E8yvc^pmhVdE zFSG=P#KdD=+iY|Upd!X1Fk7~u5eGKTAMLHYw|!~OrgHLz||Yb`7-}W zY!}y7egCznj5v;=G5={)%r%)K){~C+q`5M52j8aALsmQ6;d09k9vvdImT-*qkYN?i z_}RZL`0({0NGU5Hd7J9Fn2bKQEDn8>3hlmEt-2pywH@p9W}dgEQD~a+E3Ya$lU?iB zp~ar}gwo{jHIUC7oB8sso_g>EUHcKqCvI=oZRV^WE z=E;QjdA(Mevn?~}MB1vTh(hA1s7zd2og~DpG0pac4W}|`qpP50VJ{s73TfaFRrNVa z=GWyUSn79keQOu{!vP*|R?@YOJ<9aCxJod;P$h>BItw3~KRg|vgk@Fl-a4HyxL!sb z=n4X6Vk~6)EyYdWb7-b^tVqN~3yRZUwxoI`I*O0EaHI0PnIS4*4kWxq+hU=Y_0V|5 zc%}G}kcB#7^G?*tCY5bdPskkc+DqG)gF6B7J{- z(dxKR&-mmmUy4BG2W+d0=j_&C(6L9l`L4Dhb7Yc4(faC7N_{P6B@!Y>@xzoc!0^23cEd_i`OP z7@7bgs6t7CLuNS{=7e}DXAfj*eKcH_X12%TxC^sInAmLX38+Sw8W-0vM7fi~!>L*8 z;`)@Z>dC-YLg7T5Hc!pEDf^h>LsT z#$!uMf@LzL-&<8=M#W)S|A*k>SVHUn6Q>Ef9d(757L?S~MvVt8AhwB^R0_;wav-#uU}-3|7wsbvQb=R77^ zz4$db0(76PIJ_QMoGKbZ#I4~ret+YDqM5z&I8sQ7uR$z($c;9}x;cmr7W>}j=!*hc zj}212IUtWa-0OxR&}!LgPj*a1W8`L)ZbbTZ1tWUOUy~y+Nn3SZBTD@zl)NL&AE^#VAL0dkJA0@Q=1VLnn;;GuJRgrXU(C=IwAAcX4KWSEd(`*()gaiQKQ{=P6+C; zffWMDqQvLm!qN!&ckZ|6wTvL3kTG-YM3kLH0+?|W6q1vCreA+wI%S| z_|S0|@N+ZsC3+swWv;Q~G=?n5ZkC5>Od8ya)Y3aMoa9_=-MwFZl8J4S(UFLPCQOp?7HmWF}TkhiYDpk9Y&FP77Z#+=V)_r?B%P#5gis8)_etLJyMGWuN#i(ys*Z-=g9m`(n^N}y=NF% z^xWEF{W{?gF=VKr=PhPZ@ZcSfS8o2R#)F~JDgiL%x5=Qh*1BjqkNG*Hf^qf=S{NUi z7~A$!GLjn;LTC~icO<(b8!EIQDs;B6Ed@D`E`;1OslM3XC&Y}2jqwShK}`%*H03z_=*{U6h<7^0fiq;+(w94KxxJc={(i$=^bUa{nMUG0Jz#b4kGexYX>Sq(OmK^CnF$#pL->>}jlM+!<>>B@T%e1X(}q#z;5 z(S}KkJK#YsO?p5~q?vq(9^!D>`YCcOWqlz3{Psbs_Xg(#yH4OIn~E>}s&tvOK*y0h z!2Q>s7J<1R^4!4l;GIXo=7uBtXC>{s^p(0dyf~KR@Ip4|Q~a@Dqog#s#p+DionuO? zk^N4qmyg@?J$xQ_1%hP z29_7z2hmn;35n%HAM-k|_1V=HXXNXhg;5hjK~%q(J3^n2pJkPM34rC+>6cpy0q9Z= zw0Q4*QjiLUv>6jWdDjOP!ID<9qz*^Hu8e$XxXrjoS{l2aZpgJX#mY#sBsWtNfoz$S0R*%E}BL4;4#wDbdYe;iX4#Z73tNj*N=O^y5f2c zg#IDfKk`woLB@<+pzMqHt#RXGw`u+7XEQ!}a3|Jfq^Z~srKbud*gMR$)JW>8Hljfb z!qY-x#wvu^C#S+67o1*JedAQ=mLy_#r4NC+uPU@dQqbG-0j;$7liPjT1t$`a(?&7x z-5JgNRWRggs+?M7l_{UQsqeOR%ZILT_Oe7qLS=_>Z^^dc;lAR|u!8I7G5k zxwxV{qaZ`jreEX6gChhrM>NKQvtN8B*pyzRefoAK!O@tq+UtGhFR_w(s+GI-VA%|5 z63wCE=ak>OOm~S9od^j-+BS)W@IfQmVgzjJqSCBwwY?DjW4zcO6sE`H7o6W-W78cgq6W~*wX)i0(w64w$zbSh*%Wm^ z4#@0v-tERJ*`dQzSP-R^z>mSF>4vPrxVtLoeVf-UaL6DbI-RcM3@)+3VxR-#TU0i@ zuAYyxbjoMP(`sET z_B-D^zx%!xNKJ_Z;`}!BdyvG+p;mrJCx>?6#AH?T{u~UOugB=dH|T+NXoN=DH9f_h zdDmI#oQU>4NVM!*Puz#E5x9?fIi=tk+^sxvxKp0v|XL5irHvHzZAt z1`FY_5xtWwt%g+@&yW1e5j#p*+TiO-BQ0U6UwKhqyr<;+m&)-u;z`UDxE;c0ymRrF;*R!j^NS0mCf zvC#2SR;4{QckbW=^R>JRNIcPX0jH>^$EMsgn0trq-5&sBHj)mv>Eiwh)?IGmGZwaQ zVDEJ;RmMlsSwQ4XWLj*GlS@`ZA;6%k)CeuTOJ6kFij-rKW8E6V$xb7iLrxkN z#Bu%729ERu=ZsT16JODcfQ2|}r*nzcphZ~f3zeMo21xd2NUhx?-lvtu=}nN)&YKkZ z2C6K6SMiURqgoT4BpoYl=O(}Hh>RQe7az9I2Cg1%TnwwaYkPPwJj#-ovB_yk?@rbl z6I;qQoJd7?#{OW8Csr)nAwsKmdO3gXxwo4>V-0_6MjXl%BRUkQunm^WO$SlNmWkP} z+(1|<%U6aghs%f*r#7*!zW}k5^z{pjAiR{Hm*x59q0(>9QTtJ%A3oyI;<@Gi(HP*s z3C(?NvMFfv=E~64td$#O&`1=hdOwj3%-}IJBN9YyAzK3%%?e(1+yQFk-ozRvR%^Z= zR!BAi?qj(lfRjgqCm^Wp|aW^)e|PoPs)sy5vC1ps35nu6cM8YVl}G}DzFlDhGi(xqeR z4LA|OfHsSfV+@=o}oFK4zQqDs)M5A2Zbse>nGbS?J0v<{&bkSRj*6vN*sj{ZO3SLZ^?kuo!~Gmy~VekzyQk z@44B!z*)&0F7&q^)aKzdGG>fZ!zodAEbmzTs~r`J0F%$Xk(UJINYqb`j9_EwpM(KT zmG>ePz+@r^9`5N{EmYoosQu)Z6u-1eUmNl|VN-k(G8Kj$VI0CIigB1>`EmW|`Q%Ka zBM^F|to(Ka4_qDI4l0_xrxi_sT%O6BZjimjBTaarNw3Q$_NdW$mQOZs;}$i4gJ|nt zVSVnEP1y*Mh{oN##^F-&bE=NH8+MDW!^~F`jYpMOJ`6q`KYl#HrL1@b;#V4!ta7xFY9H7)riM6^oz%GQOL3L zaP_*He$?LaqJ?@gqB7m$>V})s>yyXxdP{A8hH>e|!nceS#th<&-{6z5OndLw=2@f< zo)4C>I1XGD1T^urHl!;q~Bs2pX0Ge)(Tph|7_AmcW2!MXj2cH-y0(ORzm7}MOse4CVn+thkjLgS%WtSaj7nA)Uyq+gu#(Nk| zt<`HtD*58pb5GBxW3Q`sd&?SN197|)iD`7PdsSZS?#BA$wN&E|O|Hlapz<%|#fY)W zWZ?JMF!-aCN%AZLyB&5b#+n&V8v=_BP27`gZi|z#?y47FS7+`#aR>V-L=4x${f$Z# zig9i!0>Qs9mZKp;hGXM)_rB@BV(=43%>Bin7WV~{x}Rb)Y<6DMSJl9hBhB}6?W6x> zOcMQUR6W#j&B~TxbbMbhWk6dSQg%E$Hw7eV`q5(wWY&h4%(PI5SM>^zj|$gSgZ_3- zFFTm2RJlDs3g=ox$Dhm{&2i2<&KxCLYtF;RJ=wkJ+oQ_kc`*BuVD--FYJS0eeFX@i z+EKx2mm+#?tl+RC2PG082?0UC@#l_!3on=YP$5@r$=TZebU?%DX11PWTeTim+$otL zg&#_ZNs=bO9po9+?#kFJg-j`gp5-BM5g)#p08iA@e?J*dXZf)HFWBy3Vl_^&GqYC`^ z%zh4l!ptP@Xp+jpO6;$ONR<9^Vu$R*JU~7+aoAr@livhZa`*)z>xc&*)K2n?k_)yb z!9#+CGp1a5azH_RRD%50chTYGDDNRYuYk=wCa)yj+-zfQanV9Tp5b1}JtWK`K&H1JL^d{eC^WNhQBKs9?O6b8_8Uy7 zg|Jb&vJKl8qW|ETTdrjOrUVV6WN7z0Jp^NI38;RQRen<`S=+8xhToy-IKr?o>8TDy znIaH2-^*^lQPTUuevSU!c!fI{3NnHW&uAWw)V25Nq*N4VKqgpK!g z^`_3z%LxdU_5Fc>zaACBJ?~^{6t0xt8^z;2`#^y)7K*0KZaz7;Lu~P*ZtbFy9D5#d?(l46g%cH%@Kn>EH?-0Y1;{GVF5vyz|5 zzPNrqDCWqJ1#~+qZ@$k}OP&>m}D7b~ly#M=l(2@V2 zBXhursGgO?pY7UDtAsLuoiSGYhfw%cC(Uv{TqA`G|An^g2jC%qb)US)$k_MDSVZDK z^*N!%R__d;E`O6uu21Ii5K3Vq!BHbd_&;@kkAV5$KGYbofSmbtCg~edTwk-jWF0{c zAF%aI!tmdwY`}{L{{>0(;I$3#lK+4rAG8~N#i#$ieAcH}^#8wS{d8oc{#zGxds5tx z;pgCgQBytXNV-H#qiM(fKRq~EH_00d5wAH!^({d*9GvIr$I%ITuUUB$MN4L{flE2w z!T*G`NogCCZPPjLb_K@)R`06YUZ#ZcRYAe7@V`R~(#Pg;viLUnZ?_XYOq{Q^YEQ5% z*$;%{;Oi#*gYl*?f493gj^1QoVq!wP6mO;8RTW}J1-(@Xk6`{)5Y%P4DU>d7lK!X1 z-vtH#BR6!nF{`-!hHgn#bu|+a3^F#Ok9>tya>c>*qyUNp*Bdz*Spc!{PgGpovvnQ zH%g^C%+gtotR$ahdYs<#Ldwl~O1rw^7z{=_{sw4hgif0v6?L|ldD3G2$bqO`8Vf}H zL`g^Y1GqbkJebDq7|L_r=w za_6ZkE2Hx9CJ6e|Ul1YsN42zA7gO@g9j|@qxD#;eSjZ_n3#=@V&*Z;3oQCr6*8PNT zi6+6WXUK@HfiN;#*m=(dFcuPe(yLZ8v9cCRBn&Ghx+d#C~{tzR-+coSW<0?Doguv>_rUCU%0Pf%ltQVoDunWoJi6M;B63 zirv3vwa`rhY}l`*SNZDUwYeyGtRWvhY9Nje8AcKCG2%uz2~K~f#R}siG-g^_U0vOO zv1DcASOPt<036pfpqByK&HU`P7oomTaOeaC6MKnpAche%QZbv$&F)BcVbm77Hw##{ z)bW>1H~|}18GCycBLRWVR+fr&ifwbycEtHqxC|~5tUK#4;r38M;dh?YQK&dd=q? zSQVlQPFgAgo`M<)uxdqfet7j^!B0zn1b~lD>2Ml2TV8z&tvlLUG&(OJe+G1NAaWdW zAeP$RCAO;X@E!d=F5w4V06-S?7lVz>fcc@sr>4@d51Q#nu>RtmCNJ`&Cm`DxTLGLA z-E`81a&^gRM;zW)(uh85C)@go+lr*t(guz*U%zB__RPTS zl$|&}e@b+`ghe^C&|a6*dD^4#fL?vtaHVzdrh#I+QFrFxt9T9{fL|29dwPI%6D^8F ztP+4BMrBP+HDPzZYr|aK8A<%x*9>c+lJZMn8y4>wO5QIBy8|I2BA$WdQ`yI#+sa-c zQd3j$fVXht^iSBwTOkj?KI@9(+`Yn{9-+p!>jwUHEdbym@VkX(PXNWpgUTBq`7GMa z#PGEhP-9?7`_b1R^UPq&mr>^_KewoC>4snamyD#QXi`L_(-rQ{@T46&mjK=%lxi87 zqb&B9+T2&=BtO8(rf>T4UWD;ht1E4p_9$uCtjjQ|AXoVH;@Uv|{0fl}pycy?{>L6^ zk3y_8$eThU=+J^NSyuOloi&h${CJ`YYth}y=16G>zJqTH!)N$*C+tL*^bL-e&0{s# zTSspPB9oS)3u(|(OS{K`)&xpZ4b*GtKzwETmGnxEEUPPSv*PUBoZ-gJoqNlYRgO_a z9a!3N(EPK-^E`;>;H+H!#kTCbru^4`=-PP^L4+(>)3}wXY-<~ z!!%SyFRo~SZ9r#gB#^lJWn5AMI8N_%U&*L*my2D@rGugxU@A6hm61LczQ&`zb8D7Q zq5e21d^#fqY({=^ZK<2pc2!;Pj&&9TPA}Kv-SveBKXW=CTRyQK=5f44{Ay=nU7yjg zcsiFCw2?P5B6q(#otE9GHAYEJPS)8oW#<4(p|IlceQrUqbUE}>WM1)+(|UzxDn=%7 zWz1XLSu0)3aT-`zxiacJv1hT>O{lE2p?4o{+~Fi<4-ttgpF%Ylj?*|x#q^D*l|TN;nhCrr$xC{@tK2thl@^C~d|Fo!~? z`grVky3n&vVGKH2Ix_Y2Fs)eN7B`28#9}kg*v{1ibsg*V679Qvw@e+MwOUEjB#CwI z2OlIV{PLnbIJDc)lWwD_ak78%*DBKSsxGiAQrQh6XXZ3(k31DYD%NY7T>)z&t_(cj z^*ym(D{_j6G)ZR^kfoYI?Ag|ZgL@yEL$e9u*}}u3Q5Cg&AEy@3+ZGeOeNWcKd9W_L zz2EyqoK$vZ#M7wO=yt!;H!#4TLB{9q8;Pe$X8sYn-|RMdv~L8ucfH5(?|!EYw0e4d zsb9`n?o0*fJaT*H z)P5*`Aa9}F@$T&84w!Dw_0x2+=EsgyM{>(AtyzR7=#EZCpTnZj!(LMrFX722}780;n3WbWseE;rI4uRvFyt-ePE+EtBF z^N_-LAUYt|>7)nZv4<@sT5^SfRz6o@QQJAa7oht1h`t3>{@Rd_dI57?Y!oA z3ZBHus5tm^z*`5LrI}4+}y*3X_wxx)O$mN`pe6__Aa{{e;kG0qJX9yjSE770G_#-)@Vep8EvwVQky?g^$ z;*t<@0|Ppo1^E>~(#Qq7DW3i9GZ`6guE;=!N8D~F-(aEV#IFYptX|L^5rTChm1$#F z>zNi5o7+W2*8|v>8hKg!^-DGzJ<#Og=O7ho1zvF5^5?22QM*{?W2+-jOsXo~VZom$Td(syFPN z!%R|^UWD|(swze-2A#3Yw;PHKw_~cWM{sWsJ5la+V%03Z8EE}{8nX4cgKd^7lBo^f zZgxHU`g#i4SR~|145i(gg*C*ttx~u^GddkgVGCz%jJL8Q%`ioVqv8wK$%1z1WMuP- zsrjc%1SlY-wus~YUTixz_}-k-r3BRqbw37|ok=-j^4pXwOEjVSU#C*RzfQyF8Y4}# z`F}+Zj!?ZB;njM(fW!RSFr;SYFkwIAPWrp=o@^8MR4yIGg=viFFIb|pMg9?$>`Ytf z%0dHy7P}W)2x0C4w2-JhWAr9LcU;l&# zGFH~Ou`wBD=D0<7BclR&p_-FfC{ir?w*%g(&vKb3M&qlN-JdsHNi^Jb^ZYo@Gi1*j z+f@cJl`LFhOhfpR%vJ}k-)3WUwqld&*tVWDX`69vX6G*(l2T7= z`%lSK2)hU)4UR1L^5`{(&AY<6hR0kASG^`?!v^d(YT{+8@GpMk)$EVjA&28%6hg9a zJ66Rzw(0EPO-?n;I=Wi!>GxR%oW6b@fY)@GS$-*J;S}GH6TD>5)6;7My*=Ywioq%M zR;QT66d-LTe|g^QD3r`GNNsLKe!ELo^3v-0)l_ZRAVY+}Y5o8XV1YbnMo zd;0WZ7Tri1)jO<~#YZAviR`2q!zyo|Tu8&C9nWz?F-rLo5@yy!y3Idv*1kf_?RvE= zepGA4)-DE;GZ1O41bek}2|~Bo*p70smg0LJ!dc*wKGn{6e)H0CSd~P>3tuk?i zYP48mMl9pw<62ENzVhN?OS9+vC!JZYU?|LKvk5^e9=UtERO>aWnttD88=0ejvQQon z7-;%5s)Tlg*X(eoYFq@qA4Fh&u;fG$0N60oh{zR>0*=sBq7o3STb zl3uST0Q-3rRj$0V<$4;T$&2&we-f~{4lmH_z4w2X8hDnixROK3W^q%%Q3K=;Bm)+5 zTW%w-0wOD-C>#|COH~s%-ViZ*W6t;Y*l5&&@q`H^4*jaB@5nt~G~iH9EjTjOnWA(= zcLq6770Wf`n0&x}-mq;pXFiD1gTUXncqX2RJ$@$7q}LkquA02AlA}oAN!lsl33}Ei zC)L;(x?^%JDn^6O`7o*|??dOjVDE%a!U6Fo>&LO`1fhp-qjq<#2ZG~a~F{wUdWjY^^c@HOjI3rgkET|Z)p&78;?iX zSh2n%nqgm`OKBDdW7{lVsljYW3wncbV(CFDYwJ_u9r%`0_nr8pxhHfF-ql)6r&nJA zIPIdquueGpG%ov};H0+E&E)2ME%o|fa;5j=4X?`3UBYqi>G!eS+l%Ws@agVs^k}y5 zXr++>LM#{X{Q;c8!*d$dCJzjVJ+sK1xVr6+;XK`*EDB=55>~8hgOPvEfjJ#gad9!0 z&myio%qkFsHr)+ z5SYt5_6%L{pjuR}GEwUJg&LYT&0F)eNTqb!ysq-&dI@Cc57 zeIyS(hCLF&pHwvP@c9($qYqNqFsW9vSp{!9x#e5EKDjS?XA)mw;aK3JQ%!Rz`!c3B zt}gxFdci1KgcawrxhqS5ZQJBJZ(yD!NZKmiZfs(*Bm~bbf3`WqaM5ZvUNx+!ygYx? z_#pY=lldcqY~F-^w|0PH`EodAg?yxcWf&$d<^)`?h zsCKOqIoTjCH~7tS!LMIYd}xwgJ<2;410OIkk==%`{s^OR5#Mz0MXy;Es2YkZ<9kxm>Y!^dCl+>k*OCKsq zN=V%FF|bAn3P0xHyp3B+JddmCc-WFks+;DOKT|Pua0Y6=y|6tCmkhOAv)Y4R>3$6W z%n5fBK=(g?%7(s5eyNO3xD8>uVEW36V+$goJ5$M*>r|ZBAk4w@*849Y-1MdSq%>vo zIm*am{AC*D+viW`6N`WC)d4jlm?X1!WN+Tlo20ZMVf#@v<}S))0JQi`$mjbq$qA-Y zUR!plxHnGzGuh2M3x)auwheyE*NB ztR;pxgxbt%X8mTD^|$6LAr@?Rb39YJ+Llmi>f(x?CvOY|g)YgD{RV(q>Kob^ zi)Y7E(29E|=b7r+v*G9dyKC#c1u}_|lKciIQk>~&E&C5$w#QLlqHmYgLc?U!Zpxqj z5y7^^o{)m>j7_M&kbEPq-8(Ce++3y68!2Sr&LOQHlz>nuI0uT}G8nz}9$P6O(KhIndH z168mzA{(*@`5Z@D@5l!CH%8bxUBY<9YH#v&PQA)UjyxPYxIsZTewEIbi`)7xME<;+ z)@oI1LWhBYvv6UL+t0S)_!^_b2Ge9qr=7eRnqu55%aI3m+txUeoD^J_ zS6-oE7Zku2j>l;UM3B>=3z*mhM+;-3tnt-|pr!WG7#4_dqZ%|JAq(6uDS5+u4{O`{ zVgj#JlI-oQBJ#B+rhlyHcj?^vC606DH)qV%fl+5`^GD8ov~_F8@QWss{d4fH$wS%b zo8eLK{gvfx?otukgsDz5l?{t*<* z@H;s!|92dEkK8j;=4HR!4+y!d9?qBpvVoZH({H6b#wHsmR@ocQq0QW*&jFXSlwUjhnD9UhThD8^#9f(|gm+TNi zG3eq;%*Lit5b)^_=}v5d1E#>?kns+EVg@e{H)c6sep{<~uf9&F$G^P1Y`jxx7}u}H zQz{(&&-?^rckIG)MN|}&&7bn%&!R^U;f2{VMB+r`v+KVzIW3$y&hLU)?GgX#IXu6? zHyTI(Zq#>3w#)yN3OFA{yEUp-!<`R7_9UmnlFsec<;-5*n4>5EXJ!RHJ$`55ETHxm zbOa^i30{kZ_DkoAQr0e%Tf){ac literal 0 HcmV?d00001 diff --git a/source/search_and_replace/search-and-replace-results-buttons.png b/source/search_and_replace/search-and-replace-results-buttons.png new file mode 100644 index 0000000000000000000000000000000000000000..be37c336be8196507b40c5a262fbeccb53a53157 GIT binary patch literal 5149 zcmZ8l2Uru^wvNI95fFpYix_$lLX&cU2nGpVV&R~42u(-`genjeghUjiOA}E+ns5LC zL+=4;0@9>+0YmSh+`;qiz3;vKec5~R&zd!B&#blnwT5`xNQe16_jwQq#H@>eBSE0E z5a8JS933#^4R@`wEx0s zdf}Wf9-y3p4g>%(;Q$DZ^0f1CcE>qm(4b2UR|Nt5{3(7D9-?C698<+F6C0_cU` zs0YgCR8#=x?1lm;>Cl?KMfiKy^Lg9X?0N8_P;IXtN=4aMr! zE8VFpT5V0Xvg7!ZKnDkh)RpH1!tA66sVV_AXCT2Y1bP4d{rB(RzYPr`3=It>T8mX} z%-9o9vPw$ybqm+sEbmtZTwvyxvO4s%nc-ny=5 z7B|gc4})M~Hj~@_eZ&$1;cnb^ouYJNglk*tQ#kG0va+&SA|jWYHHw^+mV)y3_8!K{ zcXoAV;S&XG#s=;44oRC@K9p#s&tr zp#wL3M&~@5<-(ndMIbp5)=Q2gq%Hv^ymGm0UTS_`4?p;~qUrda_naC`Ix)|F{Z5f- zURW4im1SYy*hO&k=l~5?fXMaoY!;D zF^Q_M%xr@Fn=90PDKj& zl>K(6-ul(7uX&Qc5Cl>j5FrB5S5#1dLpjZnBff`nCF|{s39A#eu%m;`^pk-4K!T{< z{PS8@KlE2I5ficR$a3*~nFTHil`qS!?Z?BFEJ|1uC*{xXZN6*fR<~uk<$w6ZgjJ4w z(G(N`)DvQaAUTW^$k=GoaI%yPbTWhjKf2UM=2L=X$a5&tz!9g7iMuv}%k8$AR(BSZlL&U`3 zU?LiWPs_s$TZ+ya!I8x7x%Na-0EwypwG@)UTDCua->Aq(a~j$tSYy%l^;Yp$tiIrC zO-go}P_9T$O!%kVX~s1tiKcy%gDxv$9eo=`;MJ4-2jJCb|fRImqoMJ~wIg>qbYi+@k)Zx=p98MqYSOP;Po% zbqICLCJ58e-);1vx#;gqKNddeKY8fH*quZjKEIX{awx%8X2&saf!XL!#FxLQAre|$ zybb3+9v`wj`L$BD+2vO&k80_-4{j^RKUNep9qAYvo?iH~Ec2e>yr{?yCyx?Z>frvc z`O(*1j2&!nxT~^SHBR!DKi8Rx-6WjoMD2FrpNlHA_ibsUB!}nA0)LI}pAA^S?gY&| za`m6l;oUXrJ^say-Y=|mT);<(4vaBBzQ&l>!#Lh@{z@_{7%Up^TI@nXT^PIE@aFC; zcY>K-Nt~f3);;-fxHQ|zoOQot*22d_ ze%UX^*ul}creGpLy{I+7%~Y&Z*K%4nIofZw^*Z z_>ZW+H|Hi)M|Hs9oV)kd5qi|omoECZC9DLQznDEt$M`w$P^s9UjRqNapVdYM!w#A2 zYxi9&>}V7e3WlNy1jM!()QoN3_@Kjk0g;h@Tw*9tT036hwfxjgE)n&pWJsf3eDhGs z(MbfDy^k3wjy1c`Ru*q2hvD8DwGzV?YSG~S2w$NLlk5&nahNpN@F^QOCn&N5EIzm! zGE|#~%B;oP1MYI(&>P6c5@~isgo;Mzk4w=T0S~-a+8qkURm6Z$OIArB04Xp*7_BlR znx20Z0)Ys}D1wW+O~jfvW#txb#Le&oQn2l869uUYALADArQPqv`fHyM2+DSvkYa~U zZfT1Ocwpc(I}vIA{SF5sRl6u7!)6$}DXxFm&e11BMeq48&d|^vSE*r5uSSs@nA5%(y4HdmN@RSm3yOtB#d_w8jXo`Oahk*HgC(n$c%ljI!^^U4<>pje(f4|C@Fp#`&uUW`L`XT&LGrLq-CYr** zJo;oJ;qFyo2(q84@oi2Haem(69}Qm|O7R@Te9Ht>&$n;EgUenOk`M?|=pOt-F3G&$ zD|ZYrjEhT=cxJnX{lO8xfS#}Y}WJaT@KY-i%vAoICqzPd!4h z)4PgfEA3tN$1hX(eP&@u@e;gI@I`XlYPwlZL_nN-YtyB3y{ec*{=-k2hxTUd46>Ka zGFIZv3uZbU6nP5?aUrbHd84!IGzOMFGUb+umJRDPAJ@v3f)`RZddqs+edjCm zE-}b*%Q`U}tP8=Og+nyYZrj{4fWDh=FrJIPcr&A^U-l?RBe|z$+_JOvg}%FXkf1#gxHujc#nG{$w_}+}F5-7c)h)?mBW%X8~&onlK4!iD8ipv^1Pt6v@J` zLJ*P|nDljQ_g!09pv58iN^DZ=?3fy+#^C3a=wfAD>-8)pSk(UebNJnkN;Nn1jInW0 z%8B~2^~X&D9Kv~QEoZYfxy!?(4Vk2Yh!ov;^){OG>^U9g!%!|FCvC`+rkxCML(c$w z8}dF-Xo(yvcqz$8mXEK&z)FBIpBC=9MZR?P^3xm8)?Vqt9f=o5zMi}sHd>pkU%o-c zI-)d3CIV z5zpJqXfPhgq7*gg(I*mevRE0K=*%=>_~OdrkfQJSb&g2S$vQ3&H;tQX6;gF-?}?8x z&D#11X?I{5aqq7^LcknE_$kC)WMGt4VDd2EsGtU0f0-4xt=kiZUO<%Yx=1-ZtDNs-xJ z!t2gSWlYDuTJ~KauUm6&hrTm`7VC78CQ=v9)YYYrW{@ZJ9{F26OS=NjVXAmE@8UBr z1-Lj=gZt`yn!{$bg+bL(dj9Ir(?TB@M;7ySukRjP6Gk>>bk^%r2^_NcLo<+;jN3v{ zP=tu}(r$T4`ytyyP|y)m`iNqSXjR%TxhwYGb)5q#6Vpi_t?ZN^R(4su_Ni{$NgS7^ ztT)>>v6HGC((IFDmc>fUV>MphcqL%cAb69hsP(pqf`M{O?pGu}!042mVk)35Vm^cSq}!7`J+z&{o?vWG?sRmluh1n5A`Jf;NP> zgiywz(7I24VFmPr&fbc2L5v@!PX0`9HB5fUXqvJ@ zLc_G$7+pd$GMZ{=ZWYX_9LyAz8}pmiL{a%^LVB9kv%+mRpaFXgZ9BJugTc}TV)nF7 z#K;cV$(w+MtK=YcQrFD_J`Ud?_y=1tFt{a>FLP%(@FM@y+n+-V>$^R|(j(QycJlJtcfkqHAp&9vr#DbwH&quAZphdG>jE^d+gX zM1d>_B>0;|0?3Z{@rYsFk>#`zJBW@;gG0dG^|hoQg2r+*|5Nu)(2GIu6JDQP4THWW z1*@r={E=BF(|0Nm6~DvJE*tL%h-PfyoTOEcn>;dJL`1~*cz?m!#ie(*6W|-M+KCgs z$-7JB;{3k@t0e$JgG_S@|Gx#Q!(A+rF9y7>rG21!SWUq4fN|pz;w4&J+$83a_s}G;Y2NZ0(VY z%kvO=7S%CkFxZUlf0(bJNJ{;$dq99?=%uBl)RhR}+_K}tfKgRNlAAFm`ME|lPUhyQq3VbJjg-fmakC_{h7sMvAU z+IGqsc4X`-dNJ6iYpB5p*!c|O>%d(hj?`IK(6~yUuH&HYj+(5~qtr)M6OJj>Nq}|< zJ$R_3Cmd}}X7T??n&~^-Y@$p4>n8J6OTRsa@z-5df3!e$>J=tY2U~wQWH(c~oO($- zo@CmI(Xy9CIm~LkyMt|PkFty0@F=r{z_}zKDk1&GH|1^RTk>FsTgwu1Ff39XfU-PpV)f*LyTrDg+5Mp!OE$2$)-5(|IQ#=5 zIbTAXbCy~W5B$@+0d$E#XukkL+vWFnj|H64sSuFia_824_tqL&ataIS-)7zND^{}0cn;Jl$^m=s|3s~!kx}o&#OkS9doJ?? zuQ@*l>BM%%{O-NeJBtrEQ=?F3n>BfXmfB6l`Ob;$ip~%Dt)iuYe9`LSC9*G{loWa+ zA%m;Ec-)g@{tBU`z<3*YxCwSKaMlgWviQv~hxtzkroMbhJ2HUVZ&$wh#2OPLf2tiU nuB3iO4?ua}1Ji$(&6B0;^(hM;XAXd`U?5#>BY1(9_0xX=o5bxM literal 0 HcmV?d00001 diff --git a/source/search_and_replace/search-and-replace-search-results.png b/source/search_and_replace/search-and-replace-search-results.png new file mode 100644 index 0000000000000000000000000000000000000000..ed525f91a9aa1497d9da12f953a67a518caeb89f GIT binary patch literal 55307 zcmX`S1ymhP(>00*2o~H4!Gi_}Zowru!8N$My9al73GVI=2ROI{cXxNY!~1;yT?^J3 zdgct()z#g*cI^(4lMzEk#7BgHfIyZI7gm6PfRclNfHZ=K16p!v@=bsb1RHTRdk6@W zzV~0q1X>gVpz(u)gtW+qH5gb_a_#~xBAov-3Q-=QJ^ zcM#t1C|VmiIP2LNLTK5%y+8i(e=j$+*SF9E9<_sL?5c|bn&ID@RrKtvOs$L|x(IfI zfwm9-ec#be-w@*F&Hw2CJtkyrX=!NX0C78#*a@`3y+5X8>R@3AQFJ;*1p)CHLPGe5 zl1ut=yQ_!hY{vRid*f}aq=spufn~!s>=I%_b=o=>l8mecGYmZWw7<@tbgYa~S6gN# z4wnFx0AJj}T?#52FH!6Wn1>~!kCdF1Z3WVLKDOJ(@VBqCzJ#{H&|=cpS#8HPlExAx zieCwmPn%aS9>f3I_f~6P#+vV(z4y}BV#*d$Lip!iT3$6JNEwd=f`HV%L2BgeNLd3GhwDgu4n)EkP=y)hZNd-HlFRyZbVs`0IMzOysiYW*$xMrdHm#YPkzl!GQLm0XkD`I~C zsnGM6s0}r^sgqv$J8=vO>As62v281QGBUp&-9=NqiaZ$_}s8`bl1*oc&oMR!tsLtnH{y z4|?Q!&s7u28=?dRNrA?LqE*D^BmOZSv&Ax;$fn7zpn#i$hsz1pF)_?A=+j}DKYlsu zy;2mPj6nPi^Cri$4;tedjllnz0aNq)bXX$ghoJ)IO_p3HCWVQIIJp=F#}^DPpK}5g zM2-CIq9;(Pt}IL}I$IH@MC?p4wWM>|QJrFHsl@LhC=7f-z}fenkbuMG%p>K>pdc|} z4b%kx4aS(wG)+bF6n@=5^cPCpkq6P^QYnNBAsDEMmd*xnn`|?kiWivPl+rq&DGm4| zHjnR7p}`}iw!p>(MeiJcR%-9v#w5iN!E@!HR#(IK@cjS<2?Yu37_TQ-%YZAm-(JFG zB7#3G$2p*2Cv+9@cimk+?^n+mXtE)UCL4Z2GFF(5!c2x*juRmgOk%YCMKU*GYa}qKW%G)%DD(K>3aEx7cUP!679;Qu`!0n$H&3p;V)!l zM0t||-Pu`Hc8CK(;GG_$M*EjV#|q76s8~PcQjtVRLkIg=K}&ixx$_5)Y;ii(s^|xb ztLprM->mpl#h6fNHR<$CnhX|f+;f#5c7y}cW7A2vlw1`s&!1kXLj|?98I;Yj-TWc_ z^^V7Fy9Zr(w4eF-t)f0qeAcTs0)Fyl&7uwQ)DmNYkPezPtq3C_xmsKHPY=Jau!Q;f zc|iF>$P|X9v8O#e4`Y$j_{fw7%GZU_v%EpqFScP_aveJe#FiBAsaF1nbH; zF?in^n@^ZIUf3hm?VDJOl}>*FD_r~e;qtoJxQNv&!$2YORYs*RYo5N=*5e|H zlAh5Bz6aV*87jWqygc3_VUbRYEj5BK^fIJ7L$O9Vxw%LgGQrauU0XM~)Yau*{6c=j z8eDS`QP!pieD(n!K$0scDo&W>CKRE?T;930v$C>oI&f8~mnV-JO-)ZO(^Eh`5j@QK!*g70knW{8vO2cRzl`mH8v=jERSqI{BaN#^>P#Kr4QD+&=$Dxc z0d&S6^f)tkh9U^qW8KsS6f&7vSg7e~yN_-*9R@PiXp@D1QnI+U6DNV85%cr&VRkr| z5wX5}|Be+mB(A^p>piMQMg&S{V=^;?7A$rRw1`GWhw8&5s3c&`WRNxj>3;BKMU902 zR4&&H88y<^?TQ@V%d4zJZPyl)81k@SdkS!9>Atw@%KuB6%wy5;9=gZT1vStnq>07k{a8g+Z59 zVPPXx@hdk*ay@p@V8~()r#Qr&bu)=X?Eb+)_udr{R@Dm@WvbOsA_x<6bL^z1!I(uu zl0r=1^9u_x;9)pi&OeK1PY#O55)%8P$`Hc<^T%hcQih@9?e!_fP;JmX=rdsUpID6Q z9hhFKFj_=9wHkN{s3)H)v@sY3MTJR|`uWEX;t~=+D(A##99W< z)gqKDOBoqahUVIw%N1#v_=P6Bt;K&;Y>a|6vq5*h2{l84gKo51K^&LB$HmRgH{eq* z54ydr2$8TIY%3fR2kgAQzK%{y0~3Ky*QaIqk)57hB3t2tKPi`~`gZGPx3_zi)YAR& ze_yHS3b{AIru!3GpV4$z+XNll=y`d0r{nFrldG$u zR#prrCnp?)D0GQR25Py0A%Fi;Xtuj0cxiZ7X%#6K;cfo=9Qut$u7>U^kg?2Qh4*No z{;89y&1p~3d-USYoYV6WW43ZQ0R5Tk;zNDDGh?Cx?BX#n30e=J5hXdAk?by|t$YYUsV$v5*gfZKd2z&kD zBaY%OSmW)!-nwX-B)H}vs;Cm7iNQitdceWNoS2yKnKXfz(c?}6OV8$h<$K-N$Bdx# z#d3YbtB3lft=zp>?+x@&d+M&N)tL8J!Y_~O$zWEt@8N7i)W6lUm|2EKhj#vzYi#_o zMG3~pn-o`9$G5b^F!xLyVTG9%0*1}i)z!er0H)I;KbuUchf$@IU%*HduDRJ&aFqp@ z6uj_5RVD@R`tA;-NrMMZojfWEtYiBJAqPn6OwjvhXH+aKALVRXd40k~h5DG5Z3Hjb z@gq10WfT+)1aeDD!=9f#n3-7)&dvyuu*?95@@{@7!}CRtse>}CH?kkcnUhym<|_!W zv%i|}c%fze{{8ax1L)xJkWi7wA4xq6n?coQ`k?DfC3sd4qm}mSR~s%O3=2;M%J0bC z*BcI8s#Us>j)gL?R7@yd4@FmoP;~GO-$~C>BL0hKu3s{wva|kU($K24wPL28_}M$h z(qD`vQ$7w;*SeW-atkaHHRnfuO@gjVKk1R`; zR-a#}v43(RvJy_3vc^pO)Ou!Xy?V|xE0M+wX*zPN^URfc(z&{-eR*m34KG4Z79{CY z^>^BUH8v^9J#EO{>D8!{F6m-^%`?JqqjS$Civ`c0_9UKqN1|{pCey0hs8(czpXlJu z`r+;I=^*Mp!{ZbMb4T85_KlWUf-7_Io^SK50-rPEt@!}^B`=bHp>AtO-{{$bjesiy zDb{bikc;it+Cs=qR;JaD(%H=m7kHRwYDpi!AUk_|pff^?uzC0cyq=G7O;-dYICTeGu>8UP^$2s^SSn6ToXwj43YWb%Zposl^4D7R^oTuJTP zKTH`qdQ;M%)v4a6bn3oZQk@kG3^HTiJnxj& z>hN#zsmc5xW9KVVr%5=Ecc^uKd#K)zPbrU(RvBmA(UpZK%KQ+!&*+jh4&CM-njAY4 zw0%aTi@3C|z1)SS@;&hdlWBxia7y zmx$`9q57OnAxfU@?aJ!v>x1`Xec^z8LZV8GTw9(XOW<>t7>VcL?THQ^_U)t?No4Dr zxq`w^{-4_)4v(8_fmKxRhu+9}6yGb89+dgqD$&(5l{Z&E$=iM9y~nD&AuhZ|w%qy{ zcc*}}Gpeso%R}K@=~wohogD{f=ctk`-q*adYIqikQub<1ci$+26Y(iT;=xH&2s2Pv0p*mW+&yJV~L5GxKeo=VZ~R^R4Hn%x&w;dv=S(cv;y|wZ)!0 zk0>!V%ioGW*g<0rfoB@ZRY78G8ci-!-HTLjA7!5(DA_FWNBD(Kbt-1%Ui*@Q^GUc* zJuEq8c`i&iI^v|Ucy445j< zK@s1MEUC@^mHo}mj;^a?O-)M+CW^uW)=)1mVrgmVZW(@#l$$X|58uqpO!*=A{w>Dy z`scw0OwuQ;sH?nDe6z6~DhjZRqiX}b7jG6aB3U!rjCe`3p8Y`0$ zHg?0yKG0u>>RszEPnztBjNaC&S~@%n;)5(x772>_`ucrFy@xDbUJ{?!G~V{L9fqM! zpHQ8rZV$b88gEt{oE)}TjABZb2KZS!hKWF4AgYz6`{04Bnh6_5>(^Hto~sd-XN^%3 z*ONMAB1Gu&yUW^J_18U?@$(TJR!y4G{I|Q#Eu|=C@{ELQxN&zrC&gC-tkF)6!314G ze$@WzvY5`dt?%KN5U^{U11aopnZ}uF5_^m&=grK?m5RKG)G-f8e>e6tvYy%5;`$H0 z-;kn=+Q!fLI@stcz~pn8bLC3{^77vf4)8SF7g>*8%3RvD6%-U~;DRr{y!@a@{b^Ni zG`+YODpQF1O6|O2n&!yFKLrJ%uLmlXw$Co3MLe%4C~L(9{GDsE zKlDgz%HFZ*9jeUn*l^7kFf(5kBZo0f^IB!r6EDs|_HE&K^^q>EuTKwAlqc3sgt6=E zgG#Z44tSA{A4QD#*A=gx`Hacb`P1xk@UEf=38V3J3yRmx(l_;}IJDt1`-|TjXA*JMjC&OLW9mO~>To?Q|mRdfL3_qNO&H z`{x>?znx((9e?eNQCF)mg!}pC+aa}6W*(S;Xf8LHcn`&!)_BaZ%4En63Nmo{*n(?3 zL%N0d?H=T8Vq)@{ztiWt`70eySxiB$Ra=(YywdJ|Kb!Qe=HRpLLvh zdq3en>}<_?+>nfcB58-X-0m`*O)M<(O|(A|u>J2NA|j&gX^eXde?YNZ1yMZ%I|=MR zzK1#{Ekoz6mN+zAvuVT8dj|xjfm+_}nr`c#f6%deFQ}1JJjAqQU*$+!TDTS(-?A1u z-^#x|`~+a9{@ZKgJkSE-_2prWS5{V*1Yi(pBNSg2NfKDZ%F1c}k@YYuRp8u(QwrzD ztcuS1!`>UT^WVR5sk@*Zv+gA-X*v8DkY$}S!|p~UV^ov&Xm4(?&UQaeC;0K0(9TZi z&e7)eCwRS{wqq=ev12fdk#FQn&Cn?73crgMxLaQnzA%a7bdl`laP7vp87sVabOAmlIuPfx9e zhb1qbUSOVqY&9$P;R-~4mdLVqpjj7>71|T}cOjkMi8zstLT8AIomyg73}0^8E1j6koDM^h^+HijhHB7tHu$(R=vdC@{vk*V3)Az(LyEy~l` z(&;N;He-j2kVe*Q|A%=Coq)7;1C3SEBxm^a0$HZEkSuLv@$yn+4-Exm2UAm1Ot|6Q zLpl0}a&n^&=YMlq?&;RzUmtnlc0Ks}_xW`}CvVJe zKl_%%*|zHY51!ez^}i7(&s(*fxd~<+7gGbIrhSr(Lrwa`!LN}?d*qvDyuGd+12tx< zJ+9i;(jET$4(bh-Pt1XVfvjw73fkIZ4VF5)+e1;H?@tnFO zB<608V-?la8SwB@06rup)oehQb$uT%EA$(ifdOWl6=SwPB;$qD+#n-~_n)lqbi4fR z)k$xTI-g{{lBE%unUSB5b55RX)NpKHU|%;j%urqn8~4xN*gZNQ`R#=(3veoW0uDsb zX)CrRi>43e8&1G_JH>5f;g(AsBTr{h)+m^04TJ{{_-)##_z{pI63416GqTfDQ#P$y zCagvVYKU2lMuyXKYXsi|3aRt#O>GX9fTUD)pjgpy>#GjAghuuk1Q;lfO9?H7R}80< z*E8U9B{`umhq`-c%g~U5gD|p6;qO;DD*zqZa!{JFOt39-*A%PAviq9WO-`l=$qYs) z-zZ?CHs{`~AI&)JMr$y+yu=#9l8LQM${ba31TSY%TM!EGHK$s)T_czD=J=apE_cTC zXY6rKBTfvbTt(Niei+Ll-F>1$abBsXeEy8;iG_oWZ8xW7KA?pS5#0Mj%@vO?E6X)7 z5D5t>{NkfH{Z?$HCHdYnp1SGI$OB=b6>-kUH$#MrBWC&e{cSpfl;rJ4Htp<=gu z)$b^uSQt%ln8{cn#TN?$L_CrxFF*xO@CA`_f_gV>fPFb^=_Im7nUfF&SV7?LXI%zD zrw`WO;W)wyoyUOn4zr2pm$JU(5z3lcdlU0kEJ88lbs#-CaQIP}*f@}^&b!CJ)6={5 z^i9g_?E@o;$;QOdcO{Q2{_{C7oQWxCw+6qvak^=p-TAz$w%a|Z?V8DEg9oQaZ`Nb$ zuh>lRVIaE;+kF@Jy&JMr#~q2QDR0-qe4_88y{60kCvCTb7*bo5W`23qwkC|3$qIkh zZG2OWdk$e8G!%qF2c(YMn*wk@z`lw z%*UsvD%B}*X=$Rut)E0(tosfjW2o(vm#V*l*j~?iuf1_Nw1rOoTtMPDU-)}3f+}VB z#yj0zR2&Fr&huI`H+5XXb#6Ml+SC+%nOSlS3B53%e-?01$1=NLP?+IZp8^MbU&jaC5x09ncZ`X!SB8qPSrFHN(St$o18Bu3O&IGm^*=zJzQH4WxRN z7a4UIosbYh2kwoe@++gGU0GR~KY=!3MOQCp`yG6Ku+J27$ZX3i>-8v@s3@`7lF4g_ z$h#&a6a5{ZNG6G>T$v^ELDnxu4imO@<%d}bCl4XEE6=C=zkff$`+!dRE!arG_^kN# z8GTY@wBUD+u)MrH|F2rl%Z%A*!Qc8osU(KHY15dU>heJ;d=W>*$;s6h=ykLGLTX8= zZ9|qtC@k<}{ePb}EGvu*bydp|Lua_ngl z$h))WsIqZl4KD*VO7126JC`p&T29K&9(;T21dwhubiqkGGIvSiBLFdch%2i#{*$wq zqy!RRF`Zh8q|}Ew_Nov?1!KwS662dd7`~%M0P{#x*c&{)CsY_G7vD!h*WS*nmjuuY z?8~z5?(XlF4Fti>NOv0tVVQ|)WCy8dd1#Y-#Ae8@%a3np(C9|?oRvvRN)nTi84EZm zAvX0)En|gY$y#3K;o{;lF*hdzxY-OVCk+NGV}RVn_PJFzOBg4p=3kGfV8ZhTfn)Lk3bMa)*<{t%v_YUhzH6NZ47l#@IDNKD+ai8wVnH+Ys zy3WK(XXP}NegZ~LIQnuGYsh1kDbo@W5n&`c4PLUUnZg@=0RB=fSH=|SK5+v463I%c zz;p%F3pj=O*Pwssc=6S7MaX6Dq5)ktam0W2BGIp7r6@=sDXDM)rsR>xscthOLlE$%5Q{ zoCC0rBO^aYb}4kKKGnPdI1a5*~0Pa?s@X>j(=Q1H^pz}}T! zb#me4S)6W-ZL3!DPdE#<4_55BNHFY?k^DGcwfTu~adjUq4S_O4aLKf61YCsC?;9ME z44Cg<7JYI@IPwm%cO+KG3R@mOny{(^0R_}ffC=ovLyS#FEtWSqHT&I`0amcrDJ~^Q z_jYn=Ny^HK*wFB=X7iNz=WHv>9GOr|!1V#qJJ;yy>01sh=We{f?DZp;&W1MV{t4_l z+2c&nvA=UW*CN*{b(!&c!#I9_s?53t=;^DGc}XRc%LZ-h>=rjz8XB6qhK9|XN1J9%z_ej7m?>?vu0iJ5@45Ir8fd7gyEbel z=H~;nD?ui#xznR2)}Q@2;MHVMy*f#vK>na33VM3j2vHW4!W6#+VIw1KugaB~KOvN;!}SNz)N?N4>hZ3shylby(?SdFg*CLzKruQmDC|@Y)pl(=D(V4tlI@Z zQA*;dV4t<9vPn5b#ohwxG+-;}GGRJTYj=0Oo)j}}b^MsLB;7?KK-yKTn03CN7iD*~ zE6s|ZvbeZqvE1~jbtNbuTo3}}6L(BVi;gZD7xM2Pb`5hahq5AzKF&G5e17$#QvWaAR!@P z-onYjjn}C)BiFT`kk`p#fLd13x6W%NLy_%+nT%>S_L;%jDv_ppM=I5wtg}%;@>270 zEi5S+U>L-vMz(;~2_v|sM0cQC;N?KpI~CS_gMM|Wew zdj6HjNz*eE3w5B0%V>e|{L+86ZNy2txYOA|gb+34k`qtUd=pU)Qqw%W8`+V0anFLL zRltUzb|WlMv(-w-dO|MRxS(;|pU!_WyMF`V;U830GrRX9+Er`AU6#EdphEqC8wN8> z>(^7$M>#cL{397YFsMKjg2m*2Ao6-zA-N$_#zmeIls^F3Jn;|JIJ)LlOJd0#id0^|p=I9^&u@kqcscBxx)j^{GJwqY+ z2JDh6MbFfwWFOV_?aHKb@_tpLi<>*o$FXSlU{%JiP90ceW5S8pH%G4rf1YwXW`fn{ zgMvWYP>lQ>Mc109Es~}SJ)ce?8`i)<=I-}u=K~a|7WwhW%SrhMdJ?V(DrtNqb^w)I zaDPdl&X`wi)i<_x&LK8UIUwA_Ois;xvA8ZLC4X)E%-ok0lREa%LKm75McVp8=2k?j za)5=k5}4#h82G8ocy-B0_?LF0@tB2r&MrgX@A}L|x3Qr$4i4%m@t8z3G%e@fMdK1j z9Q5y7MjXhDY7>Eb;gs|g{qNLH??FgtWj+UTm`LzYwn%Bh&`)*+`NYVTjeZN|GZwtM zc4;{VqEHg%es3mC>4PFvX!DNL~C;N9L!+xiD^^AtcG4oJKJ{ODrN zR<7(gTs&!F!4^1vXjtk~r_l-lNAa=zI1x;evf&BU6mF2f<1m&ZoZXp8gYUl@vg zY31P0{cE`IiCSea2RnvZUuC&AT6jksQbkSy@~crWixl2%j3;tGT7VQ*&r6I?>Y63n zVD40H3FiIIO-(@hO2NJM`z&&5eNvlm?UM8|9LA?gqzl9RTa26Mjhw{6j~_UkEE(@C zgI}I}`%$Yd4zB``-EF}Pz}kf_7R7FVcj)2vw4!M?H8nqvt6VacuGskH=~~lx`AKLl z+(C=Hw}Lxqxjx1;;x<*-l)Pu}N?uz#a_NK^n^FRulaq6~%@w1Tvjd$i{y-($=c=`% zCseCDN&f|<2yl?>i3-Us1>ho`@vx23%BebBcp5TBi$8ygDZj3!>Y#kp_aFY}bh>1d zz#9c}x1Bv-R_w0&7@Apf;*l}2RDSP<`-?YnPPrTFr9zL>m7kbCxI@Ozsty}g?ehDX5cVbCJkL4lD>PmRhIm)d>a#ue6jc%R0Ipv zEnL&|HEvmx1y}?Mb`QozN666Nb=lIYmrlO*BE$K&a9&U+e?nA(zu9TZP&s^yEyOuf z!3xk*E=F5&-3dg$4d{Fo(c?Twe-nIGRs#c}y&L0_`bEU!wGc@SBd zR^5qlN2INSAsuzn7 zr?k8S<3^GlFi=0HG~1TJ{a}CEm5 zXjO9AahcM70*K_<7Xn{xSJa*bpzMH3f57JE@2Tl2*B9r?s|g|0i}APT@!ri8;;^T{6qUPL$J@b)Bd`v)`a#*3}90+a5o3%DKALI zI!dbh9W2IUqC{&I@M5WPqqi#_kD~?DBIZx0ZXFBp z&ut{Wx-}^i&DMY)7ik*2e2+4`@!2dKxoLP}B3UzJr~qO+yR(x-L>_==^86z5O%4a> z&CSgc+*9d*+cb^eKACB|kS;>~y5gbj3zKAmhOaa$d!PFuY&2*iSj>u{69qS-JL&$jn^gHhL% zuZn+@Vp9L_9lN-8P>dqMQG|HT&yB5@Ff5a(@$V23#?N-+y8pI`KAGeHf03w{C`G|f zKPH( z#b)vkCr816oaf!sgPwOQV&2~TUY&p_Yow_C)XdC$p~aDwEe#nWYdm=EEU)5pCS6^N zeIb%{Pe%GZ%K%WX(no+6q5$x96Yr^>`^v(J6Oj4?NE^W2US538%eElP_Qn;HPeLy5 zkE4xz!ymg8vz)u&SM|T#MSuxp+KSIo*4CCjGJ=EzM}{Bq6Cio;@bJWo{!z7S1BuA_!(P^V3FPosshnR0 zyKKf|z-StKTvieY_?SGnA>{K&F4t(BnzD-<=i}}LR4*4#9zY^4?_3i3bk>=bd79be zel|Pv@A7ZCPHt^2h8kI1O3D!TS(`r{xJ62Uo@7aH|c?*0DKA6O(>MOX%T=!-k z&QDeZ7DR~TQA&?jh~0QhK<@=POC&hi_FEuBXXm!4^cn)#9cU`4fms@t856l+@g5Ds z!^7w4W#)60^4jt;fcGi$Vj>9GvZ)atU?1XD;)Az_!J{ApHd{cv>DJN;2}_O;VRSf) zSB)t9-$)OTMe+2!`^3b+%slGqy|-)sqD0ApU+4opI1SZm0V1p4gel;KaWoLi^*2`L ze{)LS_F@wj7+tnBGYRI@@QtnL?;s0iz=p^btHP2J^bBoAaclhiHX;PwAcBngR$tlHMS|+dpALh*mfr^$n8Ibeq^Ss@}brs0dPKe zI(T|VU(XdTi~aWZDD$T66C^w}B5)&4zSn13O13f>$PBnz2%9t^(-}xaU}>(eo4@UU zPyWf(;;zY|#rKt#xoN=+w1u*M^MU&7Ps6T_oWeQ(@6&&J4}=o+x;A=sC$eY7ago)d zyS8pI<*Uvy{Vl8AD)}1YZ)+&AQi*1Q{+vK=?m4-lM-kYBMk~5cVa>x-vE|JbzXtjQHZInZe=+v4tGZVk=nG|iv z>4Dr;xW^SIX+Q6X5Q^h!X`r5`N2!*jOGzzi@2zJOdORHwtAnrIIq1_dB?*gi39p5bF0s0W{e9)K9zhZBFb}13J-NjoTswD^`;p}h}m+^?X$WVpe;QB!(i{7TS$?sD)eUmiv? zD#^FWPJG5mY+tM|PUj0}A7gJ1k%miR+@}}!{pN4CcciAzo2BPV8Nv6iLJl6$$5#}# z8OY^FMJ^%>`gaN6`1WQmqb~7ctHw6@D>3+}L=PKnCx+b&Sex2z_4JY$w4ijsiS&d# zE@%?5stp!+04Bg0{^tdt9w zI9ySSme!ZhpDolq8E1Uxd2Zo7%$L$UA{XzSE%-pFt5TT8&mIiv*1l=%59t&BgHZE+ zsCmMM$w*RDxL}kK9ccaqWzb`ziv1l(>|Xgwi-((^NIa}TSBY+?UQ6TtwqEWbHbI9( z#kyxjqK}i!+$fisNw6LBQdOR*J@jweZC03SQ(+V|WBZV=9_sR+7GfcH2~9?X%Y})N zklj}5atM5%&@ZRE=!}6RJ+@Qk93Uxg>TR4>;>~J3#)-{O25Em>UZ`W9Ma{CR!RHT- z1XpJ=&{I7%CNQa$cNCuh+k;f!V_bE*r?DaMa2Jk$9y{l}J#`?{#!FO^kyz-^?Mgjz z)ssaK56zHdRb}8co#cpx+$*EsTbs&5hLzPmm-Di>`cJF%zl%Qjt3nS*RCIK%h;JS; z@|ffjzX8YR7v$Ug-9U^bzW^wNsH&|_^!O2Q60sA5%mDg{TM)NAvHe%x8eB1E#azn_2;cvjRBNGLEJj}MX9GTE_`3bH0SGFa3Bn#X5$rZ2x|0Td zlLU335H<-(v*yyC{5OK<>rUW1EoE9hV}O&vC>|ax^A{TT(%V87S3IY$_nX8>cx?tVmr}UK-;UX8-1jt%lk4Wo;XN}iuzlF~%qRg^wE zbu?4|IEU2(8kPSS;BruWaw*+$V@ulkCmlK=zyjk_D?LTD4*Cg;5njcD(noa>d{zzB zPQ2l;^~d_{&G4n&>ht-EU?tcuL57siv5`npU)rm`4D;2UMBZ@nM;gP299qy_UtF=P zH$7R^kMo|pkW$4CCMo~Ri;IxY98CHzQIe*NCcnJAgq&50m#GA$8j2Lok%1NFS(@mE zfI)61%)K=ZgtXm>if5$*g2SxM5Db zWlkS-qmfJ=AHUPgf0+G(ed;@EZt=WZ8T8L^^LpkP`)aEZ=i(%k;Mrq_LM9RBl0Y8C zc9@AV;=@0+rdQFAS9>^OydMV`GzdCh{3Ade_)iPJzYwzx7`CJZ_`i<-7M)1*UWw<+xpV zl1%DDr$EI*Q-{&&dP&fGK%3<_4Tf!8@d9Ccg+90UxA>0jdRkMdKhn1B9|5*;u1AM+ z9EQj*9s&^Jk3O75=yB0;`eYl*?Bm`hqpinO5r4Z<)#16h`5DG__@G%Z8nMf*Ht`m^ z`zis=7{QE}=HMJv4IfC0F{HCbY*sr6?H422?iE};`^Sa0W?+R_4d=9AR&dMVlovp+ zA(C2>{@h8v!&HX!qjcTPqU}zbWiD*@8~?Q*VWmZscV9u$#*>hW+%LMFh1{@StjSN) zVT#7@yJDNv`wDEacuSeKIpT_G7`5Ugc9)(NU@WfC=Ppz9p!Rmm<3h%{Go2pmx3pCN z;J!5J`bz-F_Wb*tHp;*gA&WL`?VB5w^)~y-sJ7P!x;6?r(jl8aqh+nm{VmV88qaq2Rme_} zcMZo$u#2x`eU7}F`a-@ZCLgT4+zNT{r;k?$MbsZ7m~enF7&SQXU){o4I?YwvAPDI^(xWWa*2!x~G!phr$72``Wh^WE+}_wfs%^E%^UpUIhD`?e?D zKQesmbfpQ&_ZfqOjwPR-o*D9~hX_sjR$y1GX=u8+NTgHV;TnqT}L5t5fk`Z>_T^)=_=(ttc&O z7vv!-LBJUie8#qWs5Caqo^R`2fbhqu`CCdv(+cr_iSMq#iUgb0Jld*1YS$SmK(zt6 z0g@Z^2UMcX*Qc{WfQ{%}6EhN}oU72;16Z6gtyb)E<**@>^h-_!dt=(9cc=Za#1G0A z9kLkOQzAR0U{lm$wEux(pMw73O?Ww(G>;9<5qRgCVbV`59kA zEVvv&TAlr!5!2}if6vWgDWnF+8WiN@29GK`Wq|%0)rN##!aCeJkdoTwHKzmx!4bRO ze_~Zf23FI8rY88bQ5oPIhgDMAc~=%uX{Q(N^L`718I|6Med>o6BH6yOB`1{mEALW8}cIPl9W1b#&Lkil-3FSOo~oVPbg zmZwvY`)PAVL`n_c zRLK7l^FOlr?mkNqOO3}l66bjo+aDxjgF07*uJVRyhnr^?CEbF!=8iV|KPo9JPpwR2 zWilEvr--ws0ipqf%G@}Ll%M8s00)rH=b8HK=fPTo-QEr11K!yN$cFnDNQjcJw5EWQ zfV7tH=@{u>867|dqWY{@i6v41?=R;56$~mLTS8Pzro(o0nL!J8r~E=E_a9&I>0g3KcjH^-j?s6R~a6)?qykqc*(8nC=9x zAa#d0<4(?X!N+eO{*RdJDM_G(MDU;V88YeHx)46GWuI9j@b!g2kr_0Uuf~Kj$M!rzrNZG)YJsvLJSf8nw!6%jIcHtpJFjy1Hu{9#S2}oUMr)v$jA0M*^zK zLP*`wVMKQV)PBpxCF8)X5;a|40DD{W_uWC7Y)~!nZ3+nQn*jgye@t7&=0}%kEQCBh zdJl&8RiNv@rV3zRO-xNG$eI$Q^o5{v65Iim#j=@YKM8!5+pJleHY2d~83U0HXj`o6 z8>S{Fhn`~}SlL*AGvNbF66|L{c9b?c0IcL=K&Ve1IK1CtCcwkB(XCc3D(4*o9OOTD zq<{3UysoY;s9XjaStXYzfBbp_l#(aVe)lQuw+sYH1*=GnjTY(ihQYDT{{>;=Cv~-P zpHhN$hVLF$@6wgq1-whUs|y!i2m`fpKyM+S)ojdGII*~hzWPBHK|K~Yh6OR3G;M4= zR%N;+icgRhO+Nb@v*kl>`LCR<%M+L>hySMq2(@F->G&xs3YV=OU#6x;?E~6EI0G9u zF7*;m8H1P0Q&bw165l@es@T@_MYZ zpv;4`U*s>qSB9>=-Zm!tuMVv+uuBT)ji!EoZxr~Q0~ zDQgW}V+iK7-GnhTGz1PR0(^BK_+Ymel|R3!DH%9ATA^(Y)L74tblxzO%_&vVQcWyc z1nsYo)5jodYHNW(=`}jq+n>}2gxBj%t-zMIbA2$)^SGa9U|=ApuHLiRAJ%NQBRPeb zFh>CIjs+avj*pLDzj2etq}Z)2Ev0SyA{R>zpp7+XH=$0F*Yn_p!F%HqwEtsOP3mfh z3+IAl{soT*-u8h1$K2{Or{yUx{`#d1RYEcRyIStoFT7h_6#vo##E*OOYHE1eYB-#C z#egLK;UTbBdHdI|UqO{DX+MEo0LTk@&jIxzb{GYr4mBfo7;IQSl<--EF*80$lMz26 z==Jrrsp1nbIO-?+a61K_jBT;8=oMP6Y?pz4DWjVi$4jmL=Hn_?+ph;>;r}0Ve;HNP z`-T0ZND2rjT>?rY(%pj6-QC?O-6c}e-7O;04FUqv4brjc?vDSx_4|9CbIv&D{TV}t zFmSW?TI*i(p7V2Eb1o2c=QF?Q)uAWNMYd=60AsMBY}hO+<5>APxM$(~rgyuxor5+d z2XS6scAQ>&sng@)zSRusT=_JMG<QgBhyz>1&wbkgt0(%N>?(j^8ZXxnfez zw|XAk+}v<8xPm)v9QoS0a%MusM&z<1T$|QxuunLV5;&|roPI81or?oK{-BvW8VFUP z33T#mupFG6kkf0XsIdQTyoN&@M|K_oXBDBo_IT33$7?{_ebC zr#*9W)Q{6uNt+tS6VKQW2N058%(Zn!l@3>}wj1xd@s>Bk46CSB2|8;(zN|g;_*@}n zk=P5QlmVJ3Ql8Ln;^MK1<3*3`-)M*h9|WwXzjy6Bj!#W>gLD(bQZ&!!mmd5e8%S+b zasmI)arMsokFS7X62_*cCkIW3A^gc^#`(|*1xT>T5u)fMJZupDP@+gtaQIvX-!#DbH*Gk5YRLq3O;vYa^#(!>5Ltwd} z@K!+X(CbZYu&KC5MW+}mthu%wva{eEu-4()R4bh`yo_uhI*XE>a1`14NAF<4A3MBEo{HK~XH^K#t1Y4$P@ z$DeaAcvxKa-a&m_FLsKt))&)YY61V{G7d?-au;?pw6M;bGi%W^2+1|FbZoWqvBdHM z>C~;BXI8k{cvEX{L4lBOw!i36(DRURVk2SW_CZ%-3uWW=+*50$=M_(rqqe#5T7`Po)m=J_`& zKLZ}Z&Bl!(oPC<*k9+io%NifRbNQL=vazXy}&kotTwi-$P_g{T;3X>(b;^gZ(8O@_3 z9GkMg650-c&Pcx8VD^*9Ii_Ib*HU;!@THpI^_%Z{ZBfD{`bx6s=soZ}Ex6G=B6>@B z$EOF)B&03gEnbhew@*XKfwiOc?nLV1U_pwBi?R-Kaq_+w%fYue+QTFE<5ibefyb@K zOp_~PjCfFUGoP2P-Pre^S$AvH5m8aO%5+?=2N1UgSfeK}7tFjoEs0K>0=h0JN%Gl= zewP@NKbpD-RTwpYL^+ReVL&X_w+nkxm#gA_*Srd`^5xjKQ=S=EnKcOc-Zge1HW?)u z^^x*M=xuDDDSFb!5p^Xj6))42a)euIC&|4k&JXH7JrkrBE5h8b5;SKl$MRP5W?5wouV{%x((KgHP7aU zH4}lyy{v{~{2J91DSQHAzrH~FE|TW;+*@%}Bx`0tQscG^@`V#e4JiV=)z9*|81h7R zF6p`BrVxC68;kZ?!c$kvWw!t&_p-t6iWqc4jGED`@8obc>BP087FLpOP69q+7GgbN zQCXt|FFWnUkfvrU##>Z|K>8?lPfpgFJkBd<(a> zz8;g66ip#9-{ORnwG^$I*M4}3g@SOsaOgA4I_#CUvSI*Ag3tUOen$<_f>G0NBrqRO zO7#k?IY*P|M%5%^^EJH74J|;?w7S|Q6&;`U_Rx|X;?IUa6d&@DftW;+rJ8WohM2@s zn?uYIq&n({%~z}8pu0a;ndY}57*jK;-6rr!wn(IW8geXc_YNcyYqovs7>^K)=7+p# z2WhS&kCx;0>Phoz`k-GzsU;7F?^v-Ov+T$Q(TatTRS_1`dy^){7{fG*Y0O~64 z;GhqwS|El(?(&qIqw#UuU4Pr!!@VaU9a!kWFv-rcu*=6DV33KylEBR2_KevjSx$Cc zd6HS?HHT#I=fzfCU7u?cDr)Lu4}SBBS+{u_kN|JIJvq^#!4@r1&K}>sKI+6!^Y$w4 zigkdK#FryVuwB$HkcEIu_=jrPwNS%7Bsw2>0&4B%+JCLVOBU=ct=a#+HtdV9$o6yS z;X-VAqNMNw+(pU#eF|UW&o0g}kNP*~(9qEg zUrS3Hysl4D)v8R%A&Bwve~TqDb;6I>UZ_cS5oHZ>u}v!N%gbbBx6gxx-xU_ZZn^Lf zMm7e69S<-1IVQIDA21D5J^s`l7CF@b~Yh;O3jf)BCk~$vX1L zZd*rGApDL3GpEsmb44DXVg`AB+u4BQ(3p?r#+<6*zwRJW?{6x_r7_XQpoMPrIE{{u?stDb zIW`I`S&mTAbhmdh^Z?zDjsyrJaV28weIEtX%5@7ay70oDhu!kI^S8P+@VeTbPO9NS z!yR41=Mq|OpLodv;R0pMXTkV&(RrL(Tf4WfX+tKo@7>oE)K;SwArMGJbhOj?&ZJl( za?)Iwml2)(4e3cA>f!MX^zXPJg)8ljwRyB?NMfE6b;fq>AGW`>0i65VKWvXp-# zI9GBi%K9TjOj~Hl{e#KUUG>`E>lKYzQo!Lm6o|)CNPqaimEpKY9aqBjUAaM<0W8WV zzbo>vQNli>paNedex&Hd-b~=A`7g}KHweAV`5QaYONX87jydC&y}i9*mu3Ysegg7c z%7P8S<$|}|oPI#0?m^|XzPlZqb4pB)+j>{IPSz8o`T5_6+mN{a?gcZHB`D|Z&7Y(H zJk$u*Z|T9e&6~n^;7A+~VnM}BTA=rMGc9!D?#{X!HF_Ycw03FV&@J= zQfn%DD))-#Pb!;Hl*@O2{Tl^6>hgZVuZUhTB%%8LB#nN`psvZ$j4^@5yJVDhzj^0Q zZ=?ey9{&0gG;?=+N;xp8^!!Wnw-go@{ni|DSy`cqw2T5>UJ-j24$5>mh=ETM6oX~U zKL~ehUV^Xyx@fFtDpRUd-;_6>pv1++fxrl+96b#Vz>iD=fq>78DP%Fb(|mqlkce}p zx$Dz3gj_foa7LfIn`nZnXa#wBKgFE2i;OuyzQ|^VEr6Rz;v=N&Rwy-vEz{BU4li>$ zW1ZZ9?{A;N%Vo4iGR#+Rax>T$vN^vLs6uUJ3${qca616s-CdoN<|)%Qc%0MmezX=_ zajtOLRRu%COq~cYdb&ZkAvR7*y^r@7Z~=j7|JVVEBpL~TzpMI}N&UfHh6ZchPeBP( zH}}ECg&hkE9fpb;sBU2$9l|66ZZLi&#h=9CMaAs8Tp>D*&K4>?(X&5Llnw{YlFCVip&*6g^5&zNO&~sO5!WtY*b+FJB z-oL*Z&iD`rjXaR!TzR^up&c~wD8e~pm?#2=_r$@%?cqz0K7D)@Zi=@T`*3S7{TSQs zSn}#bX_;`BFR!=vch`{wub!X;!xkt?aAB|JWs>+D1(NF1(ZjEGM%pblN`REbs^h4? z{z=UV$^_osbrqv(z0BW_mPi_$|Gr?1q9v(dDtpxYhdO=opo!PS=?n1LA_%z;V#n8w zH)T=5tO{_0uo1F@?zO;IL@m0Z=kpEK?#;S0FZe!2k${8zX;`68O4_MyTUb|)2YxP@ z(iIqrAx~$5rsdc8xiaQ>|lo6Qzo3`*Mh!SJrBqD zE;TjBr-z`>ci z<#VIubw2r_^})lhObeCSGGYx6`YH1Yl|I?hSwT(QB=TdbUrpCoS=- z`aP#)K71JEQaI6YtvKC>^#RjnDjkWj(6t%V=7+bzT>{MxHY1n|rgwV>`#V?gd)6I6 zM`!MXDk0b^)fT=BufS2NvwqWr%d1TJK13y|Y3WvVd;C?i#s~};vI>?Wnm~n@=H7qCgqs25u?I>FTk?OQkXE7yf-$5oOKC$};zQ+M5~Of0o21Hp}ht zR4EgP_j$TT`=l?8_(y*_Xz`+@9E1pw{b8a}ksMez1u7D_1&hXm8|EV@B)}4i5G8ML zZ!j*I1X239cq!}&7s4qyM9S?=xsc9k=Tg$C!Jf%Bqg&C9nAg>DUXd~?{HbAfqzJoB z%0Vz#W%k=uw^w(v*pfJT7f#?x44T3%i#=|Oft?VkK+%61l2=p|s;29X&{H26h=c)# zKLB8Kb>{~F=EmQu0TDmHIIjdRRi>Mv2z&oJVy*{z{s`rBb?9cVO?EUOQEeaTBc;OKFu;+Q!s3mW6a5i11dOzGyEYq}hnxmdvJ={2Xx8Ng0XO*p+FIa6H|Wvc5y!ui>PKmsl8{ za8m6Z{jToaD;YO0`=(~X(c08AVbGa!J!v;(MhzO9XexBvG(L+Bccdk!1NPRfLJQL( z8w##L|9Wn2hj5~%jI1m=RUGn{`#cVtJ{if<;veAV{|&ae>Aayn;hZmM1R#V8E=L#X zG&mw8N!hZh7Up&Y^csKOEcu}>PeXx?qCs2rUXSPu5nN#$+^`zu{)LH=E>H^V5)iu zVw7tN_bA76Z+R&Ks9=H{Cn53IzWr_(-5MzyBN+nQ>owz5^vafzZf zS>f&!$6F2|x;@IH9ghEWn0v^_ToAL|ifUZ~-DeDlvQ8iK*rQ$54A@Yhweyvy@6C8t>h_`}t7I6RB&MXh>#PX#utXUqtFoa=qgYE%3mvaz(H+Fh~TFS!R6 zoi43kxNS66=t~Z=5z`xOt!eZPpv5Oq4yb-N-eF**F z3e31GG;e^Pc8V?VQZVwdEw%QpTnr>S*ab)>seGMkVcp|&m;Q!-@d7&2ukC~JX9@d7 z^rpnmp0Oy7{UQq2LE-TZT6k-3y>U>{XSzsxyPh|9wrO1+bh5?AQC+8)Ccm^YhE8Z@ z`3H(1Qu?(W{Wb2B4bSRYx(~Y1L!<^z9Iaxv*lA;F?P56;RaCEYALGOm+@ z$3_Mj4P$)tYL>oLCXCH~KGA&nx5;X&rbYLncYZKjtt`W@)QC4~7B?x0YpoNr*2Ge& zyK5eC@hsW5?~y`z`?=hWNuYl1cZ8O0Y6HK~s4XL7bA|b%!eCGk%-QMq7Rhw=zGQ6h zeMjSA!Zk;}5`hUKe^E_{!&8P?=la<}3`WYG1f!ep%FCd+m258jS%loxXmP@pv&Nqu zZ#VCE^y}^siw-Z2LQ_zJXLQpe=dkqWU;Ioi?}DJ^%KOb>z0Xs~Rg?s8^o490<3-ea zd(QxT)ar;CZ>NpxaWmJegVPV@)skL|w894RbV8*n$AZHPn#by@1Q_|Wf3n%ComP(I zV-2Q9Y#~STMv`JD=eWj|U$3zbk5tFprswcMZ$h7ZogGmpdEA=qn7nc^c|?$I(dx|+ z{D)w~gN4%{-deTRU+Rli*HKPtv`I7ddupvaa-O;#c>Jm0Pt#`_2x1k|{f;OB>yjAj zdC4C{Zs5pi(cmgKRHR5-?>QVfO_cjXK3W)7;+4a0ZMd}vZm`zbGc>uAUl+vjbYZ)l zSk`YQASZ}3+S#3?PZcWpLj`?(T!;9ke82#7y<1sT!kX9^T&6c2O$n$B7HwJ6Mbatm`Zj|c{`&Y@3Et}S`L~gOS;_jkR#QZL(gr4qD1IxugwJveOquYgAMgpmo%Mwpr2OeY$bz0VZ zM?rY|{{jqnI%1xu2oR~qQuv(CEzy4)=^-tWQKi972lcB8zTA%-h!Bp_{TZNE9dhok zMfm^KR3!@Hk^u(3g-sO)GykfE$fD*Xg2^(sacDevPESM#f!|m)99Z;nbaaFPEs)}| zzY+)28eFWfBUJ;v2cp{b$%OIq99R(pfveRP^VKsy-EuME*TV1_vS3!NaEUU=yJ*1R z+DS25Uh2?cfm`P;BNmf@h-fBql=z3xW_hoy;qtOFk)VH*!owdPd?@r44MhtJ`41{LbyEHS4@*K425xK~UA;8HaHAyG53R~cji9p+%ja3g3vmzI_O zEg*>?S~+0}%3*NAMz^acCZ{la&j?phemub`HvF3Pt@C?f+ zdmf$SLEaP;>6omxFsMp-1^3`a1ghafugxZ96;)tYG36s+1W8rfaI|cB*CEC)*IDny zTW*l7|4Zdya^&$r(}!Y-P~OzhA*uH-P^@;Wtx@F2f4OV+0yQ0@Ip?Bd#R@i!`}Tp} zwbNI89V`Dn(?)9!hCkNY=1CYnrIrF8)SL>$wRSDQbvsHf#DCM*PM>M3 zVcs`|-!rpI+g3E^%c_lvvN{+=08-s%Wi_#!l24#g1zA^IZxFz#Z*+KCGLv?8z@(pJ zzK5U%w-nU|4sGJ%ouVa3iN;-~XxsI5D)ZOEXc+%IoeZ`F7l#xHQ@;oi{WaX<`)P;hOa&js*At6}!RaXLak&MgS~tK zKWZLd9FGa!h~nv$2*^g}Gs(JP-x_@+{SfTo^*|<&wYPR~jzCK{!MgqIOH!%HSrn>~ zf1;rG$IwFovyOc<#V_Rs#>%W#zs}dGAczxvL~;PzEu<4mk3W>(ZKVE*gc`sCY9t2S zMl6)K*d*Ds&bM6XzGKMAE1NGb@?*fPn>5rfC>fWmAruFAy`2uF{yjXMt@`HJ-2_4@ zsMa6!TF4>hi9|rG4B^4T*dY8EmwXecE z-g<?lKHCZ11cdx3`VJ1?B z>Ia`p+$=_McMS&0Ij0}dx5>_O3d+T1hAc4Vsy-bW2#Ct2*u_X*-p7v{v1Y+(IDeTR z0hgx_+f7!SXB}Oyq9vs1NO|X_HS_+jZM5Z!`rhIGO~8h9%X|~&F!t8)tRWA{Nly)| zlUm89)q_<_*X6P@Hg1=eLWg(7a+I@2zpfkUkhop#j6H4WrgP?bslmgE;*wl}ObUb8 z;-7271IFCc9fVZqG)7t6lB7dqTN|A-^y^VtbbHF0P@sxeogL|nd&6CH=IKQ1)oVH# z_$0;w+_oWv7iyCKaiAYjzZJj6eOyWD z?>k1igYM~Ph<8r}VKg%mK^z4X;VQqh*Dc~mn@qqCTfbYH-E*iIF zPWj9X2>9t9*xlF&(E#ZMFY_aI>N979)vx&7bYf`H9RQ1sG6TbcgR|n?=kDUc50FLR zB5*LimMZH8)$^%oDq20N-3Df+d>+*1^TWsO<1mSkaM3iBFBI2oooVusV1QZa;9V~E zZ%O=rV&}*|j}+~v&hireAN>tjY+Yo3$?Ua2x?Tw&oDGBbxf4T|E}?JV?$Qly+$tX* zG=KO8C;fry%mWTkb(8Tz?OL0;?#WWMncA{su=_CRB^q(!*s`xA+XFTvPh;F=Y3l6w z&XUDe$ixe8@eieF*0&+;+kc73D{oSa-1zu;!nRKo62x5gFbRrX6Utx2xrFz_8DT5^ za>k(@qy~qJEzL(AsM0dMUkAZExnIoipPhRjf1*2|cN)e*M*{iI>!9QMmOVE^B!TiI zeVQQ9a0M=w_w9v(w(>yv`k+}pZot5q zH)_5b(|x%&gB6W}E^iP+9=^G@rq4#moL1zWtIdG-;3s%crEJS#M9*Z%z-cr>1n_0m z4GjS*3jS52pl;jvws77kpvn-(29R_(EPYMZOIXzZbSv03E4AL4V8M}%F+tLL+Mx&9 zRTP7mzz2YB=gEE0=f7~^)r>@p7F*Prp1wq=si`rq(F7edgNrSm*JtB$?lli8dytPO zr>DSXOp|~zlyS=i*%?wK^U6+4XS_N!>(GbB==PiUrQ?bflL4J8Kb4h(=H8Y{hc)f~ z<9*|9i?^4g;8+^mPfe+sS_}X9q5SJ!-c2g{?CbYV$uENupO|>9tnR_zp5_^*`GjS< zEZz(Kf8tZrJ%oA3(&~x5=RCM8zHJUw{N+=iXyYK^qzkZSna6K<5k2gDbLQMkD={Tz6Ss<)(iUxpzMA9x^^Xpi2~eG*TqGl;9@?pe`qF#qZ1C2r-{%lGIADuR{Z|) z>otw>D*fMu`4s+CG;b_VSz2uKBNtVJ>!Uw0{ON(WGY?vh{L?bk&SY;`Fu+9unp+yb z=48bCqCyue4DJv(`-iwwuwY0sREeV3*;sWa3S}B3T2%;Zcnv*HusdM%f`@$~yu##@mG#ts!)_7wXDF!;zS^hP zK?-y#T+|s`XqA%K;g}?I5_MB|xj`85%P)Y56K{8FM19x@_<{ox$Tp_gSoi`2m&MAa zo`)UeIyLE}^IJu3M$*0qNl;FHbxo{0&;!VhE>kJ#%Jb%x~Q(&b1sP1?zcow z=^q|5>X+h)iW$}OxZx0Gg;zaRU%!8+!t5>nSjq7F3R9N~yLfeh^w`&0uv5_G0j+Lx zs1?QH{{S$uaqlpek?x$-TItKzXmHKG#UYm#%k?(Cg}hbIzFi&zIDL&70Y6&$?07oM z>jW8w)YnVkVNvtcOfwQH+ou-QVI1!+wWZCveYGy^|M)pC;mu4rg1ki`g$;mi)Wu3Y zW_Np*=2XN=}VI~qKezqlh%}S|GsjITPj9%(rYKCLB_*Q zw4rMu3)S;siia*Z)t(}K+xD9$M<#5-W1D;znb#xFp>@)d$B6Hz$IXs{vvpN0IGg54 z1u?Ut$ilz20_OcyHGo*}&n700sGdLm*cTAyJPBQ5*8HPWB`;Q>n2Ii9B!hN8>al2U z4jDX{=o7n)A#BV$yqx&GFBiSSW+ukNJp!|^AhiB&Cq#>D0*!Rw`c>9f#_gU=^oDW; zy0q<`h(syQ5O91-l-i$Il%smTT$IFi&ermfE zrtG@nu>)UPJ@+o{%H#WTCIL{cKQ8i(4A4nd5u!Ou9A!xP)Lmmjn zms_jGF+S=3Id57wd@9azFZ%SZ%-c4~8~JI1MMH1>lY|$f#WIh)S`102Q#~+(tAd=Z za`%x**YN&!U#SmmR8xAD7euD5q zT$t}l6>`Su96XCa-uxqe^H_f%a2T(97qznG_s^>!(n!rP*`#3a`Os;+Umz3TdWrYM zH@QSUdB1C>p8rYr%O?@nnt=PEAk_1}VdSW}|DK$5u^Tk|_5iL-tWpB+_SJ+yl~>UZH{;FdnN0dWm;@4Xu@oC z0$_TLVA=!yck2y%n}Fl2&+Bdvs@%+wcSYcI($LO-Ei&$*($1tssoNQ~FmB0jrca_z zfDL?w8u;o>rdX*`Ojc>+X8-VH?sO>)WB-RzB?XZ3$5N~uBgXE$nW+d%Pp5Y##Gy+F zxYK?MEg|@nw$2^7GekdZU&tKSI#yMUd>HTRcbsXls+zYeqg%B778(084b&FDcIoDG zJ0WOaaBQSvDZtyi_rnm zwBtzK-l=xTVNXpzdQ<(^N0p&%{<*Nr7vZB*F2t--4~J=f)W4?IS|DS^Eg;YoYMsj0 zYw0~7y2DxW&JFC$FiGdDEKW&&*H}@sYxWn^7Z7`XWzM&-%Z{w$ksT$_5vZuG*0=H2 zCXMKd!uZ6~-Y>-synVM$1#NnYar3%+B1v6) zw$a-TjTPt^ndc`IR_Oc;3)J2*tE7 zhgN~x-63yhb)6Z8LE9&}(u;mr`x?`oVrl()UB>zi_b}hAc&8+QlYl>{#he?oP?9E6ZPKcU-4E*)$7(3~&sdA$; z%7pg`Et=_-P{V|cBcQ0-GwvPr8PpNOzsO^H5^E_WR)g_$^&JgkU&=wB(DUL5>8Y4- zTffpNazKT!`2hVvJ zbGF&~CwRPp!{+l5-UG6_x(uY}XW!i67y*@J%Eax~dpuwIh8j$@AjD(!h2hkf2#8p$|z=H@LeWS5{PAfHWG2ce>@S1%-wh zy;q>d$;R#ZpWF^4ZIBd4_h5CKJq?BhwM6}fN@kD20)QP53x}s7BG9D0>Xigav(k{X ztI+~bvn)GlFRfQLXj6>-Vlxs5 zPgp|;s3d&yKOhJUQ}%}sIxxaHOp*lwP%C7TRx(wUb9SuN{0LUjUKJ)+e12KRK5XjFcA1YU{&_h8A z`^3lBkJt4O3j22{yVzp z8v}_nI%e4WdS(t#SZTM?BLRdQ=6gL^j;m7+Y9p@WrHzaw)2goiGBJ*9SjxDawTm9^ z4DSn`@e{}U=He**Av?d~68t!>wLEG$G@yI(L`m!4D8!o>si`9y=wN4hLN!n7* zCM!)vV!1T!s3dgJewi$)R^YTA-byMR zO`eTZyuZ~aMf;a5`T~ye1@%kgdB460SoYJk3zp0XO7?2GHv$<(zB0Z^)1Qq%P`e$p!*9y@(YET|8s_T((t-LmrfZfuW@MH*C`z6R?!pdk1Ek9S~aO%*TV zxVR@A>tDly$i-2@{y%Y7=koIMXIeV~!M+b)0{-7Er`WQy(90s8YrDh|B1YA_ke^d5 zFNTlYBHIOM)Mpg5`KC>S+gj@xa|gMuew;O{1_8eID4UrekrxN^=Rb@*IokD;kUpyG$Y8iL`Tu>?|`yn1nTbZ53wj_R9~ zRFtYF4_043U(^K2cM3U~VZAUIJ!l|&HwyNdxX{X%emY=P*U|#!AuH6T;J;BSfFPY; z5JgDg0jr*5ZS`WNftA^hLc+Ydz}SM4s>LzhAzl{+Rc5})H7U(?Ve45Ma%|{=LC?pM zBzheJl;HO?*v53}!(#mWph%7@IL{v6CGg}5*;iyN-1j`X4uB`e`onO3l7689jN$B{NDn;l^mv_Yi_u_L zhK{!09ll7c#!dwff?U101y0BS!OO+S==&2t{)b1&8*gONVihS)yD5qwWpNZSXmo{b z&jaE_M+_6)q%(zM%eyF+1Lww7g>IzQ18RV$vN`1yUWriwcKw6~%vdV^0X&dLNOv&D zjsOK@4g)U`#ucPo=0l+yZyLvX_alE&nRD$83r>B&BsC=X&Xn+d71<|Fv{Xb^i0_E z!tz5@V1f_V%m@ZnoVs$?g}p_sga7+dS@ln|*h)bFfus*vAV@L^f=d0bDzO`6h1Y|B z&-01*`SQ?J5)jS&;gFtQ-2?3qjL#o6uhzcXd7V~=@4ga@hfhKxTA*w|N(8sO+#VRg zPfRY1U!WKaF#2M)i10f*J;w5>w!VBPOkjEGWcHUWrzDQDf4Fns+1)*Mn+FzR0P7?R zV3862kDVX7Z37Fx!1Wpy`1JinSw4~g+d&`@>%QKVyv$5DqM4Z)XnQj-l*NLlC4zBv zYLUW;V6*Frq=v}3-}mbD9=Z>ojH>zS8=81Rg9&VVEas_ypJFlOaNC9FbOwrUIkV0k43gE_~1|8X!06HfxI}79+1QrKNOAkg<|;Lp9?idknt1fb@Ug* zns}uYH9y8Jxv`8l|6LPOy~{~Y99=}`9~{!ZNy~D1V=UB)BGDf@Dv^ud>OD_^nXp0yyF=u;Q-jR!1-Ph z9%2ko`@;3u+-{d}cYGyH1xZicgim>L43X>vAtlhMh_Rkvql{Q8yEVT9z8T&@cWokP zefkm1qfnTqVy}T8##xin_7EEq1(SHfM-t(F1lriV-__y~;Ab7>DZClot^}IT(M^DQ z-zk0z5=FVF@s^wu6cdxVYU} zC%|&w^{6|e(0t9}XvoetDq zq3w^}QXJc%op}ZqTMC?Sc?~$){W{EXKGguoaIA_>(CXNeal1jLnYt)zMx%TI6JtTlora^~*D1wV9qRJPoTJ%~_jc7P2tMo&; znu2a(xN1=@DDEjF08pWrgi3YX+!|YKbjoxH*A1GWD0gr#9NArWz0kI<)hx+N2TBX?$b|AjAa@yIqOG+oyJib;qJ2b9^|pzzC+* z-J43-7$excWFat^Q~Lw}VuhLmc}|7%?-{%7Vp~zAMv>0Va}qQ3>}u?7BI7@Bta>{_ zek5L-nkRQ|Nb37f+whM7zuN*?{K!o4+OiaR^8#!rhU&?~Prid_=hKua8k_&<@EWNe zv_Q*T-Kt5B<(C%AyYmIbGtZLE##s)>jaj1Sv!P7V$cIhiy8~AELcaMFe4$th2HnI! z65aYcCX;LR%!U)n6YqVD2HL0BE6%yyottpn9RXI*&$Di7fa>uzM`gXb5K|s>TVU|&HxL_Qc5V3Y+x>#2-msZj`=*B;`)8_C$FF?=f53aFD{)RF) zO%Yz5{e4Hh##HXvhpTB=H)F5Uw5o=&u^QJejVr9qdPD(9=nT@Ybjef(1@oqE`nS!T zpfn}>U^#EP{P9d9L<+bhv&RM;@1|lX5a<$22`q6bKpWN9eB%ONx}}XVHNj0Qo2up@ zHG7K%gh^}jx?V|1naDd=iVGF~dn>d5szD1GHa1HOx?7WKZB%lZ!`~KgMcllYx0uv7 z?Gv%twee%l_=}%wFE8w|?0&T!tv7y)zF=u!gw})aRgww3E%vf0EYqDy!zRtv_rIOFptkXqb+Uz52D-@fc%+PE2Hf^H z27_+Ck-u!lX|u!Q4Qa>>?fTNnc;X^?N1rVFrYty){jIuGYB7;zeuYso<|zcnpY17A32 z*YP9Kmu7MlbyoZ{qP}O32juKhKO(-2B>BG+mAp8m_%$cqAIm^cm@+IzljG(8Mgq9~ zxKwA~8J>5FK-*duNQq{=jr~F{3N?~;V|U#{3s(}iPCA7(?p*YUX}{Y5H9^wSqH=}{ zcbIozgxG0TkV|;`A!FnR={H~x{_CR7u5=&bQCey$U;}Pj!tLy1`8oPa-LwAtk(ll3 z4^ajh$)$|YI9w(}^F_ZztZf-Xf8BTvhE34c43XyAZCkt%4;s5~6>sw1A5y|tNsVEAeyE-Pvw+J!VIvcr&xk0Y_@zKzQ1xX1 zR9vW86_CFn{OkfcVM-Zc>K)1=W#l-OOzz-(bvex-k@nsa0^dTz$^)FU+GiWH5SN9v zHDvid-Y=Y~YjNY=%D4B;v6oJI8nvD_{BVzcLxik11l2ccYZY-%{c~ea#u|2ct`uqG zs~y{?2z|?^Od&sWKMF8xx?}~$clXV+?S*ENn{kaS!iY#IY%;xkNzTTeFlgBfjh-{T z({8?|6(4Hqq=!ZNTG{NIYl5Qc4aq55Q`v|OGFdCezy`szc5KpX|AmV}X4Zew!9mYSSl{rXEEl$L z0xz^35tziqesgTSi;Wfq-m>?8B|ovRuhY0LqI=Bm^oSaK?s-rOU?W8%ry(N1S8(hG zYD3{)k*UGJSY$#K)UL|0ZS;s2ljrF-p5|}M$53^1^VgbuWZjB29fJS;e#ZF$z>#Sx zFAb`(BSaa>FhqatL;s6=dq)R7d)8Z@`s%>$dbYNaf}-NtxZH!_TOl1I8ixit+0<)k z%W>)6-_Mr@s%mB;s2dts)v?f$LpaS1XQ}CMP82OVDixitt=qfDV|6dtrp-B^MBm*R z*+%v|8uNe;x_yXkFA%>m_>tX!;$>?=PRm(QFg}EK&_eZ{q zQzleYd{0Ha4H4(MS;M>BzgBP~q|O3U_g*?3K|J^Sujo_n#Eec@UuYS&{gnaWm#P9M z5(Zkm1P_@r1W+pq>^|L+XQns6^Nw_Dz3hxHJn7YZokdfS|N6Oek6vh}!T&dpUQ_dh zA!(fv11IQd!xHQn+IH?5Zo%T~>sHF<^Ifi*YjV5RIy_cBD;u@*8KNBSb1`Vx78vVz zqD76DnrrvVXB(~Bp%@VBV?C2`UJ+yCB0UYdx|53tjN=2Wm&6D3khPfWi+qqTZDVX` zrbQZ6=*9hQOzw?!Nl&?#;1-s3zKa;bj=fs_#Gv-lw(u+OjJ!B^7BXA&=&#?ssqTdM zXw9R_C~TAwf*ebKP2+DQ!o+o1K3(gKSVDw%^QJ9U=+9k3yL9rlEA&1gTb!zpT3XR= zb3OUVDMCqX6%aKZtzp)z1@)IR{r;S}XQ!&!QN4;+4xHt^PApIjfTI!SOdTxvsG@zT z+|`5$p!3;$GO*0^Q8?Y!KQVh}ZGC^bwQ2Z$sXa-OfIH<6qkA(FVRlnfq{!QobH2op zq#lnDMX%Z+RWsi?#tM#_zNU{U4G}l>)7l&DYh>;Aexq}NqpS-8)C;|D8JmCLftJTm z5spGC>I@iTladBsUmxBRj@JZ&(&|4nlRb%?{~`MxXX{Az>7n3G5ed>Dw0#bA40Z;Y z`|yLQ*EdZ4>Qh)!9t#LnRgzhu6TcB(SiR;t=*}}ft$Oai650YV!RfGI)|6jr_^{xk zwG6|`+e?EEA~}Cd`ebOY2uFgbN)Y7@)1g3MO%3}sUY*Me=H$fW1MYCrb5Q}}0Qx!& z>v;cEa+4PI$5mI^wZ#2JJT@>uoc^47NJT6Qidubl_l~P)Ir4s55WFtTMHYq?6K%cz z^kX(i&|VKugLfIrsrC1QK3>udF6zJI#lwYTvE7Q&Qx3WtslgUYpp;Fx_$9ja`J8xS zmPWK{%y6%#FT!gw;LdCpeT|9y__){NZm+yqvvoVSP)0JDn);4B8&@3ncQ$??F|TNc z->cSP$EY|is_V|L5GSlG9+yZr7szKh;s?L{y^}JJr%PHmJ%?O!0wq{o5_^7Lu||eQ zlelPPK@%4};UI&brkT%>ju%BJXB^>BhO&b)WEZs(e&bv^fM#K+zi z&Q0y;U9^}3kY97T6s=i?Y)Zhng;qar3&!laxg}HNy?_ZXh>njp{(fy#44xN${czbf z?0eVaE3f-NQBy-Iuc|7lqqD%jyWVKVFTY}OA%d^M%$M1>Z}7gh?Z_7`< zHau6yG4mzI>C=M`D4({>Gs!1mZ)G}+mQHK>T#_JBO`z&m^CMP-{fWlvIZLFnZI-pD zEu)8-*arer;?Msp=qJjx;AN@>hU!9EFmAMvNv035jK?6)}DN(?m0|tRY3w&#E z-#iEwv?-zsh-j53xM&P0>;CF`>7WuEA;moWG03Cy)p%+wrKA;|XZ{>Kua39b=aCX> zW$Loz6g?`1-J?8T`CgVNeOp)outo&~ZDP^Xtx8O;q0Kb>m#G86BE_r;QaU=i(9TtZ zi9e`^^N!07x8Z$%#D0%*1gT{Ul*x~b?Sb@%3Nu5P)Kr!fek%Y=z>eKROL{eGco3MOPDlqA$+61or%)7?jLK z50bfNp5-vEgpG*)zdv`5Z;FuKh)Db_bVuz{up-!@I5ay3S6@E-789OZU!*gtlRb`> zQ4i0i!k_}7WKwySl$I4s(KkwhjG?P}xm70I(RMl-M2#zm8 zlw0$bRIW2dbaaPY%rdbIP>v!vdE2Y#h*;L9rKUa9qLW-<4O=!3Vv}C^j(keBl9Ok0 z;nZ@YmV$U=(LsWR{L_7^{U*d&bex=S*(NfsFtdc8-`@UABt=19y1WE7jBD+ZK568x z7Y_p%=as2ML?{L%hV~|12qgV2qHoE%AIv4zsigs1!67PY2GR7TV}*=bQF2VVnS_L* zSEVqo%sZ&DIe-q*jF8A|KEOf1tVXJVWw8q$=l_fguap!2Z(Mlhr!M6Cl}3u*>1sY{)GjY&)*Qo}p6%@IZ4EAP0O&Uc=CxVPkUldw z*tj*Pt;e8J#c5fv;DGsTFkT>(otd8>l(QpFkBMAAGa=}tgkU)}2kauZjFd5YKYVyh zYXW1&{aAo9adsk`K*L!5FXjO@)G!yyr19=1 zc z9WY_bab4HFwlaCZ@hO$xVWBBZDi1`0f^g66!<}To4_mCiApb>ZyyTBUZD)Gz{d9-b z#4s{=WtTE;@DBgq*f=^Sj40b25tYl=|J*2F2lR2F-rw~nGFINfAS!sg{f|_Dg@e{b zm1O<(<)2{QXJpdTdh1IP^w$@E{|Imq;}wAW$3L82_UK2(3B{@Wd;{x3#s=p@&2(ew6=dKjkyF!$I@$Ba-;h zd$TY=JP1mcp@2^o#(n^kmo^CXw)IU0#-w^@b-H3>I?g|3Md);#GbbrTWyHXm(&lQ` zW!0*Sf6*8sXsUL22^UqN5Ye&IwR7IPY4a15vAiYruS!L~+4gyJ6m+WKD;x?4C33@o zL0u*C&G~c~)>#wuf0ulg@?~V1F+hPzwOId#ff%e@arC`mGf!IsZ=fA%a)OW%F#9Yo1Ve6 zM$928@!?cv{MTQ5R-H8Y(`95PGc;l8c^%6UBGjm_yj$+Q4yO_r5f=SAZ7W37iu~$< zWC_G(gp3O{$G<=Rlb>#~74)hdySe@#@vCN{mdZ)g%1{(V|RFk)qxsvm=MSV0y*>sbG4ShLvYPzdL+LFES)$o zAOli@*<4Raz$+bAb@r$0qGICWSeWIuhx33^wQxD+b#TK&xO)%a`j{A0w+8o5?t|pX zfFJz*4F$LevVJFl&a;0DJSxn@3a#P5+J`<$4EnFhe6eCPV*{t|*9X?F4FVheR^kgf zGBP=t@6v8=?9ahG$pZoQJ)*v9VSI!YUJq^%m6cVXRaoEJf}~q_cz&OpoLxB=cvr8% z%g<$Fub-62NxrA0aXS(Cy(pRpU>lO)<>h8crk+;f_2P!{ANr)$K$3cXE&&5`3Um{? z`U$W>nE5vni`a_=l*?U@z-ofLiu&0X@a^VH#8T}DwQSxf5(Y+wdcY+>0D-aLh#rd6 z);nMj3dfH7w|n|~nP>fs^9`=iym=@Qa~(7G#;%)*#@pN5p8W_qrYznu|cSW3b&74p3d)$f*CR}FMvElXfV9n#RJJoyYAJ7g@ z@>@i>&Pkwb+O*0Q_q{A!qP+ANTm?rQErUOgl`H8KBwmYHSgE}FQ3YHd;d zZ1Q-JcB-7RIQ7_ly)f8P|48`phOTmHdyQymNT?5qB_8B>B=c;;zX7BVV1~zXgpkM0 zCd;&?fmyCn5%uar(Heyvt)CS93d!sj~vhYhrGakL@k^6LGD${rXZAij|wf!2RNt_vibvmbe>?vR3D>TZNFULAYKg?Qife zY5ld1=d@?Kg5^^=o94Xt!}{)z(;rxo>RE_;Z&V0}>=FqcJ(?=+LR0kH3A%?3pTa0{ zGNPw)`^$s$_anG|b09*JCQ>!pCN4Rm9$Sb4f1q<@C&;jqd(8swjw7+!@*Vn5xFwSJ zJlLd<{u%9r*+VA!LHQWkI8#fEr~7qbZ9T4tu`4TxX`AG_m7#e25@)1IT135xbpg(W zq4zAGoR;oYFQJ|;MIJUtBjGj3Um^|p&CiF~;UVqZ_ofE+=&LAJgeiYQvGa`3!q~dt zE{v#afp0Ck57O3zwMNuyZtdB#s4nf84Rd+a`&lPMM4KGQ!G5i%j=c0_#Zpvw$Je#c zTM+(|65sqSYkx(Rfo0eTXziJFUgCcQ<%EwgQ^{OJ z`g8&Etl!AZtwD51q#I=Lx6U^FVL?^0znq`Z zp;B;mc9wBE`W}6;Hzn`9KV7|NnbqI&qGrCQ5=SX%js0ip?$zO1Y_I`>a`)|eVt>S= z@sGSz1F!Qws&K9wZl2e^Wjfr@^9iAxcbeBL(MR^Lm%;jgpnrr=7bBw)?XyHqK39dVwk1ehk;rD@JkWI@i(r=-L!n(Q`pxx?uku`7feIp^!RpJDe7!Qn!Z+GE$lp;pF$UVg_B`pUu~Y{kiYRMOltjsSJQy;PoxE-hg4(b8NDBQ<1@>r>vmG9u z>z|EqkSzMjyCSia)(*e^#v zB5D4%;c<7l8uMtFyK)|eh)Ff}brDfpC1PbwgxezqzG#p4TRc@>50HSPjtUhLW3^nZ zYJCU;6PdwaXIr-U6? ze&s@1+iVh!bxkm_cD>HTseZw9q(B0O%KJ7~_9eWKJuq5*0_ktPT<%kDJ9;`jueW^i zgcDh^dt4ucTD|XtExbDz6a5^`PbFHt+>2W*S~N~K{OwMShqW?H;7N$&@dg=5mCf^k>ps7% zOfkaf*A9*@k6h&K*+Adb&B~6%B21X%x0U%n^p6@*Y~J+!L$=++Mi;Iur%}rRk&+QU zY&fNLos&kt*&-s1i_$K!q}Lvo@4|A1E$PoOXi-`bSI_dnNe6@;WBry^C8bcG#owsv?dTLH)Z;_rzUZ_J`E#;7~U2qvIJ15Bhs%-W2K2m6k%^&;B@m?Cbj3Z5*lUdK>a^ zzwikyBz{C}PoY~@!cS{8kyamiLcF#(<@twOi=Qbj4CodszQ0Tt-ji$LNpE7iU-i4Y zmet~DO*#(J7u>uT?%*4lGjyQtZ^&XW3#zpr%>F( zN_K@?a8avMcLxM`{NfJ{UiB6Y1JDCW0ux4 zTItRQi+)ZNdRf~F`Xg1f7R(>owvn5gM)+>qguv(>zO7e24|xArOdr1&%YgyP*YwU` z&&hXT;W#OuY<~w?-=xZ}nPmL~vo-t@ZN+W6g)nAzysU+{AuQMiccrsx zW(F(95rFW5|*d)zU}n6!nEa^v&uYVC`Oqr36XI%`9({!plS`>3G353t7>nvVsK zeOe&B{;~UOR^5$gX)7Bpju68a#Fmv?m)A?vO$1&Hx8^-y%Z~CiEhfaSX?@Gyr`~Z@ z#n&vj)_RJ=afx|YvR1x3BH?l*GAv(x(_58-JydloiqhKm2RD*&_kl`?Z%g&dFENA( z0t4rj^`sW%a)d=e!m#@$jP)(>;ETGskpb`HS2fsvi|@T}$WpZ;*oJWLUzW9{ z!-|!SMP?|CITS?Ziifp(_PZLP!hA?jr{r0RH>a!)8_~W{rFxie@Px{<4=PQr8`)v{ zxnNbT2EV}70>xD{fZdN3o0f(j!~9*}tTw?D5!Lg4H$9?_w(fWb3dh&H`$>)XB`EHe z+hbETZ_?(D?$+VN?Hli4M_#c8%Na9hj*X_77ce(gwKuq<1k8G}Tx8!RB#Y@53!T5_&kr2kdNFs7 ziHpE7c=dX@sxfT-_z2_1Ym=Di4W)~f;a1{%{QW_#08NA>Yv#aC?68&V6Z)c;+6!TI zk4xTXIKT}5(hu=ht!C5q9d=Voi&iZju#vP`A;O^1fTL->*?fw`3*pOL4x!z>Sq-@j zy6ac+82=^u)ZCj#{G38-H^{_CyT&-?ruueEmoStt#fcYLBH^g2_yXPsUJ3~q5!F@s~`FmF%=_M+i-bmY0I-JWbfjk zUpxx6Uk<+q+OTdeQf9f+PbgaujGk*JrkVkjCkl$790M~8<$y9u#J{dl|iRg3{!bf{Qe)Lx<1Zb_+SNd&QGpEjU& zXOz{thk~7DIeaV`7jple%4l*T3`X4+g4ua_yX3gy9tlyA0lu)0z={wU66@Nl(LC9m z#YFAbVFl4-MGGLl5*i;LA6+VR@*<^No2^pFyfJ4DB_*P`MP49ca!U@+yH497Ux{o~2GAeHiip4=G@djx13;8YY|O6C_ddz!;TdZub%@ds?4{Z*h7;Cg~07hD8X3l}~yD{Y~E3dQe4U^4`lo&)c{Ah?W?- z%{C^Y4$+_b#2t01AGeGLwM_?oQ`IX71z;e_s8_1glT;Wp0=CjQ0ws?%j6xF zXZ;-=`G-3pbZW~75-gM+5msQMLcgu3VYx%DUy!C=cL3m*)r)JmBnZ<2v(no0Dyol2 z5#8cj12601&GV+9U>psD9cFy4kuW-VP3&@|htv^lDljs3y04_V(!iyPAd}9$p_>9r1b{=99aV@lY-V{)26_e|mu3CgtFRRkg%k<86I-I}K>M)e6u7um0 zi2ph0R@t@RoN#yOoq7lHvm*!g7tS-R=6ln(V_)az?d@0-alX#iKotg9y1Mj77H^NE z2nY}RZq}PV?}yj^d`SJ!Ia52B*x0`gPBIiIOj>RI!1k?FruFPi*DKoFba&_Mdb^W% zGnW3yl$+`vtIC>@``hKu4Ly#d@J&8P`90*JeN!JnWA|KRbcl9~z%Z?$TlmrZ6YfKv zaFeQi+9_npk~+2qRY{pKflOUq0*0W>vjy+`841Nidn=a~B82(W;?N07w`$|17mdcx zphcbcY%|J@!>}%aDaG2YX_q)HtDGR%2*kz&4h|wrmNutL5(w5)G`k{pv9?d@}NQBI|We0IC)UQ=u`91R%@4tqQGdo;f zhbE7X${iaM^Qb914`Fh`a--ZR;7EV|8TcXCCnn_#Q~7~K$4Bm+E=kZv3txhlAZyYl5<`3#YGY$=ru=h126@a+iMOyKV=&KsfFl#6 zrbUPS_*X-|@&mh4mQ=Ot0md2_h&n7CbcH}gn<6bNIJ3E5;y&G$l`Y%4e|{OJ7B*ql z0Sku+ADxu+yCwaoF;72Dh;i?Y!aaWe(9OOBRlv~pgC5r*evT8y-d9Or6!+>Zi7*~7 zW(_#uStOi+Xy)ndgBk!aNdaOCU7QCY&<~JiZf;amS~0;BM#4oC!wX}qUiw#bRaT!D z_7Z#k3TG3{io@0Cw=sF3#=oJEcX8!rX7bibu6V*2|36Xi{FvDwfU+%!acW0+-k)?6 z1yFtkkHr5#-~vIyX!5%?V&PRYc}(e*{stbYe@3kUsz!*ntQAx_2DtG1l;`e3VVGrv z>CFi~(BBHZn~Ky47Lo21j^D++`q%^jLK~p3E-yOp{bI!|)*o+jWi zd{Db%U;5x0ZkWxQn0AJTaWajSaSySD7!#qUIE1qS;lIzVFm!X<*6O!UgF9pGxWS8{ zh>lE`;li1-lJbL>#Kd~+FX@X z|X$T&^if`s`KNUR##1 z(B{=_{K>Cj(26{T)Wt8Kh=t<6j6BP|PD6KA#)orj{MBUi42mFLR8Dj+D<-QXTgOE7 za5fxFH@Tc#uznz_WyA7}I}>`v)`y5|;OyE{5lE?u7nnl4y z?1SOb&qW|}#$4DGXsT-QBA?VINfpH5SJBqBlv-s6)1CA6Van;Y{W;*d^AGD|T|BPG z3!!rVAovc}uj8SL`j@XUzI(o!X$%M|S<~tZE|ifgo>_s%#EequI^OJ)_6uSy8muyr1DZ+OFK4tdRo)m) zG9z6>z86T4fg(#TIJr4uads}I*5@S=&Ko-4Rua~ z4s9Tvuc-}h8~|3He^oV3^5 zr=LyhM?|(be89uQBgvoe0L5c}y21~XbP(F`GJ^XS{y7wlb-8@b)}8bDaOiy<=)HV- zFb8(7<6}Cjx{&c01*$l12RCX*$L>wV{_$cQ8F@X>7{Ibm=NK(T4J`ZjQNqF}1y@xb;hj7!X&QWt*}Z3ze+Ho8F<+w&R-@zG^g zJaN)|t*-n+S$``>>@JIi$z> zZ^oOsPR%~;3v(;6>62=u_J(JE>qzI5l;kp;;2@_f>zh%V6}uR;72?2S_tPoqMcUPi zVSd~*(O_GfFrIfiskzy`AW#YeK^wvnzH5qZ}?j!J_#?(yHDAxM)}36+69z|&Zx%v35xuoLm^4O$e+Danl%#vX$v`2T0%#=m ztK@b2ydTfByY}Vp+M(K8m)xJYbVv{=%OAmjg1pVm^~p(9<`Bjj^rj=+_;nXbTPLmd zYD6C7(_)U_o52*XZ$k|)+__SV355x!-MLgvoy*zD=!0D9NBPWm;=WIRKZv0&TU#5s zddQ{JDz!4~+&rl0%$0!JfXeUX`W4cswYj~S)Z2ZFs&slEZ03ZHQC0dg!BKvtqVf3) zc)~qOR8)F_AfZ~L{b@X{Pf6{QhI>NXJoWmY2N$W@)P_FgRzI35(76q_VnK6L?C){=950A zV1kxWlFJ3#hvxB9TXU?rzB>6yHLEXOoxqKe_xFUhd|`iSFhO2#yA{!A;$ZE8=o zC5{pMY^;s-b{4^NdOhvUZ)uO&UgU^2w}d3;Ql`z?e>vlwsu@~iN+TRmxiH_QybS2f zEzW=Yo4$Qr8wb>RkuOH3o?Le?rTsUcKDEYY2XLGQ{VM|R z#G@ySP$S)kMITH3pp?s^1hGC`Z=&b+WjKT z?j>qBS;#&oiU1K;{r5vBXB*eCT*++*_WjEjAfFOU+N4Sit#kz5bg{OyFK76H>FRXl z#q|0w3O4Dg3HiQ>d7vjrw}x&!i39uFP29KNA>6!x7JGHOQwXE$itiqqAv9(uApT{7kE(MVkoG1^h|qwGZ51xj|Q$u6y`qGI=L({|Hpd!CeWKm=EuHK==Ee`Wd(HOkj{BZ8whUuq^8{6`ndN|)_f&4HdZjSZ1#BB@5hfH zpnC!W4dA9|qKRjilLN<|`g4H>0^C8jW_;i>E>yBo223Z{B6y^{y}jv_$F+HGO$IlD zl7J}be?2E2b}atZ@#kZV$I%=zV1Eh*@hKjJg4kFQbHsX;wLJx;q*!2z!brvAmT?{Q zShnoy8gW8$2m(8J#l#r6xX{sQ#X8NZ0w;dSlapkOnTd*tA#^FfwiDTb570@=OV-pR z$s?(%FAgOY9~&{7I6ptXUY{_*!pF~TZcdF!QDBLWU2#BorhuiT5uZ&hW8>ri*OGFY zKhW@kl=I(=lLTJx$J+|TX?jye`kX{y+zEI-kedidY9KxXhn{4>*n-h4V`Flwy1>j# z!WgmFkQf#kO)ioB{rz;b!|K*IO`rY!{XrmK7H}h5D+DCV$16o|bbOSt9>p5J2b&fv;<^QNWf|8z&_)%d<@whO2wUT9q5Ze6q zrm|%yRa-3BsHv$_*xUoiTW($fl?*pXgXr!!S?gx=x__07?}-YQLqv80*o2788eJO>iMS}V*_BsE+Qo=ls5%%Oe8-ojB~lfv;Krp3BtPw zOLx;-IUw>;DhdPlYx}|tIIr*QBr^VpEij%O!<6WPL@WNmox2&!6K(Y#(ngmwP|GjA zyDv^%r8hH4WATz4f{I6Gs0EEU(XkJ4yy`;aWcttf8XjvY)eBc5#RP93bLrQUfkzms zaePh$ZfIT%--;KW)jlfUe~@EjNs9c~7)*5CnMtHX_rUhM=8|EE9e**iyCF-NC0tyI zfAZ6$Qa~pvb^z2Qt!Kp#Z0f6=q;}moi;#-tL`O(7J9?QDRKKt~BDd zqJOuBaBR^YKfztQgqmp+oUA2CFQDI93!WdZ=|z%0!kpO&6mx5P>CAtke%2nneHCr2 z_4l5~bBW~=x!rg7_909AyRxm8anpiVef@=Zh!d-|>awI{z5^*uj`v&tR{-s5><9xW zj-eKVa@j=%g=F7yISxeGT!>PUK#{nPjt*u>XD<-!%-8R=?VRJq$HoTbIKQhA`lgka zl{fVbd=e-GfeF#4!15x_Rx`GrG^jMQ zgbR*e8`L?^iZGCr8+;4job-y@z?A(!3gEHmSlu=jx_-TA^t`c-Q(WS_L5IwV!XAk! zMjhvoDIQdC9d5BeA1Eol=lHP*Rt`uU6NgB9``UTxUcu+@AP}X4TDbmS&9?LKpNKnC~E__dBRmv(|v92c32@x`N5JR#5G@ ze-D$wXIX1)>G7as23=R}I?wxd#UccREt=CXIoM}r;(U4JNF854^DLR!=k|;HsN1c2=FJ1xotso@N}?6EGLt~N^wiQ{pOS!>}2T^qJo z?Ih0nY1n%Wp9AvRp4tD2qvw$CIEV66TYsJ{rNLEZ&&6xw;91Si;yK7WBLOG?ET9fI z>X;>z+;Cw0jPC}bkX;jYhYw4e{fq8GjLd6_AI4pp(w0wi#3fZqSU@RaFDVmB1N+p! z0&OS805&~PpzrTJfCL8d3p*j9O4;CFtxNfgMf+Nb5)Ke114tn%Ee*?pmW#_Xia3D) zv}g)Q9QZ6}rjq#D5ZdnN*h8gv(vRt97=G>srE}7zPe|C&d>s<2-U18q)*h`jLu@|#8}B_Mn8l0u?7s+hBP|^l zlZ5ec5|9tvUoyw~!Z)oHjN%WuB2IE%e%4&?;CcE^doNyho2;6mKv&6jLC)FO;J-w` zLp3IZ#4))p=X}z9Jn{UTrQ_g#Yx)Cv3>g=t6T8K?CmNCzYd`z1m6GGfX6+2eXGf$3 zGy7UvodbJZO%#MKPazrbOQ3h%95>qO4+6_VisMfqp=LC-dNbQD`D0gR=J;n}uU-YX zLwDRojHjmzzFdnlXMLF+9wHgncHPZ^cxop!shXe1aQ|&)YUnR+vHb}1kqx!BwJbGZ zv#fY0?Y)pupR}BX3yaiA29xx6pFhZ;wMREu6QcYyNr+*A5}hQ_f@Xh zp%b1nn^r>rw&pNqb%!ejYS*kY1oUjFf*gpEo5uHNq{TfhU=ue38(f&D+>~VxCdF3R zt@4cLw6mp94C$=Lw{poxY#c{?@JlNEmHA(N6Jf`3)aYjx5f0(lk%>5@H{ySnU=WY`brhM_duEeKK(>wa3h z8ZV8sjOIc_$^F04kB*_pVk-I+C@i8qD*UABCnvnEx@)TZQ;a{KZZ}D^UkGs_o@fgr zb!&NjIdkXteC;UzJ`a~re;J0_@?($Y1`kaZ6~mdJRq{NuQj7m+gZ7!8&Q&huVrh|% z`Db*ZZHseT6r#}w(!~m4Q${U=ErG9(WI6FYz}MwCe7&c|p#VBZ4jc#&0K3!~{r`7F zNS@bVl-hcKQ*?TB`s=mM?=g@y-470OmzPfSR@zMyqom>|FWF1bL3q!AQAdg~7a5SuGyX0)2^m{|Nc<>#iS&4tt_|BoUoybLKe`8Yo{MF# zB4@4a?J7>Mv0d$oRY5T<`UW!bHi$%ey~0FR43o841ss%*{V~=q&jR>PWMi zO>U++4Gm$z!SlA(KZ-tTlU^NIS9qW6+FoF2DUTT2bQ{He#ctTzQ~o-o5ff{OJ;>km z_wa}Q$EW0D_^FYEo#2RS(-v3h+8PAQE`r)92*mfQ_P|f!)tm5^TmPoUT!v_V`;Z_qh5|kq2{ijN3LkYSlr9jm}u* zh&l|^s~|62AT!~Df>_l^v!Q?`4TAgL9-nsV)nl^&vGBF0WY7ufId?OQ*YP!Oun%^8 zuF-6q@-bi2(ZL$_lHKY3T|7b11()YvsG~{4Vo1Qy)GXK1l}6ok#pXa)&93e{4jlqn zQG7>Z*VAood6crfH`gWOL;i!{u&OTUP+7i_u`T^xaEK~vTHWZAztNBB&}Zz>%9y$2 zV}A=KimGZ>YM{%YB~@rOM;fO(qJ>XgH$7PwPGid8D%VkTDlM;V_ZUD|(z6~ZynTW< z)^L7D4lX6!5YrO+rnGOk=w|@08L;n9Tlkb6j8@EeREPnh3=|OymZc@7q5%SOG%m8jvepRDHh_^d zx?Gs|yd?;=s!D3XQyg{T7lQ!8shg>sg-f_0;CO2EUO@8FW<*xOkNj}SJ-}Jh^mD8~ zGs$i6=%Or1DMEqTTIq?H`7!Tla@TBE%wC_vZVJD45=yTy!8fn%{{_E1*h#6;)-1@oRj+-&>sdQb`?ty%H5OWU_L_l1@bH&YEA*6D4Q#D{1 znQ%o()e=9eF_M#uGHvw2E9>qnQLh8<%#RVXsC`lVpp-Jm8%L%3D;?nx?6|zTx`gD? zX#!C{%CB=GB5<*kSpeF2y%wPlQsE=~k}mXqy=>HsVNTA`^~s^uCV}5n>eZR=Kr(A|%6i|@+QlyroZ8dJ2*mWdb#p*>{t4G|YyB*>aQx98RH71R6ZX z(MD3v^ee9W;KZ=`p+-1=u90;-A{qFE)sS1@d`a3#`k`*bmNB0KDHyUuwL#d}as}$f=lU6)0d`Enc=u zR2dCmgRDJxc=)SgTgbm7C-<**JE;Yp?G7d2cY6Kd=0{iT8i@|8c1DCN=J0@Jj#SDg zUQto#Jn8gswWY)T8GFu$^Rao8Rv)3F%)CY@zxFQ}(#L)EN1jLSx{gn;+BJq;Kv~vBVtm6hlFHtbEkfm?~acLiN(I_XRE0%hKrvIn@JHjHpal( z!D`nBcn{m0OZdee!RPD|8JX`x{;(Lb9~7B1%}7|M;MxX~>wM?t=B$tFfHbtSk^#hj z7)^ArfJq>5W8Y!?cW9D6nLd9BFpkT2Q=7$dDk>sMMr1HK$Pj@YgJC#$+xPhIo24SU z_k{i*dhoYk8X&RCcp9K9W?^r#M?~D+Ie^dBxx>|~W{HETxe*)(dlnncm>n;F*0QtD znLr;RuC>KMT6UINBmJGzC{QAJvSrX&EKOf^+ic9fMgRT@f2cQ9JHS+*z3@8*0G|y` z)%_=VaPmqQVu&bbhpf^6+=Lhp3S-|nY#Zdxg=#?3KeD`*7uDA%1|uKS7A;NUJ3B2) ztTk$3Y9(D@_lz;h%6QL{kk@O%1PD`k;Nh-ShPW95Xr^|HRUcd#_%Qf<6s9W9KlSa! zt-nH+AY(;G{&Z@vKOj%}7#3;ek>sVd)<$3k^|J9Sa|=V_H4Lv!o?XP+ba~?zZ|#xJ zsZ2hGd#k>SJjKX20R&y%W}Cht?uOGVUueeo&HI%1cJRL=HGkKzB^&%G-gJxhBfNSK zK&~#AZ@|iI=6pMwiCK#;d&1`a+P39pzK zC-@g%aq9JcdMG;Avp`;p;r>31RI}8Q+DnM($WEu?kIz;hjCh~tA$Uh2-G=nBQ~C$d ztqNPWv7Y4{gKugFTH!%-xn!ds~D*uO>_>KI&IUB2JPOlNHBdiDeh89k`-pw&nOaEZmILET2 z5wv1t7-^EXvzMV$#H=QROJV{O$V3Ino12^T`1tx+k-51-3=9k-d*`|{oqb~Bw)GnG z`@4GJ0sH!r79TuQq@+ta17=(z$8A&iVCeDWqRiWGB~w?7CC&!OmfxiMRoB+O*;|^J zz~j%9k&%=81-2=b28R#uVPTvtmN*YeAC0OK0SyL(=P+JaF5o$yELQEv5+nnEy-AoMaLqcAo%{WxJQ z)F2pMx_t1_0VjVK-{V)wlDKL4rBXGEvW%?!5o4MjmF=j?1@$BvMpacq?Bs6hqnbg* z;x$nyVPT5xa+w8wOi@8_-QK<8o}uB1qE%V`x2=Lte93l|8m5_OzX})1`bpimDhi^a zLE9lXEWTZvfBUuJyP8u?WA1yCX>F(@4^OTwb4nE?Q@HHGrN_EGiiOpyx@MWK5tYr@ z{%bPUt&O0qr0^=q?<2<5^(13P^F0H+?FyN)JF=8a)40yW&)_hxlhRTlvEDx>KA*;D{AE_-Ch(>#9%#ddK9r3&U49NT=6nIfbEJ?X_oJMnyQKS)V-Aia%s#uwUmgVaMsmy5)n?gg5mD-{>?P0o&KCJ%f(SPwnn1PE8>>Dvc?tK@2Ka+gP;5acrr-!_j~ zHyzj}ylf*D7cOL%v{U@qgycpH_*_;j8LzmiI#ojM4^$c5)tt!YSbiodA(!; z03TpK_>mcu>pj)fdQ1v^bj?K+CYXx+Trir=nZ^gBLqx zUEd!f`2%h%w(L}>rM*l~i1CxE^6QkhbE}hEDz18|Q=kkX;yxHL4^6F~Iu+Nfkuh_t zimqZe&NJhc;YI>^M@oGCqd}d|Jua#Q+6%;(F+;z%EaM)>pIw_5GwOEy5Feu}N9BMM zqaVn|D^OtIB4}uO(PQcxf4ini=wPOmctb4`g zdsI|^+n3bN5V?xk{d^SUa*j9kZaLo?7h06L0CiVgR~K!-1Q;~TxmqhyVn#^wR6huF7U*(f~#Riq)Fd9R>_5*!a0+t?3|)sLeRV75IzZ?K93O zyJYkPGFkt^RJrU-!E|vVu-|P$;OBtz0N75@}dPp zK#CvDJVVW+QSh_u?YUKD1sD{4j{kh^4extQwfFBre}8^)eUL`~!`MKFjs#qIAdto@ z^_4D}!MkOQMu+O+=YNJ%_)9RxWk8uZz@dh^Wc(2m2W>c(1jHJ+h*zXNqK5t5X?P`qx_6 zI|$MQ26PiR1vs>hJV;r8jc0{|o+B{&a>Ge|R^I(C9O`pzS}h#}co9Do z!u2h?Lhm7DcCB#1kH3Bf?h#+0#BxSoO#y3Iz=kH#+{h(`hkMRyC<%EzQi52aiW!Sf zfhp~nxnR_xnMbSF=!`m9f((Q+f@Kbj%9k3L{xODM*?Aes_2Y7rTn~Jr%I5LE$)Zj7 zA=-HLA$gxRe<~W961sHh)K0}yiupAZd{tiKMQfOTXkgq|)MR#vC3YG+{;a>Wp&ebc z=e~AsJA0O$==cLg!mr^=*%uM|N^wh~8vZhI zzB>j$zqVR3kFQ1WM>*Q`(UXDo?%(&)DN}foMAz;q0WCR}_=U=CfDFawB3WJMpEhs} zDuz-kVpXr@li~>Ta3CV4LX?23qawpHX6_V&fR`4GbHf1~f*W{a&mi6K+}5+7#2D%D z7)Ox)upoFDPm?7e1wUW`zmgFJKr|!fSifQlI}dF#W!kz1xBbg2n?O3kXT&m#?g#qk6quBy4LrSiMGYy;7tHOa^^aWi6PV}v-&++BEx1u61 z1>O^KrYGV?IWKuSvx-k!EG`5l6Jv~>s)ha1vT(Qz%leLilInRjHRnO%Nci<#>~>w? zTFS#HFGca$l!{{4ZXJ1x!I!1(mc*v5vfLR8%?8IEk7V&=uac7759FjvBKA`k2*=l> zDznREu8h|?71kudjqmt^xONhX!Y{Kg1c*XH!@Oli=AbMlrL2F{2O4JtJ6tITlxh#9 z_+U45eZb;`Cj2^`od&SleOJ4qyvcweHiajwwWG8ci+3ANjcntiQEvFj>ExJib1y+! zu~CHzHHdaxJv-~~+@wn`$}cJ+#(X^=f9%5x*C8;B!Z$SG&MFdK0blPY9Sa1Vz=8v+H8u`TRa?HY?t)E)1jc7x>; zVzr>hb!@5?U0+D8w0rdDBfMQ*#C4rSVhMmmVi{FcF`G?T4p_K%|32N_-Gswo5{V`1 z>*|@9nB3HAyq(_0U=PngP4aYfbx;Je@o8$T2iFd(J#;ot@#ycTnWr^)XbC<|okwhh zNltLMgtJh&9PhimF3w%XYwkYojI4cg%t)JcZ0&gA8H|GR<_XCU$Fka#Sp(_q#_RWkP_&2CS?tWINUAFJi`_r+IX2WEJD7% zyRp1^=6R2jGnR{eC}A&57pJh(w~) z*43h_DwtA#*t7N6gj^M-D_UB&13 z(b4e*np4AMQc~AyZ+8)mM$w!a=e%A%aU7(*-G#&9z~OM9XV0vs_Ag0Te}1fkRmjA%qY@i2Y_f{b3kJEd5}{P2`4Q#1uuDNqc>1SBfZv5JCu1 zUf!-eX0iuQkYg2|VHm-cDY+#ezT?FcLI@#*C_ghK2T#FV2bFxkA+G$KSGR)&6G8|f zgeX^`Tr*Fr@(!Sc5JCtcL~bQtg(rj%LI|00000NkvXXu0mjf$>(9e literal 0 HcmV?d00001 diff --git a/source/search_and_replace/search-in-files-with-filters.png b/source/search_and_replace/search-in-files-with-filters.png new file mode 100644 index 0000000000000000000000000000000000000000..980216c02b07b1e34c64f460bfb1a83c1baa946a GIT binary patch literal 8971 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 这个章节) .. _snr-incremental-search-buffer: -增量查找 +增量搜索 ================== -按下 ``Ctrl + I`` 可以呼出 **增量搜索面板** 。与正常的搜索面板相比,唯一的区别在于 ``回车`` -键的作用:在增量搜索中,按下回车键将选中缓冲区中下一段与搜索条件匹配的文字,并自动关闭面板。 -一般来说,可以根据个人的喜好来决定是选择增量搜索面板还是普通搜索面板。 +按下 ``Ctrl + I`` 可以打开 **增量搜索面板** 。与正常的搜索面板相比,唯一的区别在于 ``回车``键的作用:在增量搜索中,按下回车键将选中缓冲区中下一段与搜索条件匹配的文字,并自动关闭面板。一般来说,可以根据个人的喜好来决定是选择增量搜索面板还是普通搜索面板。 +===================== ==================== +**打开增量搜索面板** ``Ctrl + I`` +开/关正则表达式选项 ``Alt + R`` +开/关大小写敏感选项 ``Alt + C`` +开/关精确匹配选项 ``Alt + W`` +查找下一个 ``Enter`` +查找上一个 ``Shift + Enter`` +查找全部 ``Alt + Enter`` +===================== ==================== .. _snr-replace-buffer: @@ -38,9 +45,10 @@ 可以通过 ``Ctrl + H`` 来打开替换面板。 -========================== ======================= -替换全部内容: ``Ctrl + Alt + Enter`` -========================== ======================= +================ ======================== +替换下一个内容 ``Ctrl + Shift + H`` +替换全部内容 ``Ctrl + Alt + Enter`` +================ ======================== .. xxx no key binding for replacing once? @@ -55,8 +63,7 @@ .. todo: link to goto anything section -可以在Goto Anything(快速跳转)(译者注:ctrl+P唤出,或者菜单栏->Goto->Goto Anything)面板中使用 ``#`` 操作符在当前缓冲区中进行搜索。跟在 ``#`` -操作符后面的内容将被识别为搜索关键字。 +可以在Goto Anything(快速跳转)(译者注:``Ctrl+P`` 唤出,或者菜单栏-> **Goto** -> **Goto Anything** )面板中使用 ``#`` 操作符在当前缓冲区中进行搜索。跟在 ``#`` 操作符后面的内容将被识别为搜索关键字。 文本搜索的其他快捷键 --------------------------------------- @@ -64,18 +71,26 @@ 下面的这些快捷键在搜索面板不可见的情况下仍然有效。 =============================================== ============== -Search Forward Using Most Recent Pattern ``F3`` 使用最近一次的搜索模式进行前向搜索 ``F3`` -Search Backwards Using Most Recent Pattern ``Shift + F3`` 使用最近一次的搜索模式进行后向搜索 ``Shift + F3`` -Select All Matches Using Most Recent Pattern ``Alt + F3`` 使用最近一次的搜索模式进行全搜索 ``Alt + F3`` =============================================== ============== +你还可以根据当前所选内容执行搜索: + +======================== ================== +使用当前所选内容进行搜索 ``Ctrl + E`` +使用当前所选内容进行替换 ``Ctrl + Shift + E`` +======================== ================== + .. search under cursor ?? 多行搜索 ---------------- -你可以输入一个多行搜素模式。在搜索面板中使用 ``Ctrl + 回车`` 键来输入换行符。值得一提的是, -搜索面板的大小是可以调整的。 +你可以输入一个多行搜素模式。在搜索面板中使用 ``Ctrl + 回车`` 键来输入换行符。值得一提的是,搜索面板的大小是可以调整的。 + +.. figure:: search-and-replace-multiline.png + + 多行模式 +请注意,搜索面板也可以调整大小。 \ No newline at end of file diff --git a/source/search_and_replace/search_and_replace_files.rst b/source/search_and_replace/search_and_replace_files.rst index 2745990..02ef3ec 100644 --- a/source/search_and_replace/search_and_replace_files.rst +++ b/source/search_and_replace/search_and_replace_files.rst @@ -3,22 +3,19 @@ =================================== .. _snr-search-files: +用于搜索多个文件的搜索面板称为“**在文件中查找**”。 搜索 ========= 使用 ``Ctrl + Shift + F`` 键可以打开多文件搜索面板。搜索面板与搜索动作可以使用快捷键进行操作: -========================== =========== -Toggle Regular Expressions ``Alt + R`` +========================== =========== 开/关正则表达式选项 ``Alt + R`` -Toggle Case Sensitivity ``Alt + C`` 开/关大小写敏感选项 ``Alt + C`` -Toggle Exact matches ``Alt + W`` 开/关精确匹配选项 ``Alt + W`` -Find Next ``Enter`` 查找下一个 ``Enter`` -========================== =========== +========================== =========== .. _snr-search-scope-files: @@ -31,9 +28,11 @@ Find Next ``Enter`` * 使用某种模式来添加/删除某些文件 * 添加链接位置(````, ````) -你可以在一次搜索中组合使用以上确定作用域的方式,并且在不同方式之间用逗号分隔,例如: +你可以在一次搜索中组合使用以上确定作用域的方式,并且在不同方式之间用逗号分隔。 - /C/Users/Joe/Top Secret,-*.html, +.. figure:: search-in-files-with-filters.png + + Combining Where scopes in Find in Files 通过在搜索面板中按 **...** 按钮来显示包含这些选项的菜单。 @@ -56,6 +55,13 @@ Windows平台上,可以使用 */C/Users/* 来指定盘符) * 在单独的缓冲区/输出面板中显示 * 显示上下文 +.. figure:: search-and-replace-search-results.png + + 在文件中查找结果显示在视图中 + +.. figure:: search-and-replace-results-buttons.png + + 用于自定义“在文件中查找”结果的按钮 .. _snr-results-navigation-files: @@ -64,9 +70,7 @@ Windows平台上,可以使用 */C/Users/* 来指定盘符) 一旦找到了符合要求的内容,你就可以使用以下的快捷键进行结果之间的跳转: -================ ============== -Next match ``F4`` +================ ============== 转到下一个匹配项 ``F4`` -Previous match ``Shift + F4`` -转到前一个匹配相 ``Shift + F4`` -================ ============== +转到上一个匹配项 ``Shift + F4`` +================ ============== diff --git a/source/search_and_replace/search_and_replace_overview.rst b/source/search_and_replace/search_and_replace_overview.rst index cdc6998..9606075 100644 --- a/source/search_and_replace/search_and_replace_overview.rst +++ b/source/search_and_replace/search_and_replace_overview.rst @@ -7,8 +7,8 @@ Sublime Text主要有两种搜索方式: .. toctree:: :maxdepth: 1 - 搜索和替换 - 单文件 - 搜索和替换 - 多文件 + 搜索 - 单文件 + 搜索 - 多文件 我们将逐一讲解这两种搜索方式,但在此之前,让我们先来聊一聊一个强大的文本搜索工具:正则表达式。 @@ -17,18 +17,15 @@ Sublime Text主要有两种搜索方式: 正则表达式 =================== -正则表达式用于在文本中找到复杂的 *模式* 。为了最大程度的利用Sublime Text提供的搜索与替换功能, -你至少需要掌握基本的正则表达式使用方法。在本文档中我们不会讲解如何使用正则表达式。 +正则表达式用于在文本中找到复杂的 *模式* 。为了最大程度的利用Sublime Text提供的搜索与替换功能,你至少需要掌握基本的正则表达式使用方法。在本文档中我们不会讲解如何使用正则表达式。 (译者注:要想学习正则表达式,可以阅读O'REILLY出版社出版的 `《精通正则表达式》`_ 一书) .. _《精通正则表达式》: http://book.douban.com/subject/2154713 -如果让你一直输入 *regular expression(正则表达式)* 这个词组,很快你就会觉得很无聊,甚至会 -觉得的很烦人,因此宅男们经常把这个词组缩写为 *regexp* 或者 *regex* 。 +如果让你一直输入 *regular expression(正则表达式)* 这个词组,很快你就会觉得很无聊,甚至会觉得的很烦人,因此宅男们经常把这个词组缩写为 *regexp* 或者 *regex* 。 -(译者注:对汉语来说毫无压力,大家可以说“正则表达式”或者“正则”;另外,上文中的 *宅男* 原文为 -*nerd* ,还可以翻译成书呆子、极客 *geek* ,根据语境这里指代经常使用计算机的人) +(译者注:对汉语来说毫无压力,大家可以说“正则表达式”或者“正则”;另外,上文中的 *宅男* 原文为 *nerd* ,还可以翻译成书呆子、极客 *geek* ,根据语境这里指代经常使用计算机的人) 咱们来看个正则表达式的例子吧:: @@ -36,11 +33,23 @@ Sublime Text主要有两种搜索方式: 正则表达式真是坑爹啊。 -为了在搜索中利用正则表达式,需要在搜索面板中开启这个选项。否则,输入的正则字符将被视作字符常量 -进行匹配。 - Sublime Text使用正则表达式中的 `Boost语法`_ 。 .. _Boost语法: http://www.boost.org/doc/libs/1_47_0/libs/regex/doc/html/boost_regex/syntax/perl_syntax.html (译者注:正则表达式有很多类型的方言) + +在Sublime Text中使用正则表达式 +============================== +为了在搜索中利用正则表达式,需要在搜索面板中开启这个选项。否则,输入的正则字符将被视作字符常量进行匹配。 + +.. figure:: search-and-replace-regex-sample.png + + 启用了正则表达式选项的搜索面板 +.. seealso:: + + `Boost库的正则表达式文档 `_ + 有关正则表达式的文档。 + + `Boost库的格式字符串文档 `_ + 有关格式字符串的文档。 请注意,Sublime Text另外将 :samp:`\\{n}` 解释为 :samp:`${n}`。 \ No newline at end of file