每次 Emacs 启动时赋诗一首

emacs 文艺牛

更新版本:没有任何依赖,纯elisp实现.

在~/.emacs.d/init.el中增加如下代码,每次emacs启动时文艺牛会赋诗一首,按 =g= 刷新。

(defun literary-cow-on-http-data (proc string)
  (with-current-buffer "*literary-cow*"
    (read-only-mode -1)
    (erase-buffer)
    (insert (substring string (+ 4 (string-match-p (regexp-quote "\r\n\r\n") string))))
    (read-only-mode)
    (beginning-of-buffer)))

(defun literary-cow-refresh ()
  "refresh a new literary cowsay text"
  (interactive)
  (with-current-buffer "*literary-cow*"
    (setq buf (get-buffer "*literary-cow*"))
    (setq proc (open-network-stream "cowsay" buf "literary-cow.cc" 80))
    (set-process-sentinel proc 'ignore)
    (set-process-filter proc 'literary-cow-on-http-data)
    (process-send-string proc "GET /shici?format=cowsay HTTP/1.1\r\nHost: literary-cow.cc\r\n\r\n")))

(defun literary-cow-init ()
  "Init literary literary-cow"
  (interactive)
  (get-buffer-create "*literary-cow*")
  (with-current-buffer "*literary-cow*"
    (local-set-key "g" 'literary-cow-refresh)
    (literary-cow-refresh)))

(setf initial-buffer-choice
      (lambda ()
        (literary-cow-init)
        (switch-to-buffer "*literary-cow*")))
5 个赞

何必这样,安装fortunecowsay,加入这个配置

(setq initial-scratch-message
     (if (executable-find "fortune")
         (format
          ";; %s\n\n%s"
          (replace-regexp-in-string
           "\n" "\n;; " ; comment each line
           (replace-regexp-in-string
            "\n$" ""    ; remove trailing linebreak
            (shell-command-to-string
             "fortune -a | fmt -80 -s | cowsay -$(shuf -n 1 -e b d g p s t w y) -f $(shuf -n 1 -e $(cowsay -l | tail -n +2)) -n")))
          (concat ";; Happy hacking, " user-login-name " - Emacs ♥ you!\n\n")
          )))
1 个赞

作为 emacser, 你们应该贴 纯 elisp 的实现,而不是依赖外部程序。

3 个赞

虽然说emacs是一个“操作系统”,但它毕竟还不是操作系统, 既然有很方便的实现,为什么不用呢

3 个赞

Emacs Lisp sometimes sucks. 只要能 portable,用 external utils 沒关系。

1 个赞
  • 请用 Markdown 语法正确地格式化代码块,右边有预览可以及时查看效果,并且提交了之后应该也能编辑;
  • 没有绑定局部变量就用 (setq text ...) 会造成 text 成为一个全局变量,即使在 defun 中也如此;

有这个追求的话,wget / curl 可以换用 url.elcowsay 用 Emacs Lisp 实现感觉有些烦,去年我实现过一个,但仅支持 ASCII,不支持中文。

1 个赞

服务器端改了一下,不需要客户端安装cowsay

http://literary-cow.cc/shici?format=cowsay

2 个赞

的确代码格式化一下比较好。工具的话我同意怎么方便怎么来。毕竟wget和cowsay不像是会出什么问题的依赖。

已去除所有外部依赖...

任务已达成...

请不要创建没有意义的全局变量: bufproc

这块儿我真的不懂,请多指教.

说实话, 从写配置转换到写package,确实需要一些经验指点, 我感觉我们应该编写一个小的教程,来处理这个事情。

3 个赞

刚好可以那我这个小程序做教学,怎么写成一个package, 现在代码存在哪些问题,为什么不能这样做.

其实我对楼主的fortune库更感兴趣,是自己做的中文库吗?还是用的网上有的那几个唐诗宋词库

https://github.com/guoxiangyang/quan-tang-shi

数据是网上遇到的,然后自己整理过.

代码是老的.很久没有push了.

每次启动加载上次会话需要五六秒,此时如果屏幕中央能显示一首诗或者一个小动画,同时minibuf显示加载进度,效果感觉挺不错。

另外,长时间无操作后也可以显示一下,跟屏保一样,放松一下。

可以用childframe实现

其实你可以把你收集的诗集导出为一个 emacs packge, 安装后,不就不需要网络了么。

https://github.com/tumashu/elptips/blob/master/elptips-cn.org 刚刚开了一个头

如果我没理解错,这样定义的是用户可以用custumize-variable自行修改的参数,作用域也是全局的.

(defcustom elptips-name "elptips-name"
  "Elptips's name.")

那如何定义平时其他语言经常用到的"局部变量"呢?