77 KiB
- Tabla de contenido
- Acerca de este documento
- Configuración Genérica
- Iniciar paquetes elpa/melpa/marmalade
- Asegurarse de que use-package y el-get estan instalados y los inicializa
- Moverse por el buffer
- Establecer nombre y correo
- Abrir cómo buffer inicial
- Iniciar cómo servidor
- Auto-guardado
- Modo por defecto
- Acepta 'y' o 'n' cuando pide 'yes' o 'no'
- Lenguaje por defecto en emacs y org-mode
- Moverse por ventanas con shift
- Helm
- Buscar más eficazmente en Helm
- ivy-mode
- Seguir enlaces simbólicos
- Emparejar parentesis y otros
- Mantener lista de buffers recientes
- Guardar el layout tal cómo está
- No truncar líneas
- Programación
- Auto identación
- Auto completado
- Magit
- Aviso de errores con flycheck
- Insertar licencia
- Borrar espacios sobrantes
- Usar ssh con tramp
- Golden Ratio
- Abrir enlaces en el navegador por defecto
- Terminal
- Cambiar de ventana más comodamente
- undo-tree
- Sobreescribir al seleccionar texto
- Imenu
- Aspecto
- Configuración por modos
- JSON
- Haskel
- Markdown
- python
- web-mode
- DockerFile
- kivy-mode
- gnu-social-mode
- po-mode
- org-mode
- Definir fuente de el-get
- Agenda
- Edición, diseño y varios
- Atajos de teclado
- Definir lenguajes que entiende babel
- Asteriscos bonitos
- Seguir links
- Exportar Markdown
- Configuracion de bloques de código
- Elementos de marcado
- Quitar confirmación al evaluar código
- Añadir imágenes in-line
- org2blog
- org2nikola
- Notas a pie de página
- toc-org
- Cifrar archivos
- Generar id para cabeceras de manera dinámica
- Hábitos
- org-protocol
- Empareja simbolos de marcado y paréntesis
- Más profundidad en imenu
- Capturas de notas
- Comandos de Agenda
- Funciones personalizadas
- Recargar todos los buffers abiertos
- Insertar cabeceras para org-mode
- Insertar bloque src para org-mode
- Insertar org-entities
- Añadir soporte para editar archivos en docker
- Insertar fecha de hoy
- Abrir eshell aquí
- Devolver enlaces
Tabla de contenido TOC_5_org
- Acerca de este documento
-
- Iniciar paquetes elpa/melpa/marmalade
- Asegurarse de que use-package y el-get estan instalados y los inicializa
- Moverse por el buffer
- Establecer nombre y correo
- Abrir cómo buffer inicial
- Iniciar cómo servidor
- Auto-guardado
- Modo por defecto
- Acepta 'y' o 'n' cuando pide 'yes' o 'no'
- Lenguaje por defecto en emacs y org-mode
- Moverse por ventanas con shift
- ivy-mode
- Seguir enlaces simbólicos
- Emparejar parentesis y otros
- Mantener lista de buffers recientes
- Guardar el layout tal cómo está
- No truncar líneas
- Borrar espacios sobrantes
- Usar ssh con tramp
- Golden Ratio
- Abrir enlaces en el navegador por defecto
- Terminal
- Cambiar de ventana más comodamente
- undo-tree
- Sobreescribir al seleccionar texto
Acerca de este documento
Este documento está hecho en org-mode y es a la vez la explicación de todo lo que hay en mi configuración de emacs y la propia configuración de emacs. Esto se logra mediante la programación literaria, un concepto bastante molón de programación.
Mi idea es que termine siendo más o menos un tutorial de emacs, extendido con los articulos del blog. A ver como sale. El documento estará en este git.
cat ~/.emacs.d/init.el
;; Antes que nada, quitamos del path el org-mode que viene con emacs, por que es viejo
(dolist (val load-path)
(if (string-match "lisp\/org" val)
(progn
(setq org-viejo val)
(delete val load-path)
)
)
)
;; Se añade la ruta del org-mode nuevo
(add-to-list 'load-path (concat user-emacs-directory "el-get/org-mode-maint/lisp/"))
;; Se intenta cargar el org-mode más nuevo. Si falla, vuelve a añadir al path la versión vieja para poder cargar el fichero de configuración
(unless (require 'org nil 'noerror)
(add-to-list 'load-path org-viejo)
)
;; Se carga la configuración pública y la privada
(org-babel-load-file (concat user-emacs-directory "init-literate.org"))
(org-babel-load-file (concat user-emacs-directory "private-literate.org"))
Estas lineas cargan org-mode
y mediante org-babel
coge todos los bloques de lisp que hay en init-literate.org
y los junta todos en init-literate.el
, que luego carga cómo la configuración cómo tal. El archivo private-literate.org
es, como su nombre indica, privado. Tengo mi contraseña de GNU Social y la de mi nextcloud.
PD: init-literate.org
está aquí.
Configuración Genérica
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:
#!/bin/bash
USERID=`id -u`
if [[ ! -e /tmp/emacs$USERID/server ]]
then
emacs-24.5 --daemon
emacsclient -c -n -e '(load-file "/tmp/powerline.el")' -e "(org-agenda-list)"
else
emacsclient -c -n -e "(org-agenda-list)"
fi
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
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.
(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)
;; Actualiza la lista de paquetes
(unless package-archive-contents
(package-refresh-contents))
Asegurarse de que use-package y el-get estan instalados y los inicializa
;; 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)
Moverse por el buffer
Subir y bajar párrafos:
(global-set-key "\M-p" 'backward-paragraph)
(global-set-key "\M-n" 'forward-paragraph)
Establecer nombre y correo
Al exportar en org-mode, por ejemplo, coge estos valores.
(setq user-full-name "drymer"
user-mail-address "drymer [ EN ] autistici.org")
Abrir cómo buffer inicial
(setq initial-buffer-choice "~/Documentos/org/index.org")
Iniciar cómo servidor
De este modo puedo usar emacsclient
desde la terminal y la sesión de emacs
existente.
(server-start)
Auto-guardado
Es bastante molesto que te vaya dejando la mierda por ahí, mejor en un directorio conjunto.
(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)
Modo por defecto
Al abrir un archivo o bufer sin algún modo asociado, se abrirá en modo texto.
(setq major-mode 'text-mode)
Acepta 'y' o 'n' cuando pide 'yes' o 'no'
(fset 'yes-or-no-p 'y-or-n-p)
Lenguaje por defecto en emacs y org-mode
(setq current-language-environment "Spanish")
(setq org-export-default-language "es")
Moverse por ventanas con shift
No funciona en org-mode
.
(when (fboundp 'windmove-default-keybindings)
(windmove-default-keybindings))
Helm
Copiado del git de helm. Esta es una configuración bastante mínima. Más información por aquí. Ahora mismo no está activo en mi configuración.
#+name:helm
(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)
Buscar más eficazmente en Helm
Más información en este articulo. Desactivado actualmente.
#+name:buscar-helm
(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))
ivy-mode
Ivy es más liviano que helm, aunque más simple. Más información aquí.
#+name:ivy-mode
(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 y flx
(use-package smex :ensure t)
(use-package flx :ensure t)
(use-package diminish :ensure t)
:config
(ivy-mode 1)
: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)
;; 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)
)
:config
;; usar ffap
(setq counsel-find-file-at-point t)
:ensure t
)
(use-package swiper
:bind (
;; Sustituir isearch
("C-s" . swiper)
("C-r" . swiper)
)
:ensure t
)
Seguir enlaces simbólicos
(setq vc-follows-symlinks t)
Emparejar parentesis y otros
Empareja () [] {} y "".
(electric-pair-mode 1)
Mantener lista de buffers recientes
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.
(setq recentf-max-saved-items 30)
(setq recentf-max-menu-items 20)
(recentf-mode 1)
Guardar el layout tal cómo está
No está activo.
(desktop-save-mode 1)
No truncar líneas
(setq truncate-lines nil)
Programación
Auto identación
(global-set-key (kbd "RET") 'newline-and-indent)
Auto completado
Tiene como dependencia popup.
(use-package auto-complete
:init
(use-package auto-complete-config
:init
(use-package popup
:ensure t
)
)
:config
(ac-config-default)
:ensure t
)
Magit
(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
)
El wrapper es el siguiente:
#!/bin/bash
torify git "$@"
Aviso de errores con flycheck
Solo me interesa para python-mode.
(use-package flycheck
:config
(setq flycheck-global-modes '(python-mode))
(global-flycheck-mode)
:diminish flycheck-mode
:ensure t
)
Necesita pylint para funcionar mejor, por lo que hay que configurarlo minimamente.
# Lo instalamos
sudo pip install pylint
# Creamos archivo de configuración
pylint --generate-rcfile > ~/.pylintrc
Si no se quiere que aparezcan ciertos errores, se busca el código de estos en esta web y se añade a la variable disabled
del archivo de configuración.
Los que yo he desactivado son los siguientes:
grep "^disable=" ~/.pylintrc
disable=setslice-method,delslice-method,nonzero-method,long-builtin,coerce-method,old-division,reload-builtin,filter-builtin-not-iterating,oct-method,old-ne-operator,parameter-unpacking,execfile-builtin,import-star-module-level,no-absolute-import,standarderror-builtin,round-builtin,unicode-builtin,getslice-method,apply-builtin,reduce-builtin,cmp-method,buffer-builtin,metaclass-assignment,file-builtin,indexing-exception,suppressed-message,backtick,dict-view-method,map-builtin-not-iterating,unpacking-in-except,old-octal-literal,using-cmp-argument,raw_input-builtin,coerce-builtin,input-builtin,old-raise-syntax,long-suffix,dict-iter-method,intern-builtin,print-statement,useless-suppression,hex-method,raising-string,cmp-builtin,range-builtin-not-iterating,unichr-builtin,basestring-builtin,xrange-builtin,zip-builtin-not-iterating,next-method-called,C0111,W0702,R0201,W0223,R0913,R0914,C0103,R0902,W0703,R0912
Insertar licencia
(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/"))
)
Borrar espacios sobrantes
Al guardar, borrar los que sobren de cada linea despues de el último carácter.
(add-hook 'before-save-hook 'delete-trailing-whitespace)
Usar ssh con tramp
Por defecto usa scp, que es muy lento. Así se usará ssh.
(setq tramp-default-method "ssh")
Golden Ratio
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
(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"))
:diminish golden-ratio-mode
:ensure t
)
Terminal
Establecer shell.
(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)
Cambiar de ventana más comodamente
(use-package switch-window
:ensure t
:bind ("C-x o" . switch-window)
)
undo-tree
Visualiza los cambios hechos con un arbol. Además, cuando se tira para atras y se hace un cambio, los primeros siguen accesibles.
(use-package undo-tree
:diminish undo-tree-mode
:ensure t
:config
(global-undo-tree-mode)
(setq undo-tree-visualizer-timestamps t)
)
Sobreescribir al seleccionar texto
No está activo.
(delete-selection-mode t)
Aspecto
Tema cyberpunk
(use-package cyberpunk-theme
:config (load-theme 'cyberpunk t)
:ensure t
:init (custom-set-variables
'(custom-safe-themes
(quote
("71ecffba18621354a1be303687f33b84788e13f40141580fa81e7840752d31bf" default)))
))
Powerline modificada
Lo siguiente lo he cogido de la configuración de Dennis Ogbe, modificando sólo los colores (creo).
(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."))))
Formato de las columnas de númeracion
Por defecto no se activan, hay que hacerlo a mano con M-x linum-mode
.
(setq linum-format "%4d \u2502 ")
Ventana limpia
Sin scroll bar, menu bar ni tool bar.
(tool-bar-mode -1)
(scroll-bar-mode -1)
(menu-bar-mode -1)
UTF-8
(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))
Tipo de fuente
(custom-set-faces '(default ((t (:family "DejaVu Sans Mono" :foundry "unknown" :slant normal :weight normal :height 107 :width normal)))))
Partir buffers de manera más bonita
(add-to-list 'default-frame-alist '(height . 40))
(add-to-list 'default-frame-alist '(width . 90))
Scroll
Similar a la manera de vim. No tengo claro en que se diferencia, pero me gusta cómo funciona.
(setq scroll-step 1
scroll-conservatively 10000)
(setq scroll-margin 80
scroll-conservatively 3000
scroll-up-aggressively 0.02
scroll-down-aggressively 0.02)
Configuración por modos
JSON
Los archivos cuyo nombre termine por los mencionados abajo, usarán json-mode
.
(use-package json-mode
:mode "\\.json\\'"
:ensure t)
Haskel
Lo usé un tiempo para xmonad, pero ya no está activo.
(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
)
Markdown
Cargar markdown-mode
, usar utf-8 al exportar y asociar el modo a las extensiones ".md" y ".markdown".
(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
)
python
Carga el modo python-mode.el
, que no es el que trae emacs por defecto, activa la identación inteligente y establece la version de python 3.
(unless (require 'ivy nil 'noerror)
(sleep-for 5))
(use-package python-mode
:init
(setq py-smart-indentation t)
(setq py-shell-name "/usr/local/bin/python3")
(setq py-python-command "python3")
:ensure t
)
Carga el pep8. Se ejecuta con M-x pep8
. Hay que instalar el paquete pep8
mediante pip
.
(use-package pep8
:ensure t)
Este paquete muestra una ralla que marca los 79 carácteres, para cumplir con el pep8.
(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
)
Configura el virtualenv
y el virtualenvwrapper
.
(use-package virtualenvwrapper
:init
(setq venv-location "~/.env/")
(venv-initialize-eshell)
(venv-initialize-interactive-shells)
:ensure t
)
web-mode
No lo he mirado mucho ya que apenas lo uso, es un copia-pega.
(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))
DockerFile
Editar archivos DockerFile.
(use-package dockerfile-mode
:mode "Dockerfile\\'"
:ensure t)
kivy-mode
Si el paquete no está instalado, lo instala mediante el-get.
(use-package kivy-mode
:mode "\\.kv\\'"
:ensure t
)
po-mode
(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)))))
)
org-mode
Definir fuente de el-get
Se usa la rama maint
del repositorio git. Primero se comprueba si está instalado, de no ser así se instalará. Tardará un buen rato.
;; 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)
)
Agenda
Definir archivos de la agenda
(setq org-agenda-files '("~/Documentos/org/index.org" "~/Documentos/org/archive_index.org" "~/Documentos/org/notas.org"))
Definir archivo de notas para org-capture
(setq org-default-notes-file "~/Documentos/org/notas.org")
Estados de los objetos de las listas
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.
(setq org-todo-keywords
'((sequence "TODO(t)" "NEXT(n)" "IN-PROGRESS(p@/!)" "WAITING(w@/!)" "|" "DONE(d!)" "CANCELED(c@)")))
Refile
Mover un arbol debajo de otro del mismo fichero o de los archivos de las agendas.
(setq org-refile-targets '((nil :maxlevel . 10) (org-agenda-files . (:maxlevel . 4))))
Caldav
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í:
(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/archive_index.org" "~/Documentos/org/notas.org"))
(setq org-caldav-inbox '(id "c14f-42fe-a358-648240e73991"))
(setq org-caldav-save-directory "~/Documentos/org/")
)
Esto es un workaround para un bug raro de url-cookie:
;; 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)))))
Configuración del calendario
(setq org-icalendar-timezone "Europe/Madrid")
calfw
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. Ahora mismo no lo tengo activo.
(if (not (el-get-package-installed-p 'calfw))
(el-get 'sync 'calfw)
)
(use-package calfw
:config
(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" "Decembre"])
(setq calendar-day-name-array
["Diumenge" "Dilluns" "Dimarts" "Dimecres" "Dijous" "Divendres" "Dissabte"])
)
Tareas repetitivas
Las tareas marcadas para repetirse, al marcarlas cómo DONE vuelven al estado TODO y añade un timestamp del dia y la hora.
(setq org-log-repeat 'time)
Cambiar el formato de CLOCKTABLE
Por defecto, al pasar de las 24 horas dedicadas, lo mostrará cómo 1d. Con el siguiente snippet, seguirá mostrando horas.
(setq org-time-clocksum-format
'(:hours "%d" :require-hours t :minutes ":%02d" :require-minutes t))
Edición, diseño y varios
Atajos de teclado
org-iswitchb
muestra todos los buffers de org-mode
abiertos.
; (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)
Definir lenguajes que entiende babel
(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)))
Asteriscos bonitos
Requerir el paquete y activarlo sólo cuando se abra un buffer de org-mode
.
(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
)
Seguir links
Presionando tanto RET cómo TAB.
(setq org-return-follows-link t)
(setq org-tab-follows-link t)
Exportar Markdown
(use-package ox-md)
Configuracion de bloques de código
La primera linea formatea el código cómo si se tratase de código nativo, la segunda indenta acorde al código.
(setq org-src-fontify-natively t)
(setq org-src-tab-acts-natively t)
(setq org-babel-python-command "python3")
Elementos de marcado
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 =.
(setq org-hide-emphasis-markers t)
(add-to-list 'org-emphasis-alist '("=" (:foreground "cyan")))
Quitar confirmación al evaluar código
Cada vez que se evalua código de un bloque, pide que se confirme. Con el siguiente código, no lo hará.
(setq org-confirm-babel-evaluate nil)
Añadir imágenes in-line
(org-display-inline-images t t)
org2blog
No está cargado ni configurado, lo mantengo por si acaso. Para publicar articulos con marcado org-mode
en wordpress.
(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)
org2nikola
Sirve para publicar en nikola
con marcado org-mode
. Si no está instalado, lo instala mediante el-get. Más información (o 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"
:load-path ("./")
))
(if (not (el-get-package-installed-p 'org2nikola))
(el-get 'sync 'org2nikola)
)
Las funciones cutres son mías, si me animo algún día las mejoraré.
#+name:org2nikola
;; Se instala el htmlize de melpa, el de org-mode es demasiado viejo
(use-package htmlize :ensure t)
(use-package org2nikola
:load-path "el-get/org2nikola/"
:config
(setq org2nikola-output-root-directory "~/Documentos/blog/")
(setq org2nikola-use-verbose-metadata t)
(defun blog/build ()
"Construye la web."
(interactive)
(compile (concat "source ~/.env/blog/bin/activate; cd " org2nikola-output-root-directory "; bash scripts/construir.sh; deactivate") t))
(defun blog/serve ()
"Sirve la web en un servidor web interno."
(interactive)
(compile (concat "source ~/.env/blog/bin/activate; cd " org2nikola-output-root-directory "; qutebrowser --target tab-bg-silent http://localhost:8000 2> /dev/null &; nikola serve; deactivate;") t))
(defun blog/clean ()
"Borra la carpeta output para empezar de cero."
(interactive)
(compile (concat "source ~/.env/blog/bin/activate; cd " org2nikola-output-root-directory "; nikola clean; deactivate")) t)
(defun blog/deploy ()
"Despliega la web al momento preguntando por el nombre del commit."
(interactive)
(compile (concat "source ~/.env/blog/bin/activate; cd " org2nikola-output-root-directory "; nikola deploy; deactivate;") t))
(defun blog/autodeploy ()
"Despliega la web automáticamente el día designado."
(interactive)
(insert
(compile (concat "/usr/local/bin/programa-post " (org-read-date)))))
(defun blog/url-post ()
"Devuelve el enlace del articulo en el que esté el cursor."
(interactive)
(setq url (concat "https://daemons.cf/posts/"
(cdr (car (org-entry-properties (point) "post_slug")))))
(message url)
(kill-new url)
)
(defun blog/url-config ()
"Devuelve el enlace de la parte de la configuración en la que esté el cursor."
(interactive)
(setq url (concat "https://daemons.cf/stories/mi-configuracin-de-emacs/#"
(cdr (car (org-entry-properties (point) "CUSTOM_ID")))))
(message url)
(kill-new url)
)
)
Notas a pie de página
Prefiero que aparezcan las notas debajo del arbol en el que se ha tomado.
(setq org-footnote-section nil)
toc-org
Ando trasteando toc-org para crear tablas de contenido exportables en org-mode. Aún no está listo.
(use-package toc-org
:ensure t
:init
(add-hook 'org-mode-hook 'toc-org-enable)
)
Cifrar archivos
(use-package epa-file
:init
(epa-file-enable)
)
Generar id para cabeceras de manera dinámica
A diferencia de la función de writequit, esta establece el título como custom_id.
;; 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))))
Hábitos
(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 80
org-habit-show-habits-only-for-today t
org-habit-show-all-today t)
)
org-protocol
(use-package org-protocol)
Empareja simbolos de marcado y paréntesis
(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)
Capturas de notas
(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 "~/Documentos/blog/Articulos/articulos.org" "Blog")
"* 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")
))
(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")
("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")
)))
Comandos de Agenda
#+name:custom-commands
(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"))))))
("p" . "Projectes Personals")
("pp" "Projectes Personals" tags-todo "projectes")
("pg" "General" tags-todo "general")
("pi" "isso-gnusocial" tags-todo "issoGnusocial")
("pr" "gnusrss" tags-todo "gnusrss")
("pj" "jabbergram" tags-todo "jabbergram")
("v" "Relacionat amb els VPS / chustaserver" tags-todo "vps")
("w" "Webs" tags "" ((org-agenda-files '("~/Documentos/org/web.org"))))
)
)
Funciones personalizadas
Recargar todos los buffers abiertos
Es útil cuando los archivos se suelen sincronizar y se deja el pc abierto. Los archivos que esten abiertos y hayan cambiado, se refrescaran.
(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."))
Insertar cabeceras para org-mode
#+name:insertar-cabeceras
(defun insert-header-org-mode (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"))
)
)
)
Insertar bloque src para org-mode
Además, funciona tanto sin ninguna región activa cómo con esta. De haber región activa, la envuelve.
#+name:insertar-bloque
(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")))))
Insertar org-entities
Más información aquí.
#+name:insertar-entidades
(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)
Añadir soporte para editar archivos en docker
Usar del siguiente modo: /docker:drunk_bardeen:/etc/passwd
. Sacado de la wiki de emacs. Se puede usar el siguiente alias en bash para ver el nombre del container en ejecución:
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)} }'"
Desactivado de momento, no tengo docker
en este pc.
#+name:docker-tramp
(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))
Insertar fecha de hoy
(defun insert-todays-date(arg)
(interactive "P")
(insert (if arg (format-time-string "%d-%m-%Y")
(format-time-string "%d-%m-%Y")
)
)
)
Abrir eshell aquí
Sacada de la web Howardism.
(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)))
Devolver enlaces
No le servirá de mucho a nadie, lo uso para copiar en el portapapeles las direcciones de un articulo de mi web.