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)))))
  • 预设场景一 …

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 …

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 …

使用maple-note管理笔记


Table of Contents

更新于2019.04

  1. blog-mode 更新为 maple-note
  2. 新建 Git 仓库 emacs-maple-note

emacs-maple-note blog-mode, 一个基于tabulated-list的emacs笔记管理插件

前言

很早之前我一直在使用blog-admin作为博客笔记的管理工具, 虽然没有用社区维护的 CodeFalling/blog-admin, 而是用我自己修改的honmaple/blog-admin, 毕竟我使用的pelican, 是一个很小众的静态博客生成工具, 为了适应pelican, 也为了适应自己平时的使用, 所以自己修改了一个版本

但最近一是闲来没事,二是blog-admin使用的是ctable,中英文对齐上有些问题(虽然早就解决了), 三是觉得blog-admin有很多我不需要的代码, 而且看到那一长串的配置。。。

(setq blog-admin-backend-type 'pelican
      blog-admin-backend-new-post-in-drafts t ;; create new post in drafts by default
      blog-admin-backend-new-post-with-same-name-dir nil ;; create …

elasticsearch笔记


elasticsearch

安装

优化

  • 关闭swap
    swapoff -a
    # 注释 /etc/fstab swap
    sysctl -p
    
  • unlimit调整
    sysctl -w vm.max_map_count=262144
    echo 'vm.max_map_count=262144' >> /etc/sysctl.conf
    
  • 使用ssd

重启

curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'
{
  "persistent": {
    "cluster.routing.allocation.enable": "none"
  }
}
'
curl -X POST "localhost:9200/_flush/synced …

ansible笔记


ansible动态解析inventory

ansible调用inventory模块时总会调用一个文件或脚本来进行处理, 但我想要动态的解析inventory, 即直接传入一个字符串而不是文件, 直接调用ansible的接口来进行解析(不同格式的inventory也可以手动解析,比如yaml格式可以使用pyyaml解析,不过直接使用ansible接口会更方便一些)

但问题是ansible没有直接可供调用的接口, 不过可以直接查看ansible源码,找到相应的解析函数,封装一下即可

查找源码, 根据 InventoryManager 传递的source变量找到parse_sources这个函数

class InventoryManager(object):
    def parse_sources(self, cache=False):
        ''' iterate over inventory sources and parse each one to populate it'''

        self._setup_inventory_plugins()
        ...

然后再根据

def _setup_inventory_plugins(self):
    ''' sets up loaded inventory plugins for usage '''

    inventory_loader = PluginLoader('InventoryModule', 'ansible …

如何保持一个干净的系统


Table of Contents

由于工作需要经常会使用多种语言, 比如 python, golang, lua, javascript等, 各种语言都有自己的包管理器,像python的包管理器pip, lua的包管理器luarocks。。。

每个包管理器安装package的方式,位置都不相同,对于一个有洁癖的人来说,

ls ~/ -al

后各种各样的.something简直是场灾难, 所以保持一个干净的系统是非常必要的, 比如把相关语言的package都放到一个目录(我选择放到$HOME/repo/{language})下

请不要使用root用户,或者sudo来安装非必要的软件包

python

我的python环境是pip+virtualenv+virtualenvwrapper, pip可以有多种使用方式:

  • sudo

    sudo安装的package放到/usr/lib64/python-{verison}目录下, 这可能会与系统的包管理器所安装的python package冲突, 比如docker可以使用

    sudo pacman -S docker
    

    也可以使用

    sudo pip …

自定义helm式的ivy


n 个月前, 我曾写过 helm与ivy简单对比, 并吐嘈了ivy细节打磨不够,以至于我切换到ivy不到几天后, 又回到了helm的拥抱, 但在n个月后,本着生命不止,折腾不息的精神, “狠狠地”的折腾了一把ivy, 让ivy也能像helm一样“如丝般润滑”,适应我平时的操作

吐嘈一: counsel-find-file

我在dired中移动文件, 即使已经设置了

:map …