自己开发主要开发语言是 Golang,因此项目比较多,怎么样给在 Spacemacs 中给每个项目设置不同的 GOPATH
用法:
(setq hacking-packages
'(
(goenv :location (recipe
:fetcher github
:repo "MephistoMMM/goenv"))))
(defun hacking/init-goenv ()
"Add Goenv."
(use-package goenv
:init
(with-eval-after-load 'go-mode
(spacemacs/set-leader-keys-for-major-mode 'go-mode "Va" 'goenv-activate)
(spacemacs/set-leader-keys-for-major-mode 'go-mode "Vd" 'goenv-deactivate))
))
没写文档。
模拟 pyvenv
,具体实现方式就是 改 process-environment
这个变量。
可能你的 GOPATH 在emacs中原值是空值的缘故吧
我的源 GOPATH 是在 .zshenv
设置的,没有在 .zshrc
设置,可能这样 emacs 的 getenv GOPATH
获的值是空值。
或许你可以尝试一下 GitHub - purcell/exec-path-from-shell: Make Emacs use the $PATH set up by the user's shell. 如果你已经安装了 exec-path-from-shell
, 因为你配置GOPATH
在.zshenv
的,你可能需要修改 exec-path-from-shell
:
;; make Emacs use the $PATH set up by the user's shell
(use-package exec-path-from-shell
:ensure t
:init (progn
(when(not(eq system-type 'windows-nt))
(setq exec-path-from-shell-variables '("RUST_SRC_PATH" "PYTHONPATH","GOPATH"))
;; when it is nil, exec-path-from-shell will read environment variable
;; from .zshenv instead of .zshrc, but makes sure that you put all
;; environment variable you need in .zshenv rather than .zshrc
(setq exec-path-from-shell-check-startup-files nil) ;
(setq exec-path-from-shell-arguments '("-l" )) ;remove -i read form .zshenv
(exec-path-from-shell-initialize)
)
)
)
这个是我的配置。
好的,我试试,谢谢
我用的不是Spacemacs,所以你需要做一点适配~
这个包应该是能让 Emacs 读取到 .zshenv
,不过还是没有解决我的问题,我想给不同项目设置不同的 GOPATH
。
,不过我改了下他的源码也可以设置了。如果 GOPATH
为空,设置一个默认的就可以了。
defun goenv-activate (directory)
"Activate the go temporary workspace environment in DRECTORY."
(interactive "DActivate goenv: ")
(setq directory (expand-file-name directory)
goenv-temporary-env-name (file-name-nondirectory directory))
(goenv-deactivate)
(if (getenv "GOPATH")
(setenv "GOPATH" "~/go"))
(setq goenv-old-process-environment process-environment)
(let ((path-items (split-string (getenv "GOPATH"))))
(setq process-environment (append
(list
(format "GOPATH=%s"
(mapconcat 'identity
(append (list (car path-items))
(list directory)
(cdr path-items))
":")))
process-environment))
)
(setq goenv-temporary-env t)
)
我升级了一下emacs,也遇到了类似问题
改法和你类似,不过:
(if (getenv "GOPATH")
(setenv "GOPATH" "~/go"))
这里有问题,应该改成:
(if (getenv "GOPATH")
nil
(setenv "GOPATH" "~/go"))
1 个赞