ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
<!-- 译者:Github@wizadforcel --> # 作用域设置、作用域和作用域描述符 # Atom支持语言特定的设置。你可以在Markdown文件中软换行,或者在Python中把tab的宽度设置为4。 语言特定的设置只是一些东西的子集,我们把它叫做“作用域设置”。作用域设置可以只作用于一类特定的语法符号。比如你可以仅仅对Ruby的注释,Markdown中的代码段,或者JavaScript函数名称进行设置。 ## 语法符号中的作用域名称 ## 编辑器的每个符号都有一系列的作用域名称。例如,前面提到的JavaScript函数可能拥有作用域`function`和`name`。一个左括号可能拥有`punctuation`、`parameters`和`begin`作用域。 作用域的名称就像CSS中的class一样工作。事实上,编辑器中的作用域名称作为CSS的class附加到符号的DOM节点。 比如这段JavaScript代码: ``` function functionName() { console.log('Log it out'); } ``` 在开发工具中,第一行的标记就像这样: ![](https://box.kancloud.cn/2015-12-28_5680ba002d411.png) span标签上的所有class名称都是作用域名称。任何作用域名称都用于指向一个设置的值。 ## 作用域选择器 ## 作用域选择器允许你指向特性符号,就像CSS选择器指向DOM中特定的节点。这里是一些例子: ``` '.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`接受一个`scopeSelector`。如果你想要对JavaScript 函数名称进行设置,你可以向它提供一个js函数名称的`scopeSelector`: ``` atom.config.set('.source.js .function.name', 'my-package.my-setting', 'special value') ``` ## 作用域描述符 ## 作用域描述符是一个对象,它封装了一个字符串数组。数组描述了从语法树根节点到符号的路径,包含整个路径的所有作用域名称。 在上面的JavaScript例子中,函数名称符号的作用域描述符应该为: ``` ['source.js', 'meta.function.js', 'entity.name.function.js'] ``` `Config::get`接受一个`scopeDescriptor`,你可以从作用在JavaScript函数名称的设置中获取值,通过: ``` scopeDescriptor = ['source.js', 'meta.function.js', 'entity.name.function.js'] value = atom.config.get(scopeDescriptor, 'my-package.my-setting') ``` 但是你并不需要手动生成作用域描述符。有一些可用的方法来从编辑器获取作用域描述符: + `Editor::getRootScopeDescriptor`获取语言的描述符,例如`[".source.js"]`。 + `Editor::scopeDescriptorForBufferPosition`获取缓冲区中特定位置的描述符。 + `Cursor::getScopeDescriptor`获取光标处的描述符。例如,如果光标在例子中的方法名称上面,会返回`["source.js", "meta.function.js", "entity.name.function.js"]`。 让我们使用这些方法来回顾我们的例子: ``` 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') ```