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 …

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 …

方便的切换emacs主题


作为一个主题控,经常会切换主题,之前切换主题的方式是这样的,M-x,`load-theme`,选中,但是个人认为不够便捷,正好前几天发现了hydra这个插件,也想实践一下

获取主题列表

(setq maple-cycle-themes (mapcar 'symbol-name (custom-available-themes)))

获取当前主题索引

(cl-position (car (mapcar 'symbol-name custom-enabled-themes)) maple-cycle-themes :test 'equal)

获取下一个主题

(setq maple-current-theme-index
      (+ 1 maple-current-theme-index))
(setq maple-current-theme (nth maple-current-theme-index maple-cycle-themes))

加载主题

(load-theme (intern maple-current-theme) t)

最后得到这样的函数

(defun maple/cycle-theme (num)
  (interactive)
  (setq maple-current-theme-index
        (+ num
           (cl-position
            (car (mapcar 'symbol-name custom-enabled-themes)) maple-cycle-themes :test 'equal)))
  (when (>= maple-current-theme-index (length maple-cycle-themes))
    (setq maple-current-theme-index …

emacs实现智能注释


之前使用emacs时遇到这么一个问题

当前行存在代码折叠时,如果想要注释,必须先选中当前行,否则只能注释代码折叠块的第一行

就像这样

基础注释函数来源于 stackoverflow

(defun comment-or-uncomment-region-or-line ()
  "Comments or uncomments the region or the current line if there's no active region."
  (interactive)
  (let (beg end)
    (if (region-active-p)
        (setq beg (region-beginning) end (region-end))
      (setq beg (line-beginning-position) end (line-end-position)))
    (comment-or-uncomment-region beg end)))

在此函数的位置上进行修改,刚开始使用

(when (hs-already-hidden-p)
    (evil-visual-line))

但是一直没得到想要的效果,后来修改了一下,使用

(when (hs-already-hidden-p)
  (progn
    (end-of-visual-line)
    (evil-visual-state)
    (beginning-of-visual-line)))

意思就是如果当前位置存在代码折叠,先选中当前行,然后注释整个选中区域

因为光标被移动到首位,我对这个不太在意,如果有在意的话,可以使用 …