From 2bb8756607edcc0ad7ee0e5b2f0e47d9b30a764f Mon Sep 17 00:00:00 2001 From: Alan Pearce Date: Mon, 2 Nov 2015 17:32:45 +0100 Subject: Emacs: Install dockerfile-mode --- tag-emacs/emacs.d/Cask | 1 + tag-emacs/emacs.d/init.org | 3 +++ 2 files changed, 4 insertions(+) (limited to 'tag-emacs') diff --git a/tag-emacs/emacs.d/Cask b/tag-emacs/emacs.d/Cask index ead4a52..096b802 100644 --- a/tag-emacs/emacs.d/Cask +++ b/tag-emacs/emacs.d/Cask @@ -34,6 +34,7 @@ (depends-on "dired-subtree") (depends-on "discover") (depends-on "discover-my-major") +(depends-on "dockerfile-mode") (depends-on "dtrt-indent") (depends-on "editorconfig") (depends-on "elisp-slime-nav") diff --git a/tag-emacs/emacs.d/init.org b/tag-emacs/emacs.d/init.org index 8d82022..42332b8 100644 --- a/tag-emacs/emacs.d/init.org +++ b/tag-emacs/emacs.d/init.org @@ -1436,6 +1436,9 @@ configuration files. (req-package haskell-mode :mode (("\\.hs\\'" . haskell-mode))) + (req-package dockerfile-mode + :mode (("Dockerfile\\'" . dockerfile-mode))) + (req-package nix-mode :mode (("\\.nix\\'" . nix-mode)) :config (progn -- cgit 1.4.1 From 0f36ecdade396e397c19b13309c7d9743bd0cedd Mon Sep 17 00:00:00 2001 From: Alan Pearce Date: Tue, 3 Nov 2015 17:17:39 +0100 Subject: Emacs: Install and configure coffee-mode --- tag-emacs/emacs.d/init.org | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'tag-emacs') diff --git a/tag-emacs/emacs.d/init.org b/tag-emacs/emacs.d/init.org index 42332b8..e36d3a5 100644 --- a/tag-emacs/emacs.d/init.org +++ b/tag-emacs/emacs.d/init.org @@ -1963,6 +1963,13 @@ it though (add-to-list 'auto-mode-alist '("composer\\.lock" . js-mode)) #+END_SRC +*** coffee-mode + +#+BEGIN_SRC emacs-lisp + (req-package coffee-mode + :mode ("\\.coffee\\'" . coffee-mode)) +#+END_SRC + *** tern Tern understands javascript. It adds really clever documented -- cgit 1.4.1 From 8dd85354ccc40bfbb43bf0051074e17ec3d58f94 Mon Sep 17 00:00:00 2001 From: Alan Pearce Date: Thu, 5 Nov 2015 09:16:59 +0100 Subject: Emacs: Background-load cc-mode --- tag-emacs/emacs.d/init.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tag-emacs') diff --git a/tag-emacs/emacs.d/init.org b/tag-emacs/emacs.d/init.org index e36d3a5..464b0cb 100644 --- a/tag-emacs/emacs.d/init.org +++ b/tag-emacs/emacs.d/init.org @@ -1903,7 +1903,7 @@ quite a few other modes are derived from it. #+BEGIN_SRC emacs-lisp (req-package cc-mode - :defer t + :defer 5 :init (progn (add-hook 'c-mode-common-hook #'electric-indent-mode)) :config (progn -- cgit 1.4.1 From e52aef3c88ff8487605ab8773959a493a5734616 Mon Sep 17 00:00:00 2001 From: Alan Pearce Date: Mon, 9 Nov 2015 09:16:22 +0100 Subject: Emacs: Load skewer in web-mode --- tag-emacs/emacs.d/init.org | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'tag-emacs') diff --git a/tag-emacs/emacs.d/init.org b/tag-emacs/emacs.d/init.org index 464b0cb..94d2bf8 100644 --- a/tag-emacs/emacs.d/init.org +++ b/tag-emacs/emacs.d/init.org @@ -1930,12 +1930,13 @@ really seem to use it. I don’t use this as often as I probably should. I should figure out why that is. #+BEGIN_SRC emacs-lisp -(req-package skewer-mode - :defer t - :init (progn - (add-hook 'js2-mode-hook #'skewer-mode) - (add-hook 'html-mode-hook #'skewer-html-mode) - (add-hook 'css-mode-hook #'skewer-css-mode))) + (req-package skewer-mode + :defer t + :init (progn + (add-hook 'js2-mode-hook #'skewer-mode) + (add-hook 'html-mode-hook #'skewer-html-mode) + (add-hook 'web-mode-hook #'skewer-html-mode) + (add-hook 'css-mode-hook #'skewer-css-mode))) #+END_SRC *** js2-mode -- cgit 1.4.1 From 0ad05722d21d6d8dcb953fd9fa9297f1ce49bf60 Mon Sep 17 00:00:00 2001 From: Alan Pearce Date: Mon, 9 Nov 2015 09:16:44 +0100 Subject: Emacs: Load modules on startup --- tag-emacs/emacs.d/init.org | 1 + 1 file changed, 1 insertion(+) (limited to 'tag-emacs') diff --git a/tag-emacs/emacs.d/init.org b/tag-emacs/emacs.d/init.org index 94d2bf8..4f5133e 100644 --- a/tag-emacs/emacs.d/init.org +++ b/tag-emacs/emacs.d/init.org @@ -1566,6 +1566,7 @@ Org is wünderbar. org-log-into-drawer "LOGBOOK") (set-register ?o `(file . ,(expand-file-name "organiser.org" org-directory))) (add-hook 'org-mode-hook #'turn-on-auto-fill) + (org-load-modules-maybe t) (defadvice org-clock-in (after wicked activate) "Mark STARTED when clocked in" (save-excursion -- cgit 1.4.1 From c416be67dfc497c1ae7b771e9cce94a5697cbea6 Mon Sep 17 00:00:00 2001 From: Alan Pearce Date: Tue, 10 Nov 2015 15:21:10 +0100 Subject: Emacs: Improve tangling usability Show a message when tangling and make the function a command --- tag-emacs/emacs.d/init.org | 2 ++ 1 file changed, 2 insertions(+) (limited to 'tag-emacs') diff --git a/tag-emacs/emacs.d/init.org b/tag-emacs/emacs.d/init.org index 4f5133e..f276658 100644 --- a/tag-emacs/emacs.d/init.org +++ b/tag-emacs/emacs.d/init.org @@ -2530,7 +2530,9 @@ the =org=-document after changes. "If the current buffer is 'init.org' the code-blocks are tangled, and the tangled file is compiled." + (interactive) (when (string-suffix-p "init.org" (buffer-file-name)) + (message "Tangling init") (async-start `(lambda () ;; Avoid running hooks when tangling. -- cgit 1.4.1 From c51f934a0102cd2f684e18333a4e53eebf5bd8d7 Mon Sep 17 00:00:00 2001 From: Alan Pearce Date: Tue, 10 Nov 2015 15:28:58 +0100 Subject: Emacs: Remove php-extras company backend --- tag-emacs/emacs.d/init.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tag-emacs') diff --git a/tag-emacs/emacs.d/init.org b/tag-emacs/emacs.d/init.org index f276658..9dd213d 100644 --- a/tag-emacs/emacs.d/init.org +++ b/tag-emacs/emacs.d/init.org @@ -882,7 +882,7 @@ seems to work perfectly well for me. :bind (("C-" . company-complete)) :init (progn (add-hook 'prog-mode-hook #'company-mode) - (setq company-backends '(company-tern (php-extras-company company-elisp company-bbdb company-nxml company-css company-eclim company-semantic company-clang company-xcode company-cmake company-capf company-gtags company-dabbrev-code company-etags company-keywords) + (setq company-backends '(company-tern (company-elisp company-bbdb company-nxml company-css company-eclim company-semantic company-clang company-xcode company-cmake company-capf company-gtags company-dabbrev-code company-etags company-keywords) company-oddmuse company-files company-dabbrev) company-idle-delay .3 company-begin-commands '(self-insert-command) -- cgit 1.4.1 From 095a891232b8742584855dc449335f69089d8286 Mon Sep 17 00:00:00 2001 From: Alan Pearce Date: Tue, 10 Nov 2015 15:37:03 +0100 Subject: Emacs: Fix M-q binding --- tag-emacs/emacs.d/init.org | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'tag-emacs') diff --git a/tag-emacs/emacs.d/init.org b/tag-emacs/emacs.d/init.org index 9dd213d..319ca7b 100644 --- a/tag-emacs/emacs.d/init.org +++ b/tag-emacs/emacs.d/init.org @@ -2169,9 +2169,9 @@ nice, when I remember to use it. (req-package esh-buf-stack :require eshell :config (progn - (bind-key "M-q" #'eshell-push-command eshell-mode-map)) - :init (progn - (setup-eshell-buf-stack))) + (setup-eshell-buf-stack) + (add-hook 'eshell-load-hook (lambda () + (bind-key "M-q" #'eshell-push-command eshell-mode-map))))) #+END_SRC *** Shells -- cgit 1.4.1 From 20e56f1995e9bbf01c099d3d80e852aebe6aff8b Mon Sep 17 00:00:00 2001 From: Alan Pearce Date: Wed, 11 Nov 2015 14:52:25 +0100 Subject: Emacs: Move ap-functions into init file --- tag-emacs/emacs.d/elisp/ap-functions.el | 47 ------------------------------ tag-emacs/emacs.d/init.org | 51 ++++++++++++++++++++++++--------- 2 files changed, 37 insertions(+), 61 deletions(-) delete mode 100644 tag-emacs/emacs.d/elisp/ap-functions.el (limited to 'tag-emacs') diff --git a/tag-emacs/emacs.d/elisp/ap-functions.el b/tag-emacs/emacs.d/elisp/ap-functions.el deleted file mode 100644 index bdc7fae..0000000 --- a/tag-emacs/emacs.d/elisp/ap-functions.el +++ /dev/null @@ -1,47 +0,0 @@ -;;;###autoload -(defun ap/remove-extra-cr () - "Remove extraneous CR codes from a file" - (interactive) - (save-excursion - (goto-char (point-min)) - (while (search-forward " -" nil t) - (replace-match "")))) - -;;;###autoload -(defun copy-rectangle (start end) - "Copy the region-rectangle." - (interactive "r") - (setq killed-rectangle (extract-rectangle start end))) - -;;;###autoload -(defun eval-and-replace () - "Replace the preceding sexp with its value." - (interactive) - (backward-kill-sexp) - (condition-case nil - (prin1 (eval (read (current-kill 0))) - (current-buffer)) - (error (message "Invalid expression") - (insert (current-kill 0))))) - -;;;###autoload -(defun shell-execute (to-current-buffer) - (interactive "P") - (let ((file-buffer (if (buffer-file-name) - (file-name-nondirectory (buffer-file-name)) - "")) - (command (read-shell-command "Shell command: " nil nil nil))) - (shell-command (replace-regexp-in-string "%" file-buffer command) to-current-buffer))) - -;;;###autoload -(defun narrow-to-region-indirect (start end) - "Restrict editing in this buffer to the current region, indirectly." - (interactive "r") - (deactivate-mark) - (let ((buf (clone-indirect-buffer nil nil))) - (with-current-buffer buf - (narrow-to-region start end)) - (switch-to-buffer buf))) - -(provide 'ap-functions) diff --git a/tag-emacs/emacs.d/init.org b/tag-emacs/emacs.d/init.org index 319ca7b..ce1a1f6 100644 --- a/tag-emacs/emacs.d/init.org +++ b/tag-emacs/emacs.d/init.org @@ -29,14 +29,6 @@ the buffer to be empty. * Packaging -I still use a couple of [[file:elisp/][elisp files]] that don’t appear to be in any package -archives. -#+BEGIN_SRC emacs-lisp -(add-to-list 'load-path (expand-file-name "elisp/" user-emacs-directory)) -#+END_SRC - -** TODO Move [[file:elisp/ap-functions.el][=ap-functions=]] into this file and delete above - ** Cask For most packages, I use [[https://github.com/cask/cask][cask]] @@ -338,7 +330,7 @@ because I manage those in my [[file:~/projects/dotfiles/tag-xresources/xresource ((eq window-system 'w32) (ap/set-fonts "Consolas" "Segoe UI" 10)) ((eq system-type 'darwin) - (ap/set-fonts "Input Mono Narrow" "Input Sans Condensed" 12)))) + (ap/set-fonts "Input Mono" "Input Sans Condensed" 13)))) #+END_SRC Allow font-lock-mode to do background parsing. I’m not really sure if @@ -1162,10 +1154,40 @@ Option/alt, then Control. indentation::space indentation::tabs))) - (req-package ap-functions - :commands (ap/remove-extra-cr) - :bind (("C-x r M-w" . copy-rectangle) - ("M-!" . shell-execute))) + (defun ap/remove-extra-cr () + "Remove extraneous CR codes from a file" + (interactive) + (save-excursion + (goto-char (point-min)) + (while (search-forward " + " nil t) + (replace-match "")))) + + (req-package rect + :init (defun copy-rectangle (start end) + "Copy the region-rectangle." + (interactive "r") + (setq killed-rectangle (extract-rectangle start end)))) + + (defun shell-execute (to-current-buffer) + (interactive "P") + (let ((file-buffer (if (buffer-file-name) + (file-name-nondirectory (buffer-file-name)) + "")) + (command (read-shell-command "Shell command: " nil nil nil))) + (shell-command (replace-regexp-in-string "%" file-buffer command) to-current-buffer))) + + (defun narrow-to-region-indirect (start end) + "Restrict editing in this buffer to the current region, indirectly." + (interactive "r") + (deactivate-mark) + (let ((buf (clone-indirect-buffer nil nil))) + (with-current-buffer buf + (narrow-to-region start end)) + (switch-to-buffer buf))) + + (bind-key* "M-!" #'shell-execute) + (bind-key* "C-x r M-w" #'copy-rectangle) #+END_SRC #+END_SRC @@ -1539,7 +1561,8 @@ Org is wünderbar. org-reverse-note-order t org-modules '(org-habit - org-checklist) + org-checklist + org-protocol) ;; Add time done to ‘done’ tasks org-log-done 'time -- cgit 1.4.1 From 47dd9149961f48bc1e1dc66916a9225db81d7845 Mon Sep 17 00:00:00 2001 From: Alan Pearce Date: Thu, 12 Nov 2015 12:45:07 +0100 Subject: Emacs: Remove apparently-unused packages --- tag-emacs/emacs.d/init.org | 143 +++++---------------------------------------- 1 file changed, 13 insertions(+), 130 deletions(-) (limited to 'tag-emacs') diff --git a/tag-emacs/emacs.d/init.org b/tag-emacs/emacs.d/init.org index ce1a1f6..ef9e491 100644 --- a/tag-emacs/emacs.d/init.org +++ b/tag-emacs/emacs.d/init.org @@ -164,17 +164,6 @@ based upon some folder conventions I use. projectile-completion-system 'ivy))) #+END_SRC -** projector - -Project-based shell buffers sounds like a good idea, but for some -reason I haven’t found a use for it. - -#+BEGIN_SRC emacs-lisp -(req-package projector - :require projectile - :bind (("s-z" . projector-open-project-shell))) -#+END_SRC - ** perspective This package makes buffer-switching inside of projects make sense, by @@ -485,19 +474,6 @@ for similar things any more. :bind ("M-SPC" . shrink-whitespace)) #+END_SRC -** fasd - -Fasd is a nice shell plugin that remembers file and folder arguments, -making it easy to re-visit them later. This package hooks into that. -I don’t seem to use it much though. - -#+BEGIN_SRC emacs-lisp -(req-package fasd - :bind ("C-x C-/" . fasd-find-file) - :init (progn - (global-fasd-mode 1))) -#+END_SRC - ** recentf I only use this occasionally, but it’s nice for files outside of projects. @@ -526,7 +502,7 @@ it off to see if I notice it. #+BEGIN_SRC emacs-lisp (req-package saveplace - :config (progn (setq-default save-place t) + :config (progn (setq-default save-place nil) (setq save-place-file (expand-file-name ".saveplace" user-emacs-directory)))) #+END_SRC @@ -728,19 +704,6 @@ Enable it without prompting (put 'narrow-to-region 'disabled nil) #+END_SRC -** Fancy Narrow - -Sometimes I like to be able to focus on one block of code at a time. -Normally narrowing hides everything else completely, which I don’t -like. This package just makes everything else lower-contrast. -#+BEGIN_SRC emacs-lisp - (req-package fancy-narrow - :defer 15 - :diminish fancy-narrow-mode - :config (fancy-narrow-mode 1)) -#+END_SRC - - ** ace-window I don’t often have many windows open at once, but when I do, @@ -796,20 +759,6 @@ A dedicated window always keeps the same buffer in view. "normal"))) #+END_SRC -** popwin - -This works really nicely wiht helm. I should think about whether it -might be useful elsewhere - -#+BEGIN_SRC emacs-lisp -(req-package popwin - :if (and (>= emacs-major-version 24) - (> emacs-minor-version 3)) - :config (progn - (popwin-mode 1) - (add-to-list 'popwin:special-display-config '("^*helm.+*$" :regexp t :height 20)))) -#+END_SRC - ** winner Undo, for window-based commands. @@ -1139,21 +1088,6 @@ Option/alt, then Control. "Where the emacs init file really is, passing through symlinks.") (set-register ?e `(file . ,*init-file*)) - (req-package whitespace - :defer t - :config (setq whitespace-style - '(face - space - tabs - trailing - newline - empty - tab-mark - space-before-tab - indentation - indentation::space - indentation::tabs))) - (defun ap/remove-extra-cr () "Remove extraneous CR codes from a file" (interactive) @@ -1216,22 +1150,6 @@ Occasionally, I exit emacs. I should probably reduce the frequency of this. (defalias 'exit-emacs #'save-buffers-kill-emacs)) #+END_SRC -** helm - -I like to use =helm= for some completions, especially when there are -lots of candidates. - -#+BEGIN_SRC emacs-lisp - (req-package helm-config - :demand t - :ensure helm - :config (progn - (setq helm-idle-delay .1 - helm-input-idle-delay 0) - (when (fboundp #'helm-adaptive-mode) - (helm-adaptive-mode 1)))) -#+END_SRC - ** swiper/ivy Ivy is the new kid on the completion block. I wonder if it can @@ -1681,21 +1599,6 @@ I can use this to keep a journal. I should use it. #+END_SRC * Programming -** cedet - -*** TODO Setup cedet and see whether it’s useful - -#+BEGIN_SRC emacs-lisp -(req-package cedet - :disabled t - :config (progn - (semantic-load-enable-code-helpers) - (global-semantic-idle-completions-mode t) - (global-semantic-highlight-func-mode t) - (global-semantic-show-unmatched-syntax-mode t) - (global-semantic-decoration-mode t))) -#+END_SRC - ** flycheck On-the-fly error checking in programming modes? Yes please. @@ -1949,20 +1852,6 @@ really seem to use it. ** Web development -*** skewer-mode - -I don’t use this as often as I probably should. I should figure out -why that is. -#+BEGIN_SRC emacs-lisp - (req-package skewer-mode - :defer t - :init (progn - (add-hook 'js2-mode-hook #'skewer-mode) - (add-hook 'html-mode-hook #'skewer-html-mode) - (add-hook 'web-mode-hook #'skewer-html-mode) - (add-hook 'css-mode-hook #'skewer-css-mode))) -#+END_SRC - *** js2-mode This mode is really great for editing Javascript. It turns code into @@ -2200,28 +2089,22 @@ nice, when I remember to use it. *** Shells #+BEGIN_SRC emacs-lisp -(req-package shell - :defer t - :config (define-key shell-mode-map - (kbd "C-d") 'comint-delchar-or-eof-or-kill-buffer)) - -(req-package comint - :defer t - :config (bind-key "C-c C-l" #'helm-comint-input-ring comint-mode-map)) + (req-package shell + :defer t + :config (define-key shell-mode-map + (kbd "C-d") 'comint-delchar-or-eof-or-kill-buffer)) -(req-package multi-term - :if (not (eq system-type 'windows-nt)) - :bind ("C-`" . multi-term-dedicated-toggle)) + (req-package comint + :defer t + :config (bind-key "C-c C-l" #'helm-comint-input-ring comint-mode-map)) -(defun comint-delchar-or-eof-or-kill-buffer (arg) - (interactive "p") - (if (null (get-buffer-process (current-buffer))) - (kill-buffer) - (comint-delchar-or-maybe-eof arg))) + (defun comint-delchar-or-eof-or-kill-buffer (arg) + (interactive "p") + (if (null (get-buffer-process (current-buffer))) + (kill-buffer) + (comint-delchar-or-maybe-eof arg))) #+END_SRC -*** TODO Do I need multi-term? - * Text editing Emacs has an editor within. -- cgit 1.4.1 From 43d0e86610038d4b73a1675deabe02498b093e17 Mon Sep 17 00:00:00 2001 From: Alan Pearce Date: Fri, 13 Nov 2015 09:00:53 +0100 Subject: Emacs: Use only secure package archives --- tag-emacs/emacs.d/init.org | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'tag-emacs') diff --git a/tag-emacs/emacs.d/init.org b/tag-emacs/emacs.d/init.org index ef9e491..2673002 100644 --- a/tag-emacs/emacs.d/init.org +++ b/tag-emacs/emacs.d/init.org @@ -65,11 +65,10 @@ cask update #+BEGIN_SRC emacs-lisp (eval-and-compile - (setq package-archives '(("gnu" . "http://elpa.gnu.org/packages/") - ("marmalade" . "http://marmalade-repo.org/packages/") - ("melpa" . "http://melpa.org/packages/") - ("melpa-stable" . "http://stable.melpa.org/packages/") - ("org" . "http://orgmode.org/elpa/"))) + (setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/") + ("marmalade" . "https://marmalade-repo.org/packages/") + ("melpa" . "https://melpa.org/packages/") + ("melpa-stable" . "https://stable.melpa.org/packages/"))) (package-initialize) (unless (package-installed-p 'req-package) (package-refresh-contents) -- cgit 1.4.1 From fd9734e7eaac3749a2a0ae3f7e47f34515070866 Mon Sep 17 00:00:00 2001 From: Alan Pearce Date: Fri, 13 Nov 2015 10:02:41 +0100 Subject: Emacs: Improve TLS security --- tag-emacs/emacs.d/init.org | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'tag-emacs') diff --git a/tag-emacs/emacs.d/init.org b/tag-emacs/emacs.d/init.org index 2673002..ab2a087 100644 --- a/tag-emacs/emacs.d/init.org +++ b/tag-emacs/emacs.d/init.org @@ -64,6 +64,19 @@ cask update ** Req-package #+BEGIN_SRC emacs-lisp + (let ((trustfile + (replace-regexp-in-string + "\\\\" "/" + (replace-regexp-in-string + "\n" "" + (shell-command-to-string "python -m certifi"))))) + (setq tls-checktrust t + tls-program + (list + (format "gnutls-cli%s --x509cafile %s -p %%p %%h" + (if (eq window-system 'w32) ".exe" "") trustfile))) + (setq gnutls-verify-error t) + (setq gnutls-trustfiles (list trustfile))) (eval-and-compile (setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/") ("marmalade" . "https://marmalade-repo.org/packages/") -- cgit 1.4.1 From dc6b681b05468122c7602c24847b770d1402d2c8 Mon Sep 17 00:00:00 2001 From: Alan Pearce Date: Fri, 13 Nov 2015 15:35:32 +0100 Subject: Emacs: Use a proper ellipsis for elisions --- tag-emacs/emacs.d/init.org | 1 + 1 file changed, 1 insertion(+) (limited to 'tag-emacs') diff --git a/tag-emacs/emacs.d/init.org b/tag-emacs/emacs.d/init.org index ab2a087..6d319e5 100644 --- a/tag-emacs/emacs.d/init.org +++ b/tag-emacs/emacs.d/init.org @@ -1483,6 +1483,7 @@ Org is wünderbar. :init (setq org-replace-disputed-keys t) :config (progn (setq org-directory "~/Sync/org" + org-ellipsis "…" org-agenda-files `(,(concat org-directory "/agenda")) org-default-notes-file (concat org-directory "/notes") -- cgit 1.4.1