Emacs + Hugo: Haciendo 휴고 블로그 모드(II)
automatizando el flujo de publicación del blog usando 스크립트. En este les mostraré como llevamos esos scripts a un modo de Emacs.
마노스 알 이맥스.
Una de las ventajas de Emacs es su extensibilidad, con un poco de
편집자 추가 정보 Elisp podemos adicionar nuevas funcionalidades al Editor
Aunque sería posible hacer un modo 1 블로그에 대한 경험이 많지 않은 경우, 블로그에 더 많이 등록하십시오. 2 .
Planeando las funcionalidades.
Necesitamos 3 funcionalidades básicas para trabajar en nuestro blog.
Con esto en mente podemos crear el esqueleto de las funciones
(defun hugo-blow-new (path)
"Create new content in PATH.")
(defun hugo-blog-publish ()
"Generate the site and commit everything.")
(defun hugo-blog-preview (arg)
"Launches a preview HTTP server. If ARG is provided also render drafts.")
구성 옵션.
필수 구성 요소인 Vamos:
hugo
. (defgroup hugo-blog nil
"Hugo blog mode customizations"
:group 'tools)
(defcustom hugo-blog-command "hugo"
"Path to hugo's executable."
:group 'hugo-blog
:type 'string)
(defcustom hugo-blog-project ""
"Blog directory project."
:group 'hugo-blog
:type 'string)
(defcustom hugo-blog-process-buffer "*hugo-blog-process*"
"Hugo blog process buffer."
:group 'hugo-blog
:type 'string)
기능 드 soporte.
구성 가능한 옵션 정의
necesitamos englobar algunas funcionalidades comunes en funciones de soporte.
Emacs nos brinda funciones para ejecutar programas externos o comandos del shell. La forma simple sería ejecutar los 스크립트
de shell que tenemos definidos, pero es mucho más interesante reproducir la funcionalidad en Elisp. Veamos por ejemplo como podemos ejecutar
hugo
y capturar la salida en busca de mensajes de error.(defun hugo-blog-run-command (command parameters)
"Run COMMAND with PARAMETERS with `hugo-blog-project' as working directory.
Returns the command's output as a string"
(cd hugo-blog-project)
(let ((output (shell-command-to-string
(concat hugo-blog-command
" "
command
" "
parameters))))
(if (string-match-p "Error" output)
nil
output)))
라 펑션 레토르나
nil
en caso de error o el mensaje resultado de la llamada en otro casoAsí mismo podemos definir el resto de las funciones necesarias.
(require 'git) ;; git related functions
(defmacro with-git-repo (repo &rest body)
"Run BODY using git repository REPO."
`(let ((git-repo ,repo))
,@body))
(defun git-modified-files ()
"Return list of untracked files."
(git--lines
(git-run "ls-files" "-m" "--exclude-standard")))
(defsubst hugo-blog-submodule ()
"Inline function to get the submodule."
(concat hugo-blog-project (f-path-separator) "public"))
(defun hugo-blog--commit-all ()
"Commits the submodule and then the project."
(with-git-repo (hugo-blog-submodule)
(when (git-modified-files)
(git-add)
(git-commit (concat "Commit on "
(current-time-string)))))
(with-git-repo hugo-blog-project
(when (git-modified-files)
(git-add)
(git-add "public") ;; Let's be really sure
(git-commit (concat "Commit on "
(current-time-string))))))
Completando las funcionalidades
Con ayuda de las funciones auxiliares podemos desarrollar los comandos necesarios. Es Importante notar que todas las funciones están marcadas como
autoload
전자 interactive
así estarán disponibles como comandos en el editor y sería más fácil distribuirlas en un paquete.
;;;###autoload
(defun hugo-blog-new (path)
"Create new content in PATH."
(interactive "sNew content path: ")
(cd hugo-blog-project)
(let ((output (hugo-blog-run-command "new" path)))
(if output
(find-file-existing (car (split-string output " ")))
(error "Command hugo returned an error, check your configuration"))))
;;;###autoload
(defun hugo-blog-publish ()
"Generate the site and commit everything."
(interactive)
(save-some-buffers) ;; avoid commiting emacs weird files
(when (yes-or-no-p "This will commit changes, are you sure? ")
(hugo-blog-run-command "--noChmod" "--noTimes --ignoreCache")
(hugo-blog--commit-all)))
;;;###autoload
(defun hugo-blog-preview (arg)
"Launches a preview HTTP server. If ARG is provided also render drafts."
(interactive "P")
(unless (process-status "hugo")
(cd hugo-blog-project)
(when arg
(start-process "hugo" hugo-blog-process-buffer
hugo-blog-command "-D" "server"))
(unless arg
(start-process "hugo" hugo-blog-process-buffer
hugo-blog-command "server")))
(sleep-for 5)
(with-current-buffer hugo-blog-process-buffer
(goto-char (point-max))
(if (re-search-backward "http://localhost:[0-9]+/" nil t)
(browse-url (match-string 0))
(error "Error executing hugo"))))
Los modos de son conjuntos de funcionalidades que extienden el editor en distintas maneras, muchos incluso hacen cambios en la forma en que interactuamos con Emacs ↩
특별한 기능을 수행할 수 있는 특별한 기능을 수행할 수 없습니다. ↩
Reference
이 문제에 관하여(Emacs + Hugo: Haciendo 휴고 블로그 모드(II)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/yorodm/emacs-hugo-haciendo-hugo-blog-mode-ii-2b2d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)