#+STARTUP: indent * Tabla de contenido :TOC_5_org: :PROPERTIES: :CUSTOM_ID: Tabla de contenido :TOC_5_org: :END: - [[Acerca de este documento][Acerca de este documento]] - [[Configuración Genérica][Configuración Genérica]] - [[Iniciar paquetes elpa/melpa/marmalade][Iniciar paquetes elpa/melpa/marmalade]] - [[Actualizar paquetes][Actualizar paquetes]] - [[Asegurarse de que use-package y el-get estan instalados y los inicializa][Asegurarse de que use-package y el-get estan instalados y los inicializa]] - [[Hábitos][Hábitos]] - [[Moverse por el buffer][Moverse por el buffer]] - [[Establecer nombre y correo][Establecer nombre y correo]] - [[Abrir cómo buffer inicial][Abrir cómo buffer inicial]] - [[Iniciar cómo servidor][Iniciar cómo servidor]] - [[Destacar el par coincidente][Destacar el par coincidente]] - [[Auto-guardado][Auto-guardado]] - [[Modo por defecto][Modo por defecto]] - [[Acepta 'y' o 'n' cuando pide 'yes' o 'no'][Acepta 'y' o 'n' cuando pide 'yes' o 'no']] - [[Lenguaje por defecto en emacs y org-mode][Lenguaje por defecto en emacs y org-mode]] - [[Moverse por ventanas con shift][Moverse por ventanas con shift]] - [[Helm][Helm]] - [[Buscar más eficazmente en Helm][Buscar más eficazmente en Helm]] - [[ivy-mode][ivy-mode]] - [[counsel-dash][counsel-dash]] - [[ace-isearch][ace-isearch]] - [[Seguir enlaces simbólicos][Seguir enlaces simbólicos]] - [[Emparejar parentesis y otros][Emparejar parentesis y otros]] - [[Mantener lista de buffers recientes][Mantener lista de buffers recientes]] - [[Guardar el layout tal cómo está][Guardar el layout tal cómo está]] - [[No truncar líneas][No truncar líneas]] - [[Programación][Programación]] - [[Auto identación][Auto identación]] - [[Magit][Magit]] - [[Insertar licencia][Insertar licencia]] - [[Auto-competado][Auto-competado]] - [[Borrar espacios sobrantes][Borrar espacios sobrantes]] - [[Usar ssh con tramp][Usar ssh con tramp]] - [[Golden Ratio][Golden Ratio]] - [[Abrir enlaces en el navegador por defecto][Abrir enlaces en el navegador por defecto]] - [[Terminal][Terminal]] - [[Cambiar de ventana más comodamente][Cambiar de ventana más comodamente]] - [[undo-tree][undo-tree]] - [[Sobreescribir al seleccionar texto][Sobreescribir al seleccionar texto]] - [[Buffer \ast{}Scratch\ast{} persistente][Buffer \ast{}Scratch\ast{} persistente]] - [[kill-this-buffer en vez de kil-buffer][kill-this-buffer en vez de kil-buffer]] - [[emacs-purpose o proposito][emacs-purpose o proposito]] - [[Yasnippet][Yasnippet]] - [[Ispell][Ispell]] - [[Paquetes genéricos][Paquetes genéricos]] - [[Imenu][Imenu]] - [[imenu-list][imenu-list]] - [[Hydra][Hydra]] - [[csv-mode][csv-mode]] - [[Paleta de colores][Paleta de colores]] - [[Hacer gifs con camcorder.el][Hacer gifs con camcorder.el]] - [[Mostrar teclas presionadas en un buffer][Mostrar teclas presionadas en un buffer]] - [[Hardcodear atajos de teclado][Hardcodear atajos de teclado]] - [[Flycheck][Flycheck]] - [[Rainbow-mode][Rainbow-mode]] - [[i3wm-config-mode][i3wm-config-mode]] - [[Lorem Ipsum][Lorem Ipsum]] - [[Pastear en sprunge.us][Pastear en sprunge.us]] - [[Aspecto][Aspecto]] - [[Tema cyberpunk][Tema cyberpunk]] - [[Powerline modificada][Powerline modificada]] - [[Formato de las columnas de númeracion][Formato de las columnas de númeracion]] - [[Ventana limpia][Ventana limpia]] - [[UTF-8][UTF-8]] - [[Tipo de fuente][Tipo de fuente]] - [[Partir buffers de manera más bonita][Partir buffers de manera más bonita]] - [[Scroll][Scroll]] - [[Configuración por modos o lenguajes][Configuración por modos o lenguajes]] - [[JSON][JSON]] - [[Haskel][Haskel]] - [[Markdown][Markdown]] - [[Python][Python]] - [[web-mode][web-mode]] - [[DockerFile][DockerFile]] - [[kivy-mode][kivy-mode]] - [[gnu-social-mode][gnu-social-mode]] - [[po-mode][po-mode]] - [[org-mode][org-mode]] - [[Definir fuente de el-get][Definir fuente de el-get]] - [[Agenda][Agenda]] - [[Definir archivos de la agenda][Definir archivos de la agenda]] - [[Comandos de Agenda][Comandos de Agenda]] - [[Capturas de notas][Capturas de notas]] - [[Definir archivo de notas para org-capture][Definir archivo de notas para org-capture]] - [[Estados de los objetos de las listas][Estados de los objetos de las listas]] - [[Refile][Refile]] - [[Caldav][Caldav]] - [[Configuración del calendario][Configuración del calendario]] - [[calfw][calfw]] - [[Tareas repetitivas][Tareas repetitivas]] - [[Cambiar el formato de CLOCKTABLE][Cambiar el formato de CLOCKTABLE]] - [[Quitar tags de la agenda][Quitar tags de la agenda]] - [[Edición, diseño y varios][Edición, diseño y varios]] - [[Atajos de teclado][Atajos de teclado]] - [[Definir lenguajes que entiende babel][Definir lenguajes que entiende babel]] - [[Asteriscos bonitos][Asteriscos bonitos]] - [[Seguir links][Seguir links]] - [[Exportar Markdown][Exportar Markdown]] - [[Exportar rst][Exportar rst]] - [[Configuracion de bloques de código][Configuracion de bloques de código]] - [[Elementos de marcado][Elementos de marcado]] - [[Quitar confirmación al evaluar código][Quitar confirmación al evaluar código]] - [[Añadir imágenes in-line][Añadir imágenes in-line]] - [[org2blog][org2blog]] - [[org2nikola][org2nikola]] - [[Notas a pie de página][Notas a pie de página]] - [[toc-org][toc-org]] - [[Cifrar archivos][Cifrar archivos]] - [[Más profundidad en imenu][Más profundidad en imenu]] - [[Empareja simbolos de marcado y paréntesis][Empareja simbolos de marcado y paréntesis]] - [[org-protocol][org-protocol]] - [[Temas para exportación en html][Temas para exportación en html]] - [[Ejecución de bloques babel asyncrona][Ejecución de bloques babel asyncrona]] - [[org-brain][org-brain]] - [[mail-mode][mail-mode]] - [[lisp][lisp]] - [[Paredit][Paredit]] - [[package-lint][package-lint]] - [[rainbow-delimiters][rainbow-delimiters]] - [[Funciones personalizadas][Funciones personalizadas]] - [[Recargar todos los buffers abiertos][Recargar todos los buffers abiertos]] - [[Insertar cabeceras para org-mode][Insertar cabeceras para org-mode]] - [[Insertar bloque src para org-mode][Insertar bloque src para org-mode]] - [[Insertar org-entities][Insertar org-entities]] - [[Añadir soporte para editar archivos en docker][Añadir soporte para editar archivos en docker]] - [[Insertar fecha de hoy][Insertar fecha de hoy]] - [[Abrir eshell aquí][Abrir eshell aquí]] - [[Reabrir buffer con sudo][Reabrir buffer con sudo]] * Acerca de este documento :PROPERTIES: :CUSTOM_ID: Acerca de este documento :END: Este documento está hecho en org-mode y es tanto mi configuración de emacs como la explicación de esta. Más información sobre esto aquí. Mi idea es que termine siendo más o menos un tutorial de emacs, tal vez extendido con los articulos del blog. A ver como sale. Se puede instalar mi configuración de emacs del siguiente modo: #+BEGIN_SRC bash :tangle no :eval no git clone https://daemons.it/cgit/dotfiles cd dotfiles ./instala.sh emacs #+END_SRC Que hace esto exactamente? Básicamente, instalar todos los paquetes y scripts mencionados en este documento. De un modo más extendido, lo que hace el script de =instala.sh= es esto (la explicación en los comentarios): #+BEGIN_SRC bash :tangle no :eval no # Establece el directorio de las configuraciones, lo crea y las copia ahí EMACSDIR="$HOME/.emacs.d" mkdir -p $EMACSDIR ln -sf $(pwd)/emacs.d/{init.el,init-literate.org} $EMACSDIR # crear private-literate.org si no existe para que no se queje init.el if [[ ! -e $EMACSDIR/private-literate.org ]] then echo -e "* Vacio\n#+BEGIN_SRC emacs-lisp\n#+END_SRC" > $EMACSDIR/private-literate.org fi # Instalar todos los paquetes de emacs emacs -Q --batch --eval "(load-file \""$EMACSDIR/"init.el\")" emacs -Q --batch --eval "(load-file \""$EMACSDIR/"init-literate.el\")" emacs -Q --batch --eval "(load-file \"/tmp/powerline.el\"))" # Por algún motivo al compilar desde el-get mete una ruta incorrecta en org-loaddefs.el sed -i "s,org-mode-maint/lisp/,,g" $EMACSDIR/el-get/org-mode-maint/lisp/org-loaddefs.el # Necesito permiso de superusuario para copiar los scripts capture y demacs en /usr/local/bin/ sudo ln -sf $(pwd)/emacs.d/{capture,demacs} /usr/local/bin/ #+END_SRC Este archivo en formato org-mode está [[https://daemons.it/cgit/dotfiles/plain/emacs.d/init-literate.org][aquí]]. Este archivo en formato HTML está [[https://daemons.it/stories/mi-configuracin-de-emacs/][aquí]]. * Configuración Genérica :PROPERTIES: :CUSTOM_ID: Configuración Genérica :END: En esta sección se tocará la configuración que tenga que ver con el manejo general de emacs. Yo suelo arrancar emacs usando un script que llamo =demacs=. En el llamo a emacs en modo demonio para que quede corriendo en segundo plano y luego abro =emacsclient=. Que ventajas tiene esto? Si por lo que sea petan las X, emacs sigue corriendo, por ejemplo. O que puedo no tener ninguna ventana de emacs abierta y aún así no perder las ventanas que hay en ellas. O mejor aún, que puedo usarlo desde terminal como editor de mutt. El script que uso es el siguiente: #+BEGIN_SRC sh :results code :exports results cat `which demacs` #+END_SRC #+RESULTS: #+BEGIN_SRC sh #!/bin/bash USERID=`id -u` if [[ ! -e /tmp/emacs$USERID/server ]] then emacs --daemon emacsclient -c -n -e '(load-file "/tmp/powerline.el")' -e "(org-agenda-list)" else emacsclient -c -n -e "(org-agenda-list)" fi #+END_SRC Me gusta que nada más abrirlo, me muestre la agenda, por eso está el =(org-agenda-list)=. El =load-file= al fichero del powerline es debido a que emacs al lanzarse en modo demonio, es como si se lanzase en modo terminal, por lo que hay ciertos paquetes que los carga como tal. Y dado que el powerline que uso es un poco especialito, si no se arranca desde la gui, se ve feo. Por ello la primera vez que se ejecute el =emacsclient=, evalua el powerline. ** Iniciar paquetes elpa/melpa/marmalade :PROPERTIES: :CUSTOM_ID: Iniciar paquetes elpa/melpa/marmalade :END: Ahora mismo el repositorio de marmalade está comentado por que da un error al usarlo con https. Uso el de ojab.ru, que es un proxy a marmalade. #+BEGIN_SRC emacs-lisp (setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/") ;;("marmalade" . "https://marmalade-repo.org/packages/") ("marmalade" . "https://ojab.ru/marmalade/") ("melpa" . "https://melpa.org/packages/"))) (package-initialize) #+END_SRC ** Actualizar paquetes :PROPERTIES: :CUSTOM_ID: Actualizar paquetes y hacer su instalación asíncrona :END: #+BEGIN_SRC emacs-lisp (package-refresh-contents) #+END_SRC ** Asegurarse de que use-package y el-get estan instalados y los inicializa :PROPERTIES: :CUSTOM_ID: Asegurarse de que use-package y el-get estan instalados y los inicializa :END: #+BEGIN_SRC emacs-lisp ;; Comprueba si use-package está instalado, sinó lo instala desde los repositorios (unless (require 'use-package nil 'noerror) (package-install 'use-package)) (require 'use-package) ;; Añade la ruta de el-get (add-to-list 'load-path (concat user-emacs-directory "el-get/el-get/")) ;; Comprueba si el-get está instalado, sinó lo instala desde un gist (unless (require 'el-get nil 'noerror) ;; comprobar si existe el fichero a descargar, si existe no lo descarga (if (not (file-exists-p "/tmp/el-get-install.el")) (url-copy-file "https://raw.githubusercontent.com/dimitri/el-get/master/el-get-install.el" "/tmp/el-get-install.el")) (load-file "/tmp/el-get-install.el")) (use-package el-get) #+END_SRC *** Hábitos :PROPERTIES: :CUSTOM_ID: Hábitos :END: #+BEGIN_SRC emacs-lisp (use-package org-habit :init (add-to-list 'org-modules 'org-habit) :config (setq org-habit-preceding-days 7 org-habit-following-days 0 org-habit-graph-column 50 org-habit-show-habits-only-for-today t org-habit-show-all-today t)) #+END_SRC ** Moverse por el buffer :PROPERTIES: :CUSTOM_ID: Moverse por el buffer :END: Subir y bajar párrafos: #+BEGIN_SRC emacs-lisp (global-set-key "\M-p" 'backward-paragraph) (global-set-key "\M-n" 'forward-paragraph) #+END_SRC ** Establecer nombre y correo :PROPERTIES: :CUSTOM_ID: Establecer nombre y correo :END: Al exportar en org-mode, por ejemplo, coge estos valores. #+BEGIN_SRC emacs-lisp (setq user-full-name "drymer" user-mail-address "drymer [ EN ] autistici.org") #+END_SRC ** Abrir cómo buffer inicial :PROPERTIES: :CUSTOM_ID: Abrir cómo buffer inicial :END: #+BEGIN_SRC emacs-lisp (setq initial-buffer-choice "~/Documentos/org/index.org") #+END_SRC ** Iniciar cómo servidor :PROPERTIES: :CUSTOM_ID: Iniciar cómo servidor :END: De este modo puedo usar =emacsclient= desde la terminal y la sesión de =emacs= existente. #+BEGIN_SRC emacs-lisp (server-start) #+END_SRC ** Destacar el par coincidente :PROPERTIES: :CUSTOM_ID: Destacar el par coincidente :END: #+BEGIN_SRC emacs-lisp (show-paren-mode) #+END_SRC ** Auto-guardado :PROPERTIES: :CUSTOM_ID: Auto-guardado :END: Es bastante molesto que te vaya dejando la mierda por ahí, mejor en un directorio conjunto. #+BEGIN_SRC emacs-lisp (defvar backup-dir (expand-file-name (concat user-emacs-directory "backup/"))) (defvar autosave-dir (expand-file-name (concat user-emacs-directory "backup/"))) (setq backup-directory-alist (list (cons ".*" backup-dir))) (setq auto-save-list-file-prefix autosave-dir) (setq auto-save-file-name-transforms `((".*" ,autosave-dir t))) (setq tramp-backup-directory-alist backup-directory-alist) (setq tramp-auto-save-directory autosave-dir) #+END_SRC ** Modo por defecto :PROPERTIES: :CUSTOM_ID: Modo por defecto :END: Al abrir un archivo o bufer sin algún modo asociado, se abrirá en modo texto. #+BEGIN_SRC emacs-lisp (setq major-mode 'text-mode) #+END_SRC ** Acepta 'y' o 'n' cuando pide 'yes' o 'no' :PROPERTIES: :CUSTOM_ID: Acepta 'y' o 'n' cuando pide 'yes' o 'no' :END: #+BEGIN_SRC emacs-lisp (fset 'yes-or-no-p 'y-or-n-p) #+END_SRC ** Lenguaje por defecto en emacs y org-mode :PROPERTIES: :CUSTOM_ID: Lenguaje por defecto en emacs y org-mode :END: #+BEGIN_SRC emacs-lisp (setq current-language-environment "Spanish") (setq org-export-default-language "es") #+END_SRC ** Moverse por ventanas con shift :PROPERTIES: :CUSTOM_ID: Moverse por ventanas con shift :END: No funciona en =org-mode=. #+BEGIN_SRC emacs-lisp (when (fboundp 'windmove-default-keybindings) (windmove-default-keybindings)) #+END_SRC ** Helm :PROPERTIES: :CUSTOM_ID: Helm :END: Copiado del git de helm. Esta es una configuración bastante mínima. Más información por [[http://daemons.it/categories/helm/][aquí]]. Está activo, pero solo para counsel-dash. #+name:helm #+BEGIN_SRC emacs-lisp :tangle no (require 'helm) (require 'helm-config) (global-set-key (kbd "C-c h") 'helm-command-prefix) (global-unset-key (kbd "C-x c")) (define-key helm-map (kbd "") 'helm-execute-persistent-action) (define-key helm-map (kbd "C-i") 'helm-execute-persistent-action) (define-key helm-map (kbd "C-z") 'helm-select-action) (global-set-key (kbd "M-y") 'helm-show-kill-ring) (global-set-key (kbd "C-x b") 'helm-mini) (global-set-key (kbd "C-x C-f") 'helm-find-files) (global-set-key (kbd "M-x") 'helm-M-x) (helm-mode 1) (require 'helm-descbinds) (helm-descbinds-mode) #+END_SRC *** Buscar más eficazmente en Helm :PROPERTIES: :CUSTOM_ID: Buscar más eficazmente en Helm :END: Más información en [[http://daemons.it/posts/cosillas-de-emacs-buscar-en-el-buffer/][este articulo]]. Desactivado actualmente. #+name:buscar-helm #+BEGIN_SRC emacs-lisp :tangle no (global-ace-isearch-mode +1) (custom-set-variables '(ace-isearch-input-length 7) '(ace-isearch-jump-delay 0.25) '(ace-isearch-function 'avy-goto-char) '(ace-isearch-use-jump 'printing-char)) #+END_SRC ** ivy-mode :PROPERTIES: :CUSTOM_ID: ivy-mode :END: Ivy es más liviano que helm, aunque más simple. Más información [[https://daemons.it/posts/migrar-de-helm-a-ivy/][aquí]]. #+name:ivy-mode #+BEGIN_SRC emacs-lisp (unless (require 'ivy nil 'noerror) (sleep-for 5)) (use-package ivy :init ;; Añade los buffers de bookmarks y de recentf (setq ivy-use-virtual-buffers t) ;; Muestra las coincidencias con lo que se escribe y la posicion en estas (setq ivy-count-format "(%d/%d) ") ;; Un mejor buscador (setq ivy-re-builders-alist '((read-file-name-internal . ivy--regex-fuzzy) (t . ivy--regex-plus))) ;; No se sale del minibuffer si se encuentra un error (setq ivy-on-del-error-function nil) ;; ivy mete el simbolo ^ al ejecutar algunas ordenes, así se quita (setq ivy-initial-inputs-alist nil) ;; Dar la vuelta a los candidatos (setq ivy-wrap t) ;; Ver la ruta de los ficheros virtuales (setq ivy-virtual-abbreviate 'full) ;; Asegurarse de que están smex, flx, diminis y ivi-hydra (use-package smex :ensure t) (use-package flx :ensure t) (use-package diminish :ensure t) (use-package ivy-hydra :ensure t) :bind ("C-c C-r" . ivy-resume) :config (ivy-mode 1) (setq magit-completing-read-function 'ivy-completing-read) :diminish ivy-mode :ensure t) (use-package counsel :bind (;; Sustituir M-x ("M-x" . counsel-M-x) ;; Sustituir imenu ("C-c b" . counsel-imenu) ;; Sustituir find-file ("C-x C-f" . counsel-find-file) ;; Abrir ficheros del repo git ("C-x f" . counsel-git) ;; Sustituir describe-function ("C-h f" . counsel-describe-function) ;; Sustituir describe-variable ("C-h v" . counsel-describe-variable) ;; Sustituir descbinds ("C-h b" . counsel-descbinds) ;; Sustituye helm-show-kill-ring ("M-y" . counsel-yank-pop) :map ivy-minibuffer-map ("M-y" . ivy-next-line-and-call) ("C-c C-r" . ivy-resume)) :config ;; usar ffap (setq counsel-find-file-at-point t) :ensure t) (use-package swiper ;; comentado en favor de ace-isearch ;; :bind (;; Sustituir isearch ;; ("C-s" . swiper) ;; ("C-r" . swiper)) :ensure t) #+END_SRC *** counsel-dash :PROPERTIES: :CUSTOM_ID: counsel-dash :END: #+name:counsel-dash-conf #+BEGIN_SRC emacs-lisp (add-to-list 'el-get-sources '(:name counsel-dash :description "counsel-dash" :type github :pkgname "nathankot/counsel-dash")) (if (not (el-get-package-installed-p 'counsel-dash)) (progn (package-install 'helm) (package-install 'dash-functional) (package-install 'helm-dash) (el-get 'sync 'counsel-dash))) (use-package counsel-dash :load-path "el-get/counsel-dash" :init (setq counsel-dash-docsets-path "~/.emacs.d/docsets/") (setq counsel-dash-common-docsets '("Bash" "Emacs Lisp" "HTML" "Markdown" "Nginx" "Python 3" "Docker" "Font_Awesome" "LaTeX" "MySQL" "Python 2" "SQLite")) (setq counsel-dash-browser-func 'eww)) #+END_SRC Auto-instala los docsets: #+name: instala-docsets #+BEGIN_SRC emacs-lisp (if (not (concat counsel-dash-docsets-path "Bash.docset")) (let ((local_docsets counsel-dash-common-docsets) (docs)) (while local_docsets (setq docs (car local_docsets)) (if (string-match "Python" docs) (setq docs (replace-regexp-in-string " " "_" docs))) (if (string-match "Emacs Lisp" docs) (setq docs (replace-regexp-in-string " " "_" docs))) (if (not (file-exists-p (concat counsel-dash-docsets-path "/" (car local_docsets) ".docset"))) (progn (counsel-dash-install-docset docs) (setq local_docsets (cdr local_docsets))) (setq local_docsets (cdr local_docsets)))))) #+END_SRC *** ace-isearch :PROPERTIES: :CUSTOM_ID: ace-isearch :END: #+BEGIN_SRC emacs-lisp (use-package ace-isearch :load-path "~/Proyectos/ace-isearch/" :ensure t :init ;; Dependencias ;; (use-package helm-swoop :ensure t) (use-package avy :ensure t) ;; (use-package ace-jump-mode :ensure t) :config (setq ace-isearch-function 'ace-jump-char-mode) (setq ace-isearch-input-length 5) (setq ace-isearch-jump-delay 0.30) (setq ace-isearch-use-jump 'printing-char) (setq ace-isearch-function-from-isearch 'ace-isearch-swiper-from-isearch) (global-ace-isearch-mode +1) :bind (:map isearch-mode-map ("C-'" . ace-isearch-jump-during-isearch)) :diminish ace-isearch-mode) #+END_SRC ** Seguir enlaces simbólicos :PROPERTIES: :CUSTOM_ID: Seguir enlaces simbólicos :END: #+BEGIN_SRC emacs-lisp (setq vc-follow-symlinks t) #+END_SRC ** Emparejar parentesis y otros :PROPERTIES: :CUSTOM_ID: Emparejar parentesis y otros :END: Empareja () [] {} y "". #+BEGIN_SRC emacs-lisp (electric-pair-mode 1) #+END_SRC ** Mantener lista de buffers recientes :PROPERTIES: :CUSTOM_ID: Mantener lista de buffers recientes :END: Al usar ivy o helm y ejecutar =switch-buffer= (C-x b) se pueden ver los buffers que se han abierto recientemente si se tiene recentf activo. #+BEGIN_SRC emacs-lisp (setq recentf-max-saved-items 30) (setq recentf-max-menu-items 20) (recentf-mode 1) #+END_SRC ** Guardar el layout tal cómo está :PROPERTIES: :CUSTOM_ID: Guardar el layout tal cómo está :END: #+BEGIN_SRC emacs-lisp (desktop-save-mode 1) #+END_SRC ** No truncar líneas :PROPERTIES: :CUSTOM_ID: No truncar líneas :END: #+BEGIN_SRC emacs-lisp (setq truncate-lines nil) #+END_SRC ** Programación :PROPERTIES: :CUSTOM_ID: Programación :END: *** Auto identación :PROPERTIES: :CUSTOM_ID: Auto identación :END: #+BEGIN_SRC emacs-lisp (global-set-key (kbd "RET") 'newline-and-indent) #+END_SRC *** Magit :PROPERTIES: :CUSTOM_ID: Magit :END: #+BEGIN_SRC emacs-lisp (use-package magit :bind ("C-x g" . magit-status) :config ;; usar un wrapper que torifica git (setq magit-git-executable "/usr/local/bin/tgit") :ensure t) #+END_SRC El wrapper es el siguiente: #+BEGIN_SRC sh :results code :exports results cat `which tgit` #+END_SRC #+RESULTS: #+BEGIN_SRC sh #!/bin/bash torify git "$@" #+END_SRC *** Insertar licencia :PROPERTIES: :CUSTOM_ID: Insertar licencia :END: #+BEGIN_SRC emacs-lisp (add-to-list 'el-get-sources '(:name xlicense-github :type github :pkgname "jtimberman/xlicense-el")) (if (not (el-get-package-installed-p 'xlicense-github)) (el-get 'sync 'xlicense-github)) (use-package xlicense :load-path "el-get/xlicense-github" :init (setq license-directory (concat user-emacs-directory "el-get/xlicense-github/licenses/"))) #+END_SRC *** Auto-competado :PROPERTIES: :CUSTOM_ID: Auto-competado :END: #+BEGIN_SRC emacs-lisp (use-package company :ensure t :config (add-hook 'after-init-hook 'global-company-mode) :diminish company-mode) #+END_SRC ** Borrar espacios sobrantes :PROPERTIES: :CUSTOM_ID: Borrar espacios sobrantes :END: Al guardar, borrar los que sobren de cada linea despues de el último carácter. #+BEGIN_SRC emacs-lisp (add-hook 'before-save-hook 'delete-trailing-whitespace) #+END_SRC ** Usar ssh con tramp :PROPERTIES: :CUSTOM_ID: Usar ssh con tramp :END: Por defecto usa scp, que es muy lento. Así se usará ssh. #+BEGIN_SRC emacs-lisp (setq tramp-default-method "ssh") #+END_SRC ** Golden Ratio :PROPERTIES: :CUSTOM_ID: Golden Ratio :END: Gestiona las ventanas abiertas modificando el tamaño para hacerlo aceptable. Ignora los buffers concretados en la variable =golden-ratio-exclude-buffer-regexp=. #+name:golden-ratio #+BEGIN_SRC emacs-lisp (use-package golden-ratio :config ;; (defun init/no-golden-ratio-for-buffers (bufname) ;; "Disable golden-ratio if BUFNAME is the name of a visible buffer." ;; (and (get-buffer bufname) (get-buffer-window bufname 'visible))) ;; (defun init/no-golden-ratio () ;; "Disable golden-ratio for guide-key popwin buffer." ;; (or (init/no-golden-ratio-for-buffers " *undo-tree*") ;; (init/no-golden-ratio-for-buffers " *undo-tree Diff*") ;; )) ;; (add-to-list 'golden-ratio-inhibit-functions ;; 'init/no-golden-ratio) (golden-ratio-mode t) (setq golden-ratio-exclude-buffer-regexp '("undo-tree" "help" "diff" "calendar" "messages" "Org Agenda" "Agenda Commands" "Org Select" "magit:" "Calendar")) (setq golden-ratio-auto-scale t) :diminish golden-ratio-mode :ensure t) #+END_SRC ** Abrir enlaces en el navegador por defecto :PROPERTIES: :CUSTOM_ID: Abrir enlaces en el navegador por defecto :END: Para establecer un navegador por defecto, hay ejecutar: #+BEGIN_SRC sh :tangle no xdg-settings set default-web-browser qutebrowser.desktop #+END_SRC En general, cada navegador te lo crea. En el caso de qutebrowser esto no fue así, por lo que tuve que copiar el de firefox en =/usr/share/applications/qutebrowser.desktop= que contiene: #+BEGIN_SRC sh :results output :export results cat /usr/share/applications/qutebrowser.desktop #+END_SRC #+RESULTS: #+begin_example [Desktop Entry] Exec=qutebrowser --target tab-bg-silent %u Icon=qutebrowser Type=Application Categories=Network; Name=qutebrwoser GenericName=Web Browser GenericName[af]=Web Blaaier GenericName[ar]=متصفح ويب GenericName[az]=Veb Səyyahı GenericName[bg]=Браузър GenericName[bn]=ওয়েব ব্রাউজার GenericName[br]=Furcher ar Gwiad GenericName[bs]=WWW Preglednik GenericName[ca]=Fullejador web GenericName[cs]=WWW prohlížeč GenericName[cy]=Porydd Gwe GenericName[da]=Browser GenericName[de]=Web-Browser GenericName[el]=Περιηγητής Ιστού GenericName[eo]=TTT-legilo GenericName[es]=Navegador web GenericName[et]=Veebilehitseja GenericName[eu]=Web arakatzailea GenericName[fa]=مرورگر وب GenericName[fi]=WWW-selain GenericName[fo]=Alnótsfar GenericName[fr]=Navigateur web GenericName[gl]=Navegador Web GenericName[he]=דפדפן אינטרנט GenericName[hi]=वेब ब्राउज़र GenericName[hr]=Web preglednik GenericName[hu]=Webböngésző GenericName[is]=Vafri GenericName[it]=Browser Web GenericName[ja]=ウェブブラウザ GenericName[ko]=웹 브라우저 GenericName[lo]=ເວັບບຣາວເຊີ GenericName[lt]=Žiniatinklio naršyklė GenericName[lv]=Web Pārlūks GenericName[mk]=Прелистувач на Интернет GenericName[mn]=Веб-Хөтөч GenericName[nb]=Nettleser GenericName[nds]=Nettkieker GenericName[nl]=Webbrowser GenericName[nn]=Nettlesar GenericName[nso]=Seinyakisi sa Web GenericName[pa]=ਵੈਬ ਝਲਕਾਰਾ GenericName[pl]=Przeglądarka WWW GenericName[pt]=Navegador Web GenericName[pt_BR]=Navegador Web GenericName[ro]=Navigator de web GenericName[ru]=Веб-браузер GenericName[se]=Fierpmádatlogan GenericName[sk]=Webový prehliadač GenericName[sl]=Spletni brskalnik GenericName[sr]=Веб претраживач GenericName[sr@Latn]=Veb pretraživač GenericName[ss]=Ibrawuza yeWeb GenericName[sv]=Webbläsare GenericName[ta]=வலை உலாவி GenericName[tg]=Тафсиргари вэб GenericName[th]=เว็บบราวเซอร์ GenericName[tr]=Web Tarayıcı GenericName[uk]=Навігатор Тенет GenericName[uz]=Веб-браузер GenericName[ven]=Buronza ya Webu GenericName[vi]=Trình duyệt Web GenericName[wa]=Betchteu waibe GenericName[xh]=Umkhangeli zincwadi we Web GenericName[zh_CN]=网页浏览器 GenericName[zh_TW]=網頁瀏覽器 GenericName[zu]=Umcingi we-Web MimeType=text/html;text/xml;application/xhtml+xml;application/vnd.mozilla.xul+xml;text/mml;x-scheme-handler/http;x-scheme-handler/https; X-KDE-StartupNotify=true #+end_example La configuración necesaria para emacs es la siguiente: #+BEGIN_SRC emacs-lisp (setq browse-url-browser-function 'browse-url-xdg-open) #+END_SRC ** Terminal :PROPERTIES: :CUSTOM_ID: Terminal :END: Establecer shell. #+BEGIN_SRC emacs-lisp (setq explicit-shell-file-name "/bin/bash") (setq shell-file-name explicit-shell-file-name) (setenv "SHELL" shell-file-name) (add-hook 'comint-output-filter-functions 'comint-strip-ctrl-m) #+END_SRC ** Cambiar de ventana más comodamente :PROPERTIES: :CUSTOM_ID: Cambiar de ventana más comodamente :END: #+BEGIN_SRC emacs-lisp (use-package switch-window :ensure t :bind ("C-x o" . switch-window)) #+END_SRC ** undo-tree :PROPERTIES: :CUSTOM_ID: undo-tree :END: Visualiza los cambios hechos con un arbol. Además, cuando se tira para atras y se hace un cambio, los primeros siguen accesibles. #+BEGIN_SRC emacs-lisp (use-package undo-tree :diminish undo-tree-mode :ensure t :config (global-undo-tree-mode) (setq undo-tree-visualizer-timestamps t)) #+END_SRC ** Sobreescribir al seleccionar texto :PROPERTIES: :CUSTOM_ID: Sobreescribir al seleccionar texto :END: No está activo. #+BEGIN_SRC emacs-lisp :tangle no (delete-selection-mode t) #+END_SRC ** Buffer \ast{}Scratch\ast{} persistente :PROPERTIES: :CUSTOM_ID: Buffer \ast{}Scratch\ast{} persistente :END: #+BEGIN_SRC emacs-lisp (use-package persistent-scratch :ensure t :config (persistent-scratch-setup-default)) #+END_SRC ** kill-this-buffer en vez de kil-buffer :PROPERTIES: :CUSTOM_ID: kill-this-buffer en vez de kil-buffer :END: :PROPERTIES: :CUSTOM_ID: kill-this-buffer en vez de kil-buffer :END: Fuente: http://pragmaticemacs.com/emacs/dont-kill-buffer-kill-this-buffer-instead/ #+BEGIN_SRC emacs-lisp (global-set-key (kbd "C-x k") 'kill-this-buffer) #+END_SRC ** emacs-purpose o proposito :PROPERTIES: :CUSTOM_ID: emacs-purpose o proposito :END: #+name: emacs-purpose #+BEGIN_SRC emacs-lisp (use-package window-purpose :ensure t :init (use-package ivy-purpose :ensure t :config (ivy-purpose-setup)) (use-package window-purpose-x :config (purpose-x-golden-ratio-setup)) (setq purpose-user-mode-purposes '((python-mode . py) (inferior-python-mode . py-int) (org-mode . org))) (setq purpose-user-name-purposes '(("index.org" . agenda) ("index.org_archive" . agenda) ("web.org" . agenda) ("notas.org" . agenda) (" *command-log*" . command))) (purpose-compile-user-configuration) :config ;; https://github.com/bmag/ivy-purpose/issues/1 (define-purpose-prefix-overload purpose-switch-buffer-overload '(ivy-switch-buffer switch-buffer-without-purpose purpose-switch-buffer-with-purpose)) (purpose-mode)) #+END_SRC ** Yasnippet :PROPERTIES: :CUSTOM_ID: Yasnippet :END: #+BEGIN_SRC emacs-lisp (if (not (el-get-package-installed-p 'yasnippet)) (el-get 'sync 'yasnippet)) (use-package yasnippet :load-path "el-get/yasnippet/" :config (yas-global-mode) (setq yas-snippet-dirs '("~/.emacs.d/snippets" "~/.emacs.d/el-get/yasnippet/snippets/" "~/.emacs.d/el-get/yasnippet/yasmate/")) (add-to-list 'hippie-expand-try-functions-list 'yas-hippie-try-expand) (setq yas-prompt-functions '(yas-ido-prompt)) :diminish yas-minor-mode) #+END_SRC ** Ispell :PROPERTIES: :CUSTOM_ID: Ispell :END: Instalamos el diccionario de [[https://www.cs.hmc.edu/~geoff/ispell-dictionaries.html#Spanish-dicts][esta dirección]] y configuramos emacs para que lo use: #+BEGIN_SRC bash (setq ispell-dictionary "español") #+END_SRC ** Paquetes genéricos :PROPERTIES: :CUSTOM_ID: Paquetes genéricos :END: Aquí van los paquetes que apenas uso o que no necesitan configuración. *** Imenu :PROPERTIES: :CUSTOM_ID: Imenu :END: Imenu sirver para crear menus de archivos, habitualmente usando las cabeceras. **** imenu-list :PROPERTIES: :CUSTOM_ID: imenu-list :END: Muestra imenu en un buffer lateral. No está activo. #+BEGIN_SRC emacs-lisp :tangle no (use-package imenu-list :ensure t :bind ("C-'" . imenu-list-minor-mode) :config (setq imenu-list-auto-resize nil)) #+END_SRC *** Hydra :PROPERTIES: :CUSTOM_ID: Hydra :END: #+BEGIN_SRC emacs-lisp (use-package hydra :ensure t) #+END_SRC *** csv-mode :PROPERTIES: :CUSTOM_ID: csv-mode :END: #+BEGIN_SRC emacs-lisp :tangle no (use-package csv-mode :ensure t) #+END_SRC *** Paleta de colores :PROPERTIES: :CUSTOM_ID: Paleta de colores :END: #+BEGIN_SRC emacs-lisp (use-package palette :ensure t) #+END_SRC *** Hacer gifs con camcorder.el :PROPERTIES: :CUSTOM_ID: Hacer gifs con camcorder.el :END: #+BEGIN_SRC emacs-lisp (use-package camcorder :ensure t :config (setq camcorder-recording-command '("recordmydesktop" " --fps 100 --no-sound --windowid " window-id " -o " file))) #+END_SRC *** Mostrar teclas presionadas en un buffer :PROPERTIES: :CUSTOM_ID: Mostrar teclas presionadas en un buffer :END: #+BEGIN_SRC emacs-lisp (use-package mwe-log-commands :ensure t) #+END_SRC *** Hardcodear atajos de teclado :PROPERTIES: :CUSTOM_ID: Hardcodear atajos de teclado :END: Desactivado. #+name:hardcore-mode #+BEGIN_SRC emacs-lisp :tangle no (use-package hardcore-mode :ensure t :config (global-set-key "\M-p" 'backward-paragraph) (global-set-key "\M-n" 'forward-paragraph) (define-key key-translation-map [?\C-h] [?\C-?]) (global-set-key (kbd "") 'help-command) (define-key hardcore-mode-map (kbd "") (lambda () (interactive) (message "This key is disabled. Use M-p instead."))) (define-key hardcore-mode-map (kbd "") (lambda () (interactive) (message "This key is disabled. Use M-n instead."))) (define-key hardcore-mode-map (kbd "") (lambda () (interactive) (message "This key is disabled. Use M-b instead."))) (define-key hardcore-mode-map (kbd "") (lambda () (interactive) (message "This key is disabled. Use M-f instead."))) (define-key hardcore-mode-map (kbd "") (lambda () (interactive) (message "This key is disabled. Use M-v instead."))) (define-key hardcore-mode-map (kbd "") (lambda () (interactive) (message "This key is disabled. Use C-v instead."))) (define-key hardcore-mode-map (kbd "") (lambda () (interactive) (message "This key is disabled. Use C-a instead."))) (define-key hardcore-mode-map (kbd "") (lambda () (interactive) (message "This key is disabled. Use M-< instead."))) (define-key hardcore-mode-map (kbd "") (lambda () (interactive) (message "This key is disabled. Use C-e instead."))) (define-key hardcore-mode-map (kbd "") (lambda () (interactive) (message "This key is disabled. Use M-> instead."))) (global-hardcore-mode)) #+END_SRC *** Flycheck :PROPERTIES: :CUSTOM_ID: Flycheck :END: Corrector #+BEGIN_SRC emacs-lisp (use-package flycheck :ensure t :config (global-flycheck-mode)) #+END_SRC *** Rainbow-mode :PROPERTIES: :CUSTOM_ID: Rainbow-mode :END: Muestra los colores de paletas HTML (hexadecimal) con el color que representa. #+BEGIN_SRC emacs-lisp :tangle no (use-package rainbow-mode :ensure t) #+END_SRC *** i3wm-config-mode :PROPERTIES: :CUSTOM_ID: i3wm-config-mode :END: Muestra colores para la configuración de i3. #+BEGIN_SRC emacs-lisp (add-to-list 'el-get-sources '(:name i3wm-config-mode :type github :pkgname "Alexander-Miller/i3wm-Config-Mode")) (if (not (el-get-package-installed-p 'i3wm-config-mode)) (el-get 'sync 'i3wm-config-mode)) (use-package i3wm-config-mode :load-path "el-get/i3wm-config-mode") #+END_SRC *** Lorem Ipsum :PROPERTIES: :CUSTOM_ID: Lorem Ipsum :END: Inserta Lorem Ipsum. #+BEGIN_SRC emacs-lisp (if (not (el-get-package-installed-p 'lorem-ipsum)) (el-get 'sync 'lorem-ipsum)) (use-package lorem-ipsum :load-path "el-get/lorem-ipsum") #+END_SRC *** Pastear en sprunge.us :PROPERTIES: :CUSTOM_ID: Pastear en sprunge.us :END: #+name: sprunge #+BEGIN_SRC emacs-lisp (add-to-list 'el-get-sources '(:name sprunge :type github :pkgname "tomjakubowski/sprunge.el")) (if (not (el-get-package-installed-p 'sprunge)) (el-get 'sync 'sprunge)) (use-package sprunge :init (use-package request :ensure t) :load-path "el-get/sprunge") #+END_SRC * Aspecto :PROPERTIES: :CUSTOM_ID: Aspecto :END: ** Tema cyberpunk :PROPERTIES: :CUSTOM_ID: Tema cyberpunk :END: #+BEGIN_SRC emacs-lisp (use-package cyberpunk-theme :config (load-theme 'cyberpunk t) :ensure t :init (custom-set-variables '(custom-safe-themes (quote ("71ecffba18621354a1be303687f33b84788e13f40141580fa81e7840752d31bf" default))) )) #+END_SRC ** Powerline modificada :PROPERTIES: :CUSTOM_ID: Powerline modificada :END: Lo siguiente lo he cogido de la configuración de [[https://ogbe.net/emacsconfig.html][Dennis Ogbe]], modificando sólo los colores (creo). #+BEGIN_SRC emacs-lisp :tangle /tmp/powerline.el (use-package powerline :ensure t :config (progn (setq powerline-default-separator 'contour) (setq powerline-height 25)) (setq powerline-default-separator-dir '(right . left)) ;; first reset the faces that already exist (set-face-attribute 'mode-line nil :foreground (face-attribute 'default :foreground) :family "Fira Sans" :weight 'bold :background (face-attribute 'fringe :background)) (set-face-attribute 'mode-line-inactive nil :foreground (face-attribute 'font-lock-comment-face :foreground) :background (face-attribute 'fringe :background) :family "Fira Sans" :weight 'bold :box `(:line-width -2 :color ,(face-attribute 'fringe :background))) (set-face-attribute 'powerline-active1 nil :background "gray30") (set-face-attribute 'powerline-inactive1 nil :background (face-attribute 'default :background) :box `(:line-width -2 :color ,(face-attribute 'fringe :background))) ;; these next faces are for the status indicator ;; read-only buffer (make-face 'mode-line-read-only-face) (make-face 'mode-line-read-only-inactive-face) (set-face-attribute 'mode-line-read-only-face nil :foreground (face-attribute 'default :foreground) :inherit 'mode-line) (set-face-attribute 'mode-line-read-only-inactive-face nil :foreground (face-attribute 'default :foreground) :inherit 'mode-line-inactive) ;; modified buffer (make-face 'mode-line-modified-face) (make-face 'mode-line-modified-inactive-face) (set-face-attribute 'mode-line-modified-face nil :foreground (face-attribute 'default :background) :background "#729FCF" :inherit 'mode-line) (set-face-attribute 'mode-line-modified-inactive-face nil :foreground (face-attribute 'default :background) :background "#729FCF" :inherit 'mode-line-inactive) ;; unmodified buffer (make-face 'mode-line-unmodified-face) (make-face 'mode-line-unmodified-inactive-face) (set-face-attribute 'mode-line-unmodified-face nil :foreground (face-attribute 'font-lock-comment-face :foreground) :inherit 'mode-line) (set-face-attribute 'mode-line-unmodified-inactive-face nil :foreground (face-attribute 'font-lock-comment-face :foreground) :inherit 'mode-line-inactive) ;; the remote indicator (make-face 'mode-line-remote-face) (make-face 'mode-line-remote-inactive-face) (set-face-attribute 'mode-line-remote-face nil :foreground (face-attribute 'font-lock-comment-face :foreground) :background (face-attribute 'default :background) :inherit 'mode-line) (set-face-attribute 'mode-line-remote-inactive-face nil :foreground (face-attribute 'font-lock-comment-face :foreground) :background (face-attribute 'default :background) :inherit 'mode-line-inactive) ;; the current file name (make-face 'mode-line-filename-face) (make-face 'mode-line-filename-inactive-face) (set-face-attribute 'mode-line-filename-face nil :foreground "#729FCF" :background (face-attribute 'default :background) :inherit 'mode-line) (set-face-attribute 'mode-line-filename-inactive-face nil :foreground (face-attribute 'font-lock-comment-face :foreground) :background (face-attribute 'default :background) :inherit 'mode-line-inactive) ;; the major mode name (make-face 'mode-line-major-mode-face) (make-face 'mode-line-major-mode-inactive-face) (set-face-attribute 'mode-line-major-mode-face nil :foreground (face-attribute 'default :foreground) :inherit 'powerline-active1) (set-face-attribute 'mode-line-major-mode-inactive-face nil :box `(:line-width -2 :color ,(face-attribute 'fringe :background)) :foreground (face-attribute 'font-lock-comment-face :foreground) :inherit 'powerline-inactive1) ;; the minor mode name (make-face 'mode-line-minor-mode-face) (make-face 'mode-line-minor-mode-inactive-face) (set-face-attribute 'mode-line-minor-mode-face nil :foreground (face-attribute 'font-lock-comment-face :foreground) :inherit 'powerline-active1) (set-face-attribute 'mode-line-minor-mode-inactive-face nil :box `(:line-width -2 :color ,(face-attribute 'fringe :background)) :foreground (face-attribute 'powerline-inactive1 :background) :inherit 'powerline-inactive1) ;; the position face (make-face 'mode-line-position-face) (make-face 'mode-line-position-inactive-face) (set-face-attribute 'mode-line-position-face nil :background (face-attribute 'default :background) :inherit 'mode-line) (set-face-attribute 'mode-line-position-inactive-face nil :foreground (face-attribute 'font-lock-comment-face :foreground) :background (face-attribute 'default :background) :inherit 'mode-line-inactive) ;; the 80col warning face (make-face 'mode-line-80col-face) (make-face 'mode-line-80col-inactive-face) (set-face-attribute 'mode-line-80col-face nil :background "#729FCF" :foreground (face-attribute 'default :background) :inherit 'mode-line) (set-face-attribute 'mode-line-80col-inactive-face nil :foreground (face-attribute 'font-lock-comment-face :foreground) :background (face-attribute 'default :background) :inherit 'mode-line-inactive) ;; the buffer percentage face (make-face 'mode-line-percentage-face) (make-face 'mode-line-percentage-inactive-face) (set-face-attribute 'mode-line-percentage-face nil :foreground (face-attribute 'font-lock-comment-face :foreground) :inherit 'mode-line) (set-face-attribute 'mode-line-percentage-inactive-face nil :foreground (face-attribute 'font-lock-comment-face :foreground) :inherit 'mode-line-inactive) ;; the directory face (make-face 'mode-line-shell-dir-face) (make-face 'mode-line-shell-dir-inactive-face) (set-face-attribute 'mode-line-shell-dir-face nil :foreground (face-attribute 'font-lock-comment-face :foreground) :inherit 'powerline-active1) (set-face-attribute 'mode-line-shell-dir-inactive-face nil :foreground (face-attribute 'font-lock-comment-face :foreground) :inherit 'powerline-inactive1) (defpowerline dennis-powerline-narrow (let (real-point-min real-point-max) (save-excursion (save-restriction (widen) (setq real-point-min (point-min) real-point-max (point-max)))) (when (or (/= real-point-min (point-min)) (/= real-point-max (point-max))) (propertize (concat (char-to-string #x2691) " Narrow") 'mouse-face 'mode-line-highlight 'help-echo "mouse-1: Remove narrowing from the current buffer" 'local-map (make-mode-line-mouse-map 'mouse-1 'mode-line-widen))))) (defpowerline dennis-powerline-vc (when (and (buffer-file-name (current-buffer)) vc-mode) (if window-system (let ((backend (vc-backend (buffer-file-name (current-buffer))))) (when backend (format "%s %s: %s" (char-to-string #xe0a0) backend (vc-working-revision (buffer-file-name (current-buffer)) backend))))))) (setq-default mode-line-format '("%e" (:eval (let* ((active (powerline-selected-window-active)) ;; toggle faces between active and inactive (mode-line (if active 'mode-line 'mode-line-inactive)) (face1 (if active 'powerline-active1 'powerline-inactive1)) (face2 (if active 'powerline-active2 'powerline-inactive2)) (read-only-face (if active 'mode-line-read-only-face 'mode-line-read-only-inactive-face)) (modified-face (if active 'mode-line-modified-face 'mode-line-modified-inactive-face)) (unmodified-face (if active 'mode-line-unmodified-face 'mode-line-unmodified-inactive-face)) (position-face (if active 'mode-line-position-face 'mode-line-position-inactive-face)) (80col-face (if active 'mode-line-80col-face 'mode-line-80col-inactive-face)) (major-mode-face (if active 'mode-line-major-mode-face 'mode-line-major-mode-inactive-face)) (minor-mode-face (if active 'mode-line-minor-mode-face 'mode-line-minor-mode-inactive-face)) (filename-face (if active 'mode-line-filename-face 'mode-line-filename-inactive-face)) (percentage-face (if active 'mode-line-percentage-face 'mode-line-percentage-inactive-face)) (remote-face (if active 'mode-line-remote-face 'mode-line-remote-inactive-face)) (shell-dir-face (if active 'mode-line-shell-dir-face 'mode-line-shell-dir-inactive-face)) ;; get the separators (separator-left (intern (format "powerline-%s-%s" (powerline-current-separator) (car powerline-default-separator-dir)))) (separator-right (intern (format "powerline-%s-%s" (powerline-current-separator) (cdr powerline-default-separator-dir)))) ;; the right side (rhs (list (dennis-powerline-vc minor-mode-face 'r) (funcall separator-right face1 position-face) (powerline-raw " " position-face) (powerline-raw (char-to-string #xe0a1) position-face) (powerline-raw " " position-face) (powerline-raw "%4l" position-face 'r) ;; display a warning if we go above 80 columns (if (>= (current-column) 80) (funcall separator-right position-face 80col-face) (powerline-raw (char-to-string #x2502) position-face)) (if (>= (current-column) 80) (powerline-raw "%3c" 80col-face 'l) (powerline-raw "%3c" position-face 'l)) (if (>= (current-column) 80) (powerline-raw " " 80col-face) (powerline-raw " " position-face)) (if (>= (current-column) 80) (funcall separator-left 80col-face percentage-face) (funcall separator-left position-face percentage-face)) (powerline-raw " " percentage-face) (powerline-raw "%6p" percentage-face 'r))) ;; the left side (lhs (list ;; this is the modified status indicator (cond (buffer-read-only (powerline-raw " " read-only-face)) ((buffer-modified-p) ;; do not light up when in an interactive buffer. Set ;; ML-INTERACTIVE? in hooks for interactive buffers. (if (not (bound-and-true-p ml-interactive?)) (powerline-raw " " modified-face) (powerline-raw " " unmodified-face))) ((not (buffer-modified-p)) (powerline-raw " " unmodified-face))) (cond (buffer-read-only (powerline-raw (concat (char-to-string #xe0a2) " ") read-only-face 'l)) ((buffer-modified-p) (if (not (bound-and-true-p ml-interactive?)) (powerline-raw (concat (char-to-string #x2621) " ") modified-face 'l) (powerline-raw (concat (char-to-string #x259e) " ") unmodified-face 'l))) ((not (buffer-modified-p)) (powerline-raw (concat (char-to-string #x26c1) " ") unmodified-face 'l))) (cond (buffer-read-only (funcall separator-right read-only-face filename-face)) ((buffer-modified-p) (if (not (bound-and-true-p ml-interactive?)) (funcall separator-right modified-face filename-face) (funcall separator-right unmodified-face filename-face))) ((not (buffer-modified-p)) (funcall separator-right unmodified-face filename-face))) ;; remote indicator (when (file-remote-p default-directory) (powerline-raw (concat " " (char-to-string #x211b)) remote-face)) ;; filename and mode info (powerline-buffer-id filename-face 'l) (powerline-raw " " filename-face) (funcall separator-left filename-face major-mode-face) ;; do not need mode info when in ansi-term (unless (bound-and-true-p show-dir-in-mode-line?) (powerline-major-mode major-mode-face 'l)) (unless (bound-and-true-p show-dir-in-mode-line?) (powerline-process major-mode-face 'l)) ;; show a flag if in line mode in terminal (when (and (bound-and-true-p show-dir-in-mode-line?) (term-in-line-mode)) (powerline-raw (concat (char-to-string #x2691) " Line") major-mode-face)) (powerline-raw " " major-mode-face) ;; little trick to move the directory name to the mode line ;; when inside of emacs set SHOW-DIR-IN-MODE-LINE? to enable (if (bound-and-true-p show-dir-in-mode-line?) (when (not (file-remote-p default-directory)) (powerline-raw (shorten-directory default-directory 45) shell-dir-face)) (powerline-minor-modes minor-mode-face 'l)) (unless (bound-and-true-p show-dir-in-mode-line?) (dennis-powerline-narrow major-mode-face 'l))))) ;; concatenate it all together (concat (powerline-render lhs) (powerline-fill face1 (powerline-width rhs)) (powerline-render rhs))))))) (defvar-local hidden-mode-line-mode nil) (define-minor-mode hidden-mode-line-mode "Minor mode to hide the mode-line in the current buffer." :init-value nil :global t :variable hidden-mode-line-mode :group 'editing-basics (if hidden-mode-line-mode (setq hide-mode-line mode-line-format mode-line-format nil) (setq mode-line-format hide-mode-line hide-mode-line nil)) (force-mode-line-update) ;; Apparently force-mode-line-update is not always enough to ;; redisplay the mode-line (redraw-display) (when (and (called-interactively-p 'interactive) hidden-mode-line-mode) (run-with-idle-timer 0 nil 'message (concat "Hidden Mode Line Mode enabled. " "Use M-x hidden-mode-line-mode to make the mode-line appear.")))) #+END_SRC #+RESULTS: ** Formato de las columnas de númeracion :PROPERTIES: :CUSTOM_ID: Formato de las columnas de númeracion :END: Por defecto no se activan, hay que hacerlo a mano con =M-x linum-mode=. #+BEGIN_SRC emacs-lisp (setq linum-format "%4d \u2502 ") #+END_SRC ** Ventana limpia :PROPERTIES: :CUSTOM_ID: Ventana limpia :END: Sin scroll bar, menu bar ni tool bar. #+BEGIN_SRC emacs-lisp (tool-bar-mode -1) (scroll-bar-mode -1) (menu-bar-mode -1) #+END_SRC ** UTF-8 :PROPERTIES: :CUSTOM_ID: UTF-8 :END: #+BEGIN_SRC emacs-lisp (prefer-coding-system 'utf-8) (set-default-coding-systems 'utf-8) (set-terminal-coding-system 'utf-8) (set-keyboard-coding-system 'utf-8) (setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING)) #+END_SRC ** Tipo de fuente :PROPERTIES: :CUSTOM_ID: Tipo de fuente :END: #+BEGIN_SRC emacs-lisp (custom-set-faces '(default ((t (:family "DejaVu Sans Mono" :foundry "unknown" :slant normal :weight normal :height 107 :width normal))))) #+END_SRC ** Partir buffers de manera más bonita :PROPERTIES: :CUSTOM_ID: Partir buffers de manera más bonita :END: #+BEGIN_SRC emacs-lisp (add-to-list 'default-frame-alist '(height . 40)) (add-to-list 'default-frame-alist '(width . 90)) #+END_SRC ** Scroll :PROPERTIES: :CUSTOM_ID: Scroll :END: Similar a la manera de vim. No tengo claro en que se diferencia, pero me gusta cómo funciona. #+BEGIN_SRC emacs-lisp (setq scroll-step 1 scroll-conservatively 10000) (setq scroll-margin 80 scroll-conservatively 3000 scroll-up-aggressively 0.02 scroll-down-aggressively 0.02) #+END_SRC * Configuración por modos o lenguajes :PROPERTIES: :CUSTOM_ID: Configuración por modos :END: ** JSON :PROPERTIES: :CUSTOM_ID: JSON :END: Los archivos cuyo nombre termine por los mencionados abajo, usarán =json-mode=. #+BEGIN_SRC emacs-lisp (use-package json-mode :mode "\\.json\\'" :ensure t) #+END_SRC ** Haskel :PROPERTIES: :CUSTOM_ID: Haskel :END: Lo usé un tiempo para xmonad, pero ya no está activo. #+BEGIN_SRC emacs-lisp :eval no :tangle no (use-package haskell-mode :config (add-hook 'haskell-mode-hook 'turn-on-haskell-doc-mode) (add-hook 'haskell-mode-hook 'turn-on-haskell-indentation) (add-hook 'haskell-mode-hook 'haskell-font-lock-symbols t) (put 'downcase-region 'disabled nil) :ensure t ) #+END_SRC ** Markdown :PROPERTIES: :CUSTOM_ID: Markdown :END: Cargar =markdown-mode=, usar utf-8 al exportar y asociar el modo a las extensiones ".md" y ".markdown". #+BEGIN_SRC emacs-lisp (use-package markdown-mode :init (setq markdown-xhtml-header-content "") :mode "\\.md\\'" :ensure t ) #+END_SRC ** Python :PROPERTIES: :CUSTOM_ID: python :END: La configuración de elpy: #+name: elpy #+BEGIN_SRC emacs-lisp (if (not (el-get-package-installed-p 'elpy)) (el-get 'sync 'elpy)) (use-package elpy :load-path "el-get/elpy/" :init (use-package pyvenv :ensure t) (setq elpy-modules '(elpy-module-sane-defaults elpy-module-company elpy-module-eldoc elpy-module-pyvenv)) (add-hook 'python-mode-hook 'flycheck-mode) (setq elpy-rpc-backend "jedi") :config (add-to-list 'ivy-completing-read-handlers-alist '(elpy-doc . completing-read-default)) ;; véase https://github.com/abo-abo/swiper/issues/892 (elpy-enable)) #+END_SRC Este paquete muestra una ralla que marca los 79 carácteres, para cumplir con el pep8. #+name: fill-column #+BEGIN_SRC emacs-lisp (use-package fill-column-indicator :init (setq fci-rule-color "purple") (setq fci-rule-column 79) (add-hook 'python-mode-hook 'fci-mode) :ensure t ) #+END_SRC Corrección con flycheck, mejor que flymake: #+name: flycheck #+BEGIN_SRC emacs-lisp (use-package flycheck :config (setq flycheck-global-modes '(python-mode)) (global-flycheck-mode) :diminish flycheck-mode :ensure t ) #+END_SRC Configura virtualenvwrapper para eshell, lo que habilita la orden =workon= y demás. #+name: virtualenvwrapper #+BEGIN_SRC emacs-lisp (use-package virtualenvwrapper :init (setq venv-location "~/.virtualenvs/") (venv-initialize-eshell) :ensure t ) #+END_SRC ** web-mode :PROPERTIES: :CUSTOM_ID: web-mode :END: No lo he mirado mucho ya que apenas lo uso, es un copia-pega. #+BEGIN_SRC emacs-lisp (defun my-setup-php () (web-mode) (make-local-variable 'web-mode-code-indent-offset) (make-local-variable 'web-mode-markup-indent-offset) (make-local-variable 'web-mode-css-indent-offset) (setq web-mode-code-indent-offset 4) (setq web-mode-css-indent-offset 2) (setq web-mode-markup-indent-offset 2)) (add-to-list 'auto-mode-alist '("\\.php$" . my-setup-php)) (setq web-mode-ac-sources-alist '(("css" . (ac-source-words-in-buffer ac-source-css-property)) ("php" . (ac-source-[/]words-in-buffer ac-source-words-in-same-mode-buffers ac-source-dictionary)))) (add-to-list 'auto-mode-alist '("\\.php$" . my-setup-php)) #+END_SRC ** DockerFile :PROPERTIES: :CUSTOM_ID: DockerFile :END: Editar archivos DockerFile. #+BEGIN_SRC emacs-lisp (use-package dockerfile-mode :mode "Dockerfile\\'" :ensure t) #+END_SRC ** kivy-mode :PROPERTIES: :CUSTOM_ID: kivy-mode :END: Si el paquete no está instalado, lo instala mediante el-get. #+BEGIN_SRC emacs-lisp (use-package kivy-mode :mode "\\.kv\\'" :ensure t ) #+END_SRC ** gnu-social-mode :PROPERTIES: :CUSTOM_ID: gnu-social-mode :END: No está activo, lo cargo de =private-literate.org=. #+name:gnu-social #+BEGIN_SRC emacs-lisp :tangle no (add-to-list 'el-get-sources '(:name gnu-social-mode :description "gnu-social client" :type github :pkgname "bashrc/gnu-social-mode")) (if (not (el-get-package-installed-p 'gnu-social-mode)) (el-get 'sync 'gnu-social-mode) ) (use-package gnu-social-mode :load-path "el-get/gnu-social-mode/" :init (setq gnu-social-server-textlimit 140 gnu-social-server "quitter.se" gnu-social-username "drymer" gnu-social-password "lolazing" gnu-social-new-dents-count 1 gnu-social-status-format "%i %s, %@:\n %h%t\n\n" gnu-social-statuses-count 200 ) (defhydra hydra-gnu-social (:color blue :hint nil) " ╭────────────┐ Posts User Groups │ GNU social │ ╭─────────────────────────────────────────────────────────────────────────────┴────────────╯ _k_ [_t_] Post _p_ [_f_] Follow ^_J_^ Join group [_q_] Quit ^↑^ [_X_] Delete post ^↑^ [_F_] Unfollow ^_L_^ Leave Group ^↓^ [_r_] Repost ^↓^ [_i_] Profile (browser) _j_ [_b_] Favorite _n_ ^ ^ ^ ^ [_RET_] Reply ^ ^ ^ ^ ^ ^ [_T_] Show Conversation -------------------------------------------------------------------------------------------- " ("C-o" keyboard-quit "Back") ("q" keyboard-quit) ("j" gnu-social-goto-next-status :color red) ("k" gnu-social-goto-previous-status :color red) ("g" beginning-of-buffer) ("G" end-of-buffer) ("t" gnu-social-update-status-interactive) ("X" gnu-social-delete-notice) ("RET" gnu-social-reply-to-all) ("r" gnu-social-repeat) ("u" gnu-social-current-timeline) ("b" gnu-social-favorite) ("f" gnu-social-follow) ("F" gnu-social-unfollow) ("i" gnu-social-view-user-page) ("T" gnu-social-conversation-timeline) ("o" gnu-social-click) ("n" gnu-social-goto-next-status-of-user :color red) ("p" gnu-social-goto-previous-status-of-user :color red) ("a" gnu-social-toggle-activate-buffer) ("J" gnu-social-group-join) ("L" gnu-social-group-leave)) :config (bind-keys :map gnu-social-mode-map ("C-o" . hydra-gnu-social/body) ("q" . gnu-social-kill-buffer) ("Q" . gnu-social-edit-mode) ("j" . gnu-social-goto-next-status) ("k" . gnu-social-goto-previous-status) ("h" . gnu-social-switch-to-next-timeline) ("l" . gnu-social-switch-to-previous-timeline) ("g" . beginning-of-buffer) ("G" . end-of-buffer) ("t" . gnu-social-update-status-interactive) ("X" . gnu-social-delete-status) ("RET" . gnu-social-reply-to-all) ("r" . gnu-social-repeat) ("u" . gnu-social-current-timeline) ("b" . gnu-social-favorite) ("f" . gnu-social-follow) ("F" . gnu-social-unfollow) ("i" . gnu-social-view-user-page) ("T" . gnu-social-conversation-timeline) ("o" . gnu-social-click) ("n" . gnu-social-goto-next-status-of-user) ("p" . gnu-social-goto-previous-status-of-user) ("a" . gnu-social-toggle-activate-buffer))) #+END_SRC ** po-mode :PROPERTIES: :CUSTOM_ID: po-mode :END: #+name: po-mode #+BEGIN_SRC emacs-lisp (use-package po-mode :ensure t :config ;; Fuente: https://www.emacswiki.org/emacs/PoMode (defun po-wrap () "Filter current po-mode buffer through `msgcat' tool to wrap all lines." (interactive) (if (eq major-mode 'po-mode) (let ((tmp-file (make-temp-file "po-wrap.")) (tmp-buf (generate-new-buffer "*temp*"))) (unwind-protect (progn (write-region (point-min) (point-max) tmp-file nil 1) (if (zerop (call-process "msgcat" nil tmp-buf t (shell-quote-argument tmp-file))) (let ((saved (point)) (inhibit-read-only t)) (delete-region (point-min) (point-max)) (insert-buffer tmp-buf) (goto-char (min saved (point-max)))) (with-current-buffer tmp-buf (error (buffer-string))))) (kill-buffer tmp-buf) (delete-file tmp-file))))) ) #+END_SRC ** org-mode :PROPERTIES: :CUSTOM_ID: org-mode :END: *** Definir fuente de el-get :PROPERTIES: :CUSTOM_ID: Definir fuente de el-get :END: Se usa la rama =maint= del repositorio git. Primero se comprueba si está instalado, de no ser así se instalará. Tardará un buen rato. #+BEGIN_SRC emacs-lisp ;; Cutre-codigo para quitar del path el org de emacs para que no se lie al cargar de nuevo el modo (dolist (val load-path) (if (string-match "lisp\/org" val) (delete val load-path) ) ) (add-to-list 'el-get-sources '(:name org-mode-maint :website "http://orgmode.org/" :description "Org-mode is for keeping notes, maintaining ToDo lists, doing project planning, and authoring with a fast and effective plain-text system." :type git :url "git://orgmode.org/org-mode.git" :branch "maint" :load-path ("." "lisp/") )) (if (not (el-get-package-installed-p 'org-mode-maint)) (el-get 'sync 'org-mode-maint) ) #+end_src *** Agenda :PROPERTIES: :CUSTOM_ID: Agenda :END: **** Definir archivos de la agenda :PROPERTIES: :CUSTOM_ID: Definir archivos de la agenda :END: #+BEGIN_SRC emacs-lisp (setq org-agenda-files (list "~/Documentos/org/index.org" "~/Documentos/org/notas.org" "~/Documentos/org/marcadores.org")) (add-to-list 'org-agenda-files "~/Documentos/org/memacs/") (add-to-list 'org-agenda-files "~/Documentos/org/memacs/git/") (add-to-list 'org-agenda-files "~/Documentos/org/memacs/git/") #+END_SRC **** Comandos de Agenda :PROPERTIES: :CUSTOM_ID: Comandos de Agenda :END: #+name:custom-commands #+BEGIN_SRC emacs-lisp (setq org-agenda-custom-commands '(("b" . "Blog") ("bi" "Idees per article" ((todo "TODO|IN-PROGRESS" ((org-agenda-files '("~/Documentos/blog/Articulos/articulos.org")))))) ("bp" "Articles llestos per a publicar" ((todo "READY|PROGRAMMED" ((org-agenda-files '("~/Documentos/blog/Articulos/articulos.org")))))) ("bc" "Articles cancel·lats" ((todo "CANCELLED" ((org-agenda-files '("~/Documentos/blog/Articulos/articulos.org")))))) ("bf" "Articles publicats" ((todo "DONE" ((org-agenda-files '("~/Documentos/blog/Articulos/articulos.org")))))) ("p" . "Projectes Personals") ("pp" "Projectes Personals" tags-todo "projectes") ("pa" "antisocial" tags-todo "antisocial") ("pg" "General" tags-todo "general") ("pi" "isso-gnusocial" tags-todo "issoGnusocial") ("pr" "gnusrss" tags-todo "gnusrss") ("pj" "jabbergram" tags-todo "jabbergram") ("pe" "electrumfair" tags-todo "electrumfair") ("pn" "nikola.el" tags-todo "nikola") ("v" "Relacionat amb els VPS / chustaserver" tags-todo "vps") ("w" "Webs" tags "" ((org-agenda-files '("~/Documentos/org/web.org")))))) #+END_SRC **** Capturas de notas :PROPERTIES: :CUSTOM_ID: Capturas de notas :END: #+name:capture-templates #+BEGIN_SRC emacs-lisp (setq org-capture-templates '(("s" "Tasca Simple" entry (file+headline "~/Documentos/org/notas.org" "Notes") "** TODO %? \n:PROPERTIES:\n:CREATED: %u\n:END:\nSCHEDULED: %(org-insert-time-stamp (org-read-date nil t \"+0d\"))\n") ("b" "Idea per article" entry (file+headline "~/Documentos/blog/Articulos/articulos.org" "Ideas") "** TODO %?\n:PROPERTIES:\n:CREATED: %u\n:END:\n") ("p" "Personal" entry (file+headline "~/Documentos/org/index.org" "Personal") "** TODO %? \n:PROPERTIES:\n:CREATED: %u\n:END:\nSCHEDULED: %(org-insert-time-stamp (org-read-date nil t \"+0d\"))\n") ("t" "Treball" entry (file+headline "~/Documentos/org/index.org" "Treball") "** TODO %? \n:PROPERTIES:\n:CREATED: %u\n:END:\nSCHEDULED: %(org-insert-time-stamp (org-read-date nil t \"+0d\"))\n") ("w" "Marcadors" entry (file "~/Documentos/org/web.org") "* %x\n %U\n %c" :empty-lines 1) ("v" "Relacionat amb els VPS / chustaserver" entry (file+headline "~/Documentos/org/index.org" "VPS") "* TODO %?\n:PROPERTIES:\n:CREATED: %u\n:END:\n") ("e" "Coses a fer amb emacs" entry (file+headline "~/Documentos/org/index.org" "Emacs") "** TODO %? \n:PROPERTIES:\n:CREATED: %u\n:END:\nSCHEDULED: %(org-insert-time-stamp (org-read-date nil t \"+0d\"))\n"))) (setq org-capture-templates (append org-capture-templates '(("o" "Ordinadors") ("og" "General" entry (file+headline "~/Documentos/org/index.org" "General") "* TODO %?\n:PROPERTIES:\n:CREATED: %u\n:END:\n") ("oa" "Antisocial" entry (file+headline "~/Documentos/org/index.org" "antisocial") "* TODO %?\n:PROPERTIES:\n:CREATED: %u\n:END:\n") ("oi" "isso-gnusocial" entry (file+headline "~/Documentos/org/index.org" "isso-gnusocial") "* TODO %?\n:PROPERTIES:\n:CREATED: %u\n:END:\n") ("or" "gnusrss" entry (file+headline "~/Documentos/org/index.org" "gnusrss") "* TODO %?\n:PROPERTIES:\n:CREATED: %u\n:END:\n") ("oj" "jabbergram" entry (file+headline "~/Documentos/org/index.org" "jabbergram") "* TODO %?\n:PROPERTIES:\n:CREATED: %u\n:END:\n") ("os" "SimpleUpload" entry (file+headline "~/Documentos/org/index.org" "SimpleUpload") "* TODO %?\n:PROPERTIES:\n:CREATED: %u\n:END:\n") ("oe" "electrumfair" entry (file+headline "~/Documentos/org/index.org" "electrumfair") "* TODO %?\n:PROPERTIES:\n:CREATED: %u\n:END:\n") ("on" "nikola.el" entry (file+headline "~/Documentos/org/index.org" "nikola.el") "* TODO %?\n:PROPERTIES:\n:CREATED: %u\n:END:\n") ))) #+END_SRC **** Definir archivo de notas para org-capture :PROPERTIES: :CUSTOM_ID: Definir archivo de notas para org-capture :END: #+BEGIN_SRC emacs-lisp (setq org-default-notes-file "~/Documentos/org/notas.org") #+END_SRC **** Estados de los objetos de las listas :PROPERTIES: :CUSTOM_ID: Estados de los objetos de las listas :END: Todas las secuencias anteriores al símbolo =|= son tareas que no se consideran terminadas, al contrario de las que estan después de este. Los estados que tienen el símbolo =@= son los que, al escogerlos, abren un buffer preguntando si se quiere añadir alguna nota respecto al cambio de estado. Las que tienen el símbolo =!=, en cambio, crean una estampa de tiempo, para dejar constancia de cuando se ha cambiado a ese estado. #+BEGIN_SRC emacs-lisp (setq org-todo-keywords '((sequence "TODO(t)" "NEXT(n)" "IN-PROGRESS(p@/!)" "WAITING(w@/!)" "|" "DONE(d!)" "CANCELED(c@)"))) #+END_SRC **** Refile :PROPERTIES: :CUSTOM_ID: Refile :END: Mover un arbol debajo de otro del mismo fichero o de los archivos de las agendas. #+BEGIN_SRC emacs-lisp (setq org-refile-targets '((nil :maxlevel . 10) (org-agenda-files . (:maxlevel . 4)))) #+END_SRC **** Caldav :PROPERTIES: :CUSTOM_ID: Caldav :END: Lo tengo funcionando con owncloud. Si no está instalado, lo instala con el-get. Esta parte no es real, como son cosas "sensibles", van en un fichero a parte. Pero seria algo así: #+BEGIN_SRC emacs-lisp :eval no :tangle no (unless (require 'org-caldav nil 'noerror) (el-get-install 'org-caldav)) (use-package org-caldav :init (setq org-caldav-url "http://caldav.ejemplo/") (setq org-caldav-calendar-id "org") (setq org-caldav-files '("~/Documentos/org/index.org" "~/Documentos/org/index.org_archive" "~/Documentos/org/notas.org")) (setq org-caldav-inbox '(id "c14f-42fe-a358-648240e73991")) (setq org-caldav-save-directory "~/Documentos/org/") ) #+END_SRC Esto es un workaround para un bug raro de url-cookie: #+BEGIN_SRC emacs-lisp ;; source http://emacs.stackexchange.com/questions/5469/invalid-date-01-jan-2055 (defun url-cookie-expired-p (cookie) "Return non-nil if COOKIE is expired." (let ((exp (url-cookie-expires cookie))) (and (> (length exp) 0) (condition-case () (> (float-time) (float-time (date-to-time exp))) (error nil))))) #+END_SRC **** Configuración del calendario :PROPERTIES: :CUSTOM_ID: Configuración del calendario :END: #+BEGIN_SRC emacs-lisp (setq org-icalendar-timezone "Europe/Madrid") #+END_SRC **** calfw :PROPERTIES: :CUSTOM_ID: calfw :END: Paquete para ver las tareas de =org-mode= en un formato de calendario más típico. Los arrays son sólo traducciones. Si el paquete no está instalado, lo instala mediante el-get. #+name:calfw #+BEGIN_SRC emacs-lisp (if (not (el-get-package-installed-p 'calfw)) (el-get 'sync 'calfw) ) (use-package calfw :load-path "el-get/calfw" :config (require 'calfw-org) (setq cfw:org-overwrite-default-keybinding t) (setq calendar-week-start-day 1) (setq calendar-month-name-array ["Gener" "Febrer" "Març" "Abril" "Maig" "Juny" "Juliol" "Agost" "Septembre" "Octubre" "Novembre" "Desembre"]) (setq calendar-day-name-array ["Diumenge" "Dilluns" "Dimarts" "Dimecres" "Dijous" "Divendres" "Dissabte"]) :bind ("C-c f" . cfw:open-org-calendar) ) #+END_SRC **** Tareas repetitivas :PROPERTIES: :CUSTOM_ID: Tareas repetitivas :END: Las tareas marcadas para repetirse, al marcarlas cómo DONE vuelven al estado TODO y añade un timestamp del dia y la hora. #+BEGIN_SRC emacs-lisp (setq org-log-repeat 'time) #+END_SRC **** Cambiar el formato de CLOCKTABLE :PROPERTIES: :CUSTOM_ID: Cambiar el formato de CLOCKTABLE :END: Por defecto, al pasar de las 24 horas dedicadas, lo mostrará cómo 1d. Con el siguiente snippet, seguirá mostrando horas. #+BEGIN_SRC emacs-lisp (setq org-time-clocksum-format '(:hours "%d" :require-hours t :minutes ":%02d" :require-minutes t)) #+END_SRC **** Quitar tags de la agenda :PROPERTIES: :CUSTOM_ID: Quitar tags de la agenda :END: #+BEGIN_SRC emacs-lisp (setq org-agenda-remove-tags t) #+END_SRC *** Edición, diseño y varios :PROPERTIES: :CUSTOM_ID: Edición, diseño y varios :END: **** Atajos de teclado :PROPERTIES: :CUSTOM_ID: Atajos de teclado :END: =org-iswitchb= muestra todos los buffers de =org-mode= abiertos. #+BEGIN_SRC emacs-lisp ; (define-key global-map "\C-cl" 'org-store-link) ; (define-key global-map "\C-ci" 'org-insert-link) (define-key global-map "\C-ca" 'org-agenda) (define-key global-map "\C-cc" 'org-capture) (define-key global-map "\C-cS" 'org-caldav-sync) #+END_SRC **** Definir lenguajes que entiende babel :PROPERTIES: :CUSTOM_ID: Definir lenguajes que entiende babel :END: #+BEGIN_SRC emacs-lisp (org-babel-do-load-languages 'org-babel-load-languages '((dot . t) (emacs-lisp . t) (gnuplot . t) (latex . t) (ledger . t) (python . t) (shell . t) (sql . t) (sqlite . t))) #+END_SRC #+RESULTS: #+BEGIN_SRC emacs-lisp (use-package yaml-mode :ensure t) (add-to-list 'org-src-lang-modes '("yaml" . yaml)) (add-to-list 'org-src-lang-modes '("dockerfile" . dockerfile)) #+END_SRC **** Asteriscos bonitos :PROPERTIES: :CUSTOM_ID: Asteriscos bonitos :END: Requerir el paquete y activarlo sólo cuando se abra un buffer de =org-mode=. #+BEGIN_SRC emacs-lisp (unless (require 'org-bullets nil 'noerror) (sleep-for 5)) (use-package org-bullets :init (add-hook 'org-mode-hook (lambda () (org-bullets-mode 1))) :ensure t ) #+END_SRC **** Seguir links :PROPERTIES: :CUSTOM_ID: Seguir links :END: Presionando tanto RET cómo TAB. #+BEGIN_SRC emacs-lisp (setq org-return-follows-link t) (setq org-tab-follows-link t) #+END_SRC **** Exportar Markdown :PROPERTIES: :CUSTOM_ID: Exportar Markdown :END: #+BEGIN_SRC emacs-lisp (use-package ox-md) #+END_SRC **** Exportar rst :PROPERTIES: :CUSTOM_ID: Exportar rst :END: #+BEGIN_SRC emacs-lisp (add-to-list 'el-get-sources '(:name ox-rst :type github :pkgname "masayuko/ox-rst")) (if (not (el-get-package-installed-p 'ox-rst)) (el-get 'sync 'ox-rst)) (use-package ox-rst :load-path "el-get/ox-rst") #+END_SRC **** Configuracion de bloques de código :PROPERTIES: :CUSTOM_ID: Configuracion de bloques de código :END: La primera linea formatea el código cómo si se tratase de código nativo, la segunda indenta acorde al código. #+BEGIN_SRC emacs-lisp (setq org-src-fontify-natively t) (setq org-src-tab-acts-natively t) (setq org-src-preserve-indentation t) (setq org-edit-src-content-indentation 0) #+END_SRC **** Elementos de marcado :PROPERTIES: :CUSTOM_ID: Elementos de marcado :END: La primera línea esconde los símbolos y aplica el marcado, y la segunda cambia el color a los elementos de marcado que empiezan por =. #+BEGIN_SRC emacs-lisp (setq org-hide-emphasis-markers t) (add-to-list 'org-emphasis-alist '("=" (:foreground "cyan"))) #+END_SRC **** Quitar confirmación al evaluar código :PROPERTIES: :CUSTOM_ID: Quitar confirmación al evaluar código :END: Cada vez que se evalua código de un bloque, pide que se confirme. Con el siguiente código, no lo hará. #+BEGIN_SRC emacs-lisp (setq org-confirm-babel-evaluate nil) #+END_SRC **** Añadir imágenes in-line :PROPERTIES: :CUSTOM_ID: Añadir imágenes in-line :END: #+BEGIN_SRC emacs-lisp (org-display-inline-images t t) #+END_SRC **** org2blog :PROPERTIES: :CUSTOM_ID: org2blog :END: No está cargado ni configurado, lo mantengo por si acaso. Para publicar articulos con marcado =org-mode= en wordpress. #+BEGIN_SRC emacs-lisp :eval no :tangle no (defun org2web-add-keys() (local-set-key "n" (quote org2blog/wp-new-entry)) (local-set-key "p" (quote org2blog/wp-post-buffer))) (add-hook 'org2blog/wp-mode-hook 'org2web-add-keys) (require 'org2blog-autoloads) ;; habia un bug raro que hace que tengas que tener dos blogs puestos (setq org2blog/wp-blog-alist '(("blog" :url "http://blog.net/xmlrpc.php" :username "drymer" :default-title "Hola Mundo" :tags-as-categories nil) ("my-blog" :url "http://username.server.com/xmlrpc.php" :username "admin"))) (setq org2blog/wp-use-sourcecode-shortcode nil) #+END_SRC **** org2nikola :PROPERTIES: :CUSTOM_ID: org2nikola :END: Sirve para publicar en =nikola= con marcado =org-mode=. Si no está instalado, lo instala mediante el-get. [[https://daemons.it/posts/nikola-emacs-gestionar-un-blog-de-contenido-esttico/][Más información (o no)]]. #+BEGIN_SRC emacs-lisp :tangle no (add-to-list 'el-get-sources '(:name org2nikola :website "https://github.com/redguardtoo/org2nikola.git" :description "Export org into HTML used by static blog generator nikola." :type git :url "https://github.com/redguardtoo/org2nikola.git")) (if (not (el-get-package-installed-p 'org2nikola)) (el-get 'sync 'org2nikola)) #+END_SRC Las funciones cutres son mías. #+name:org2nikola #+BEGIN_SRC emacs-lisp (use-package org2nikola :load-path "~/Proyectos/org2nikola/" :init ;; Se instala el htmlize de melpa, el de org-mode es demasiado viejo (use-package htmlize :ensure t) :config (setq org2nikola-output-root-directory "/home/drymer/Documentos/blog/") (setq org2nikola-use-verbose-metadata t) ;; Las dos siguientes funciones probablemente no sirvan a nadie (defun nikola/url-post () "Devuelve el enlace del articulo en el que esté el cursor." (interactive) (setq url (concat "https://daemons.it/posts/" (cdr (car (org-entry-properties (point) "post_slug"))))) (message url) (kill-new url)) (defun nikola/url-config () "Devuelve el enlace de la parte de la configuración en la que esté el cursor." (interactive) (setq url (concat "https://daemons.it/stories/mi-configuracin-de-emacs/#" (cdr (car (org-entry-properties (point) "CUSTOM_ID"))))) (message url) (kill-new url))) #+END_SRC **** Notas a pie de página :PROPERTIES: :CUSTOM_ID: Notas a pie de página :END: Prefiero que aparezcan las notas debajo del arbol en el que se ha tomado. #+BEGIN_SRC emacs-lisp (setq org-footnote-section nil) #+END_SRC **** toc-org :PROPERTIES: :CUSTOM_ID: toc-org :END: #+BEGIN_SRC emacs-lisp (use-package toc-org :ensure t :init (add-hook 'org-mode-hook 'toc-org-enable) ) #+END_SRC **** Cifrar archivos :PROPERTIES: :CUSTOM_ID: Cifrar archivos :END: #+BEGIN_SRC emacs-lisp (use-package epa-file :init (epa-file-enable) ) #+END_SRC A diferencia de la función de writequit, esta establece el título como custom\under{}id. #+BEGIN_SRC emacs-lisp ;; Fuente: https://writequit.org/articles/emacs-org-mode-generate-ids.html ;; requerir libreria de ayuda (require 'org-id) ;; función que creará los id (defun eos/org-custom-id-get (&optional pom create prefix) "Get the CUSTOM_ID property of the entry at point-or-marker POM. If POM is nil, refer to the entry at point. If the entry does not have an CUSTOM_ID, the function returns nil. However, when CREATE is non nil, create a CUSTOM_ID if none is present already. PREFIX will be passed through to `org-id-new'. In any case, the CUSTOM_ID of the entry is returned." (interactive) (org-with-point-at pom (let ((id (org-entry-get nil "CUSTOM_ID"))) (cond ((and id (stringp id) (string-match "\\S-" id)) id) (create (setq id (org-get-heading)) (org-entry-put pom "CUSTOM_ID" id) (org-id-add-location id (buffer-file-name (buffer-base-buffer))) id))))) (defun eos/org-add-ids-to-headlines-in-file () "Add CUSTOM_ID properties to all headlines in the current file which do not already have one." (interactive) (org-map-entries (lambda () (eos/org-custom-id-get (point) 'create)))) #+END_SRC **** Más profundidad en imenu :PROPERTIES: :CUSTOM_ID: Más profundidad en imenu :END: #+BEGIN_SRC emacs-lisp (setq org-imenu-depth 9) #+END_SRC **** Empareja simbolos de marcado y paréntesis :PROPERTIES: :CUSTOM_ID: Empareja simbolos de marcado y paréntesis :END: #+BEGIN_SRC emacs-lisp (modify-syntax-entry ?/ "(/" org-mode-syntax-table) (modify-syntax-entry ?* "(*" org-mode-syntax-table) (modify-syntax-entry ?_ "(_" org-mode-syntax-table) (modify-syntax-entry ?= "(=" org-mode-syntax-table) #+END_SRC **** org-protocol :PROPERTIES: :CUSTOM_ID: org-protocol :END: #+BEGIN_SRC emacs-lisp (use-package org-protocol) #+END_SRC **** Temas para exportación en html :PROPERTIES: :CUSTOM_ID: Temas para exportación en html :END: #+BEGIN_SRC emacs-lisp (add-to-list 'el-get-sources '(:name org-html-themes :type github :pkgname "fniessen/org-html-themes")) (if (not (el-get-package-installed-p 'org-html-themes)) (el-get 'sync 'org-html-themes)) #+END_SRC **** Ejecución de bloques babel asyncrona :PROPERTIES: :CUSTOM_ID: Ejecución de bloques babel asyncrona :END: #+name: ob-async #+BEGIN_SRC emacs-lisp (add-to-list 'el-get-sources '(:name ob-async :type github :pkgname "astahlman/ob-async")) (if (not (el-get-package-installed-p 'ob-async)) (el-get 'sync 'ob-async)) (use-package ob-async :load-path "el-get/ob-async/" :config (add-to-list 'org-ctrl-c-ctrl-c-hook 'ob-async-org-babel-execute-src-block)) #+END_SRC **** org-brain #+BEGIN_SRC emacs-lisp (add-to-list 'el-get-sources '(:name org-brain :type github :pkgname "Kungsgeten/org-brain")) (if (not (el-get-package-installed-p 'org-brain)) (el-get 'sync 'org-brain)) (use-package org-brain :load-path "el-get/org-brain" :config (setq org-brain-path "~/Documentos/org/brain/")) #+END_SRC ** mail-mode :PROPERTIES: :CUSTOM_ID: mail-mode :END: Para que cuadre con mutt. #+BEGIN_SRC emacs-lisp (add-to-list 'auto-mode-alist '(".*mutt-" . mail-mode)) #+END_SRC ** lisp :PROPERTIES: :CUSTOM_ID: lisp :END: *** Paredit :PROPERTIES: :CUSTOM_ID: Paredit :END: #+BEGIN_SRC emacs-lisp (use-package paredit :ensure t) #+END_SRC *** package-lint :PROPERTIES: :CUSTOM_ID: package-lint :END: Comprueba fallos y convenciones. #+BEGIN_SRC emacs-lisp (use-package package-lint :ensure t) #+END_SRC *** rainbow-delimiters :PROPERTIES: :CUSTOM_ID: rainbow-delimiters :END: #+BEGIN_SRC emacs-lisp :tangle no (use-package rainbow-delimiters :ensure t :config (add-to-list 'auto-mode-alist '("\\.el\\'" . rainbow-delimiters-mode))) #+END_SRC * Funciones personalizadas :PROPERTIES: :CUSTOM_ID: Funciones personalizadas :END: ** Recargar todos los buffers abiertos :PROPERTIES: :CUSTOM_ID: Recargar todos los buffers abiertos :END: Es útil cuando los archivos se suelen sincronizar y se deja el pc abierto. Los archivos que esten abiertos y hayan cambiado, se refrescaran. #+BEGIN_SRC emacs-lisp (defun reload-all-buffers () "Recargar todos los buffers abiertos." (interactive) (dolist (buf (buffer-list)) (with-current-buffer buf (when (and (buffer-file-name) (file-exists-p (buffer-file-name)) (not (buffer-modified-p))) (revert-buffer t t t) ))) (message "Refreshed open files.")) #+END_SRC ** Insertar cabeceras para org-mode :PROPERTIES: :CUSTOM_ID: Insertar cabeceras para org-mode :END: #+name:insertar-cabeceras #+BEGIN_SRC emacs-lisp (defun org-mode-insert-header (language) "Make a template at point." (interactive (let ((languages '("Generic" "HTML" "LaTeX" ))) (list (ido-completing-read "To which export: " languages)) ) ) (when (string= language "Generic") (progn (insert (format "#+TITLE:\n")) (insert (format "#+AUTHOR:\n")) (insert (format "#+LANGUAGE: es \n")) (insert (format "#+OPTIONS: toc:1\n")) (insert (format "#+TOC: headlines 3\n")) (insert (format "#+STARTUP: indent\n\n")) ) ) (when (string= language "HTML") (progn (insert (format "#+TITLE:\n")) (insert (format "#+AUTHOR:\n")) (insert (format "#+LANGUAGE: ca\n")) (insert (format "#+OPTIONS: toc:1\n")) (insert (format "#+TOC: headlines 3\n")) (insert (format (concat "#+SETUPFILE: " user-emacs-directory "/css/org-html-themes/setup/theme-readtheorg.setup\n\n"))) ) ) (when (string= language "LaTeX") (progn (insert (format "#+Title:\n")) (insert (format "#+Author:\n")) (insert (format "#+LANGUAGE: es\n")) (insert (format "#+LATEX_CLASS: article\n")) (insert (format "#+LATEX_CLASS_OPTIONS: [spanish,a4paper]\n")) (insert (format "#+LATEX_HEADER: \\usepackage{color}\n")) (insert (format "#+LATEX_HEADER: \\usepackage[spanish]{babel}\n\n")) ) ) ) #+END_SRC ** Insertar bloque src para org-mode :PROPERTIES: :CUSTOM_ID: Insertar bloque src para org-mode :END: Además, funciona tanto sin ninguna región activa cómo con esta. De haber región activa, la envuelve. #+name:insertar-bloque #+BEGIN_SRC emacs-lisp (defun insert-org-src-block (choice) "Insert src code blocks." (interactive (if (org-at-table-p) (call-interactively 'org-table-rotate-recalc-marks) (let ((choices '("emacs-lisp" "python" "shell" "css" "ledger" "latex" "lisp" "sqlite"))) (list (ido-completing-read "Source code type: " choices))))) (cond ((region-active-p) (let ((start (region-beginning)) (end (region-end))) (progn (goto-char end) (insert "\n#+END_SRC\n") (goto-char start) (insert (format "#+BEGIN_SRC %s\n" choice))) ) ) (t (insert (format "#+BEGIN_SRC %s\n" choice)) (save-excursion (insert "\n#+END_SRC"))))) #+END_SRC ** Insertar org-entities :PROPERTIES: :CUSTOM_ID: Insertar org-entities :END: Más información [[http://daemons.it/posts/cosillas-de-emacs-escapar-simbolos-al-usar-usar-marcado-en-org-mode][aquí]]. #+name:insertar-entidades #+BEGIN_SRC emacs-lisp (setq org-pretty-entities t) (defun modi/org-entity-get-name (char) "Return the entity name for CHAR. For example, return \"ast\" for *." (let ((ll (append org-entities-user org-entities)) e name utf8) (catch 'break (while ll (setq e (pop ll)) (when (not (stringp e)) (setq utf8 (nth 6 e)) (when (string= char utf8) (setq name (car e)) (throw 'break name))))))) (defun modi/org-insert-org-entity-maybe (orig-fun &rest args) "When the universal prefix C-u is used before entering any character, insert the character's `org-entity' name if available." (let ((pressed-key (char-to-string (elt (this-single-command-keys) 0))) entity-name) (when (and (listp args) (eq 4 (car args))) (setq entity-name (modi/org-entity-get-name pressed-key)) (when entity-name (setq entity-name (concat "\\" entity-name "{}")) (insert entity-name) (message (concat "Inserted `org-entity' " (propertize entity-name 'face 'font-lock-function-name-face) " for the symbol " (propertize pressed-key 'face 'font-lock-function-name-face) ".")))) (when (null entity-name) (apply orig-fun args)))) (advice-add 'org-self-insert-command :around #'modi/org-insert-org-entity-maybe) #+END_SRC ** Añadir soporte para editar archivos en docker :PROPERTIES: :CUSTOM_ID: Añadir soporte para editar archivos en docker :END: Usar del siguiente modo: =/docker:drunk_bardeen:/etc/passwd=. Sacado de la [[https://www.emacswiki.org/emacs/TrampAndDocker][wiki]] de emacs. Se puede usar el siguiente alias en bash para ver el nombre del container en ejecución: #+BEGIN_SRC sh :eval no :tangle no alias dname="docker ps | perl -we 'use strict; $_ = <>; m/^(.*)NAMES/ or die; my $offset = length($1); while(<>) {substr($_, 0, $offset, q()); chomp; for(split m/\\W+/) {print qq($_:\n)} }'" #+END_SRC Desactivado de momento, no tengo =docker= en este pc. #+name:docker-tramp #+BEGIN_SRC emacs-lisp :eval no :tangle no (push (cons "docker" '((tramp-login-program "docker") (tramp-login-args (("exec" "-it") ("%h") ("/bin/bash"))) (tramp-remote-shell "/bin/sh") (tramp-remote-shell-args ("-i") ("-c")))) tramp-methods) (defadvice tramp-completion-handle-file-name-all-completions (around dotemacs-completion-docker activate) "(tramp-completion-handle-file-name-all-completions \"\" \"/docker:\" returns a list of active Docker container names, followed by colons." (if (equal (ad-get-arg 1) "/docker:") (let* ((dockernames-raw (shell-command-to-string "docker ps | perl -we 'use strict; $_ = <>; m/^(.*)NAMES/ or die; my $offset = length($1); while(<>) {substr($_, 0, $offset, q()); chomp; for(split m/\\W+/) {print qq($_:\n)} }'")) (dockernames (cl-remove-if-not #'(lambda (dockerline) (string-match ":$" dockerline)) (split-string dockernames-raw "\n")))) (setq ad-return-value dockernames)) ad-do-it)) #+END_SRC ** Insertar fecha de hoy :PROPERTIES: :CUSTOM_ID: Insertar fecha de hoy :END: #+BEGIN_SRC emacs-lisp (defun insert-todays-date(arg) (interactive "P") (insert (if arg (format-time-string "%d-%m-%Y") (format-time-string "%d-%m-%Y") ) ) ) #+END_SRC ** Abrir eshell aquí :PROPERTIES: :CUSTOM_ID: Abrir eshell aquí :END: Sacada de la web Howardism. #+BEGIN_SRC emacs-lisp (defun eshell-here () "Opens up a new shell in the directory associated with the current buffer's file. The eshell is renamed to match that directory to make multiple eshell windows easier." (interactive) (let* ((parent (if (buffer-file-name) (file-name-directory (buffer-file-name)) default-directory)) (height (/ (window-total-height) 3)) (name (car (last (split-string parent "/" t))))) (split-window-vertically (- height)) (other-window 1) (eshell "new") (rename-buffer (concat "*eshell: " name "*")) (insert (concat "ls")) (eshell-send-input))) #+END_SRC ** Reabrir buffer con sudo :PROPERTIES: :CUSTOM_ID: Reabrir buffer con sudo :END: Fuente: [[http://emacsredux.com/blog/2013/04/21/edit-files-as-root/][http://emacsredux.com/blog/2013/04/21/edit-files-as-root/]] Fuente: [[http://stackoverflow.com/a/16408592][http://stackoverflow.com/a/16408592]] Es una mezcla de ambas fuentes. #+name:abrir-sudo #+BEGIN_SRC emacs-lisp (defadvice purpose-find-file-overload (after find-file-sudo activate) "Find file as root if necessary." (unless (and buffer-file-name (file-writable-p buffer-file-name)) (let* ((buffer-file (buffer-file-name)) (coincidence (string-match-p "@" buffer-file)) (hostname) (buffer-name)) (if coincidence (progn (setq hostname (substring buffer-file (+ coincidence 1) (string-match-p ":" buffer-file (+ coincidence 1)))) (setq buffer-name (concat (substring buffer-file 0 coincidence) "@" (replace-regexp-in-string ":" (concat "|sudo:" hostname ":") buffer-file nil nil nil (+ coincidence 1)))) (find-alternate-file buffer-name)) (find-alternate-file (concat "/sudo:root@localhost:" buffer-file)))))) #+END_SRC Antes usaba esto, ahora desactivado: #+name:abrir-sudo-viejo #+BEGIN_SRC emacs-lisp :tangle no (defun sudo-edit (&optional arg) "Edit currently visited file as root. With a prefix ARG prompt for a file to visit. Will also prompt for a file to visit if current buffer is not visiting a file." (interactive "P") (if (or arg (not buffer-file-name)) (find-file (concat "/sudo:root@localhost:" (ido-read-file-name "Find file(as root): "))) (find-alternate-file (concat "/sudo:root@localhost:" buffer-file-name)))) #+END_SRC