标签:emacs

上古编辑器,神的编辑器

在 orgmode 中粘贴截图

用 org2blog 写博客有一段时间了,但是从来都不在文章中加配图。因为一直没有找到好的办法,可以在 orgmode 中粘贴并管理图片。

这个问题还是要解决的,在网上搜了一圈解决方案。一个办法是使用命令行截图软件,将图片保存到指定位置,然后在 orgmode 中插入路径。我平时使用 picpick 这个截图软件,不想更换其它软件,所以不采用这个方案。

最后在 stackoverflow 上找到一个方法, 先用 C# 写一个小程序,从剪切板中将图片保存到指定路径,然后在 orgmode 中插入这个路径。这个方法可以与 picpick 软件可以配合使用,感觉不错,决定试一下。

  • 用 VS2005 新建一个 C# Windows Program 项目,命名为 CbImage2File
  • 删除 Form1.cs
  • 修改 program.cs 文件
using System;
using System.Collections.Generic;
using System.Text;

namespace CbImage2File
{
    static class Program
    {
        private static int FAILURE = 1;

        private static void Failure(string description)
        {
            Console.Error.WriteLine("Clipboard does not contain image data");
            Environment.Exit(FAILURE);
        }

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            System.Drawing.Image image = System.Windows.Forms.Clipboard.GetImage();

            if (image == null)
            {
                Failure("Clipboard does not contain image data");
            }

            if (args.Length == 0)
            {
                Failure("You have not specified an output path for the image");
            }

            if (args.Length > 1)
            {
                Failure("You must only specify a file path (1 argument)");
            }

            string filePath = args[0];
            System.IO.DirectoryInfo folderInfo = new System.IO.FileInfo(filePath).Directory;

            if (!folderInfo.Exists)
            {
                System.IO.Directory.CreateDirectory(folderInfo.FullName);
            }

            image.Save(filePath);
        }
    }
}
  • 编译 release 版本,得到 CbImage2File.exe
  • myconfig/package.el 中增加
;;;###autoload
(defun org-insert-image-from-clipboard ()
  (interactive)
  (let* ((home-dir "d:/cygwin/home/fj/")
         (relative-dir "org/image")
         (attachments-dir (concat home-dir relative-dir))
         (png-file-name (format-time-string "%Y%m%d_%H%M%S.png"))
         (png-path (concat attachments-dir "/" png-file-name))
         (relative-path (concat relative-dir "/" png-file-name))
         (temp-buffer-name "CbImage2File-buffer"))
    (call-process "D:/tools/CbImage2File.exe" nil temp-buffer-name nil png-path)
    (let ((result (with-current-buffer temp-buffer-name (buffer-string))))
      (progn
        (kill-buffer temp-buffer-name)
        (if (string= result "")
            (progn 
              (insert (concat "[[~/" relative-path "]]"))
              ;(org-display-inline-images)
              )
          (insert result))))))

测试图片

图1  这是一张测试图片

emacs25.1 org2blog 发布中文出错问题

使用 org2blog 发布博客时,提示出错信息如下:

error in process sentinel: url-http-create-request: Multibyte text in HTTP request: POST /xmlrpc.php HTTP/1.1

依次排查了以下可能的原因

  • 网络代理
    • 换成全局代理 podvpn,还是无法正常发布。
    • 使用 linode 上的 emacs,把 blog 文件复制过去,也无法正常发布。
  • wordpress 设置

    早上刚安装了 Disable comments 插件,该插件会禁用 ping 功能,会不会与此相关。麻烦的是,该插件写数据库,并且删除插件时不还原数据库,所以只能对整个 wordpress 进行还原。刚好前两天有个备份,花了点时间,可以正常还原。但问题还在。

  • emacs 插件升级

    将 emacs packages 还原到最后一个备份,不能解决问题。

  • 其它线索
    • linode 和 dell 电脑上的 emacs 无法正常发布 blog,但是 x200 上的 emacs 可以正常发布 blog。
    • 在出错信息中,中文被转换成了 unicode 数字形式。
    • 发布的博客中,如果没有中文,可以正常发布。

最后,从 github org2blog 官方问题列表中,搜到了 Issue 223 。该问题是 emacs25.1 引入的,一个 bugfix 导致了 multibyte http request 问题。

解决方法,修改 url-http.el 文件,注释掉以下几行,并 byte-compile

;; Bug#23750
; (unless (= (string-bytes request)
;            (length request))
;   (error "Multibyte text in HTTP request: %s" request))

MAC 系统初体验

使用的是 macbook air 11,没有 retina 屏,少了很多乐趣,只能体验一下系统。不想花太多时间深度使用,只安装了一些常用软件,做了简单体验。

屏幕是 16:9 的,不是 retina 屏幕,完全没有优势。高度少了一大截,还不如手头正在用的 Thinkpad X200 16:10 屏幕。

输入法不习惯,虽然有 MAC 版本的 QQ 五笔,但设置跟 WIN 上完全不一样。没有分号快捷输入;默认经常是中文输入状态;无法通过 shift 选择二三字。

  • 清歌输入法支持分号模式。

Alfred 没有传说中那么神奇,大概因为没有深度发掘它的功能吧。

Docker 放在屏幕下方太占空间,拖到左边,并且设置成自动隐藏。原来在 WIN 下经常安装软件模拟 Docker,到了 MAC 下,反而不想用了。

