解决 Atom 编辑器 godef 插件不生效的一个小 bug

梁川   |     |   487 次阅读

最近跟风在看 geth 代码,本着工欲善其事必先利其器的原则,认真的考察了各个go的开发工具,eclipse 和 intellij 的go插件对 gopath 的处理都有一些小问题,导入依赖时总是找不到依赖,莫名其妙的报很多红叉非常碍眼,不知道是不是因为geth用了 makefile 做构建的原因;种种原因吧最终将目标锁定 Atom 这个神器(solidity 的插件非常棒);各种优秀的插件把 Atom 装修的跟一个 IDE 一样,但当用到 godef 这个插件时遇到了一些小麻烦;

首先介绍一下 godef 这个插件,用它可以实现 go 语言的 go to definiation 功能,就像用 IDE 时按住 ctrl 用鼠标一点方法名就能跳转到方法一样,不论写代码还是看代码这个功能都太重要了。但是在使用时,发现只有第一次打开编辑器时可以使用(在方法上点 ctrl+i 跳转),再用就没反应了,还好 Atom 提供了控制台,调试时发现使用插件时会提示 "godef not find",在插件的代码中找到了这段代码,如下:

        .....
        godef: (file, offset, position) ->
    @gopath = process.env.GOPATH
    found = false
    if @gopath and not @godefpath?
      for p in @gopath.split(':')
        @godefpath = path.join(p, 'bin', 'godef')
        exists = fs.existsSync(@godefpath)
        if exists
            found = true
            break
        else
            continue
    if not found
      console.log "godef not find."
      return

    args = [
        @godefpath
        '-f'
        file
        '-o'
        offset
    ]
        ......

虽然根本都看不懂这到底是什么语法,但是逻辑上还是能看得懂的,问题就出现在 found 变量上,这个局部变量被定义为 false ,每次方法执行时,都会被定义成 false,
但是 if @gopath and not @godefpath? 就只执行一次(debug时验证的),
所以下面的 if not found 在第二次执行此方法后,就永远只能 console.log "godef not find." 并 return 了;

说了一大堆废话,其实就是把下面这三行删了就ok了

 if not found
      console.log "godef not find."
      return

希望这个小小的发现能对使用 atom 来看 geth 代码的同学提供一点点帮助。

 
1 人喜欢