热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

golang快速入门[6.2]集成开发环境emacs详解

golang快速入门[6.2]-集成开发环境-emacs详解前文golang快速入门[1]-go语言导论golang快速入门[2.1]-go语言开发环境配置-windowsgola

golang快速入门[6.2]-集成开发环境-emacs详解

前文

  • golang快速入门[1]-go语言导论

  • golang快速入门[2.1]-go语言开发环境配置-windows

  • golang快速入门[2.2]-go语言开发环境配置-macOS

  • golang快速入门[2.3]-go语言开发环境配置-linux

  • golang快速入门[3]-go语言helloworld

  • golang快速入门[4]-go语言如何编译为机器码

  • golang快速入门[5.1]-go语言是如何运行的-链接器

  • golang快速入门[5.2]-go语言是如何运行的-内存概述

  • golang快速入门[5.3]-go语言是如何运行的-内存分配

  • golang快速入门[6.1]-集成开发环境-goland详解

前言

  • 在上一篇文章中介绍了go语言的集成开发环境goland的安装、配置、激活、以及基本的快捷键用法。

  • 在本篇文章中,我们将介绍神之编辑器:emacs 如何集成go的开发环境

  • 你想拥有如下图所示的工作环境吗?这就是emacs的强大功能,快来一起学习吧~


v2-12332b6db45dc7cf11d8c998a87e69ed_1440w.jpggolang[8.2]-2.png

emacs是什么

  • Emacs(/ˈiːmæks/,源自Editor MACroS,宏编辑器),是一个文本编辑器家族,具有强大的可扩展性,在程序员和其他以技术工作为主的计算机用户中广受欢迎。

  • Emacs在1970年代诞生于MIT人工智能实验室(MIT AI Lab)

  • Emacs是当前世界上最具可移植性的重要软件之一,能够在当前绝大多数操作系统上运行,包括各种类Unix系统(GNU/Linux、FreeBSD、NetBSD、OpenBSD、Solaris、AIX、OS X等)

  • Emacs不仅仅是一个编辑器,它是一个集成环境,或可称它为集成开发环境,这些功能如让用户置身于全功能的操作系统中。Emacs可以:

    • 收发电子邮件、上新闻组(Gnus)

    • 无缝直接编辑远程文件(Tramp)

    • 通过Telnet登录远程主机

    • 操作壳层(M-x EShell,Term)

    • 结合git, mercurial等版本控制系统并直接操作(Magit,VC)

    • 上Twitter(Twittering-mode)

    • 登陆IRC和朋友交流(M-x ERC,rcirc)

    • 电子数据表

    • 模拟其他编辑器,如vi(Evil-mode)、WordStar、EDT、TPU等

    • 编辑Wiki (Wikipedia-mode)

    • 对多种编程语言的编辑,如C/C++、Perl、Python、Lisp等等

    • 调试程序,结合GDB,EDebug等。

    • 玩游戏

    • 计算器

    • 心理咨询(M-x doctor)

    • 煮咖啡

    • 记笔记、日记(Org-mode)

    • 管理日程,Task,待办事项(ToDo),约会等GTD(Org-mode)

    • 写作与出版(Org-mode,Muse-mode)

    • 目录管理(Dired)

    • 文件比较、合并(Ediff)

    • 阅读info和man文档(M-x info,woman)

    • 浏览网站(M-x eww)

    • 为各种程序(TeX、LaTeX等)提供统一的操作界面

    • ……

  • 所以有人说,你可以在emacs里面。自诞生以来,Emacs演化出了众多分支,其中使用最广泛的两种分别是:1984年由理查·斯托曼发起并由他维护至2008年的GNU Emacs,以及1991年发起的XEmacs。XEmacs是GNU Emacs的分支,至今仍保持着相当的兼容性。它们都使用了Emacs Lisp这种有着极强扩展性的编程语言,从而实现了包括编程、编译乃至网络浏览等等功能的扩展。本文主要基于GNU Emacs进行讲解

