golang module 在 spacemcs 中的配置
概述
golang 官方的包管理从 1.11 版本就开始支持了, 之前尝试了几次, 效果都不理想, 就一直用 dep 来管理 package.
最近 1.13 版本发布了, 使用 go module 的官方管理方式越来越多, dep 也早就不在继续开发了. 鉴于此, 是时候把 golang 的包管理方式迁移到 go module 上来了.
我一直是用 spacemacs 来开发各种应用, 所以本文也是介绍如何在 spacemacs 中配置 golang module 的开发环境.
配置方法
go module 其实本身是不需要什么配置, 这里的配置其实为了更方便的编码而做的 spacemacs 配置. 能够让它支持自动补全, 代码调转等等开发时常用的操作.
需要的软件
使用 go module, golang 的工程不用在放在 GOPATH 下, 所有传统的 gocode 不能再用来做代码补全这些了. 我们这里采用 gopls 来代替 gocode.
出来 golang 1.13, 额外需要的软件就是 gopls
安装好 golang 1.13, 安装 gopls 非常简单:
$ GO111MODULE=on go get golang.org/x/tools/gopls@latest
spacemacs 的配置
go layer
spacemacs 的 develop 分支默认继承了 lsp 的功能. LSP 是什么 所以配置起来很简单, 在 dotspacemacs-configuration-layers 下配置:
dotspacemacs-configuration-layers
'(
... ...
lsp
;; ----------------------------------------------------------------
;; Example of useful layers you may want to use right away.
;; Uncomment some layer names and press `SPC f e R' (Vim style) or
;; `M-m f e R' (Emacs style) to install them.
;; ----------------------------------------------------------------
(go :variables
go-backend 'lsp
go-tab-width 8
godoc-at-point-function 'godoc-gogetdoc)
... ...
)
lsp-mode
lsp-mode 是 emacs 对 lsp 的封装, 参考其中 golang 的部分, 在 dotspacemacs/user-config 中配置:
;; lsp
(use-package lsp-mode
:hook (go-mode . lsp-deferred)
:commands (lsp lsp-deferred))
(setq lsp-auto-guess-root nil)
(setq lsp-ui-doc-enable nil)
(setq lsp-ui-sideline-enable nil)
(setq lsp-prefer-flymake :none)
project root 设置
使用 go module 之后, golang 项目的目录不一定在 GOPATH 下, 所以定义了个配置 project root 的函数. 当然, 如果不设置, 默认值是 emacs 的 projectile-project-root
;; project path settings
(setq current-project-path (projectile-project-root))
(defun set-project-path (relative-path)
(interactive
(list (read-string "relative path: " "." nil nil nil)))
(setq current-project-path (file-truename relative-path)))
(defun get-project-path ()
(interactive)
(message current-project-path))
build/install 快捷键
增加 2 个快捷键, 用来执行 go build 和 go install
;; go build/install
(setq default-go-package "")
(defun go-build (&optional pkg)
(interactive
(list (read-string (format "Package Name[%s]: " default-go-package) nil nil "")))
(if (not (string= pkg ""))
(setq default-go-package pkg))
(if (string= current-project-path "")
(message "You MUST set current-project-path FIRST!")
(projectile-with-default-dir current-project-path
(projectile-run-compilation (concat "go build " default-go-package))))
)
(defun go-install (&optional pkg)
(interactive
(list (read-string (format "Package Name[%s]: " default-go-package) nil nil "")))
(if (not (string= pkg ""))
(setq default-go-package pkg))
(if (string= current-project-path "")
(message "You MUST set current-project-path FIRST!")
(projectile-with-default-dir current-project-path
(projectile-run-compilation (concat "go install " default-go-package))))
)
;; set shortcuts
(spacemacs/set-leader-keys-for-major-mode 'go-mode
"xi" 'go-install)
(spacemacs/set-leader-keys-for-major-mode 'go-mode
"xb" 'go-build)
go build 和 go install 的快捷键分别是: SPC m x b 和 SPC m x i
使用中遇到的坑
在尝试使用的过程中, 遇到 2 个坑, 耗费了大半天的时间…
golang module 在 spacemcs 中的配置的更多相关文章
- setup 命令中防火墙配置选项无法打开
故障提示 1.1 如何让setup 命令中防火墙配置生效 1.1.1 CentOS系统找不到setup命令工具的解决方法 yum -y install setuptool #安装setup命令工具 y ...
- SiteMesh在项目中的配置
SiteMesh在项目中的配置 首先在web.xml里面增加siteMesh的配置: <filter> <filter-name>sitemesh</filter-nam ...
- golang学习笔记8 beego参数配置 打包linux命令
golang学习笔记8 beego参数配置 打包linux命令 参数配置 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/mvc/contro ...
- git在eclipse中的配置 转载
git在eclipse中的配置 转载 一_安装EGIT插件 http://download.eclipse.org/egit/updates/ 或者使用Eclipse Marketplace,搜索EG ...
- How to Configure Eclipse for Python --- 在eclipse中如何配置pydev
From: http://www.rose-hulman.edu/class/csse/resources/Eclipse/eclipse-python-configuration.htm Pytho ...
- tp5中nginx配置
首先tp5的访问目录指向到webroot/public文件夹中. thinkphp的url访问:http://serverName/index.php(或者其它应用入口文件)/模块/控制器/操作/[参 ...
- vue-cli中webpack配置解析
版本号 vue-cli 2.8.1 (终端通过vue -V 可查看) vue 2.2.2 webpack 2.2.1 目录结构 ├── README.md ├── build │ ├── build. ...
- golang多个项目时如何配置GOPATH,使用gb包依赖管理工具,不同项目配置不同的GOPATH的
golang多个项目时如何配置GOPATH,使用gb包依赖管理工具,不同项目配置不同的GOPATH的 1:执行脚本setGoPath.sh#!/bin/bashif [[ $GOPATH =~ .*$ ...
- maven的安装、路径配置、修改库文件路径和eclipse中的配置、创建maven工程。
注:本文来源于:杨四郎2018 <maven的安装.路径配置.修改库文件路径和eclipse中的配置.创建maven工程> 一.maven的安装 首先,先到官网去下载maven.这里是官 ...
随机推荐
- 隐马尔可夫模型(HMM)及Viterbi算法
HMM简介 对于算法爱好者来说,隐马尔可夫模型的大名那是如雷贯耳.那么,这个模型到底长什么样?具体的原理又是什么呢?有什么具体的应用场景呢?本文将会解答这些疑惑. 本文将通过具体形象的例子来引入该模型 ...
- LeetCode 205:同构字符串 Isomorphic Strings
题目: 给定两个字符串 s 和 *t*,判断它们是否是同构的. 如果 s 中的字符可以被替换得到 *t* ,那么这两个字符串是同构的. 所有出现的字符都必须用另一个字符替换,同时保留字符的顺序.两个字 ...
- Kubernetes之Pod使用
一.什么是Podkubernetes中的一切都可以理解为是一种资源对象,pod,rc,service,都可以理解是 一种资源对象.pod的组成示意图如下,由一个叫”pause“的根容器,加上一个或多个 ...
- springboot实践1
环境安装 安装jdk 推荐安装jkd1.8+,我使用的是mac,假设已经安装好homebrew,则jdk的安装指令是: brew install java 在 ~/zshrc ,添加两行 export ...
- git查看/修改个人信息-用户名邮箱
我们在使用git作为仓库管理工具时,要设置自己Git的用户名和邮箱,要不然大家一块开发时不知道谁是谁,不知道谁提交的. 另外,当我们用自己的电脑开发时你可能设置的是一个你喜欢的昵称,所以那就得改一下. ...
- Java入门系列之字符串特性(二)
前言 上一节我们讲解到字符串本质上就是字符数组,同时详细讲解了字符串判断相等需要注意的地方,本节我们来深入探讨字符串特性,下面我们一起来看看. 不可变性 我们依然借助初始化字符串的方式来探讨字符串的不 ...
- RaiseException函数逆向
书中内容: 代码逆向: 存在一个疑问:为什么在ExceptionAddress本来是错误产生代码的地址,但这里给存入一个_RaiseException的偏移地址. 答案在下个函数中:rtlRaiseE ...
- .NET MVC5简介(五)管道处理模型IHttpModule
https://www.cnblogs.com/JimmyZhang/archive/2007/09/04/880967.html IHttpModule HTTPRuntime(运行时).在一个控制 ...
- java基础(27):线程安全、线程同步、等待唤醒机制
1. 多线程 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 我们通过一个案例,演示线程 ...
- PDF怎么转换为CAD文件?这两种方法你的会
在日常的办公中,我们最常见的文件格式就是PDF格式的,因为PDF文件的安全性是比较高的,可以防止不小心触碰到键盘修改文件内容,而且PDF文件便于进行文件的传输.但是有时候也需要将PDF转换成CAD,那 ...