我是Sublime插件开发中的新手。
这是我想做的
所以这是我的代码:
class MyCommand(sublime_plugin.TextCommand):
def run(self, edit):
print("load")
self.view.insert(edit, 0, "test")
self.view.replace(edit, 0, "te") #self.view.replace(edit, region, "te")
我在shell上运行此命令:
view.run_command("my")
现在它给了我错误。
我该如何解决?
我如何获得区域信息或仅删除一些单词?
view.insert()
方法将要在文档中执行插入的点作为参数:
A point
实际上只是文档的偏移量(以字符为单位);因此,0
点是文档中的第一件事,2
中应包含两个字符,依此类推。该部分正在为您工作。
中断的部分是对view.replace()
的调用,这会给您这个错误(尽管路径会有所不同):
Traceback (most recent call last):
File "C:\Program Files\Sublime Text 3\sublime_plugin.py", line 1088, in run_
return self.run(edit)
File "C:\Users\micro\AppData\Roaming\Sublime Text 3\Packages\User\untitled.py", line 9, in run
self.view.replace(edit, 0, "te") #self.view.replace(edit, region, "te")
File "C:\Program Files\Sublime Text 3\sublime.py", line 837, in replace
sublime_api.view_replace(self.view_id, edit.edit_token, r, text)
TypeError: Region required
原因是view.replace()
方法用您的字符串替换了一段文本;因此您不能只提供一个职位,因为那还不够:
您的呼叫正在提供point
,这是不期望的,因此会出现错误。相反,您需要提供Region
:
Region
类包装了引用缓冲区中的文本范围的开始(a
)和结束(b
)位置。如果b
大于a
,则区域可以为“正向”;如果b
小于a
,则区域可以为“反向”。所选文本就是一个例子。如果光标在选择的右侧,则为“前进”,但如果光标在选择的左侧,则为“后退”。
区域也可能为空,在这种情况下,a
和b
值相同。这样的区域的长度为0,因为它不跨越任何文本。一个例子就是光标位于文档中而没有选择。它代表一个选择,该选择在同一点开始和结束。
您可以使用上面的构造函数来构造区域;根据您要执行的操作,您需要以其他方式构造区域。
例如,您可以将上面的行替换为此:
self.view.replace(edit, sublime.Region(0), "te")
这告诉Sublime用文本te
替换从位置0开始到位置0的文本。在这种情况下,只将字符插入缓冲区的开头,因为该区域是空的(因此它什么也不会代替)。
您也可以这样做:
self.view.replace(edit, sublime.Region(0, 4), "te")
[该区域现在跨越字符0到4,因此它将仅用test
代替您插入的te
(即,看起来您擦除了test
的最后两个字符。
如果您的目标是纯粹删除文本,那么您需要view.erase()
:
如此处所示,为erase
方法指定一个区域,它会删除该区域中的所有文本。因此,如果您想删除添加的文本test
,则可以执行以下操作:
self.view.erase(edit, sublime.Region(0, 4))
现在命令的结果就像它根本没有插入任何东西。