乍听之下,不无道理;仔细揣摩,胡说八道

0%

序言

在入手MacBook Pro前,我的开发环境主要是一个运行在VirtualBox中的Mint发行版。在这个系统中,只要运行一次git push并输入passphrase(下称密码)后,之后便不再需要输入了——即使ssh登录远程机器也是如此。

但用上Mac后发现,这里的ssh没有这个方便的特性——每次运行git pushssh,都需要输入密码,颇不方便。

为了避免一遍又一遍地输入密码,每次登录后,我都会运行ssh-add来一劳永逸地解决问题

1
ssh-add ~/.ssh/id_rsa

自从升级到macOS Catalina后,如果在合盖睡眠前没有注销的话,下次开盖唤醒极有可能卡死在登录界面。无奈之下,我每天都需要注销并在第二天重新登录,以至于每天都得运行ssh-add并输入密码。久而久之,这也挺烦人的。

一次失败的优化

阅读全文 »

《实战Common Lisp》系列主要讲述在使用Common Lisp时能派上用场的小函数,希望能为Common Lisp的复兴做一些微小的贡献。MAKE COMMON LISP GREAT AGAIN。

序言

因为觉得Common Lisp原生的let操作符在许多时候不够好用,我编写了vertical-let。(详情可以参见这篇文章)比起原生的letvertical-let的优势在于:

  1. 有效减少代码的缩进——尤其是嵌套使用let的时候;
  2. 方便增减binding,对其余代码的布局没有影响。

除了letdestructuring-bind也是一个常用的声明binding的语法。但如果用在vertical-let中的话,会打乱原有的代码布局。比如原本的代码为

阅读全文 »

“实战Elisp”系列旨在讲述我使用Elisp定制Emacs的经验,抛砖引玉,还请广大Emacs同好不吝赐教——如果真的有广大Emacs用户的话,哈哈哈。

序言

我用Emacs的org-mode来管理看动画的进度

org-mode中的动画清单

每个工作日的午餐和晚餐,我都会安排一部下饭动画。为了每顿饭可以看不同的动画,我的做法是:

阅读全文 »

本文是《实战Common Lisp》系列的第一篇文章。本系列主要讲述在使用Common Lisp时能派上用场的小函数,希望能为Common Lisp的复兴做一些微小的贡献。

序言

众所周知,Common Lisp没有内置多少处理字符串的函数,下面的代码便能看到所有以STRING开头的函数名:

1
2
3
4
(do-external-symbols (s :cl)
(when (and (fboundp s)
(equal (search "STRING" (symbol-name s)) 0))
(print s)))

屈指可数,而且大部分是比较两个字符串的!很多其它语言中的“标配”是不存在的,比如想要将多个字符串连接起来这么简单的功能都没有!要么自己实现,要么依赖第三方库,比如cl-str提供的join函数。

标准库也没有内置正则表达式,好在有一个优秀的第三方库可以用:cl-ppcre。一种使用正则的常见需求是提取符合某种模式的内容,比如提取一篇Markdown文章中所有的图片链接。图片链接可以由下列正则括号的部分匹配:

1
"!\\[.*\\]\\((.*)\\)"

在cl-ppcre中这个括号匹配的部分叫做第一个register。我想要写一个能够提取出字符串中所有符合这段正则的第一个register,分两步走:

  1. 先实现一个all-first-registers-to-strings函数,实现通用的、提取一个字符串中所有符合某段正则的子串的第一个register的内容;
  2. 基于all-first-registers-to-strings实现一个extract-image-paths
阅读全文 »

“实战Elisp”系列旨在讲述我使用Elisp定制Emacs的经验,抛砖引玉,还请广大Emacs同好不吝赐教——如果真的有广大Emacs用户的话,哈哈哈。

序言

上一篇文章的末尾,我说有一个更优雅的办法实现快速设置任务的开始时间,本文便来揭秘这个办法。

阅读全文 »