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

5.1 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)
    (treesit-auto-mode)
    (eglot-ensure))

Built-in Modes

hook default settings to configured language modes

  (let ((langs '("sh" "c++" "go-ts" "java" "js" "json" "LaTeX" "mhtml" "python" "typescript-ts" "tsx-ts" "python-ts")))
     (dolist (lang langs)
      (add-hook (intern (concat lang "-mode-hook")) '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

unused, as tree-sitter has covered most needed functionality

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

TypeScript

No longer using typescript-mode, as there's a builtin typescript-ts mode in Emacs 29

  (if (version< emacs-version "29")
      (use-package typescript-mode
        :mode ("\\.ts\\'" ("\\.tsx\\'" . typescript-tsx-mode))
        :config
        (define-derived-mode typescript-tsx-mode typescript-mode "TypeScriptReact")
        (dolist (mode '(ykpescript-mode typescript-tsx-mode))
          (add-to-list 'eglot-server-programs `(,mode . ("typescript-language-server", "--stdio"))))
        :hook
        (typescript-mode . (lambda () (lang-default-settings)
                             (let ((custom-tab-size 2))
                               (setq-default default-tab-width custom-tab-size
                                             tab-width custom-tab-size
                                             c-basic-offset custom-tab-size))))
        (typescript-tsx-mode . (lambda ()
                                 (lang-default-settings)
                                 (let ((custom-tab-size 4))
                                   (setq-default default-tab-width custom-tab-size
                                                 tab-width custom-tab-size
                                                 c-basic-offset custom-tab-size))))))

Markdown

  (use-package markdown-mode
    :commands (markdown-mode gfm-mode)
    :mode ("\\.md\\'" "\\.markdown\\'")
    :custom ((markdown-command "multimarkdown" "set the markdown command")))

JSON

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

LaTeX (AUCTeX)

      (use-package tex
        :ensure auctex
        :custom
        (TeX-view-program-selection '((output-pdf "PDF Tools")) "set emacs as pdf viewer")
        (TeX-source-correlate-start-server t "recommended setting")
        (TeX-engine 'xetex "set engine to xelatex")
        (TeX-PDF-mode t "use pdf mode")
        (TeX-auto-save t "recommended setting")
        (TeX-parse-self t "packages support")
        :config
        (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer))

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))))

Jupyter

  (use-package ein
    :commands (ein:run ein:notebook-open ein:login)
    :bind ("C-c C-o" . ein:notebook-open)
    :config
    (add-to-list 'org-babel-load-languages '(ein . t)))
  ;; :custom
  ;; (ein:jupyter-server-use-subcommand "server" "use jupyterlab instead of jupyter notebook")

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))))

CSV-mode

  (use-package csv-mode
    :pin "gnu"
    :commands (csv-mode csv-align-mode csv-field-index-mode)
    :mode (("\\.csv\\'" . csv-align-mode) ("\\.tsv\\'" . csv-align-mode))
    :custom (csv-invisibility-default nil "show separators when records are aligned"))