mirror of
https://github.com/Foundry376/Mailspring.git
synced 2025-03-13 16:54:40 +08:00
Summary: This diff includes a few small things: - Menu: Don't select the first item until the user taps down arrow, and allow the user to use the arrow keys to move up and down through Menu items. - Menu: Make scroll code from MultiselectList re-usable, use in Menu. Now if you use the keys to move to an item that is offscreen it will follow. - Popover: Tapping the button that opened popover should close it - Make sure buttons in toolbars are at least standard height - Re-enable Markdown processing via `grunt docs` - A bit of initial inline documentation for crosjdoc. Need to evaluate whether this is worth doing everywhere. - New `search-playground` package for experimenting with search and search weights. - Swap itemClassProvider for more generic itemPropProvider - Add crojsdoc config file - Export React, because third party packages can't require things from our app - [FEATURE] Bring back static file support in third party packages via `nylas://translate/IMG_20150417_124142.jpg` - Fix invariant error with search bar - [FEATURE] "Show Original" under Message actions - Fix DatabaseView so that many archives at once don't cause problems Test Plan: Run specs Reviewers: evan Reviewed By: evan Differential Revision: https://review.inboxapp.com/D1426
87 lines
4.1 KiB
Markdown
87 lines
4.1 KiB
Markdown
# Scoped Settings, Scopes and Scope Descriptors
|
|
|
|
Atom supports language-specific settings. You can soft wrap only Markdown files, or set the tab length to 4 in Python files.
|
|
|
|
Language-specific settings are a subset of something more general we call "scoped settings". Scoped settings allow targeting down to a specific syntax token type. For example, you could conceivably set a setting to target only Ruby comments, only code inside Markdown files, or even only JavaScript function names.
|
|
|
|
## Scope names in syntax tokens
|
|
|
|
Each token in the editor has a collection of scope names. For example, the aformentioned JavaScript function name might have the scope names `function` and `name`. An open paren might have the scope names `punctuation`, `parameters`, `begin`.
|
|
|
|
Scope names work just like CSS classes. In fact, in the editor, scope names are attached to a token's DOM node as CSS classes.
|
|
|
|
Take this piece of JavaScript:
|
|
|
|
```js
|
|
function functionName() {
|
|
console.log('Log it out');
|
|
}
|
|
```
|
|
|
|
In the dev tools, the first line's markup looks like this.
|
|
|
|

|
|
|
|
All the class names on the spans are scope names. Any scope name can be used to target a setting's value.
|
|
|
|
## Scope Selectors
|
|
|
|
Scope selectors allow you to target specific tokens just like a CSS selector targets specific nodes in the DOM. Some examples:
|
|
|
|
```coffee
|
|
'.source.js' # selects all javascript tokens
|
|
'.source.js .function.name' # selects all javascript function names
|
|
'.function.name' # selects all function names in any language
|
|
```
|
|
|
|
[Config::set][config-set] accepts a `scopeSelector`. If you'd like to set a setting for JavaScript function names, you can give it the js function name `scopeSelector`:
|
|
|
|
```coffee
|
|
atom.config.set('.source.js .function.name', 'my-package.my-setting', 'special value')
|
|
```
|
|
|
|
## Scope Descriptors
|
|
|
|
A scope descriptor is an [Object][scope-descriptor] that wraps an `Array` of
|
|
`String`s. The Array describes a path from the root of the syntax tree to a
|
|
token including _all_ scope names for the entire path.
|
|
|
|
In our JavaScript example above, a scope descriptor for the function name token would be:
|
|
|
|
```coffee
|
|
['source.js', 'meta.function.js', 'entity.name.function.js']
|
|
```
|
|
|
|
[Config::get][config-get] accepts a `scopeDescriptor`. You can get the value for your setting scoped to JavaScript function names via:
|
|
|
|
```coffee
|
|
scopeDescriptor = ['source.js', 'meta.function.js', 'entity.name.function.js']
|
|
value = atom.config.get(scopeDescriptor, 'my-package.my-setting')
|
|
```
|
|
|
|
But, you do not need to generate scope descriptors by hand. There are a couple methods available to get the scope descriptor from the editor:
|
|
|
|
* [Editor::getRootScopeDescriptor][editor-getRootScopeDescriptor] to get the language's descriptor. eg. `[".source.js"]`
|
|
* [Editor::scopeDescriptorForBufferPosition][editor-scopeDescriptorForBufferPosition] to get the descriptor at a specific position in the buffer.
|
|
* [Cursor::getScopeDescriptor][cursor-getScopeDescriptor] to get a cursor's descriptor based on position. eg. if the cursor were in the name of the method in our example it would return `["source.js", "meta.function.js", "entity.name.function.js"]`
|
|
|
|
Let's revisit our example using these methods:
|
|
|
|
```coffee
|
|
editor = atom.workspace.getActiveTextEditor()
|
|
cursor = editor.getLastCursor()
|
|
valueAtCursor = atom.config.get(cursor.getScopeDescriptor(), 'my-package.my-setting')
|
|
valueForLanguage = atom.config.get(editor.getRootScopeDescriptor(), 'my-package.my-setting')
|
|
```
|
|
|
|
|
|
[config]:https://atom.io/docs/api/latest/Config
|
|
[config-get]:https://atom.io/docs/api/latest/Config#instance-get
|
|
[config-set]:https://atom.io/docs/api/latest/Config#instance-set
|
|
[config-observe]:https://atom.io/docs/api/latest/Config#instance-observe
|
|
|
|
[editor-getRootScopeDescriptor]:https://atom.io/docs/api/latest/TextEditor#instance-getRootScopeDescriptor
|
|
[editor-scopeDescriptorForBufferPosition]:https://atom.io/docs/api/latest/TextEditor#instance-scopeDescriptorForBufferPosition
|
|
|
|
[cursor-getScopeDescriptor]:https://atom.io/docs/api/latest/Cursor#instance-getScopeDescriptor
|
|
[scope-descriptor]:https://atom.io/docs/api/latest/ScopeDescriptor
|