emacs 与 vim 的对比

  • 我相信熟悉linux基本操作的同学对于vim这一款编辑器不会陌生,针对vim与emacs谁更好常常会引发一场论战

  • 其实vim与emacs两种编辑器的设计哲学完全不同,风格迥异。vim的特点是组合性(Composability),Emacs的特点是可扩展性(Extensibility)。vim使用键序列输入,Emacs则经常使用组合键(同时按)输入,跟弹钢琴一样。所以Emacs有个绰号Esc + Meta + Alt + Ctrl + Shift

emacs安装

  • 下面我们将分别介绍在windows、mac、linux平台安装emacs的方式

  • 当以下方法遇到问题时,记得查看GUN emacs官网的最新介绍

windows用户

  • 首先登陆GNU镜像下载页面blog,下载最新版本为emacs-26.3-x86_64.zip

  • 解压并重命名 emacs-26.3-x86_64.zip 到所需安装位置。如"D:\emacs-26.3",后面均以此为例。

  • 解压之后,创建一个指向文件bin/runemacs.exe的桌面快捷方式,然后双击该快捷方式的图标来启动Emacs


  • 配置HOME目录:在注册表中添加计算机\HKEY_LOCAL_MACHINE\SOFTWARE\GNU\Emacs项,为Emacs项添加字符串值.HOME -> D:\emacs-26.3`



添加系统环境变量D:\emacs-26.3


linux用户

>> wget  http://mirror-hk.koddos.net/gnu/emacs/emacs-26.3.tar.gz

  • 使用tar 命令解压刚刚下载的Go语言开发包到/usr/local目录

>> tar -C /usr/local -xzf emacs-26.3.tar.gz

  • 编译

>> cd /usr/local/emacs-26.3
>> ./configure
>> make && make install

  • 运行
    直接在终端输入emacs

Ubuntu平台(16.04以上版本)

  • 安装

>> sudo add-apt-repository ppa:kelleyk/emacs
>> sudo apt install emacs26

  • 删除

>> sudo apt remove --autoremove emacs26 emacs26-nox

  • 运行
    直接在终端输入emacs

mac用户

  • 可以使用HomeBrew进行安装

brew cask install emacs

  • 或者通过如下网站直接下载:

https://emacsformacosx.com/

  • 运行
    直接在终端输入emacs

emacs快捷键

  • emacs有一些基本的操作指令,是每一个emacser必备的

  • 在我们查看emacs的快捷键时,要注意,大写字母C 与 M 代表的含义。在windows与linux中,C 表示 Ctrl , M表示 Alt. 但是在mac下,C 代表的是Ctrl,M表示的是meta键。此键是可以在系统偏好设置`中配置的。

  • 开启

emacs
emacs -Q  开启不显示信息

  • 关闭

C-x C-c

  • 光标操作

C-b 向后移动一个字符
C-f 向前移动一个字符
M-b 向后移动一个单词
M-f 向前移动一个单词
C-p 向前移动一行
C-n 向后移动一行
C-a 当前行的开始位置
C-e 当前行的结束
M-a 向前移动一句话
M-e 向后移动一句话
M-< 移动到开始的位置
M-> 移动到结束的位置
注:< > 需要和 shift 按键 一块按
C-v  向后翻页
M-v 向前翻页
第一次 C-l(字符L不是数字1) 把光标所处的位置移动到中间 (center)
第二次 C-l(字符L不是数字1) 把光标所处的位置移动到上边(top)
第三次 C-l(字符L不是数字1) 把光标所处的位置移动到下边(bottom)

  • 多窗口显示

C-x  + 数组(0–9)
C-x 1 取消所有的窗口,只保留一个原始窗口
C-x 2 垂直切割当前窗口,分成上下俩个窗口
C-x 3 水平切割当前窗口,分成左右俩个窗口
C-M v 下一个窗口翻页
C-x o 光标移动到下一个窗口
注:操作可叠加

  • 删除和剪切

C-d  删除一个字符
M-d  剪切一个单词
C-k  剪切光标和该行末尾
M-k  剪切光标和标点符号
C- spaces(空格键)  先标记的地方为start  第二次标记的地方为end
C-w  剪切start 和 end 中间的内容

  • 粘贴和复制

