serve-d and emacs

Renato renato at athaydes.com
Tue Dec 19 21:18:58 UTC 2023


On Thursday, 20 April 2023 at 19:54:11 UTC, Christian Köstlin 
wrote:
> I tried to reproduce my old eglot experiment, and for me 
> serve-d was not even compiling with the newest dmd. Which 
> versions are you using?
>
> Kind regards,
> Christian

I've just managed to make Emacs 29 work with serve-d using 
use-package and eglot (which both come built-in on Emacs 29+).

If anyone is interested, I just downloaded a pre-built binary 
from the serve-d Github releases page, then added this to my 
init.el file:

```lisp
;; D
(use-package d-mode :ensure t
   :init (with-eval-after-load 'eglot
           (add-to-list 'eglot-server-programs
                        '(d-mode . 
("~/programming/apps/serve-d")))))
```

This follows the eglot documentation's advice.
When you go do a D buffer, d-mode starts up automatically, but 
not eglot... just hit "M-x eglot" to get serve-d assistance 
(which will also work on other files you open in the same 
project).

I found the eglot docs quite helpful: 
https://joaotavora.github.io/eglot/#Setting-Up-LSP-Servers

Things that are working for me (so you can check if your setup is 
working):

* eglot-format-buffer - formats the buffer
* minibuffer docs - as you point at code elements.
* code navigation - e.g. hit `s-.` to go to a definition, 
including D stdlib.
* auto-completion - shows available symbols, even from 
non-imported modules.
* flycheck - shows errors as you type, highlighting them in the 
editor.

The auto-import functionality does not seem to work (it doesn't 
automatically insert imports, despite the auto-completions saying 
"auto-import ...". But apart from that, this is a very nice 
environment to write D code!

I also added a [".dir-locals.el" 
file](https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html) on the root of my project with something like this (so that the formatter doesn't put 8 spaces on indentation! And "M-x compile" does the right thing):

```lisp
((nil . ((indent-tabs-mode . nil)
          (tab-width . 4)))
  (d-mode . ((compile-command . "dmd -L-ld_classic -run"))))
```

Hope that helps others as I had to spend some time trying to do 
more advanced stuff when the setup that actually works is really 
basic.


More information about the Digitalmars-d-learn mailing list