使用Lua/love2d进行Sublime Text的选择

假设我有这样一行代码:

Object.Property.field;
Object.Property:FunctionName();

在我的 sublime 所有语言中,如果我双击任意一行上的 "Property",它只会选择该单词。 但是由于某些原因,我的 lua/lua love2d 语法高亮会选择整行直到 ":" 的部分。

如何更改此行为,以便仅选择单个单词?

点赞
用户1426065
用户1426065

发生这种情况的原因是 Lua Love 插件中有一个有点怪异的添加,我猜测你正在使用这个插件。因为你使用的是 Sublime 2,所以选择 Preferences -> Browse Packages... 打开你的 Packages 文件夹,然后打开 Lua Love 子文件夹。里面有一个名为 completions.py 的文件,其内容如下:

#completions.py
import sublime
import sublime_plugin
import re

class LoveCompletions(sublime_plugin.EventListener):
    ST = 3000 if sublime.version() == '' else int(sublime.version())

    def on_query_completions(self, view, prefix, locations):
        if self.ST < 3000 and ("lua" in view.scope_name(locations[0])):
            seps = view.settings().get("word_separators")
            seps = seps.replace('.', '')
            view.settings().set("word_separators", seps)

即使你不懂 Python,这个逻辑也很容易理解。它将变量 ST 设置为 Sublime 的版本,如果你使用的是 ST3(当前版本为 3061),那么它会大于等于 3000,如果你使用的是 ST2,那么它将等于 2221(我想)。然后它设置一个事件监听器(该进程总是在后台运行),检查 Sublime 版本是否小于 3000(你在使用 ST2),并且你的当前作用域中有 lua(基本上,如果你使用插件的语言定义,那么你的文件就是 source.luasource.lua.love)。如果这两个条件都成立,则会从你的 "word_separators" 设置中移除 . 字符,该设置在 Preferences -> Settings-Default 中定义,并可以在 Preferences -> Settings-User 中进行覆盖。

word_separators 设置控制双击选择单词时将被视为单词分隔符的字符。它的默认值为 ./\\()\"'-:,.;<>~!@#$%^&*|+=[]{}`~? 因此,例如,如果你在 foo-barfoo 部分双击,Sublime 只会选择 foo,但如果你在 foo_barfoo 部分双击,Sublime 将选择整个字符串(因为 -word_separators 中)。默认情况下,.word_separators 中,因此在 foo.bar 中双击 foo 只会选择 foo,这是大多数人预期的行为。然而,这个漂亮的小插件会从 Sublime Text 2 中的 word_separators 中移除 .,因此在你的情况下,点击 Property 会选择从“单词”的开始位置(Object 之前的空格)到下一个单词分隔符 - 在第二个例子中是 :

好的,我们知道问题是什么,如何解决?首先,当你在 Packages/Lua Love 中时,完全删除 completions.py。这样做不会有任何危害,事实上,它实际上正在通过存在而造成危害。确保在删除文件后重新启动 Sublime。接下来,打开 **Preferences -> Settings-User**,并在双引号之间的任何位置将 . 添加回到 word_separators 列表中。保存该文件,回到源代码,然后双击应该会再次正常工作。

祝好运!


编辑

我提交了这个 pull request,从插件的 Github 存储库中删除了 completions.py 文件,它已经被合并,所以希望将来的用户不必处理这个问题:)

2014-06-02 23:01:41