Skip to content

alvarocsm91/emacs.d

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

58 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Readme

1 Introducción

Este documento es la guia para poder configurar emacs con mi propia configuración, yo lo utilizo por ahora en mi ordenador sobre Fedora 31. La versión que utilizo de emacs es la actual, intentando tener la última que suele solucionar los errores detectados. Emacs 28.0.50 (Org mode 9.3.6)

Desde este archivo se pueden exportar los fragmentos de código para generar el script que leerá Emacs para realizar la configuración, este archivo es init.el y se añade en el repositorio.

2 Configuración básica

En este apartado de configuran elementos básicos del sistema, sirve de ayuda para poder realizar la lectura de variables de entorno del sistema o cargar hasta el inicio de los repositorios donde se encuentran los paquetes que posteriormente descargaremos para su uso.

Para poder realizar la localización de distintos archivos se genera la variable que apunte a la raíz del sistema, para ello se extrae el valor de la variable de entorno HOME.

;;; Basic setup
;;;; Home directory
(setq MyHomeDir (getenv "HOME"))

Para la conexión a Internet desde detrás de un proxy se prueba a ver si se tiene un fichero de configuración del proxy, mostrado a continuación.

;;;; Proxy
(when (file-exists-p (format "%s/.emacs.d/proxy.el" MyHomeDir))
  (load-file (format "%s/.emacs.d/proxy.el" MyHomeDir)))

Para poder hacer uso de los ditintos paquetes es necesario cargar los repositorios se utilizarán los paquetes de melpa, basado en paquetes no oficiales soportados en git para el control de sus versiones. Se define la carpeta de carga dentro de la carpeta .emacs.d, se descararán las últimas versiones, por último se cargan los repositorios y se refrescan los contenidos.

