您的位置:首页 > 编程语言 > Go语言

Godef 插件无法跳转问题

2016-01-08 09:34 369 查看
安装完 Godef 插件后,有些文件的代码跳转总是报下面的错误

=================[Godef]Begin=================

[Godef]INFO: using godef: C:\gopath\bin\godef.exe

[Godef]INFO: selcet_begin: 636 offset: 798

[Godef]INFO: spawning: C:\gopath\bin\godef.exe -f D:\development\go\go-example\src\example\test\net\httpserver\form\login.go -o 798

[Godef]ERROR: no definition found: b'godef: no identifier found\n'

=================[Godef] End =================

到底是 Godef.py 代码中的输入参数 offset 错了呢?还是 godef.exe 解析出错了呢?我琢磨了下,发现 Godef.py 中打印的 selcet_begin 就是 sublime 提供的光标所在的字符位置(一个中文字符算一个字符) - 在 sublime 用鼠标从文件起始位置选中拖到刚才光标的位置,所选中的区域总共的字符个数在左下脚状态栏中会显示出来。而 offset 是上面区域字符串的字节长度 (注意是字节不是字符,一个中文字符有多个字节)。下面是 Godef.py 计算 offset 的代码。我就纳闷了上面打印的 offset > selcet_begin ,计算出来的应该就是字节,没有问题啊!而且 godef.exe 要求的参数肯定也是按字节计算的,因为有些带有中文注释的代码也是可以正常跳转的!

view = self.window.active_view()

filename = view.file_name()

select = view.sel()[0]

select_begin = select.begin()

select_before = sublime.Region(0, select_begin)

string_before = view.substr(select_before)

string_before.encode("utf-8")

buffer_before = bytearray(string_before, encoding="utf8")

offset = len(buffer_before)

print("[Godef]INFO: selcet_begin: %s offset: %s" %

(str(select_begin), str(offset)))

我使用notepad 打开该文件,发现用鼠标从文件起始位置选中拖到刚才光标的位置,notepad 状态栏显示的选中长度居然比上面的 offset 大,我再用这个值在命令行中执行 godef.exe ...\login.go -o xxx 命令,发现正确输出了要跳转的文件名和光标应所处的位置。看来是 Godef.py 插件提供的 offset 错了导致的!

为什么会错,我又细心的分析起这段文本,终于发现 notepad 显示这段文本的换行符是 Dos\Windows (\r\n),意识到可能是换行符的问题,我把换行符转为 unix 后,就可以正常跳转了!也就是说 Godef.py 计算出的 offset 每一行少计算了一个 \r 字符!

我尝试修改 Godef.py 代码,但是发现这不是 Godef.py 的错,可以肯定是 sublime text 提供的这个方法 view.substr() 方法把 windows 的换行符转为了 unix 的换行符!我查了一下 sublime text 的 api ,寄希望于 Region 提供的一个 size() 方法,使用下面的代码打印后发现返回的是字符的个数,看来此路不通。

print("[Godef]INFO: size:%d" % select_before.size())

好吧,那就把 windows 换行符转换为 unix 换行符吧。好在 sublime 已经为我们提供了该功能,我修改了下 sublime text 下面的配置。在状态栏右下脚就出现了换行符转换的功能按钮,点击后转换到 unix 即可!

"show_line_endings": true,

"default_line_ending": "unix"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: