October 30, 2019
By: 马海强

emacs上使用px转换vw插件

  1. 配置
  2. 使用
  3. 效果
  4. 局限说明
  5. 参考文档

因为emacs缺少一个插件已经影响了前端同学对emacs的兴趣了,这有点尴尬,其实emacs很强大的。 对标vs code的px2vw插件,实现了一个简易的相似功能的emacs插件。 需求被大神知道后重写了一个可以支持对选中区域转换的,使用方式如下。

配置

~/emcas.d/lisp/自件一个名为px2vw.el文件,将以下代码复制进去,保存。

;;; A emcas plugin to convert px to vw.

(defun region-px->vw (pos1 pos2)
  "当前选中region或者paragraph中的px转化为vw,可能还需要考虑:
   1.1px的情况
   2.其他我不知道的规则"
  (interactive ;; interactive函数生成本函数的参数1. 开始位置 2. 结束位置; 考虑两种情况:region 和 paragraph
   (if (use-region-p) ;; 是否用户已经选择了某个region
       (list (region-beginning) (region-end))
     (let ((bds (bounds-of-thing-at-point 'paragraph)) ) ;;如果不是region的话,找到当前paragraph
       (list (car bds) (cdr bds)))))
  (save-restriction ;;保证替换操作不影响开始和结束位置
    (narrow-to-region pos1 pos2) ;; 设定我们关心的一个范围,此范围以外的文本我们不关心
    (goto-char (point-min))    ;; 回到关心区域的起始位置
    (while (search-forward-regexp "\\([0-9.]+\\)\\(px\\)" nil t) ;; 正则查找,注意我们以后两个分组,第一个分组获得数值
      (let* ((px-digit-str (match-string 1)) ;; 从第一个分组拿到数值
             (px-digit (string-to-number px-digit-str))  ;; 数值->string
             (vw-digit (format     ;; 计算
                        "%.4f"
                        (/
                         (* 100.0 px-digit)
                         1440.0))))
        (replace-match (concat vw-digit  "vw") t nil))))) ;;替换Hello!

(provide 'px2vw)

~/.emcas.d/custom.el文件里添加如下代码:


(require 'px2vw)
(global-set-key (kbd "C-c w") 'region-px->vw)

如果这个操作很常用的话,也可以定义一个更简洁的快捷键,比如F9,那就将上面的第二行换成

(global-set-key [f9] 'region-px->vw)

重启emcas。

使用

手工选取区域

选中需要转换的代码区域,按下你设置的快捷键,将执行绑定的函数,这会把比如200px;换算成13.8889vw保留了4位小数点,替换掉原来的以px为单位的代码。

自动判断段落

如果没有选中区域,将替换当前光标所在段落(大括号)内容里的px。

效果

手工选取区域

region

自动判断段落

px->vw

局限说明

  1. 目前插件内置了宽度是1440,如果需要修改,也很简单,把px2vw.el1440.0改成你需要的值。
  2. 鉴于vh很少用到,因此没有实现,需要的时候手动计算下。

参考文档

李杀的Elisp学习笔记Emacs Lisp

Tags: emacs