emacs-config/init.org.d/70-lang.org

2.8 KiB

Languages

Intro

This is where Programming Language modes are configured.

Default Settings

  (defun lang-default-settings ()
    "default setting for a language"
    (display-line-numbers-mode)
    (eglot-ensure)
    (company-mode))

Built-in Modes

hook default settings to configured language modes

  (let ((langs '("sh" "c++" "mhtml" "java" "js" "json" "python" "latex")))
    (dolist (lang langs)
      (add-hook (intern (concat lang "-mode-hook")) (lambda () (lang-default-settings)))))

add LSP server program names to eglot's configuration

    (let ((server-programs '((c++-mode . ("clangd" "--stdio"))
                             (mhtml-mode . ("html-language-server" "--stdio"))
                             (java-mode . ("jdtls" "--stdio"))
                             (js-mode . ("typescript-language-server" "--stdio"))
                             (python-mode . ("pyright-langserver" "--stdio"))
                             (latex-mode . ("texlab"))
                             (json-mode . ("vscode-json-languageserver" "--stdio")))))
      (setq eglot-server-programs (append server-programs eglot-server-programs)))

Installed Modes

Go

  (use-package go-mode
    :mode "\\.go\\'"
    :hook
    (go-mode . (lambda () (lang-default-settings)))
    :config
    (setq go-tab-width default-custom-tab-size))

TypeScript

  (use-package typescript-mode
    :mode "\\.ts\\'"
    :init
    (add-to-list 'eglot-server-programs `(typescript-mode . ("typescript-language-server")))
    :hook
    (typescript-mode . (lambda () (lang-default-settings))))

Markdown

  (use-package markdown-mode
    :commands (markdown-mode gfm-mode)
    :mode (("\\.md\\'". markdown-mode)
           ("\\.markdown\\'" . markdown-mode))
    :init
    (setq markdown-command "multimarkdown"))

JSON

  (use-package json-mode
    :mode (("\\.json\\'" . json-mode)
           ("\\.jsonl\\'" . json-mode)))

Python

Pyenv

python venv manager

  (use-package pyvenv
    :commands (pyvenv-mode pyvenv-activate pyvenv-workon pyvenv-exec-shell pyvenv-virtual-env)
    :hook (python-mode . pyvenv-mode)
    :config
    (setenv "WORKON_HOME" (expand-file-name ".local/opt/miniforge3/envs" (safe-getenv "HOME" user-home-path))))

Tab Size

Python code is recomendded to set the tab size to 4

  (add-hook 'python-mode-hook
            (lambda ()
              (let ((custom-tab-size 4))
                (setq-default default-tab-width custom-tab-size
                              tab-width custom-tab-size
                              c-basic-offset custom-tab-size))))