C-y  粘贴最近的内容
M-y  在C-y之后使用,往上追溯替换粘贴的内容

  • 查找

C-s 向后查找
C-r 向前查找

  • 打开、新建、保存、关闭文件

C-x C-f 打开文件,文件不存在则新建
C-x C-s 保存当前文件
C-x C-b 列出buffer文件列表
C-x b 切换buffer文件 (通过在面板最下面输入文件名字)
C-x C-c 关闭并且保存文件

  • 撤销 & 反撤销

C-x u 撤销
C-- 撤销
C-/ 撤销
在撤销的时候如果撤销多了需要进行反撤销
具体是用C-f等打断当前撤销操作,接着进行的撤销动作就是反撤销。
C-x z 重复之前的操作 重复多次可以只按zzzz


emacs 配置文件

  • emacs 配置文件默认位于Home目录下(~/),可以通过变量user-emacs-directory修改

  • 配置文件夹可以是Home目录下的.emacs.d文件,通常会将所有配置放入其中

  • 当启动Emacs时,通常会尝试从初始化文件加载Lisp程序。该文件(如果存在)指定如何为您初始化Emacs。初始文件为 ~/.emacs, ~/.emacs.el, or  ~/.emacs.d/init.el  中的一个。

  • 对于初学者,可以去查找网上一些有名的配置直接使用,大牛一般都是一个大的.emacs.d文件。如果想获取笔者对于emacs的配置,可以在后台留言。

emacs 基本配置

  • 添加官方与国内package的源

(setq package-archives '(("gnu"   . "http://elpa.emacs-china.org/gnu/")
                         ("melpa-stable" . "http://elpa.emacs-china.org/melpa-stable/")
                          ("melpa-stable2" . "https://stable.melpa.org/packages/")
                          ("melpa" . "http://elpa.emacs-china.org/melpa/")
                         ("marmalada" . "http://elpa.emacs-china.org/marmalade/")))

  • 对于大量emacs 软件包的配置、管理、更新。我推荐使用use-package来管理包的配置与加载。

;;
;; use use-package
;;
(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))

  • 使用ivy-mode拓展套件完成快速搜索、快速查找、智能补全功能