;;;; Repositories
(require 'package)
(setq package-user-dir (format "%s/.emacs.d/elpa" MyHomeDir))

(setq load-prefer-newer t
      package-enable-at-startup t)

(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
(add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/") t)
(add-to-list 'package-archives '("org" . "https://orgmode.org/elpa/") t)

(package-initialize)
(package-refresh-contents)

3 Instalación de paquetes

Una de las grandes ventajas que tiene emacs es que se pueden añadir fácilmente distintos paquetes y con ello funcionalidades que permiten hacer tu vida más facil a la hora de conseguir tus metas.

Para la instalación de paquetes es recomendable utilizar la función use-package que permite realizar una auto carga de la última actualización de los distintos paquetes que se utilicen en el sistema, descargandolos y compilandolos para poder ser utilizados.

;;; Package usage
;;;; Use Package
(package-install 'use-package t)
(setq use-package-always-defer t
      use-package-always-ensure t)

También se puede utilizar el comando require para las mismas funciones.

Para más información use-package.

3.1 Hydra

El paquete de hydra es muy importante en esta configuración ya que premite acortar los comandos para llamar funciones, al utilizar muchos y muy diversos paquete, permite crear combinaciones de comandos.

;;;; Hydra
(use-package hydra
  :defer t)

Para más información hydra.

3.2 Org

Org es uno de los modos de trabajo más importantes de emacs, ya que permite muchisimas cosas entre ellas trabajar de forma organizada, generando documentos con código para exportar a partir de software libre como emacs dejando los documentos elegantes y comprensibles. Se tuiliza también para la gestión de tareas por llevar a cabo y es muy utilizado gracias a la mezcla de sus funcionalidades con otros paquetes.

;;;; Org mode
(use-package org
  :ensure org-plus-contrib
  :config
  (setq org-return-follows-link t)
  :hook (org-mode . (lambda ()
                      (aggressive-fill-paragraph-mode t)))
  :bind
  (("C-x L" . org-store-link)		;; global
   ("C-x C-l" . org-insert-link-global) ;; global
   :map org-mode-map
   ("C-x C-l" . org-insert-link)))

Para la gestión de tareas se han definido los siguientes estados de la tareas en las que las tareas empiezan como ideas para ser definidas TBD pasando a por hacer cuando se ha generado la planificación de la misma con TODO. Una vez se han iniciado se manienen en modo ACTIVE o BLOCKED en función de si estamos trabajando o no en este mismo momento. Por último, la tarea se define como completa con los atributos de DONE y ARCHIVED para cuando las tareas han sido terminadas y cerradas y el atributo de DELETED por si al final se ha decidido no hacer, estos tres marcan la tarea como completa.

;;;;; Org tarsk state
;;Define pocess states
(setq org-todo-keywords
'((sequence "TBD" "TODO" "ACTIVE" "BLOCKED" "REVIEW" "|" "DONE" "ARCHIVED" "DELETED")))
;; Define process colours
(setq org-todo-keyword-faces
      '(("TBD" .(:foreground "white" :weight bold-italic))
      ("TODO" .(:foreground "grey" :weight bold-italic))
      ("ACTIVE" .(:foreground "ligth-blue" :weight bold-italic))
      ("BLOCKED" .(:foreground "purple" :weight bold-italic))
      ("REVIEW" .(:foreground "pink" :weight bold-italic))
      ("DONE" .(:foreground "yellow" :weight bold-italic))
      ("ARCHIVED" .(:foreground "green" :weight bold-italic))
      ("DELETED" .(:foreground "black" :weight bold-italic))))

Para la exportación de documentación en latex y el uso de los colores de la tablera de colores de los modos de programación soportados en org se utiliza la herramienta pygmentize que hay que instalar previamente en nuestro terminal.

;;;;; Org pygmentize
(require 'org)
(require 'ox-latex)
(add-to-list 'org-latex-packages-alist '("" "minted"))
(setq org-latex-listings 'minted)

(setq org-latex-pdf-process
      '("pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"
    "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"
    "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"))

(setq org-src-fontify-natively t)

(org-babel-do-load-languages
 'org-babel-load-languages
 '((R . t)
   (latex . t)
   ()))

Para más información org-mode.

3.3 Org-link-minor-mode

Se trata de un modo menor de emacs, permite el uso del modo org y la activación de sus links desde modos distintos al org, como puedan ser los modos de programación, es muy útil para su uso en links a documentación relativa desde el mismo archivo.

Antes de utilizarlo se debe clonar el paquete de github:

$ git clone https://github.com/seanohalpin/org-link-minor-mode.git
;;;;; Org-link-moinor-mode
;; (use-package org-link-minor-mode)
(when (file-exists-p (format "%s/.emacs.d/org-link-minor-mode/org-link-minor-mode.el" MyHomeDir))
  (load-library (format "%s/.emacs.d/org-link-minor-mode/org-link-minor-mode.el" MyHomeDir)))

(require 'org)
(use-package org-link-minor-mode
  :ensure t)

Para más información org-link-minor-mode.

3.4 Poporg

Poporg es un paquete que permite hacer una correcta presentación de fragmentos de distintos modos dobre un mismo archivo, pudiendo mantener los modos generales de documentación integrando fragmentos de código en ellos para poder extraerlos posteriormente. Sirve principalmente para comentar de forma cómoda un código o añadir comentarios automaticamente.

;;;;; Poporg
(use-package poporg
  :ensure t
  :bind
  ;; call it
  (:map global-map
    (("C-c SPC" . poporg-dwim))
    ;; from within the org mode, poporg-mode-map is a minor mode
    :map poporg-mode-map
    ("C-c C-c" . poporg-update)            ;; update original
    ("C-c SPC" . poporg-edit-exit)         ;; exit, keeping changes
    ("C-x C-s" . poporg-update-and-save))  ;; update original and save buffer
  :hook (poporg-mode . (lambda ()
             (outline-show-all)
             (aggressive-fill-paragraph-mode t)
             (goto-char (point-min)))))

Para más información poporg.

3.5 Org-Trello

Se trata de un paquete que permite la extensión del modo org a la herramienta trello disponible de forma gratuita en internet y nos permite realozar tareas de gestión de proyectos o tareas.

;;;;; Org Trello
;;(require 'org-trello)
;;(add-to-list 'package-archives '("melpa" . "http:https://melpa.milkbox.net/packages/") t)
;;(package-initialize)

;;;;;; Set credentials
;; First of all you should connect with trello with the browser using next command:
;; org-trello-install-key-and-token
;; Now you can use trello woth emacs

;;;;;; Add Trello to major mode
;;(add-to-list 'auto-mode-alist '("\\.trello$" . org-mode))

;;;;;; Auto org-trello files in emacs
;;(add-hook 'org-mode-hook
;;(lambda ()
;;(let ((filename (buffer-file-name (current-buffer))))
;;(when (and filename (string= "trello" (file-name-extension filename)))
;;(org-trello-mode)))))

Para más información org-trello.

3.6 Company

El modo company nos permite utilizar los desplegables para autocompletar palabras o funciones si es que estamos en un modo de programación en particular.

;;;; Company
(use-package company
  :defer t
  :ensure t
  :init (global-company-mode t)
  :config
  ;; Company Quickhelp
  ;; When idling on a completion candidate the documentation for the
  ;; candidate will pop up after `company-quickhelp-delay' seconds.
  (use-package company-quickhelp
    :defer t
    :ensure t
    ;; :if window-system
    :init (company-quickhelp-mode t)
    :config
    (setq company-quickhelp-delay 0.2
      company-quickhelp-max-lines 10))
  ;; With use-package:
  ;; (use-package company-box
  ;;   :hook (company-mode . company-box-mode))
  ;; Variables
  (setq company-dabbrev-ignore-case nil
    company-dabbrev-code-ignore-case nil
    company-dabbrev-downcase nil
    company-idle-delay 0.01
    company-echo-delay 0.01
    company-minimum-prefix-length 2)
  :diminish company-mode)

Para más información company-mode.

3.7 Fly check

Fly check es un paquete que permite la detección de errores en cada uno de los lenguajes de programación, subrayandolos y permitiendo sobre todo detectar errores de sintaxis, es muy útil cuando se programan en lenguajes interpretados.

;;;; Flycheck
(use-package flycheck-pos-tip
  :defer t)
(use-package helm-flycheck
  :defer t)
(use-package flycheck-color-mode-line
  :defer t)
(use-package flycheck
  :init
  (global-flycheck-mode t)
  (flycheck-pos-tip-mode t)
  :bind
  (:map flycheck-command-map
    ("h" . helm-flycheck))
  :config
  (setq flycheck-completion-system 'helm-comp-read )
  (add-hook 'flycheck-mode-hook 'flycheck-color-mode-line-mode))

Para más información fly-check.

3.8 Aggresive indent

Aggresive-indent es un paquete que permite mantener el estilo en función del modo de programación utilizado de forma que quede correctamente indentado, a veces es bueno quitarlo mientras se desarrolla ya que hay veces que desindenta el código hasta que esté terminada la línea. También permite la detección de errores en el código.

;;;; Aggresive indent
(use-package aggressive-indent
  :init (global-aggressive-indent-mode 1))

(use-package aggressive-fill-paragraph
  :ensure t)

Para más información aggresive-indent.

3.9 Whitespace

Este paquete permite eliminar los espacios en blanco no necesarios en cualquier código, esto permite una gran ayuda en la comparación y mantener los archivos sin exceso de carga.

;;;; Whitespace
(use-package whitespace
  :config
  (add-to-list 'whitespace-style 'lines-tail)
  (setq-default show-trailing-whitespace nil)
  (setq whitespace-line-column 80))

(use-package whitespace-cleanup-mode
  :init
  (global-whitespace-cleanup-mode 1)
  :config
  (setq whitespace-cleanup-mode-only-if-initially-clean nil))

Para más información whitespace.

3.10 Crux

Este paquete incluye una colección de ridiculas cuncionalidades y extensiones, esto permite por ejemplo abrir archivos sin importar el nivel de privilegios con el que se accede y si es necesario lo reabre con uno superior.

;;;; Crux
(use-package crux
  :defer t
  :config
  (progn
    (crux-reopen-as-root-mode 1))
  :bind
  (:map global-map
    ("C-a" . nil)
    ([remap kill-whole-line] . crux-kill-whole-line)
    ([remap move-beginning-of-line] . crux-move-beginning-of-line)
    ("C-a"  . crux-move-beginning-of-line)))

Para más información crux.

3.11 Smart scan

Smat scan permite buscar elementos, el uso que se le da en esta configuración es para desplazarnos entre palabras de un mismo buffer. Se utiliza a partir del Atl-p o Alt-n sobre una palabra para ir a la identica posterior o anterior.

;;;;  Smart scan
(use-package smartscan
  :init
  (global-smartscan-mode 1)
  :bind
  (:map smartscan-map
    ("M-’" . 'smartscan-symbol-replace))
  :config
  ;; Variables
  (setq smartscan-symbol-selector "word"))

Para más información smart-scan.

3.12 Magit

Magit es uno de los paquetes más importantes de esta configuración, nos permite poder utilizar git y git-snv desde el mismo emacs. Se accede a el a partir C-x g en una carpeta con un proyecto git para trabajar con ello y en una vacía para iniciarlo. Básico para el control de versiones de cualquier proyecto.

;;;; Magit
(use-package magit-svn
  :ensure t)

(use-package magit
  :config
  (add-hook 'magit-mode-hook 'magit-svn-mode)
  (setq magit-diff-paint-whitespace nil
    magit-diff-highlight-trailing nil
    magit-refresh-verbose t
    magit-refresh-status-buffer t
    magit-display-buffer-function
    #'magit-display-buffer-fullframe-status-v1
    magit-diff-highlight-indentation nil))

Para más información magit y magit-svn.

3.13 Super Save

Este módulo permite la configuración del autoguardado de las fuentes modificadas. también se instala super save para que gruarde el buffer automáticamnte cada vez que se cambie de buffer.

;;;; Auto backup and save
(setq auto-save-default t	;; do auto-saving of every file-visiting buffer.
      delete-auto-save-files t  ;; delete auto-save file when a buffer is saved or killed.
      auto-save-timeout 10	;; Number of seconds idle time before auto-save.
      auto-save-interval 300)	;; Number of input events between auto-saves.

(use-package super-save
  :init
  (super-save-mode 1)
  :defer 5
  :config
  (setq super-save-auto-save-when-idle t ;; Save current buffer automatically when Emacs is idle
    super-save-remote-files nil)     ;; Save remote files when t, ignore them otherwise
  )

Para más información super-save.

3.14 Which key

Se trata de un paquete que permite generar una ayuda de autocompletar los distintos comandos mientras se escriben, se utiliza por ejemplo en paquetes como projectile cuando tenemos una gran variedad de comandos para mostrar que hace cada combinación.

;;;; Which key
(use-package which-key
  :init (which-key-mode 1)
  :pin melpa-stable
  :ensure t
  :config
  ;; Set the time delay (in seconds) for the which-key popup to appear.
  (setq which-key-idle-delay 0.5)
  ;; A list of regexp strings to use to filter key sequences.
  (setq which-key-allow-regexps '("C-c p" "C-c p s" "C-x c"))
  ;; Set the maximum length (in characters) for key descriptions (commands or
  ;; prefixes). Descriptions that are longer are truncated and have ".." added
  (setq which-key-max-description-length nil)
  ;; Set the separator used between keys and descriptions. Change this setting to
  ;; an ASCII character if your font does not show the default arrow. The second
  ;; setting here allows for extra padding for Unicode characters. which-key uses
  ;; characters as a means of width measurement, so wide Unicode characters can
  ;; throw off the calculation.
  (setq which-key-separator "" )
  (setq which-key-unicode-correction 3)
  (setq which-key-max-display-columns 3)
  ;; Set the special keys. These are automatically truncated to one character and
  ;; have which-key-special-key-face applied. Set this variable to nil to disable
  ;; the feature
  (setq which-key-special-keys '("SPC" "TAB" "RET" "ESC" "DEL"))
  ;; Show the key prefix on the left or top (nil means hide the prefix). The
  ;; prefix consists of the keys you have typed so far. which-key also shows the
  ;; page information along with the prefix.
  (setq which-key-show-prefix 'left)
  ;; Set to t to show the count of keys shown vs. total keys in the mode line.
  (setq which-key-show-remaining-keys nil))

Para más información which-key.

3.15 Which function

Permite hacer lo mismo que el paquete anterior pero sobre la escritura de funciones en ciertos modos mayores.

;;;; Which function
(use-package which-func
  :init
  (which-function-mode 1)
  :config
  (setq which-func-unknown " "
    which-func-format
    (list " " (car (cdr which-func-format)) "")
    mode-line-misc-info
    ;; We remove Which Function Mode from the mode line, because it's mostly
    ;; invisible here anyway.
    (assq-delete-all 'which-func-mode mode-line-misc-info))
  (setq-default header-line-format '((which-function-mode (""
        which-func-format " ")))))

Para más información which-function.

3.16 Autocompile

Este paquete permite realizar la auticompilación de los archivos el que se descargan en la instalación para que estén automáticamente disponibles para su uso en su última versión.

;;;; Autocompile
(use-package auto-compile
  :init
  (auto-compile-on-load-mode 1)
  (auto-compile-on-save-mode 1)
  :config
  (setq auto-compile-display-buffer nil
        auto-compile-mode-line-counter t
        load-prefer-newer t
        auto-compile-display-buffer nil
        auto-compile-mode-line-counter t))

Para más información auto-compile.

3.17 Multiple cursors

Permite la generación de multiples cursores para editar texto en columna para aumentar la velocidad en el desarrollo. Para utilizarlo es necesario marcar las distintas líneas sobre las que se quiere actuar y luego proceder con C-c m c

;;;; Multiple cursors
(use-package multiple-cursors)
(global-set-key (kbd "C-c m c") 'mc/edit-lines)

Para más información multiple-cursors.

3.18 TODO Yasnippet

Se trata de un paquete de gestión de snippets o fragmentos de código a los que se invoca a partir de un nombre en clave y su ejecución con el tambulador.

;;;; Yasnippet
(use-package yasnippet)
;; Use as global mode
(yas-global-mode 1)
;;;;; Add yasnippet as minor mode in prog-modes
;;(yas-reload-all)
;;(add-hook 'prog-mode-hook #'yas-minor-mode)
;;;;; Configure yasnippet
(setq yas-snippet-dirs
      '("~/.emacs.d/snippets/vhdl-mode/vhdl"
;;	"~/.emacs.d/snippets/C"
   ))
;;;;; Create snippets
;; look in noxt folder .emacs/elpa/yasnippet-snippets/snippets/vhdl-mode/

Para más información yasnippet.

3.19 Annotation mode

El modo anotación nos permite tomar notas sobre un archivo sin modificar el original, creando otro en el que se almacene el original más las notas. Muy útil al coger el proyecto de otra persona y querer mantener el proyecto comprendiendolo antes de empezar a trabajar con el.

;;;; Annotation mode
(defun csb/org-annotate-file ()
  (interactive)
  (let ((org-annotate-file-add-search t)
        (org-annotate-file-storage-file
         (if (buffer-file-name) ;; if not nil
             ;; for the rest of buffers, create a hidden folder containing its buffer-file-name
             (concat (file-name-directory (buffer-file-name)) "." (file-name-nondirectory (buffer-file-name))
                     ".annotations")
           "~/.org-annotate-file.org")))
    (org-annotate-file)))

(global-set-key (kbd "C-c C-SPC") #'csb/org-annotate-file)

Para más información annotation-mode.

3.20 Ispell-mode

Permite poder utilizar un corrector de texto en distintos lenguajes al utilizar el modo texto. revisar con ispell y aspell. Para poder utilizar el corrector es importante instalar previamente los diccionarios de idiomas a utilizar, en mi caso utilizaré el español y el inglés. Para ello se define el diccionario y luego se puede seleccionar el buffer y aplicar ispell-region.

Yo lo uso con M-x ispell-continue y saltando a la siguiente palabra pulsando el SPC.

(setq-default ispell-program-name "aspell")
(setq ispell-dictionary "castellano")
(setq ispell-local-dictionary. "castellano")
(flyspell-mode 1)

Para más información hunspell.

3.21 Helm

Help nos permite realizar una búsqueda y autocompletar los comandos de lisp integrando distintas herramientas de búsqueda como las cargadas en los siguientes paquetes.

(use-package helm
  :init
  (require 'helm-config)
  (helm-mode 1)
  (helm-autoresize-mode 1)
  :config
  (helm-autoresize-mode 1)
  (global-set-key (kbd "M-x")     'helm-M-x)
  (global-set-key (kbd "C-x C-b") 'helm-buffers-list)
  (global-set-key (kbd "C-x b")   'helm-mini)
  (global-set-key (kbd "C-x C-f") 'helm-find-files)
  (define-key helm-command-map (kbd "T") #'helm-themes)
  (global-set-key (kbd "M-y")     'helm-show-kill-ring))

Para más información helm-package.

3.22 Project management

Para la gestión de proyectos, sobre todo proyectos grandes en los que podemos encontrar una gran variedad de fuentes y carpetas es recomendable utilizar projectile que permite el uso de muchas funcionalidades que resultan básicas una vez te has acostumbrado a ellas. Se utiliza en combinación con helm para busquedas específicas dentro del proyecto.

;;;; Projectile
(use-package projectile
  :init (projectile-mode 1)
  :ensure t
  :pin melpa-stable
  ;; Keys
  :bind
  (:map projectile-mode-map
    ("C-c p" . projectile-command-map)
    ("C-c p s a" . projectile-ag)
    ("C-c p s s" . nil))
  :config

  ;; Variables
  (setq projectile-completion-system 'helm
    projectile-indexing-method 'native
    projectile-enable-caching t
    projectile-remember-window-config t
    projectile-switch-project-action 'projectile-dired)

  (add-to-list 'projectile-globally-ignored-directories ".backups")
  (add-to-list 'projectile-globally-ignored-directories ".stversions"))

;; Helm + projectile
(use-package helm-projectile
  :init (helm-projectile-on)
  :ensure t
  :pin melpa-stable
  :config
  (setq
   helm-projectile-fuzzy-match t
   helm-projectile-sources-list '(helm-source-projectile-recentf-list
                  helm-source-projectile-buffers-list
                  helm-source-projectile-files-list
                  helm-source-projectile-projects)))

Para más información projectile y helm-projectile.

3.23 Helm-ag (Grep)

Permite a emacs utilizar herramientas específicas de búsqueda de linux.

;;;; Grep
(use-package helm-ag
  :ensure t)

Para más información helm-ag.

3.24 Ripgrep

Usa projectile para realizar búsquedas dentro de un proyecto.

;;;; Ripgrep
(use-package ripgrep
  :ensure t)

Para más información ripgrep-package.

3.25 Helm-rg (Rg)

Permite la gestión para búsquedas masivas de datos.

;;;; Ag
(use-package helm-rg
  :ensure t
  :pin melpa-stable)

Para más información helm-rg.

3.26 TODO Wakatime

Wakatime es un paquete que permite evaluar la eficiencia de tu uso de emacs, evaluando el tipo de scripts que habitualmente utilizas y el tiempo consumido en la modificación de los mismos. Utiliza un paquete externo que permite la visualización de los datos obtenidos a través de web. Lo mantego comentado hasta poder solucionar los problemas encontrados.

;;;; Wakatime
;;(use-package wakatime-mode)
;;(global-wakatime-mode 1)

Para más información wakatime-package y wakatime-tool.

3.27 Undo-tree

Este paquete permite navegar a traves de los cambios realizados en el archivo facilmente, evitando tener que utilizar los metodos de deshacer cambios complejos e inútiles del propio editor.

;;;; Undo tree
(use-package undo-tree)
;; Active as global mode
(global-undo-tree-mode 1)

Para más información link

3.28 Mode-icons

Permite visualizar los iconos o imagenes de las miniaturas en función del archivo que se tenga abierto.

;;;; Mode icons
(use-package mode-icons)
(mode-icons-mode)

Para más información mode-icons.

3.29 Hightlight-symbol

Se trata de un paquete que permite el subrayado de una palabra o código manteniendolo subrayado mientras navegas por el fichero para detectar donde se repite.

;;;; Hightlight-symbol
(use-package highlight-symbol)
(global-set-key [(control f3)] 'highlight-symbol)
(global-set-key [f3] 'highlight-symbol-next)
(global-set-key [(shift f3)] 'highlight-symbol-prev)
(global-set-key [(meta f3)] 'highlight-symbol-query-replace)

Para más información highlight-symbol.

3.30 Google this

Se trata de un paquete que permite realizar búsquedas desde emacs.

;; Install package
(use-package google-this)
;; Set active
(google-this-mode 1)

Para más información google-this.

3.31 Google translator

Paquete que permite poder realizar traducciones a partir del uso de google translate.

(use-package google-translate)
(require 'google-translate-smooth-ui)
(global-set-key "\C-ct" 'google-translate-smooth-translate)

Para más información google-translate.

3.32 Texto

Descripción

Para más información Link

4 Global features

Los siguientes apartados permiten la gestión de la apariencia y uso general de emacs como herramienta, en el se definen distintos comandos generales que utilizar desde cualquier punti, como las funcionalidades generales implementacas, se incluyen aspectos como la apariencia respecto a usuario y de las fuentes respecto al SO utilizado.

;;; Global features

4.1 Global keys

Estos son comandos que permiten el uso de distintos elementos de forma global, es decir, independientemente del modo de trabajo en el que estemos.

;;;; Global keys
;; Cambia la fuente del buffer a su valor por defecto.
(global-set-key (kbd "C-=") (lambda () (interactive) (text-scale-adjust 0)))
;; Maximiza las fuentes del buffer
(global-set-key (kbd "C-+") (lambda () (interactive) (text-scale-increase 0.5)))
;; Minimiza las fuentes del buffer
(global-set-key (kbd "C--") (lambda () (interactive) (text-scale-decrease 0.5)))
;; Cierra el buffer activo
(global-set-key (kbd "C-x k") #'kill-this-buffer)
;; Abre magit mostrando el estado de la carpeta
(global-set-key (kbd "C-x g") #'magit-status)

4.2 Global variables

En este apartado se modifica parte de la funcionalidad general a partir de la selección de los valores de ciertas variables seleccionadas por defecto.

;;;; Global variables
(setq-default
 confirm-kill-emacs nil
 inhibit-splash-screen t
 inhibit-startup-message t
 ad-redefinition-action 'accept                   ; Silence warnings for redefinition
 confirm-kill-emacs 'yes-or-no-p                  ; Confirm before exiting Emacs
 cursor-in-non-selected-windows t                 ; Hide the cursor in inactive windows
 delete-by-moving-to-trash t                      ; Delete files to trash
 display-time-default-load-average nil            ; Don't display load average
 display-time-format "%H:%M"                      ; Format the time string
 fill-column 80                                   ; Set width for automatic line breaks
 help-window-select t                             ; Focus new help windows when opened
 indent-tabs-mode nil                             ; Stop using tabs to indent
 inhibit-startup-screen t                         ; Disable start-up screen
 initial-scratch-message ""                       ; Empty the initial *scratch* buffer
 left-margin-width 1 right-margin-width 1         ; Add left and right margins
 mode-require-final-newline 'visit                ; Add a newline at EOF on visit
 mouse-yank-at-point t                            ; Yank at point rather than pointer
 ns-use-srgb-colorspace nil                       ; Don't use sRGB colors
 recenter-positions '(5 top bottom)               ; Set re-centering positions
 redisplay-dont-pause t                           ; don't pause display on input
 debug-on-error t
 jit-lock-defer-time 0
 frame-resize-pixelwise t
 fast-but-imprecise-scrolling t
 scroll-conservatively 10000                      ; Always scroll by one line
 scroll-margin 1                                  ; scroll N lines to screen edge
 scroll-step 1                                    ; keyboard scroll one line at a time
 scroll-preserve-screen-position 1
 select-enable-clipboard t                        ; Merge system's and Emacs' clipboard
 sentence-end-double-space nil                    ; End a sentence after a dot and a space
 show-trailing-whitespace nil                     ; Display trailing whitespaces
 split-height-threshold nil                       ; Disable vertical window splitting
 split-width-threshold nil                        ; Disable horizontal window splitting
 tab-width 4                                      ; Set width for tabs
 uniquify-buffer-name-style 'forward              ; Uniquify buffer names
 window-combination-resize t                      ; Resize windows proportionally
 x-stretch-cursor t)                              ; Stretch cursor to the glyph width

Para más información link

4.3 Global modes

Este apartado permite la configuración de las funcionalidades básicas por defecto que tendrá emacs al abrirse.

;;;; Global modes
(delete-selection-mode)                           ; Replace region when inserting text
(setq line-number-mode t)                         ; Enable line numbers in the mode-line
(setq column-number-mode t)                       ; Enable column numbers in the mode-line
(size-indication-mode 1)                          ; Enable size status in the mode-line
(display-time-mode)                               ; Enable time in the mode-line
(when (window-system)
  (fringe-mode 80))
(fset 'yes-or-no-p 'y-or-n-p)                     ; Replace yes/no prompts with y/n
(global-hl-line-mode)                             ; Hightlight current line
(show-paren-mode t)
(setq show-paren-style 'expression)
(global-subword-mode)                             ; Iterate through CamelCase words
(menu-bar-mode 0)                                 ; Disable the menu bar
(mouse-avoidance-mode 'banish)                    ; Avoid collision of mouse with point
(put 'downcase-region 'disabled nil)              ; Enable downcase-region
(put 'upcase-region 'disabled nil)                ; Enable upcase-region
(put 'downcase-region 'disabled nil)              ; Enable downcase-region
(put 'upcase-region 'disabled nil)                ; Enable upcase-region
(add-hook 'focus-out-hook #'garbage-collect)
(add-hook 'before-save-hook 'delete-trailing-whitespace)
(fset 'yes-or-no-p 'y-or-n-p)

4.4 Encoding

La codificación de las fuentes es una característica importante por ello se busca un sistema de codificación estandar como es utf8.

(set-language-environment 'utf-8)
(setq locale-coding-system 'utf-8-unix)
(prefer-coding-system 'utf-8-unix)
(set-default-coding-systems 'utf-8-unix)
(set-terminal-coding-system 'utf-8-unix)
(set-keyboard-coding-system 'utf-8-unix)
(set-selection-coding-system 'utf-8-unix)

Para más información utf-8.

4.5 Theme

Aquí se realiza la descarga del paquete de gruvbox que permite el uso de sus 6 temas distintos, a mi me gusta el dark-hard para por la noche y el ligth-soft para el día. Para poder trabajar con los dos modos utilizo el paquete adaptive-theme para el uso combinado de temas claros y oscuros en función del cambio horario de mi localización.

;;;; Theme
(use-package gruvbox-theme)
(use-package org-web-tools)

;;;;; Adaptive theme installation
(when (file-exists-p (format "%s/.emacs.d/adaptive-theme/adaptive-theme.el" MyHomeDir))
  (load-file (format "%s/.emacs.d/adaptive-theme/adaptive-theme.el" MyHomeDir))
  (adaptive-theme-autolocation 'gruvbox-light-soft 'gruvbox-dark-hard)
  )

Para más información gruvbox-theme and adaptive-theme.

4.6 Appereance

Para el uso de emacs me gusta quitar la barra superior blanca iniciando con la pantalla maximizada, manteniendo los números de línea y evitando las barras de los laterales para moverme por el archivo ya que para eso tengo las teclas del teclado.

;; Start maximised
(add-hook 'window-setup-hook 'toggle-frame-fullscreen t)

;; Remove all that’s not necessary
(when window-system
  (menu-bar-mode 0)
  (global-display-line-numbers-mode t)
  ;; (blink-cursor-mode 0)                        ; Disable the cursor blinking
  (scroll-bar-mode 0)                             ; Disable the scroll bar
  (tool-bar-mode 0)                               ; Disable the tool bar
  (tooltip-mode 0))                               ; Disable the tooltips

4.7 Load Files

Para poder cargar código emacs en distintos archivos se pueden cargar tal y como se muestra a continuación, la idea es dividir las funcionalidades y paquetes explicados anteriormente en distintos archivos *.el diferenciando usos y temáticas para hacer un poco de limpieza sobre este archivo.

;;; Load files
(when (file-exists-p (format "%s/.emacs.d/general_conf.el" MyHomeDir))
  (load-file (format "%s/.emacs.d/general_conf.el" MyHomeDir)))

5 Modos de programación

Los modos de programación permiten la carga de ciertas funcionalidades específicas de cada uno de los lenguajes de programación como son los colores a utilizar o los snippets, también permite adaptar el paquete flycheck con los errores detectados. Me gusta dividirlos y sobre todo agrupar los que son de una misma temática, una de las funcionalidades que más utilizo es el outshine, por lo que lo configuro para cada uno de los modos de trabajo.

;;; Programming modes
(use-package outshine)
(add-hook 'prog-mode-hook
          (lambda ()
            (outshine-mode t)
            (org-link-minor-mode t)))

5.1 VHDL

Se trata del modo de programación mejor hecho, configurado por csb, aún por teminar de descubrir ya que tiene mucha miga.

;;;; VHDL
;;;;; Cayetano's features

  (use-package vhdl-mode
    :defer t
  ;;; Config
    :config
  ;;;; Beautifying setting last semicolom to column 79 or not
    ;; This variable toggles the functionality
    (defvar csb/vhdl-beautify-shift-semicolom t
      "When non nil, beautify shifts semicolon to column csb/vhdl-shift-semicolom-value. Indra compliant ...")
    (defvar csb/vhdl-shift-semicolom-value 79
      "Amount of shift to apply. Indra compliant ...")
    ;; The executing function
    (defun csb/vhdl-shift-semicolom (&optional start end)
      (when csb/vhdl-beautify-shift-semicolom
        (save-excursion
          (goto-char (or start (point-min)))
          (while (re-search-forward "[,;]$"
                                    (if (region-active-p)
                                        (region-end)
                                      (point-max))
                                    t)
            (backward-char)
            (indent-to-column csb/vhdl-shift-semicolom-value)
            (forward-char)))))
    ;; Advicing the beautifying function
    (advice-add 'vhdl-beautify-region :after #'csb/vhdl-shift-semicolom)
  ;;;; Major mode variables
    (setq vhdl-basic-offset 2
          vhdl-beautify-options '(t t t t nil)
          vhdl-highlight-forbidden-words t
          vhdl-highlight-special-words t
          vhdl-highlight-translate-off t
          vhdl-upper-case-constants t  ;; Non-nil means convert upper case.
          vhdl-upper-case-types nil
          vhdl-upper-case-keywords nil
          vhdl-upper-case-attributes nil
          vhdl-upper-case-enum-values nil)
  ;;;; Helpful modes on by default
    (vhdl-stutter-mode 1)
    (vhdl-electric-mode 1)
  ;;;; Completion at point with company, see below
    ;; Declare a variable to limit the features for large files
    (defvar csb/vhdl-max-lines-disable-features 1500
      "Maximun number of lines in a file to allow all features.")
    ;; Following previous variable
    (when (require 'vhdl-capf)
      (add-hook 'vhdl-mode-hook
                (lambda ()
                  (if (< (count-lines 1 (point-max))
                         csb/vhdl-max-lines-disable-features)
                      (progn
                        (add-to-list
                         (make-local-variable 'completion-at-point-functions)
                         'vhdl-capf-main)
                        ;; Make ‘company-backends’ local is critcal or else, you will
                        ;; have completion in every major mode
                        (make-local-variable 'company-backends)
                        ;; set ‘company-capf’ first in list
                        (delq 'company-capf company-backends)
                        (add-to-list 'company-backends 'company-capf))
                    ;; For large files, disable a couple of things
                    (progn
                      ;; Force standard for large files, fixes bug
                      (setq-local vhdl-standard (quote (93 nil)))
                      (company-mode -1)
                      (aggressive-indent-mode -1)
                      (flyspell-mode -1))))))
  ;;;; Show trailing whitespaces
    (add-hook 'vhdl-mode-hook
              (lambda ()
                (setq show-trailing-whitespace t)))
  ;;;; Outshine
    (add-hook 'vhdl-mode-hook
              (lambda ()
                (setq-local outline-regexp
                            "^\\s-*--\\s-\\([*]\\{1,8\\}\\)\\s-\\(.*\\)$")))
  ;;;; Custom beautify region, activating the paragraph first
    (defun csb/vhdl-beautify-region (arg)
      "Call beautify-region but auto activate region first.
           With a prefix ARG, fall back to previous behaviour."
      (interactive "P")
      (if (equal arg '(4))
          (call-interactively 'vhdl-beautify-region)
        (save-excursion
          (when (not (region-active-p))
            (mark-paragraph))
          (call-interactively 'vhdl-beautify-region))))
  ;;;; Hydra
    (defhydra csb/hydra-vhdl (:color blue)
      "
    _i_ndent   _I_nsert   _t_emplate   _f_ill   _b_eautify   _p_ort  _c_ompose   _F_ix  _m_odel  _M_ode   _a_lign  _?_
      "
      ("i" (with-initial-minibuffer "vhdl indent") nil)
      ("I" (with-initial-minibuffer "vhdl insert") nil)
      ("t" (with-initial-minibuffer "vhdl template") nil)
      ("f" (with-initial-minibuffer "vhdl fill") nil)
      ("b" (with-initial-minibuffer "vhdl beautify") nil)
      ("a" (with-initial-minibuffer "vhdl align") nil)
      ("p" (with-initial-minibuffer "vhdl -port") nil)
      ("c" (with-initial-minibuffer "vhdl compose") nil)
      ("F" (with-initial-minibuffer "vhdl fix") nil)
      ("m" (with-initial-minibuffer "vhdl model") nil)
      ("M" (with-initial-minibuffer "vhdl mode$") nil)
      ("?" vhdl-doc-mode nil)
      ("q" nil nil))
  ;;;; Bindings
    :bind (:map vhdl-mode-map
                ([remap vhdl-beautify-region] . csb/vhdl-beautify-region)
                ("C-c ?" . vhdl-doc-mode)
                ("C-c C-h" . nil)
                ("C-c v" . csb/hydra-vhdl/body)))

(use-package vhdl-capf
  :defer t
  :config
  (require 'vhdl-mode)
  (require 'company)
  (require 'cl)
  (setq vhdl-capf-search-vhdl-buffers-for-candidates t))

;;;;; Own config
;; Specific to vhdl-major mode
;;;;; Use ghdl if available as flycheck checker (linter)
;; First, install ghdl and at it to your windoze10 path
;; Check with (executable-find "ghdl"), which should return the path to the
;; executable
;; The "vhdl-ghdl" checker is already provided by Flycheck
(when (executable-find "ghdl")
  ;; Define a custom checker called "vhdl-ghdl-custom"
  ;; using your own options following your setup
  (flycheck-define-checker vhdl-ghdl-custom
    "A custom VHDL syntax checker using ghdl."
    :command ("ghdl"
          "-s" ; only do the syntax checking
          "--std=08"
          ;;"--std=93"
          "--ieee=synopsys"
          ;; "-fexplicit"
          ;; "--workdir=work"
          "-P/opt/CompiledLibraries/Vivado"
          "--warn-unused"
          source)
    :error-patterns
    ((error line-start (file-name) ":" line ":" column ": " (message) line-end))
    :modes vhdl-mode)

  ;; Finally, use one of "vhdl-ghdl" or "vhdl-ghdl-custom"
  (add-hook 'vhdl-mode-hook
        (lambda ()
          ;; Select ONLY one of:
          (flycheck-select-checker 'vhdl-ghdl-custom)
          ;; (flycheck-select-checker 'vhdl-ghdl)
          )
        ) ;; end add-hook
  ) ;; end when

Para más información link

5.2 Python

En base al siguiente artículo he generado mi entorno de desarrollo de python sobre emacs. He tenido que instalarlo desde las fuentes ya que me ha dado problemas al no encontrar el paquete en el repositorio de melpa, por lo que acceso al github de la herramienta y la clono en la carpeta .emacs.d.

;;;; Python
;;;;; Instal packages
(defvar myPackages
  '(better-defaults                 ;; Set up some better Emacs defaults
    py-autopep8                     ;; Run autopep8 on save
    ein                             ;; Emacs IPython Notebook
    )
  )

(mapc #'(lambda (package)
          (unless (package-installed-p package)
            (package-install package)))
      myPackages)

;;;;; Elpy
;;;;;; Load module
;; https://github.com/jorgenschaefer/elpy.git
(when (file-exists-p (format "%s/.emacs.d/elpy/elpy.el" MyHomeDir))
  (load-file (format "%s/.emacs.d/elpy/elpy.el" MyHomeDir))
  (load-file (format "%s/.emacs.d/elpy/elpy-rpc.el" MyHomeDir))
  (load-file (format "%s/.emacs.d/elpy/elpy-shell.el" MyHomeDir))
  (load-file (format "%s/.emacs.d/elpy/elpy-profile.el" MyHomeDir))
  (load-file (format "%s/.emacs.d/elpy/elpy-refactor.el" MyHomeDir))
  (load-file (format "%s/.emacs.d/elpy/elpy-django.el" MyHomeDir))
  )

;;;;;; Enable package
(elpy-enable)

;;;;; Use IPython for REPL
(setq python-shell-interpreter "jupyter"
      python-shell-interpreter-args "console --simple-prompt"
      python-shell-prompt-detect-failure-warning nil)
(add-to-list 'python-shell-completion-native-disabled-interpreters
             "jupyter")

;;;;; Enable flycheck mode
(when (require 'flycheck nil t)
  (setq elpy-modules (delq 'elpy-module-flymake elpy-modules))
  (add-hook 'elpy-mode-hook 'flycheck-mode))

;;;;; Enable autopep8
(require 'py-autopep8)
(add-hook 'elpy-mode-hook 'py-autopep8-enable-on-save)

;;;;; Emacs IPython Notebook
(use-package ein)

;;;;; Show trailing whitespaces
(add-hook 'python-mode-hook
          (lambda ()
            (setq show-trailing-whitespace t)))

;;;;; Outshine
(add-hook 'python-mode-hook
          (lambda ()
            (setq-local outline-regexp
                        "# [*]+")))

;;;; Python

;; Based on [[https://vxlabs.com/2018/11/19/configuring-emacs-lsp-mode-and-microsofts-visual-studio-code-python-language-server/][this]] article.

;; Only under linux
;;(when (eq (window-system) 'x)

;;(add-hook 'python-mode-hook
;;(lambda ()
;; flychek checker
;;(flycheck-select-checker 'python-flake8)
;;(lsp))))

;;  ;; Microsoft lsp implementation
;;  (use-package ms-python
;;    :config
;;    (setq ms-python-server-install-dir
;;          ;; set path to install
;;          (expand-file-name
;;           "~/Software/MS-LS/build/python-language-server/output/bin/Release/")
;;          ;; set path to dotnet
;;          ms-python-dotnet-install-dir "/usr/bin"))
;;
;;(use-package lsp-mode
;;    :config

;;    ;; change nil to 't to enable logging of packets between emacs and the LS
;;    ;; this was invaluable for debugging communication with the MS Python Language Server
;;    ;; and comparing this with what vs.code is doing
;;    (setq lsp-print-io nil)
;;
;;    ;; lsp-ui gives us the blue documentation boxes and the sidebar info
;;    (use-package lsp-ui
;;      :config
;;      ;; flycheck
;;      (require 'lsp-ui-flycheck)
;;      ;;
;;      (setq lsp-ui-sideline-ignore-duplicate t
;;            lsp-ui-sideline-delay 1
;;            lsp-ui-doc-use-childframe nil)
;;      (define-key lsp-ui-mode-map [remap xref-find-definitions]
;;        #'lsp-ui-peek-find-definitions)
;;      (define-key lsp-ui-mode-map [remap xref-find-references]
;;        #'lsp-ui-peek-find-references)
;;      (add-hook 'lsp-mode-hook 'lsp-ui-mode)
;;      (add-hook 'lsp-after-open-hook #'(lambda()(lsp-ui-flycheck-enable t)))
;;      (add-hook 'lsp-after-open-hook #'(lambda()(lsp-ui-sideline-enable t)))
;;      (add-hook 'lsp-after-open-hook #'(lambda()(lsp-ui-imenu-enable t)))
;;      (add-hook 'lsp-after-open-hook #'(lambda()(lsp-ui-peek-enable t)))
;;      (add-hook 'lsp-after-open-hook #'(lambda()(lsp-ui-doc-enable t))))
;;
;;    ;; install LSP company backend for LSP-driven completion
;;    (use-package company-lsp
;;      :config
;;      ;; avoid, as this changes it globally
;;      ;; do it in the major mode instead
;;      ;; (push 'company-lsp company-backends)
;;      ;; better set it locally
;;      (add-hook 'lsp-after-open-hook
;;                #'(lambda()(add-to-list (make-local-variable 'company-backends)
;;                                        'company-lsp)))
;;      (setq company-lsp-async t
;;            company-lsp-cache-candidates t
;;            company-lsp-enable-recompletion t
;;            company-lsp-enable-snippet t)))
;;
;;  ) ;; (eq (window-system) 'x)

Para más información link

5.2.1 Different python files

Se incluyen como archivos de python los distintos archivos generados relacionados con este modo de programación.

;;;;; Set *.pyz to open as python-mode
;; Python script archive
(add-to-list 'auto-mode-alist '("\\.pyz\\'" . python-mode))
;;;;; Set *.pywz to open as python-mode
;; Python script archive form MS-Windos
(add-to-list 'auto-mode-alist '("\\.pywz\\'" . python-mode))
;;;;; Set *.rpy to open as python-mode
;; RPython script or python script contain app or framework specific features
(add-to-list 'auto-mode-alist '("\\.rpy\\'" . python-mode))
;;;;; Set *.pyde to open as python-mode
;; Python script used by processing
(add-to-list 'auto-mode-alist '("\\.pyde\\'" . python-mode))
;;;;; Set *.pyp to open as python-mode
;; Py4D Python Plugin
(add-to-list 'auto-mode-alist '("\\.pyp\\'" . python-mode))
;;;;; Set *.pyt to open as python-mode
;; Python declaration file
(add-to-list 'auto-mode-alist '("\\.pyt\\'" . python-mode))
;;;;; Set *.ipynb to open as python-mode
;; Jupyter notebook file
(add-to-list 'auto-mode-alist '("\\.ipynb\\'" . python-mode))

5.3 C/C++

Se incluye el modo de programación para C/C++, se trata de uno de los modos por defecto por lo que no se requiere una configuración muy compleja.

;;;; C/C++
;;;;; Show trailing whitespaces
(add-hook 'c-mode-hook
      (lambda ()
        (setq show-trailing-whitespace t)))

;;;;; Outshine
(add-hook 'c-mode-hook
      (lambda ()
        (setq-local outline-regexp
            "// [*]+")))
;;                        "^//\\s-\\([*]\\{1,8\\}\\)\\s-\\(.*\\)$")))

Para más información link

5.4 TCL

Descripción

;;;; TCL
;;;;; Show trailing whitespaces
(add-hook 'tcl-mode-hook
      (lambda ()
        (setq show-trailing-whitespace t)))

;;;;; Outshine
(add-hook 'tcl-mode-hook
      (lambda ()
        (setq-local outline-regexp
            "# [*]+")))

Para más información link

5.4.1 XDC

Descripción

;;;;; Set *.xdc to open as tcl-mode
;; URL: http:https://ergoemacs.org/emacs/emacs_auto-activate_a_major-mode.html
;; setup files ending in *.xdc to open in tcl-mode
(add-to-list 'auto-mode-alist '("\\.xdc\\'" . tcl-mode))

5.4.2 UCF

Descripción

;;;;; Set *.ucf to open as tcl-mode
;; URL: http:https://ergoemacs.org/emacs/emacs_auto-activate_a_major-mode.html
;; setup files ending in *.ucf to open in tcl-mode
(add-to-list 'auto-mode-alist '("\\.ucf\\'" . tcl-mode))

5.4.3 BD

Descripción

;;;;; Set *.bd to open as tcl-mode
;; Open Xilinx block design as TCL file
(add-to-list 'auto-mode-alist '("\\.bd\\'" . tcl-mode))

5.4.4 IP

Descripción

;;;;; Set *.ip to open as tcl-mode
;; Open Xilinx IPcore as TCL file
(add-to-list 'auto-mode-alist '("\\.ip\\'" . tcl-mode))

Para más información link

5.5 R - Matlab

Este apartado, como se puede ver está por desarrollar, se pretende crear un espacio para la programación en R eficiente.

;;;; Matlab
;; install matlab mode
;;(require 'matlab-mode)

;; include libraries
;; https://blogs.mathworks.com/community/2009/09/14/matlab-emacs-integration-is-back/

;; https://www.emacswiki.org/emacs/MatlabMode
;;(autoload 'matlab-mode "matlab" "Matlab Editing Mode" t)
;;(add-to-list
;; 'auto-mode-alist
;; '("\\.m$" . matlab-mode))
;;(setq matlab-indent-function t)
;;(setq matlab-shell-command "matlab")

Para más información link

6 Help

Para poder acceder de forma rápida a toda la ayuda disponible se crean menús a los que acceder de forma sencilla. Esta ayuda se define en unn archivo propio de ayuda que consultar a parte.

;;; Help
(when (file-exists-p (format "%s/.emacs.d/my_help.el" MyHomeDir))
      (load-file (format "%s/.emacs.d/my_help.el" MyHomeDir)))

6.1 Main help

Para iniciar la ayuda es conveniente generar un primer menú, amplio que permita acceder al resto desde cualquier sitio.

;;; Main menu
;;;; Create body
(defhydra my-general-menu (:color blue)
  "
^Basic Conf^         ^Packages^         ^Features^          ^Prog Mode^
^-------------------------------------------------------------------
_b_: My basic        _p_: Installed     _f_: Global         _p_: Programming
   configuration      packages         features          modes
"
  ;; Show basic config menu
  ("b" help)
  ;; Show basic config menu
  ("p" help)
  ;; Show basic config menu
  ("f" help)
  ;; Show basic config menu
  ("p" help)
  ;; Extra info
  ("q" quit-window "quit" :color blue)
  )

Defino el comando C-h SPC para mostrar el menú principal y poder mostrar el resto de menús.

;;;; Set global key
;;(define-key Buffer-general-mode-map "." 'my-general-menu/body)
(global-set-key (kbd "C-h SPC") 'my-general-menu/body)