#+TITLE: Languages * Intro This is where Programming Language modes are configured. * Default Settings #+begin_src emacs-lisp (defun lang-default-settings () "default setting for a language" (display-line-numbers-mode) (treesit-auto-mode) (eglot-ensure)) #+end_src * Built-in Modes ** hook default settings to configured language modes #+begin_src emacs-lisp (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))) #+end_src ** add LSP server program names to eglot's configuration #+begin_src emacs-lisp (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))) #+end_src * Installed Modes ** Go unused, as tree-sitter has covered most needed functionality #+begin_src emacs-lisp ;; (use-package go-mode ;; :mode "\\.go\\'" ;; :hook (go-mode . lang-default-settings) ;; :config ;; (setq go-tab-width default-custom-tab-size)) #+end_src ** TypeScript No longer using typescript-mode, as there's a builtin typescript-ts mode in Emacs 29 #+begin_src emacs-lisp (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)))))) #+end_src ** Markdown #+begin_src emacs-lisp (use-package markdown-mode :commands (markdown-mode gfm-mode) :mode ("\\.md\\'" "\\.markdown\\'") :custom ((markdown-command "multimarkdown" "set the markdown command"))) #+end_src ** JSON #+begin_src emacs-lisp (use-package json-mode :mode (("\\.json\\'" . json-mode) ("\\.jsonl\\'" . json-mode))) #+end_src ** LaTeX (AUCTeX) #+begin_src emacs-lisp (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)) #+end_src ** Python *** Pyenv python venv manager #+begin_src emacs-lisp (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)))) #+end_src *** Jupyter #+begin_src emacs-lisp (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") #+end_src *** Tab Size Python code is recomendded to set the tab size to 4 #+begin_src emacs-lisp (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)))) #+end_src * CSV-mode #+begin_src emacs-lisp (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")) #+end_src