键盘不习惯,布局跟美式 101 相差太多。键盘手感也不好。没有小红点不习惯。触控板绝对是亮点。用了一段时间,熟悉触控操作和快捷键后,主要操作没有什么问题,基本上手。

百度云盘跟 WIN 下完全不一样,同步方式比较像 WIN 下的快盘。使用倒没有什么问题。

MAC 版本的迅雷是个渣渣,同一个网络,竟然比 WIN 下版本下载慢很多。

Emacs 一如既往地好用。自带 emacs 是 22.1 版本,太老了。从 emacsformacosx.com 下载安装 25.0 版本,用 git 下载 spacemacs 配置,很快就能正常使用。字体要要调整,英文用 Manaco,中文用 STHeiti,渲染效果一般,不比 WIN 下强多少,跟 Ubuntu 比较相似。

  • 修改命令行下 emacs 默认版本:
alias emacs="/Applications/Emacs.app/Contents/MacOS/Emacs"
  • 安装 seil,设置 capslock 键为 constrol
  • 交换 option 和 command 键
(setq mac-command-modifier 'meta)
(setq mac-option-modifier 'super)
  • 设置字体
(setq fj/en-font "Monaco"
      fj/en-font-size 13
      fj/cn-font "STHeiti-15")

VPN 的安装折腾了一会,主要有两点要注意:

  • 网络配置是有优点级的,需要把 VPN 连接放到最前面。
  • MTU 大小设置成 1280.

重量和大小基本满意,再大再重就没什么意思了,最好能代替 ipad 的日常使用。这个本子如果边框窄点,屏幕大点,加上触控功能,就完美多了。CPU 正常使用没有问题,估计编译大程序会比较吃力。

在 spacemacs 中使用 graphviz

之前用 graphviz 画过几次流程图,感觉不错,只需要关注节点描述和节点关系, dot 程序自动搞掂图的大小和排放,很省脑。这次切换 spacemacs 后,原来的 graphviz 配置已经没有了,我也不想重新配置。

但是,spacemacs 真的很智能,你不想用都不行。我只是打算用 emacs 编辑 dot 文件,刚打开文件,spacemacs 立即提示:“我这里有现成的 graphviz layer 支持,你要不要安装?”这种好事哪能拒绝呢,当然点 YES 了。

接着,就看见窗口切换着,spacemacs 拍啦拍啦自动搞掂了一切。完事后,看看它干了什么:

  • 修改 .spacemacs 文件,加上 graphviz layer 支持。
  • 下载 graphviz layer 相关支持 package。
  • 修改 .spacemacs 文件,把 package 添加到 elpa 列表里。

我的 dot 文件瞬间语法高亮显示了。再试试 graphviz 的快捷键好用不,点两下逗号,立即生成了预览图,真不错。还有更 NB 的,输入 ,t , 打开 graphviz-live-reload 功能,每次 C-x C-s 文件存盘后,预览图自动更新。

在 linode 上使用 spacemacs

一直在用 linode vps,安装的 ubuntu 系统,远程用 putty 连接,emacs 是主力编辑器。emacs 配置是 ftp 上传的,安装成功后就一直没有更新过。没有用 git 托管,配置同步终究是不太方便。今天有时间,决定把 spacemacs 配置同步到 github,再更新到 linode。

我的 spacemacs 配置一共有三部分:一个 .emacs.d 目录,是 spacemacs 的原始代码,未做任何修改;一个 .spacemacs.private 目录,存放私有 layer 和 snippets;一个 .spacemacs 文件,就是 spacemacs 配置文件。

直接从 github 下载 spacemacs 的 develop 分支,作为 .emacs.d 目录:

git clone https://github.com/syl20bnr/spacemacs.git .emacs.d
git checkout -t origin/develop

在本地建立一个目录 .spacemacs.config ,并在目录内新建两个符号链接,保存 spacemacs 的私有配置,并将这个目录上传到 github。PS: junction 语法太 BT,参数顺序与 ln 是反的。

mklink /J ".spacemacs.private" "../.spacemacs.config/.spacemacs.private"
mklink /H ".spacemacs" "../.spacemacs.config/.spacemacs"

远程 linode 上,下载 spacemacs 的私有配置,并创建符号链接。

cd ~
git clone https://github.com/sweord/.spacemacs.config.git
ln -s .spacemacs.config/.spacemacs.private .spacemacs.private
ln -s .spacemacs.config/.spacemacs .spacemacs

启动 emacs,没有成功安装,提示找不到某个 el 文件,查看 emacs 版本太老还是 24.3 的,需要安装新版本的 emacs-25.1

add-apt-repository -y ppa:ubuntu-elisp
apt-get update
apt-get install emacs-snapshot

由于码农的洁癖,老版本必须删除。先查看安装包的名称:

dpkg -S emacs

再全部删除:

apt-get remove emacs24-bin-common emacs24-common emacs24-common-non-dfsg emacs24-nox

启动 emacs,spacemacs 自启成功,自动安装一百三十多个 package 后,成功启动了。linode 服务器网速不错,整个安装过程非常快。查看 spacemacs 启动时间,才两点几秒,太快了。要知道,spacemacs 在我的 x200 笔记本上启动时间大约 15 秒多,在我的 i5-2240 CPU 台式机上,启动时间要 8 秒多,在 linode 上为什么这么快?查看了 cpu 信息,原来是 X5 2680 v5 , cache 有 30M,相当 NB 啊。

cat /proc/cpuinfo