<!-- 譯者: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');
}
```
在開發工具中,第一行的標記就像這樣:

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')
```