atom分析-项目目录中的git状态显示

被刻印的时光 ゝ 提交于 2019-12-10 13:56:43

    最近都在用atom来代替了sublime text来写代码,github强大的开源插件让这个编辑器变得非常的强大而且有个性化,推荐前端开发的朋友都去尝试使用,为什么不是都建议使用呢?因为atom占用的内存比sublime text确实大了很多很多,目前还出现过崩溃的情况。

    这次不是讨论atom的好坏,而是发现了一个问题,atom不能显示git项目的分支。

    用atom的朋友应该都都知道,atom打开了git项目(不需要是github),打开项目的其中一个文件,那么在atom的右下角位置都会显示你项目当前的分支,显示修改了多少行,删除了多少行这样的状态,如下图

但是发现有时候,打开了git项目却没有像上面那样的显示,让我一度怀疑自己的atom已经坏了......

经过试验发现,atom没有我想象中的那么智能吧,这种情况下添加项目文件是没有的

而这样添加项目文件却能够正确显示了,如下

观察可以看出来,这两者的区别在于第一种情况是git项目在添加项目目录的时候是二级目录,而第二种情况则是一级目录,那就是说atom只能识别项目的一级目录?

这个时候应该确认一下atom是如果读取git项目的,那么需要打开atom的调试器(windows下的快捷键是alt+ctrl+i),atom编辑器调试的对象是atom,那么分析它读取的项目是atom.project,往下查看发现有一个读取项目的仓库方法 getRepositories,所以在调试工具里面执行

atom.project.getRepositories

如下图

  如上图点击操作,找到了这个方法的源码,

 Project.prototype.getRepositories = function() {
      return this.repositories;
    };

得知,直接返回的是 repositories 这个属性,那么接着往下找,搜索关键词(ctrl+f) repositories,找到这个相关的设置,发现这么一段代码

 Project.prototype.setPaths = function(projectPaths) {
      var projectPath, repository, _i, _j, _len, _len1, _ref1;
      _ref1 = this.repositories;
      for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
        repository = _ref1[_i];
        if (repository != null) {
          repository.destroy();
        }
      }
      this.rootDirectories = [];
      this.repositories = [];
      for (_j = 0, _len1 = projectPaths.length; _j < _len1; _j++) {
        projectPath = projectPaths[_j];
        this.addPath(projectPath, {
          emitEvent: false
        });
      }
      return this.emitter.emit('did-change-paths', projectPaths);
    };

" this.repositories = []; "这个是初始化设置为空数组,往下的代码就是进行设置各个项目路径,体检路径是在 " this.addPath " 中,所以找到了addPath的方法,如下

 Project.prototype.addPath = function(projectPath, options) {
      var directory, directoryExists, provider, repo, rootDirectory, _i, _j, _k, _len, _len1, _len2, _ref1, _ref2, _ref3;
      directory = null;
      _ref1 = this.directoryProviders;
      for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
        provider = _ref1[_i];
        if (directory = typeof provider.directoryForURISync === "function" ? provider.directoryForURISync(projectPath) : void 0) {
          break;
        }
      }
      if (directory == null) {
        directory = this.defaultDirectoryProvider.directoryForURISync(projectPath);
      }
      directoryExists = directory.existsSync();
      _ref2 = this.getDirectories();
      for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
        rootDirectory = _ref2[_j];
        if (rootDirectory.getPath() === directory.getPath()) {
          return;
        }
        if (!directoryExists && rootDirectory.contains(directory.getPath())) {
          return;
        }
      }
      this.rootDirectories.push(directory);
      repo = null;
      _ref3 = this.repositoryProviders;
      for (_k = 0, _len2 = _ref3.length; _k < _len2; _k++) {
        provider = _ref3[_k];
        if (repo = typeof provider.repositoryForDirectorySync === "function" ? provider.repositoryForDirectorySync(directory) : void 0) {
          break;
        }
      }
      this.repositories.push(repo != null ? repo : null);
      if ((options != null ? options.emitEvent : void 0) !== false) {
        return this.emitter.emit('did-change-paths', this.getPaths());
      }
    };

在 "  this.repositories.push  "进行断点,F5重新加载atom,观察,发现如果git项目在二级目录的情况是这样的

而git项目是一级目录的情况是这样的

由此可见,atom确实是只能识别项目的一级目录(如果分析setPaths这个方法也会发现atom实际也是读取一级目录)。当然,这里调试看到的其实是编译后的代码,那么这个文件相关的源码是在  https://github.com/atom/atom/blob/master/src/project.coffee 这里,而atom相关的源码是在 https://github.com/atom/atom/tree/master/src 这里,因为其中还包换了如果读取git项目状态等方法,这里就不讨论了,有兴趣的自个去看看,研究,如果有什么心得就跟大伙分享一下。

另外推荐几个插件:

simplified-chinese-menu -- 简体中文汉化包(像我这样不懂英文的人必备)。

file-icons --非常漂亮的文件图标扩展,当你往项目目录一看的时候,简直不能再爽了。

atom-beautify --不为啥,就为了格式化代码,必备。

language-babel --这个是跟babel相关的,写es6 react必备的插件。

另外想说的,想我这样菜鸟的朋友,遇到问题认真分析,总可以找到你要的答案。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!