dotfiles/emacs.d/init-literate.org

2631 lines
92 KiB
Org Mode
Raw Normal View History

#+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]]
2017-01-24 10:30:30 +01:00
- [[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]]
2017-01-24 10:30:30 +01:00
- [[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]]
2017-02-25 14:12:23 +01:00
- [[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]]
2017-01-24 10:30:30 +01:00
- [[counsel-dash][counsel-dash]]
2017-03-30 09:53:39 +02:00
- [[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]]
2017-02-25 14:12:23 +01:00
- [[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]]
2017-01-24 10:30:30 +01:00
- [[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]]
2017-02-25 14:12:23 +01:00
- [[emacs-purpose o proposito][emacs-purpose o proposito]]
2017-03-30 09:53:39 +02:00
- [[Yasnippet][Yasnippet]]
- [[Ispell][Ispell]]
2017-01-27 13:32:54 +01:00
- [[Paquetes genéricos][Paquetes genéricos]]
- [[Imenu][Imenu]]
- [[imenu-list][imenu-list]]
- [[Hydra][Hydra]]
- [[csv-mode][csv-mode]]
2017-02-25 14:12:23 +01:00
- [[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]]
2017-03-30 09:53:39 +02:00
- [[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]]
2017-03-30 09:53:39 +02:00
- [[Configuración por modos o lenguajes][Configuración por modos o lenguajes]]
- [[JSON][JSON]]
- [[Haskel][Haskel]]
- [[Markdown][Markdown]]
2017-02-25 14:12:23 +01:00
- [[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]]
2017-02-25 14:12:23 +01:00
- [[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]]
2017-01-24 10:30:30 +01:00
- [[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]]
2016-12-20 09:09:10 +01:00
- [[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]]
2017-01-24 10:30:30 +01:00
- [[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]]
2017-03-30 09:53:39 +02:00
- [[Ejecución de bloques babel asyncrona][Ejecución de bloques babel asyncrona]]
- [[org-brain][org-brain]]
2017-02-25 14:12:23 +01:00
- [[mail-mode][mail-mode]]
- [[lisp][lisp]]
- [[Paredit][Paredit]]
- [[package-lint][package-lint]]
2017-03-30 09:53:39 +02:00
- [[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í]]
2017-01-24 10:30:30 +01:00
- [[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
2017-03-30 09:53:39 +02:00
git clone https://daemons.it/cgit/dotfiles
2017-01-24 10:30:30 +01:00
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
2017-01-24 10:30:30 +01:00
# 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
2017-01-24 10:30:30 +01:00
# 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
2017-01-24 10:30:30 +01:00
# 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\"))"
2017-01-24 10:30:30 +01:00
# Por algún motivo al compilar desde el-get mete una ruta incorrecta en org-loaddefs.el
2017-03-30 09:53:39 +02:00
sed -i "s,org-mode-maint/lisp/,,g" $EMACSDIR/el-get/org-mode-maint/lisp/org-loaddefs.el
2017-01-24 10:30:30 +01:00
# 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
2017-03-30 09:53:39 +02:00
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
2017-01-24 10:30:30 +01:00
(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
2017-01-24 10:30:30 +01:00
;; Comprueba si use-package está instalado, sinó lo instala desde los repositorios
(unless (require 'use-package nil 'noerror)
(package-install 'use-package))
2017-01-24 10:30:30 +01:00
(require 'use-package)
2017-01-24 10:30:30 +01:00
;; Añade la ruta de el-get
(add-to-list 'load-path (concat user-emacs-directory "el-get/el-get/"))
2017-01-24 10:30:30 +01:00
;; Comprueba si el-get está instalado, sinó lo instala desde un gist
2017-02-25 14:12:23 +01:00
(unless (require 'el-get nil 'noerror)
2017-01-24 10:30:30 +01:00
;; 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"))
2017-01-24 10:30:30 +01:00
(load-file "/tmp/el-get-install.el"))
2017-01-24 10:30:30 +01:00
(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
2017-01-24 10:30:30 +01:00
(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
2017-01-24 10:30:30 +01:00
(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
2017-01-24 10:30:30 +01:00
(server-start)
#+END_SRC
2017-02-25 14:12:23 +01:00
** 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
2017-01-24 10:30:30 +01:00
(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
2017-01-24 10:30:30 +01:00
(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
2017-01-24 10:30:30 +01:00
(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
2017-01-24 10:30:30 +01:00
(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
2017-01-24 10:30:30 +01:00
(when (fboundp 'windmove-default-keybindings)
(windmove-default-keybindings))
#+END_SRC
** Helm
:PROPERTIES:
:CUSTOM_ID: Helm
:END:
2017-03-30 09:53:39 +02:00
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:
2017-03-30 09:53:39 +02:00
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:
2017-03-30 09:53:39 +02:00
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
2017-01-24 10:30:30 +01:00
(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)
2017-02-25 14:12:23 +01:00
;; Asegurarse de que están smex, flx, diminis y ivi-hydra
2017-01-24 10:30:30 +01:00
(use-package smex :ensure t)
(use-package flx :ensure t)
(use-package diminish :ensure t)
(use-package ivy-hydra :ensure t)
2017-02-25 14:12:23 +01:00
:bind
("C-c C-r" . ivy-resume)
2017-01-24 10:30:30 +01:00
: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)
2017-03-30 09:53:39 +02:00
("C-c C-r" . ivy-resume))
2017-01-24 10:30:30 +01:00
:config
;; usar ffap
(setq counsel-find-file-at-point t)
:ensure t)
(use-package swiper
2017-03-30 09:53:39 +02:00
;; comentado en favor de ace-isearch
;; :bind (;; Sustituir isearch
;; ("C-s" . swiper)
;; ("C-r" . swiper))
2017-01-24 10:30:30 +01:00
: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"))
2017-01-24 10:30:30 +01:00
(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)))
2017-01-24 10:30:30 +01:00
(use-package counsel-dash
:load-path "el-get/counsel-dash"
:init
2017-02-25 14:12:23 +01:00
(setq counsel-dash-docsets-path "~/.emacs.d/docsets/")
2017-01-24 10:30:30 +01:00
(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
2017-01-24 10:30:30 +01:00
Auto-instala los docsets:
#+name: instala-docsets
#+BEGIN_SRC emacs-lisp
2017-02-25 14:12:23 +01:00
(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))))))
2017-01-24 10:30:30 +01:00
#+END_SRC
2017-02-25 14:12:23 +01:00
2017-03-30 09:53:39 +02:00
*** 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
2017-04-18 07:22:10 +02:00
("C-'" . ace-isearch-jump-during-isearch))
:diminish ace-isearch-mode)
2017-03-30 09:53:39 +02:00
#+END_SRC
** Seguir enlaces simbólicos
:PROPERTIES:
:CUSTOM_ID: Seguir enlaces simbólicos
:END:
#+BEGIN_SRC emacs-lisp
2017-01-24 10:30:30 +01:00
(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
2017-01-24 10:30:30 +01:00
(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
2017-01-24 10:30:30 +01:00
(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:
2017-01-24 10:30:30 +01:00
#+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
2017-01-24 10:30:30 +01:00
(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
2017-01-24 10:30:30 +01:00
(global-set-key (kbd "RET") 'newline-and-indent)
#+END_SRC
*** Magit
:PROPERTIES:
:CUSTOM_ID: Magit
:END:
#+BEGIN_SRC emacs-lisp
2017-01-24 10:30:30 +01:00
(use-package magit
:bind
("C-x g" . magit-status)
:config
;; usar un wrapper que torifica git
2017-03-30 09:53:39 +02:00
(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
2017-01-24 10:30:30 +01:00
(add-to-list 'el-get-sources '(:name xlicense-github
:type github
:pkgname "jtimberman/xlicense-el"))
2017-01-24 10:30:30 +01:00
(if (not (el-get-package-installed-p 'xlicense-github))
(el-get 'sync 'xlicense-github))
2017-01-24 10:30:30 +01:00
(use-package xlicense
:load-path "el-get/xlicense-github"
:init
(setq license-directory (concat user-emacs-directory "el-get/xlicense-github/licenses/")))
#+END_SRC
2017-02-25 14:12:23 +01:00
*** Auto-competado
:PROPERTIES:
:CUSTOM_ID: Auto-competado
:END:
#+BEGIN_SRC emacs-lisp
(use-package company
:ensure t
:config
2017-04-18 07:22:10 +02:00
(add-hook 'after-init-hook 'global-company-mode)
:diminish company-mode)
2017-02-25 14:12:23 +01:00
#+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
2017-01-24 10:30:30 +01:00
(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
2017-01-24 10:30:30 +01:00
(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
2017-01-24 10:30:30 +01:00
(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
2017-01-24 10:30:30 +01:00
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
2017-01-24 10:30:30 +01:00
(setq browse-url-browser-function 'browse-url-xdg-open)
#+END_SRC
** Terminal
:PROPERTIES:
:CUSTOM_ID: Terminal
:END:
Establecer shell.
#+BEGIN_SRC emacs-lisp
2017-01-24 10:30:30 +01:00
(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
2017-01-24 10:30:30 +01:00
(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
2017-01-24 10:30:30 +01:00
(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
2017-01-24 10:30:30 +01:00
(delete-selection-mode t)
#+END_SRC
2017-01-24 10:30:30 +01:00
** 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
2017-02-25 14:12:23 +01:00
:PROPERTIES:
:CUSTOM_ID: kill-this-buffer en vez de kil-buffer
:END:
2017-01-27 13:32:54 +01:00
2017-01-24 10:30:30 +01:00
: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
2017-02-25 14:12:23 +01:00
** 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)
2017-03-30 09:53:39 +02:00
("web.org" . agenda)
2017-02-25 14:12:23 +01:00
("notas.org" . agenda)
(" *command-log*" . command)))
(purpose-compile-user-configuration)
:config
2017-03-30 09:53:39 +02:00
;; 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))
2017-02-25 14:12:23 +01:00
(purpose-mode))
#+END_SRC
2017-03-30 09:53:39 +02:00
** 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
2017-01-27 13:32:54 +01:00
** Paquetes genéricos
2017-02-25 14:12:23 +01:00
:PROPERTIES:
:CUSTOM_ID: Paquetes genéricos
:END:
2017-01-27 13:32:54 +01:00
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
2017-01-24 10:30:30 +01:00
:PROPERTIES:
:CUSTOM_ID: Hydra
:END:
#+BEGIN_SRC emacs-lisp
(use-package hydra :ensure t)
#+END_SRC
2017-01-27 13:32:54 +01:00
*** csv-mode
2017-01-24 10:30:30 +01:00
:PROPERTIES:
:CUSTOM_ID: csv-mode
:END:
2017-03-30 09:53:39 +02:00
#+BEGIN_SRC emacs-lisp :tangle no
2017-01-24 10:30:30 +01:00
(use-package csv-mode :ensure t)
#+END_SRC
2017-02-25 14:12:23 +01:00
*** 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:
2017-03-30 09:53:39 +02:00
Desactivado.
2017-02-25 14:12:23 +01:00
#+name:hardcore-mode
2017-03-30 09:53:39 +02:00
#+BEGIN_SRC emacs-lisp :tangle no
2017-02-25 14:12:23 +01:00
(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
2017-03-30 09:53:39 +02:00
:PROPERTIES:
:CUSTOM_ID: Flycheck
:END:
2017-02-25 14:12:23 +01:00
Corrector
#+BEGIN_SRC emacs-lisp
(use-package flycheck
:ensure t
:config (global-flycheck-mode))
#+END_SRC
*** Rainbow-mode
2017-03-30 09:53:39 +02:00
:PROPERTIES:
:CUSTOM_ID: Rainbow-mode
:END:
2017-02-25 14:12:23 +01:00
Muestra los colores de paletas HTML (hexadecimal) con el color que representa.
2017-03-30 09:53:39 +02:00
#+BEGIN_SRC emacs-lisp :tangle no
2017-02-25 14:12:23 +01:00
(use-package rainbow-mode
:ensure t)
#+END_SRC
*** i3wm-config-mode
2017-03-30 09:53:39 +02:00
:PROPERTIES:
:CUSTOM_ID: i3wm-config-mode
:END:
2017-02-25 14:12:23 +01:00
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
2017-03-30 09:53:39 +02:00
: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")
2017-02-25 14:12:23 +01:00
#+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
2017-01-24 10:30:30 +01:00
#+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
2017-01-24 10:30:30 +01:00
(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
2017-03-30 09:53:39 +02:00
* 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
2017-02-25 14:12:23 +01:00
** Python
:PROPERTIES:
:CUSTOM_ID: python
:END:
2016-11-28 20:31:43 +01:00
La configuración de elpy:
#+name: elpy
#+BEGIN_SRC emacs-lisp
2017-03-30 09:53:39 +02:00
(if (not (el-get-package-installed-p 'elpy))
(el-get 'sync 'elpy))
(use-package elpy
2017-04-18 07:22:10 +02:00
:load-path "el-get/elpy/"
2017-03-30 09:53:39 +02:00
:init
2017-04-18 07:22:10 +02:00
(use-package pyvenv :ensure t)
2017-03-30 09:53:39 +02:00
(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.
2016-11-28 20:31:43 +01:00
#+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
2016-11-28 20:31:43 +01:00
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
2016-11-28 20:31:43 +01:00
(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:
2017-01-24 10:30:30 +01:00
No está activo, lo cargo de =private-literate.org=.
2017-02-25 14:12:23 +01:00
#+name:gnu-social
#+BEGIN_SRC emacs-lisp :tangle no
2017-01-24 10:30:30 +01:00
(add-to-list 'el-get-sources '(:name gnu-social-mode
:description "gnu-social client"
:type github
2017-01-24 10:30:30 +01:00
:pkgname "bashrc/gnu-social-mode"))
2017-01-24 10:30:30 +01:00
(if (not (el-get-package-installed-p 'gnu-social-mode))
(el-get 'sync 'gnu-social-mode)
)
2017-01-24 10:30:30 +01:00
(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:
2016-11-28 20:31:43 +01:00
#+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
2017-02-25 14:12:23 +01:00
(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")
2017-03-30 09:53:39 +02:00
("pa" "antisocial" tags-todo "antisocial")
2017-02-25 14:12:23 +01:00
("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
2017-03-30 09:53:39 +02:00
2017-02-25 14:12:23 +01:00
**** 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")
2017-03-30 09:53:39 +02:00
("oa" "Antisocial" entry (file+headline "~/Documentos/org/index.org" "antisocial")
"* TODO %?\n:PROPERTIES:\n:CREATED: %u\n:END:\n")
2017-02-25 14:12:23 +01:00
("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")
2017-02-25 14:12:23 +01:00
(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:
2016-12-20 09:09:10 +01:00
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
2017-01-24 10:30:30 +01:00
:load-path "el-get/calfw"
:config
2017-01-24 10:30:30 +01:00
(require 'calfw-org)
(setq cfw:org-overwrite-default-keybinding t)
(setq calendar-week-start-day 1)
(setq calendar-month-name-array
2016-12-20 09:09:10 +01:00
["Gener" "Febrer" "Març" "Abril" "Maig" "Juny" "Juliol" "Agost" "Septembre" "Octubre" "Novembre" "Desembre"])
(setq calendar-day-name-array
["Diumenge" "Dilluns" "Dimarts" "Dimecres" "Dijous" "Divendres" "Dissabte"])
2016-12-20 09:09:10 +01:00
: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
2017-01-24 10:30:30 +01:00
**** 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
2017-03-30 09:53:39 +02:00
(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:
2017-03-30 09:53:39 +02:00
#+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
2016-12-20 09:09:10 +01:00
**** Exportar rst
2017-01-24 10:30:30 +01:00
:PROPERTIES:
:CUSTOM_ID: Exportar rst
:END:
2016-12-20 09:09:10 +01:00
#+BEGIN_SRC emacs-lisp
2017-01-24 10:30:30 +01:00
(add-to-list 'el-get-sources '(:name ox-rst
:type github
:pkgname "masayuko/ox-rst"))
2016-12-20 09:09:10 +01:00
2017-01-24 10:30:30 +01:00
(if (not (el-get-package-installed-p 'ox-rst))
(el-get 'sync 'ox-rst))
2016-12-20 09:09:10 +01:00
2017-01-24 10:30:30 +01:00
(use-package ox-rst
:load-path "el-get/ox-rst")
2016-12-20 09:09:10 +01:00
#+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)
2017-01-24 10:30:30 +01:00
(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
2017-03-30 09:53:39 +02:00
(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:
2017-03-30 09:53:39 +02:00
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)]].
2017-03-30 09:53:39 +02:00
#+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"))
2017-03-30 09:53:39 +02:00
(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
2017-03-30 09:53:39 +02:00
(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)
2017-01-27 13:32:54 +01:00
2017-03-30 09:53:39 +02:00
;; 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))
2017-03-30 09:53:39 +02:00
(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
2017-01-24 10:30:30 +01:00
**** 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
2017-01-24 10:30:30 +01:00
**** 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
2017-01-24 10:30:30 +01:00
**** Más profundidad en imenu
:PROPERTIES:
2017-01-24 10:30:30 +01:00
:CUSTOM_ID: Más profundidad en imenu
:END:
#+BEGIN_SRC emacs-lisp
2017-01-24 10:30:30 +01:00
(setq org-imenu-depth 9)
#+END_SRC
2017-01-24 10:30:30 +01:00
**** 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
2017-01-24 10:30:30 +01:00
**** org-protocol
:PROPERTIES:
2017-01-24 10:30:30 +01:00
:CUSTOM_ID: org-protocol
:END:
#+BEGIN_SRC emacs-lisp
2017-01-24 10:30:30 +01:00
(use-package org-protocol)
#+END_SRC
2017-01-24 10:30:30 +01:00
**** Temas para exportación en html
:PROPERTIES:
2017-01-24 10:30:30 +01:00
:CUSTOM_ID: Temas para exportación en html
:END:
2016-11-17 09:51:28 +01:00
#+BEGIN_SRC emacs-lisp
2017-03-30 09:53:39 +02:00
(add-to-list 'el-get-sources '(:name org-html-themes
:type github
:pkgname "fniessen/org-html-themes"))
2017-03-30 09:53:39 +02:00
(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/"))
2016-11-17 09:51:28 +01:00
#+END_SRC
2017-02-25 14:12:23 +01:00
** mail-mode
:PROPERTIES:
:CUSTOM_ID: mail-mode
:END:
2017-03-30 09:53:39 +02:00
Para que cuadre con mutt.
2017-02-25 14:12:23 +01:00
#+BEGIN_SRC emacs-lisp
(add-to-list 'auto-mode-alist '(".*mutt-" . mail-mode))
#+END_SRC
** lisp
:PROPERTIES:
:CUSTOM_ID: lisp
:END:
*** Paredit
2017-03-30 09:53:39 +02:00
:PROPERTIES:
:CUSTOM_ID: Paredit
:END:
2017-02-25 14:12:23 +01:00
#+BEGIN_SRC emacs-lisp
(use-package paredit
:ensure t)
#+END_SRC
*** package-lint
2017-03-30 09:53:39 +02:00
:PROPERTIES:
:CUSTOM_ID: package-lint
:END:
Comprueba fallos y convenciones.
2017-02-25 14:12:23 +01:00
#+BEGIN_SRC emacs-lisp
(use-package package-lint
:ensure t)
#+END_SRC
2017-03-30 09:53:39 +02:00
*** 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
2017-02-25 14:12:23 +01:00
(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:
2017-03-30 09:53:39 +02:00
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
2017-01-24 10:30:30 +01:00
** Reabrir buffer con sudo
2017-02-25 14:12:23 +01:00
:PROPERTIES:
:CUSTOM_ID: Reabrir buffer con sudo
:END:
2017-04-18 07:22:10 +02:00
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
2017-01-24 10:30:30 +01:00
(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