elisp生成渐变XPM图片


无意中看到 telephone-line 有一种渐变颜色的效果,看起来很棒,但telephone-line的源码有些难懂,所以自己动手实现类似的效果

渐变颜色

渐变颜色的实现可使用color-gradient

(color-gradient
 '(0 0 0)
 (color-name-to-rgb "red") 10)

实现原理是对红(R)、绿(G)、蓝(B)三个颜色通道分别取 n + 2 个过渡值,n 为中间颜色过渡状态,所以对于red#000#a0a0a0等颜色需要转化为RGB色彩模式

生成XPM图片

XPM图片格式参考 https://en.wikipedia.org/wiki/X_PixMap(XPM3)

大概是这样的

/* XPM */
static char * XFACE[] = {
/* <Values> */
/* <width/columns> <height/rows> <colors> <chars per pixel …

关于ivy的使用技巧


ivy默认的配置已经足够了,但还是可以通过一些技巧来提升使用体验

ivy中的tab

ivy提供了好几个有关补全的命令,分别是ivy-done, ivy-partial-or-done, ivy-immediate-done, ivy-dispatching-done, 但不幸,想要获得高效的补全,我不得不记住这n多个命令,这常常使效率变得更低, 所以,我自定义了一个 maple/ivy-done, 仅使用 tab 这一个按键就可以获得以上所有的体验

(defun maple/ivy-done()
  (interactive)
  (let ((dir ivy--directory))
    (ivy-partial-or-done)
    (when (string= dir ivy--directory)
      (ivy-insert-current)
      (when (and (eq (ivy-state-collection ivy-last) #'read-file-name-internal)
                 (setq dir (ivy-expand-file-if-directory (ivy-state-current ivy-last))))
        (ivy--cd dir)
        (setq this-command 'ivy-cd)))))
  • 预设场景一 …


莫相逢
只道人生初见
寻归里
岂敢天涯
且听风雨且听云

庄周,意逍遥


当你不断超越前方的人
在更前方
总会有那么一盏红灯

也许是为了安全
也许是为了公平

谁知道呢

你,终归是只能等着

Flask支持多语言站点


Flask的多语言国际化可以使用Flask-Babel插件,在此不再细述,但对于所谓的多语言站点(即形如example.com/zh/uri、example.com/en/uri或者zh.example.com、en.example.com)文档上却未作细述

有一个 Flask URL Processors 需要对所有的uri都额外增加一个lang_code的前缀,路由数较少时没什么问题,但路由数较多时太过麻烦

实现example.com/en/uri可以有多种方式,除了使用Flask URL Processors中介绍的外,还可以

使用nginx重定向uri

这应该是各种方式里最简单的一种

location ~ ^/en/ {
    rewrite ^/en/(.*)$ /$1 last;
}
location = /en {
    rewrite ^/(.*)$ /index …

emacs窗口管理


init-window.el

基础设置

;; 设置默认为左右分屏
(setq split-width-threshold 1)
(evil-leader/set-key
  "ws"  'split-window-below  ;; 上下分屏
  "wv"  'split-window-right) ;; 左右分屏

使用shackle管理窗口

当设置了 (setq split-width-threshold 1) 后所有的窗口都会变成左右分屏,所以需要 shacklepopwin package对窗口进行管理, 对一些特殊的窗口或 buffer 比如 *Help*flycheck error list 需要设置为显示在下方,并且默认选中

(setq shackle-rules
      '(("*Help*" :select t :align 'below :autoclose t)
        (flycheck-error-list-mode :select t :align 'below :autoclose t)))

设置默认的参数

(setq shackle-default-size 0.3 …

web-mode自定义fold函数以适应indent-region


web-mode有一个内置的web-mode-fold-or-unfold函数,但这个函数有一个问题,当存在fold时,使用indent-region会得到错误的缩进,想要得到正确的缩进,必须先 unfold, 比如

<div>
  <div class="col-xs-3 col-sm-3" id="sidebar" role="navigation">
    <button class="btn btn-primary">Submit</button> <br />
    <span>
        <button class="btn btn-primary">Submit</button> <br />
    </span>
    <span>
        <button class="btn btn-primary">Submit</button> <br />
    </span>
  </div>
</div>
<button class="btn btn-primary">Submit</button>
<br />
<a href="">as</a>

当把div …

从远程url下载并压缩js,css


之前一直在使用bootcdn.cn提供的CDN服务,没出过什么大问题,即使国庆第一天凌晨挂过,对它依旧信任。

但事与愿违,无意中打开查看源码,才发现竟然有那么多的css,js文件

<link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
<link href="https://cdn.bootcss.com/fancybox/3.1.25/jquery.fancybox.min.css" rel="stylesheet">
<script src="https …

maple-imenu——类似tagbar的emacs插件


这几天参考imenu-list重写了一个类似 vim 中tagbar的插件 maple-imenu, 其实之前我一直在使用另一个类似的插件—— imenu-list, 虽然imenu-list已经足够使用了, 但它和golden-ratio搭配起来很难受, golden-ratio 我是常开的, 但imenu-list也会偶尔使用(浏览及讲解代码必备,否则查找某个函数和变量时很难受的)

原本我想要自定义一下imenu-list,但看了源码之后, 发现很多地方都不符合我的需求, 而且需要改动的地方越来越多,最后不如自己重写

  • 如何使用

    下载文件复制到 $HOME/.emacs.d/site-lisp/maple-imenu 目录, 然后

    (use-package maple-imenu
      :load-path "site-lisp/maple-imenu"
      :commands (maple-imenu)
      :config
      (with-eval-after-load 'evil
        (evil-make-overriding-map maple-imenu-mode-map 'normal)))
    
    M-x maple-imenu
    
  • 相关变量
    • maple-imenu-buffer

      maple-imenu buffer name, default *maple-imenu*

    • maple-imenu-displayed-buffer

      displayed …