;;
;; ivy mode
;;
(use-package ivy
  :ensure t
  :diminish (ivy-mode . "")
  :config
  (ivy-mode 1)
  (setq ivy-use-virutal-buffers t)
  (setq enable-recursive-minibuffers t)
  (setq ivy-height 10)
  (setq ivy-initial-inputs-alist nil)
  (setq ivy-count-format "%d/%d")
  (setq ivy-re-builders-alist
        `((t . ivy--regex-ignore-order)))
  )

;;
;; counsel
;;
(use-package counsel
  :ensure t
  :bind (("M-x" . counsel-M-x)
         ("\C-x \C-f" . counsel-find-file)))

;;
;; swiper
;;
(use-package swiper
  :ensure t
  :bind (("\C-s" . swiper))
  )

emacs配置go开发环境

gomode + goimport自动导入 + godef跳转

  • 首先安装包godef 与 goimports

go get -u github.com/rogpeppe/godef
go get -u golang.org/x/tools/cmd/goimports

  • 配置

  • M-n 查找函数应用,等价于(M-x lsp-find-ref

  • M-. 查找函数实现

(use-package go-mode
  ;; :load-path "~/.emacs.d/vendor/go-mode"
  :mode ("\\.go\\'" . go-mode)
  :ensure-system-package
  ((goimports . "go get -u golang.org/x/tools/cmd/goimports")
   (godef . "go get -u github.com/rogpeppe/godef"))
  :init
  (setq gofmt-command "goimports"
        indent-tabs-mode t)
  :config
  (add-hook 'before-save-hook 'gofmt-before-save)
  :bind (:map go-mode-map
              ("\C-c \C-c" . compile)
              ("\C-c \C-g" . go-goto-imports)
              ("\C-c \C-k" . godoc)
              ("M-j" . godef-jump)))

gocode+company 实现代码自动补全

  • 安装gocode

go get -u github.com/stamblerre/gocode

gocode 是守护进程,查看是否在后台运行

ps -e | grep gocode

  • 配置

;;
;; company
;;
(use-package company
  :ensure t
  :config
  (global-company-mode t)
  (setq company-idle-delay 0)
  (setq company-minimum-prefix-length 3)
  (setq company-backends
        '((company-files
           company-yasnippet
           company-keywords
           company-capf
           )
          (company-abbrev company-dabbrev))))

(add-hook 'emacs-lisp-mode-hook (lambda ()
                                  (add-to-list  (make-local-variable 'company-backends)
                                                '(company-elisp))))

flycheck 语法检查

  • 配置

  • C-c ! l  , C-c ! v 查看是否有语法错误

(use-package flycheck
  :ensure t
  :config
  (global-flycheck-mode t)
  )

gotest 进行各种测试

(use-package gotest
  :after go-mode
  :bind (:map go-mode-map
              ("C-c C-f" . go-test-current-file)
              ("C-c C-t" . go-test-current-test)
              ("C-c C-p" . go-test-current-project)
              ("C-c C-b" . go-test-current-benchmark)
              ("C-x x" . go-run))
  :config
  (setq go-test-verbose t))

errorcheck 进行程序错误检查

  • 安装

go get -u github.com/kisielk/errcheck

  • 配置

(use-package go-errcheck
  :after go-mode
  :ensure-system-package (errcheck . "go get -u github.com/kisielk/errcheck")
  :bind (:map go-mode-map
              ("C-c C-e" . go-errcheck)))

gtags 查找项目中的变量、函数等

  • 安装源代码GUN global, 注意mac用户不要用brew安装,因为必须要配置sqlite3

wget http://tamacom.com/global/global-6.5.7.tar.gz
tar xvf global-6.5.7.tar.gz
cd global-6.5.7
./configure --with-sqlite3
make
sudo make install

  • 安装gtags生成器

go get github.com/juntaki/gogtags

  • 在项目目录中输入如下,会生成GTAGS等文件

gogtags -v

  • 配置helm-gtags

  • 开启helm-gtags-mode

M-x helm-gtags-mode

  • 这时候在项目中即可使用M-x helm-gtags find partern 等查找tags

(use-package helm-gtags
  :config
  (setq helm-gtags-ignore-case t
        helm-gtags-auto-update t
        helm-gtags-use-input-at-cursor t
        helm-gtags-pulse-at-cursor t
        helm-gtags-prefix-key "\C-cg"
        helm-gtags-suggested-key-mapping t)
  :bind (:map helm-gtags-mode-map
              ("C-c g a" . helm-gtags-tags-in-this-function)
              ("C-j" . helm-gtags-select)
              ("M-." . helm-gtags-dwim)
              ("M-," . helm-gtags-pop-stack)
              ("C-c <" . helm-gtags-previous-history)
              ("C-c >" . helm-gtags-next-history))
  :hook ((dired-mode eshell-mode c-mode c++-mode asm-mode) . helm-gtags-mode))

projectile 在go项目中切换

  • 配置

(use-package dumb-jump
  :bind (("M-g o" . dumb-jump-go-other-window)
         ("M-g j" . dumb-jump-go)
         ("M-g x" . dumb-jump-go-prefer-external)
         ("M-g z" . dumb-jump-go-prefer-external-other-window))
  :config
  ;; (setq dumb-jump-selector 'ivy) ;; (setq dumb-jump-selector 'helm)
:initny
(dumb-jump-mode)
  :ensure
)

总结

  • 在本文中,我们介绍了神之编辑器emacs的安装、配置特别是对于go语言集成环境的配置。

  • 本文使用了use-package来管理emacs的软件包,并详细介绍了go语言集成环境的配置细节和使用方法。

  • 遗憾的是,本文不会带领大家从一个初学者完全入门emacs,用好emacs是值得一生努力的话题。学会emacs需要耐心,练习,更需要交流与指导

  • 如果你有更好的配置建议,或者你在使用emacs-go的过程中有任何疑问,欢迎在后台留言,see you~

参考资料

  • 项目链接

  • 作者知乎

  • blog

  • DotEmacsDotD

  • emacs-helm-gtags

  • 用Emacs来写Go设定篇



推荐阅读
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 《软件测试精要》深度解析与实战经验分享
    《软件测试精要》深度解析与实战经验分享,系统梳理了软件测试的核心概念与关键原则,结合实际项目中的测试经验和教训,详细探讨了测试分类、测试权衡要素、测试效率、测试覆盖率以及测试框架的引入和用例设计等内容,为读者提供了全面而实用的指导。 ... [详细]
  • 本文首先对信息漏洞的基础知识进行了概述,重点介绍了几种常见的信息泄露途径。具体包括目录遍历、PHPINFO信息泄露以及备份文件的不当下载。其中,备份文件下载涉及网站源代码、`.bak`文件、Vim缓存文件和`DS_Store`文件等。目录遍历漏洞的详细分析为后续深入研究奠定了基础。 ... [详细]
  • 从无到有,构建个人专属的操作系统解决方案
    操作系统(OS)被誉为程序员的三大浪漫之一,常被比喻为计算机的灵魂、大脑、内核和基石,其重要性不言而喻。本文将详细介绍如何从零开始构建个人专属的操作系统解决方案,涵盖从需求分析到系统设计、开发与测试的全过程,帮助读者深入理解操作系统的本质与实现方法。 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
  • Python学习:环境配置与安装指南
    Python作为一种跨平台的编程语言,适用于Windows、Linux和macOS等多种操作系统。为了确保本地已成功安装Python,用户可以通过终端或命令行界面输入`python`或`python3`命令进行验证。此外,建议使用虚拟环境管理工具如`venv`或`conda`,以便更好地隔离不同项目依赖,提高开发效率。 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • 全面解析:Hadoop技术栈中的Linux操作系统概览
    全面解析:Hadoop技术栈中的Linux操作系统概览 ... [详细]
  • Go语言实现Redis客户端与服务器的交互机制深入解析
    在前文对Godis v1.0版本的基础功能进行了详细介绍后,本文将重点探讨如何实现客户端与服务器之间的交互机制。通过具体代码实现,使客户端与服务器能够顺利通信,赋予项目实际运行的能力。本文将详细解析Go语言在实现这一过程中的关键技术和实现细节,帮助读者深入了解Redis客户端与服务器的交互原理。 ... [详细]
  • Python作为一门高级编程语言,在全球脚本语言排名中长期位居前列,广泛应用于多个领域。当前,Python开发人才市场需求旺盛,而专业人才供给相对不足,这使得相关培训课程备受关注。本课程旨在全面培养Python技能,满足行业需求。 ... [详细]
  • 如何在Linux环境中高效地创建、编译与运行C语言代码
    本文面向第一次在linux尝试写C语言程序的新人。有经验的请绕行。C语言用法不是本文介绍的关键,本文只是引入如何第一次在linux系统下编写、编译和执行一个简单的c程序。学会后请自行深入 ... [详细]
  • Lunix历史及如何学习
    1.Lunix是什么1.1Lunix是操作系统还是应用程序Lunix是一套操作系统,它提供了一个完整的操作系统当中最底层的硬件控制与资源管理的完整架构, ... [详细]
  • CentOS7系统目录LINUX有四种基本文件系统类型普通文件:如文本文件、C语言元代码、SHELL脚本、二进制的可执行文件等,可用cat、less、 ... [详细]
  • BashShell作为Linux的指定合作伙伴我们已经再熟悉不过了,使用Bash可以快速编写简单的脚本方便我们的日常比如善用vim,awk和sed三剑客,也可以创建十分复杂的逻辑, ... [详细]
  • ANSI
    ANSI是什么编码?用Notepad创建一个文本文件text.txt,其默认编码格式为ANSI(乍看之下,还以为是ASCII ... [详细]
author-avatar
mobiledu2502897273
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有