1

我正在学习 emacs lisp,我正在尝试使用它编写脚本。我写了一个脚本,它工作得很好,但我只是认为我在 bash 中做的很多事情我可以在 emacs lisp 中做。

大不了:我不确定我的启动过程是否正确

请建议/向我展示在我的脚本上编写脚本的 lisp 方式(例如):

#!/usr/bin/emacs --script
(message "Vision synchronization \n")
(let ((default-directory "/home/vision/"))
  (shell-command "git pull;")
  (princ (shell-command-to-string "git fetch upstream;git merge upstream/master;"))
  (princ (start-process "Vision push \n" "git" "git" "push")))

(message "Gentoo-haskell synchronization \n")
(let ((default-directory "/home/gentoo-haskell/"))
  (shell-command "git pull;")
  (princ (shell-command-to-string "git fetch upstream;git merge upstream/master;"))
  (princ (start-process "Gentoo-haskell push \n" "git" "git" "push")))

(message "Nengraphy synchronization \n")
(let ((default-directory "/home/nengraphy/"))
    (princ (start-process "Nengraphy pull \n" "git" "git" "pull")))

(message "Gentoo synchronization \n")
(let ((default-directory "/usr/portage/"))
  (message "Gentoo rsync (New files will be added, deprecated files will be deleted) : \n")
  (princ (shell-command-to-string "rsync --recursive --links --safe-links --perms --times --compress --force --whole-file --delete --timeout=180 --exclude=/.git --exclude=/metadata/cache/ --exclude=/distfiles --exclude=/local --exclude=/packages rsync://209.177.148.226/gentoo-portage/ /usr/portage/"))
  (message "We want to make extra-sure that we don't grab any metadata, since we don't keep metadata for the gentoo.org tree (space reasons)")
  (shell-command "[ -e metadata/cache ] && rm -rf metadata/cache")
  (shell-command "[ -e metadata/md5-cache ] && rm -rf metadata/md5-cache")
  (message "the rsync command wiped our critical .gitignore file, so recreate it.")
  (shell-command "echo \"distfiles/*\" > /usr/portage/.gitignore")
  (shell-command "echo \"packages/*\" >> /usr/portage/.gitignore")
  (message "profile formats fix")
  (shell-command "echo \"profile-formats = portage-1\" >> /usr/portage/metadata/layout.conf")
  (message "\"git add .\" will record all the changes to local files the git repo. So there must be no stray files.")
  (shell-command "if [ ! -d profiles/package.mask ]
  then
    mv profiles/package.mask profiles/package.mask.bak || exit 4
    install -d profiles/package.mask || exit 4
    mv profiles/package.mask.bak profiles/package.mask/gentoo || exit 4
  fi")
  (princ (shell-command-to-string "git add ."))
  (message "create a commit")
  (shell-command "git commit -a -m \"gentoo updates `date` update\"")
  (message "push these changes up.")
  (princ (shell-command-to-string "git push origin master")))

(message "Gentoo verification \n")
(princ (shell-command-to-string "emerge --sync;"))

(message "Layman synchronization \n")
(princ (shell-command-to-string "layman -S;"))

谢谢你!

4

1 回答 1

0

这实际上只是一个使用一些尴尬的 elisp 包装的 bash 脚本。以这种方式使用 elisp 没有任何优势。在您开始使用 elisp 实际计算某些东西之前,您可能应该坚持使用 bash。

您可以使用 emacs 编写打开文本文件和修改文本的脚本,就像使用 sed 或 awk 所做的一样。那会更有意义。在这一点上,对我来说,使用 elisp 执行此操作比查找 awk 语法要快。

您确实必须从某个地方开始,但是您正在做的事情对于 elisp 来说非常尴尬。最好通过利用语言的优势来学习,而不是强迫它做一些并非真正适合的事情。

此外, start-process 在脚本中没有意义。它在 emacs 中启动一个进程,以允许在脚本中不需要或不需要的持续通信。

于 2012-06-21T03:47:24.970 回答