2017-04-10 59 views
0

我正在學習關於詞法和動態作用域(以及因此文件變量)。分號在定義本地文件變量中的作用

許多資源建議更新使用

;; -*- lexical-binding: t -*- 

;;; -*- lexical-binding: t -*- 

但是,lexical-binding文件變量,則Specifying Local File Variables文檔中,一般的分配形式是

-*- mode: modename; var: value; … -*- 

按照這種形式,我會期待一個lexical-binding的定義看起來像

-*- lexical-binding: t -*- 

所以,我測試了它。我有一個名爲lexical-scratch.el的文件。第一行是文件變量規格之一(帶有或不帶分號)。我保存緩衝區,然後撥打M-x revert-buffer。當我這樣做時,調用C-h v lexical-binding顯示變量已更新。我可以使用nil代替t重複此過程來重置變量。

運行所有窗體似乎與更新文件變量具有相同的效果。

爲什麼領先的分號不註釋掉這個任務?是否因爲分號被視爲文件變量之間的分隔符?如果是這樣,Emacs如何區分標記評論和分隔符的分號?

回答

2

文件本地變量的規格不是elisp,可以是任何文件類型(C程序,文本文件等)的一部分。

因此,它們可以通過模式的評論分隔符來保護,以便不干擾例如讀取同一文件的編譯器。

在這種情況下,分號會作爲elisp註釋出現,因此您可以無誤地評估緩衝區。只有分號is a commenting convention

+0

文件局部變量是否來自在C中實現的Emacs部分呢? –

+0

不一定。使用emacs編輯的相同文件很可能會被其他軟件(HTML解析器,Python解釋器,C編譯器等)讀取,因此您必須能夠對文件局部變量標記進行註釋以避免中斷文件語義。嘗試不使用分號的「eval-buffer」,它會失敗。 – Juancho

+0

我不明白你的評論Lorem Ipsum,但我想也許你對答案中提到的「C程序」感到困惑。由於' - * - '行是文件的一部分,因此可以通過任何*軟件來分析文件,但對於任何這樣的解析器來說它不會是有效的語法*,因此它需要一條評論。評論語法取決於文件的種類。例如'// - * - indent-tabs-mode:nil; - * - '可能在Javascript程序中使用。 – phils