;; init-prog.el --- Initialize programming configurations. -*- lexical-binding: t -*- ;; Author: kj ;; URL: https://git.kj2.me/kj/confi-emacs-actual ;;; Commentary: ;; ;; General programming configurations. ;; ;;; Code: ;; Show function arglist or variable docstring (use-package eldoc :ensure nil :diminish :config (when (childframe-workable-p) ;; Mostrar la ayuda de eldoc/documentación en un childframe (use-package eldoc-box :diminish (eldoc-box-hover-mode eldoc-box-hover-at-point-mode) :bind ("" . eldoc-box-help-at-point) :custom (eldoc-box-lighter nil) (eldoc-box-only-multi-line t) (eldoc-box-clear-with-C-g t) :custom-face (eldoc-box-border ((t (:inherit posframe-border :background unspecified)))) (eldoc-box-body ((t (:inherit tooltip)))) :hook ((eglot-managed-mode . eldoc-box-hover-at-point-mode)) :config ;; Prettify `eldoc-box' frame (setf (alist-get 'left-fringe eldoc-box-frame-parameters) 8 (alist-get 'right-fringe eldoc-box-frame-parameters) 8)))) ;; Code folding indicators using Tree-sitter (use-package treesit-fold-indicators :ensure treesit-fold :hook (after-init . global-treesit-fold-indicators-mode) :init (setq treesit-fold-indicators-priority -1)) ;; Cross-referencing commands (use-package xref :autoload xref-show-definitions-completing-read :bind (("M-g ." . xref-find-definitions) ("M-g ," . xref-go-back)) :init ;; Use faster search tool (when (executable-find "rg") (setq xref-search-program 'ripgrep)) ;; Select from xref candidates in minibuffer (setq xref-show-definitions-function #'xref-show-definitions-completing-read xref-show-xrefs-function #'xref-show-definitions-completing-read)) ;; Code styles (use-package editorconfig :diminish :hook (elpaca-after-init . editorconfig-mode)) ;; Correr el código desde el buffer de emacs (use-package quickrun :bind (("C-" . quickrun) ("C-S-" . quickrun-region))) ;; Busqueda rápida con ripgrep (use-package rg :bind (:map rg-global-map ("c" . rg-dwim-current-dir) ("f" . rg-dwim-current-file) ("m" . rg-menu)) :config (setq rg-group-result t rg-show-columns t) (cl-pushnew '("tmpl" . "*.tmpl") rg-custom-type-aliases)) ;; Tree-sitter :) (use-package treesit :ensure nil :commands (treesit-install-language-grammar nf/treesit-install-all-languages) :config (setq treesit-language-source-alist '((bash . ("https://github.com/tree-sitter/tree-sitter-bash")) (c . ("https://github.com/tree-sitter/tree-sitter-c")) (cpp . ("https://github.com/tree-sitter/tree-sitter-cpp")) (css . ("https://github.com/tree-sitter/tree-sitter-css")) (go . ("https://github.com/tree-sitter/tree-sitter-go")) (haskell . ("https://github.com/tree-sitter/tree-sitter-haskell")) (html . ("https://github.com/tree-sitter/tree-sitter-html")) (java . ("https://github.com/tree-sitter/tree-sitter-java")) (javascript . ("https://github.com/tree-sitter/tree-sitter-javascript")) (jsdoc . ("https://github.com/tree-sitter/tree-sitter-jsdoc")) (json . ("https://github.com/tree-sitter/tree-sitter-json")) (julia . ("https://github.com/tree-sitter/tree-sitter-julia")) (lua . ("https://github.com/Azganoth/tree-sitter-lua")) (make . ("https://github.com/alemuller/tree-sitter-make")) (python . ("https://github.com/tree-sitter/tree-sitter-python")) (php . ("https://github.com/tree-sitter/tree-sitter-php" "master" "php/src")) (phpdoc . ("https://github.com/claytonrcarter/tree-sitter-phpdoc")) (ruby . ("https://github.com/tree-sitter/tree-sitter-ruby")) (rust . ("https://github.com/tree-sitter/tree-sitter-rust")) (sql . ("https://github.com/m-novikov/tree-sitter-sql")) (toml . ("https://github.com/tree-sitter/tree-sitter-toml")) (tsx . ("https://github.com/tree-sitter/tree-sitter-typescript" "master" "tsx/src")) (typescript . ("https://github.com/tree-sitter/tree-sitter-typescript" "master" "typescript/src")) (zig . ("https://github.com/GrayJack/tree-sitter-zig")))) (defun nf/treesit-install-all-languages () "Install all languages specified by `treesit-language-source-alist'." (interactive) (let ((languages (mapcar 'car treesit-language-source-alist))) (dolist (lang languages) (treesit-install-language-grammar lang) (message "`%s' parser was installed." lang) (sit-for 0.75))))) ;; Browse devdocs.io documents using EWW (use-package devdocs :autoload (devdocs--installed-docs devdocs--available-docs) :commands (devdocs-install devdocs-lookup) :bind (:map prog-mode-map ("M-" . devdocs-dwim) ("C-h D" . devdocs-dwim)) :init (defconst devdocs-major-mode-docs-alist '((c-mode . ("c")) (c++-mode . ("cpp")) (python-mode . ("python~3.10" "python~2.7")) (ruby-mode . ("ruby~3.1")) (rustic-mode . ("rust")) (css-mode . ("css")) (html-mode . ("html")) (julia-mode . ("julia~1.8")) (js-mode . ("javascript" "jquery")) (emacs-lisp-mode . ("elisp"))) "Alist of major-mode and docs.") (mapc (lambda (mode) (add-hook (intern (format "%s-hook" (car mode))) (lambda () (setq-local devdocs-current-docs (cdr mode))))) devdocs-major-mode-docs-alist) (setq devdocs-data-dir (expand-file-name "devdocs" user-emacs-directory)) (defun devdocs-dwim() "Look up a DevDocs documentation entry. Install the doc if it's not installed." (interactive) ;; Install the doc if it's not installed (mapc (lambda (slug) (unless (member slug (let ((default-directory devdocs-data-dir)) (seq-filter #'file-directory-p (when (file-directory-p devdocs-data-dir) (directory-files "." nil "^[^.]"))))) (mapc (lambda (doc) (when (string= (alist-get 'slug doc) slug) (devdocs-install doc))) (devdocs--available-docs)))) (alist-get major-mode devdocs-major-mode-docs-alist)) ;; Lookup the symbol at point (devdocs-lookup nil (thing-at-point 'symbol t)))) ;; --------------------------------------------------------------------------- ;; Miscellaneous Programming Modes ;; --------------------------------------------------------------------------- (use-package csv-mode) (unless emacs/>=29p (use-package csharp-mode)) (use-package cask-mode) (use-package cmake-mode) (use-package dart-mode) (use-package julia-mode) (use-package lua-mode) (use-package mermaid-mode) (use-package powershell) (use-package scala-mode) (use-package swift-mode) (use-package v-mode) (use-package vimrc-mode) (use-package yaml-mode) ; Modo yaml (use-package nginx-mode) ; Modo para leer archivos de configuración de nginx ;; Major mode para archivos CSV (use-package csv-mode ;; :hook ((csv-mode . csv-align-mode) ;; (csv-mode . csv-header-line)) ) ;; Modo markdown (use-package markdown-mode) ;; Modo para edición de arc docker compose (use-package docker-compose-mode) ;; Modo para la edición de archivos Dockerfile (y building desde emacs) (use-package dockerfile-mode :config ;; Suelo tener podman siempre en lugar de docker, así que lo definimos como el comando a usar (setq dockerfile-mode-command "podman")) ;; Configuración para project.el (use-package project :ensure nil :config ;; Colocamos un título del frame más bonito y útil que el por defecto (setq frame-title-format '( (:eval (let ((project-name (kj/project-name))) (unless (null project-name) (format "[%s] " project-name)))) "%b" " - Emacs") ) ) (use-package prettier :diminish :defines prettier-pre-warm :hook ((js-base-mode css-mode sgml-mode web-mode) . prettier-mode) :init (setq prettier-pre-warm 'none)) ;;; init-prog.el ends here