dotfiles/emacs.d/init-literate.org

2631 lines
92 KiB
Org Mode
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#+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 "<tab>") '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 "<f1>") 'help-command)
(define-key hardcore-mode-map
(kbd "<C-up>") (lambda ()
(interactive)
(message "This key is disabled. Use M-p instead.")))
(define-key hardcore-mode-map
(kbd "<C-down>") (lambda ()
(interactive)
(message "This key is disabled. Use M-n instead.")))
(define-key hardcore-mode-map
(kbd "<C-left>") (lambda ()
(interactive)
(message "This key is disabled. Use M-b instead.")))
(define-key hardcore-mode-map
(kbd "<C-right>") (lambda ()
(interactive)
(message "This key is disabled. Use M-f instead.")))
(define-key hardcore-mode-map
(kbd "<prior>") (lambda ()
(interactive)
(message "This key is disabled. Use M-v instead.")))
(define-key hardcore-mode-map
(kbd "<next>") (lambda ()
(interactive)
(message "This key is disabled. Use C-v instead.")))
(define-key hardcore-mode-map
(kbd "<home>") (lambda ()
(interactive)
(message "This key is disabled. Use C-a instead.")))
(define-key hardcore-mode-map
(kbd "<C-home>") (lambda ()
(interactive)
(message "This key is disabled. Use M-< instead.")))
(define-key hardcore-mode-map
(kbd "<end>") (lambda ()
(interactive)
(message "This key is disabled. Use C-e instead.")))
(define-key hardcore-mode-map
(kbd "<C-end>") (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 "<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />")
: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