#+TITLE: Projects #+AUTHOR: Christopher James Hayward #+EMAIL: chris@chrishayward.xyz #+PROPERTY: header-args:emacs-lisp :tangle projects.el :comments org #+PROPERTY: header-args:shell :tangle no #+PROPERTY: header-args :results silent :eval no-export :comments org #+OPTIONS: num:nil toc:nil todo:nil tasks:nil tags:nil #+OPTIONS: skip:nil author:nil email:nil creator:nil timestamp:nil #+ATTR_ORG: :width 420px #+ATTR_HTML: :width 420px #+ATTR_LATEX: :width 420px [[../docs/images/2021-02-13-example-ccls.gif]] An *IDE*[fn:1] like experience or better can be achieved within Emacs using two *Microsoft*[fn:2] open-source initiatives: + *Debug Adapter Protocol*[fn:3] + *Language Server Protocol*[fn:4] * LSP Support for the *Language Server Protocol*[fn:4] is added to Emacs through the *Lsp mode*[fn:5] package. #+begin_src emacs-lisp (use-package lsp-mode :commands (lsp lsp-deferred) :custom (lsp-idle-delay (* 5 dotfiles/idle))) #+end_src ** UI improvements *Lsp ui*[fn:6] provides user interface improvements for *Lsp mode*[fn:5]. #+begin_src emacs-lisp (use-package lsp-ui :after lsp :custom (lsp-ui-doc-position 'at-point) (lsp-ui-doc-delay 0.500)) #+end_src ** Code completion Text completion via *Company*[fn:10] =AKA= *Complete Anything*. #+begin_src emacs-lisp (use-package company :after lsp) #+end_src Integrate with *Lsp mode*[fn:5] to provide completion candidates through the *Language Server Protocol*[fn:4]. #+begin_src emacs-lisp (use-package company-lsp :after (lsp company) :custom (company-backend 'company-lsp)) #+end_src * DAP *Dap mode*[fn:7] provides support for the *Debug Adapter Protocol*[fn:3] inside of Emacs. #+begin_src emacs-lisp (use-package dap-mode :commands (dap-debug)) #+end_src * Docker Manage *Docker*[fn:8] containers with *Docker.el*[fn:9]. #+begin_src emacs-lisp (use-package docker :commands (docker)) #+end_src Open the container management screen with =SPC k=. #+begin_src emacs-lisp (dotfiles/leader "k" '(docker :which-key "Docker")) #+end_src * Management Configure *Projectile*[fn:11], a project interaction library for Emacs. It provides a nice set of features for operating on a project level without introducing external dependencies. #+begin_src emacs-lisp (use-package projectile :custom (projectile-project-search-path '("~/.local/source")) :config (projectile-mode)) #+end_src * Languages Support for individual programming languages are implemented here. They can be either: + LSP / DAP compliant + Emacs-mode compliant + Third-party module ** Go Golang is supported using the *Debug Adapter Protocol*[fn:3] and *Language Server Protocol*[fn:4]. *** Setup Get started by installing *gopls*[fn:14]. #+begin_src shell GO111MODULE=on go get golang.org/x/tools/gopls@latest #+end_src **** Overriding the =$GOPATH= Set the =$GOPATH= environment variable prior to loading, this is to allow modification of the default value from ~$HOME/go~ to ~$HOME/.go~. #+begin_src emacs-lisp (setenv "GOPATH" (concat (getenv "HOME") "/.go/")) #+end_src **** Adding =$GOBIN= to the =$PATH= Additionally, include the ~bin~ subdirectory of the =$GOPATH= in the =$PATH= variable, adding compiled golang programs to the systems path. #+begin_src emacs-lisp (setenv "PATH" (concat (getenv "GOPATH") "bin:" (getenv "PATH"))) #+end_src *** Configuration Finally we can include the *Go-mode*[fn:15] package, adding integration with *Lsp-mode*[fn:5]. #+begin_src emacs-lisp (use-package go-mode :hook (go-mode . lsp) :custom (lsp-go-gopls-server-path "~/.go/bin/gopls")) #+end_src Apply some custom behaviour before saving buffers: + Format buffer + Organize imports #+begin_src emacs-lisp (defun dotfiles/go-hook () (add-hook 'before-save-hook #'lsp-format-buffer t t) (add-hook 'before-save-hook #'lsp-organize-imports t t)) #+end_src #+begin_src emacs-lisp (add-hook 'go-mode-hook #'dotfiles/go-hook) #+end_src Add a golang source code block structure template with ~