Emacs で Markdown のテーブルを整形する

https://github.com/qwerqwer1111/md-table-formatter

Atommarkdown-table-formatter みたいなものが Emacs でも欲しかった. Emacs Lisp で全部実装するのは厳しかったので, shell-command-on-regionPythonスクリプトを呼び出すようにした.

各行のカラム数が異なっていたり, 入力のフォーマットがおかしい場合には整形しないようにしている.

環境

使い方

md-table-formatter.pyをどこかに保存して, ~/.emacs.d/init.elに下記のように記載しておけば, C-x tで選択範囲内のテーブルを整形できる.

(defun md-table-formatter (start end)
 (interactive "r")
 (save-excursion
   (shell-command-on-region start end "python /path/to/md-table-formatter.py" nil t)))
(global-set-key (kbd "C-x t") 'md-table-formatter)

サンプル

入力

|Left align|Center align|Right align|
|:-|:-:|-:|
|Content|Content|Content|
|Content|Content|Content|

出力

| Left align | Center align | Right align |
|:-----------|:------------:|------------:|
| Content    |   Content    |     Content |
| Content    |   Content    |     Content |

C++でforの多重ループを抜ける

C++(もしくはC)で多重ループを抜けるにあたって, 面白い方法があることを知ったのでメモしておく. フラグを使ったり関数を作ったりするよりも, 場合によっては便利かも知れない.

#include <cstdio>

int main() {
    int i_max = 4;
    int j_max = 2;
    int k_max = 3;

    for (int i = 0; i < i_max; i++) {
        for (int j = 0; j < j_max; j++) {
            for (int k = 0; k < k_max; k++) {
                printf("%d %d %d\n", i, j, k);
                if (i * j * k >= 2) { // i * j * kが2以上でループを抜ける
                    i = i_max - 1;
                    j = j_max - 1;
                    k = k_max - 1;
                }
            }
        }
    }

    return 0;
}
 ./a.out
0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 1 2
1 0 0
1 0 1
1 0 2
1 1 0
1 1 1
1 1 2

Microsoft Sculpt Ergonomic Keyboard を Mac で使う

先日, Sculpt Ergonomic Desktop の US 配列を個人輸入した. Mac で使うにあたっていくつか設定をしたのでメモ.

環境

  • OS X Mavericks v10.9.3

設定内容

システム環境設定からの設定

  1. Caps Lock を Control に変更
    • Control が A の左にあったほうが便利なので変更.
  2. Option を Command に変更
  3. Command を Option に変更
    • Mac の US 配列と同じ並びにするために交換.

KeyRemap4MacBook からの設定

  1. 左右の Command に[英数/かな]を割り当て
    • For Japanese タブ -> 左右のコマンドキーを「英数/かな」としても使う -> コマンドキーの動作を優先モードにチェック
  2. Application を Option に変更
    • Mac の US 配列と同じ並びにするために変更.
  3. Insert を Fn に変更
    • Sculpt Ergonomic Keyboard では Fn キーがスライドスイッチになっていて不便だったので変更.

上記 2. 3. の設定のために private.xml に以下のように記述した.

<?xml version="1.0"?>
<root>
  <item>
    <name>Application to Option</name>
    <identifier>private.app_to_option</identifier>
    <autogen>__KeyToKey__ KeyCode::PC_APPLICATION, KeyCode::OPTION_R</autogen>
  </item>
  <item>
    <name>Help to Fn</name>
    <identifier>private.help_to_fn</identifier>
    <autogen>__KeyToKey__ KeyCode::HELP, KeyCode::FN</autogen>
  </item>
</root>

マウスは Magic Trackpad の方が便利なので現状使っていない.

プロンプトの表示が遅い

いつの間にか, ターミナルを起動してからプロンプトが表示されるまでに数秒かかるようになっていた. ASLログの破損などが原因のようなので, 下記コマンドを実行してすべて削除した後, 再起動して初期化した.

$ sudo rm -f /private/var/log/asl/*.asl

Emacs 24.3 のインストール

環境

  • OS X Mavericks v10.9.2

準備

autoconfのインストール

$ brew install autoconf

ダウンロードと展開

$ wget http://ftp.gnu.org/pub/gnu/emacs/emacs-24.3.tar.xz
$ tar xvf emacs-24.3.tar.xz

インラインパッチの適用

$ svn checkout http://svn.sourceforge.jp/svnroot/macemacsjp/inline_patch/trunk inline_patch
$ cd emacs-24.3
$ patch -p0 < ../inline_patch/emacs-inline.patch

nsfont.mの修正

Mac上のEmacsで和文フォントをデフォルトに設定すると, フレーム幅が2倍になる. そこで, Mac de Emacs総合スレ v6の700を参考にnsfont.mを修正.

/* set up metrics portion of font struct */
font->ascent = lrint([sfont ascender]);
   ||中略
font->underline_thickness = lrint (font_info->underwidth);

    • >追加 font->average_width = font->space_width;

ビルド

$ ./configure --with-ns --without-x
$ make bootstrap
$ make install

nextstep/Emacs.appが生成されているので, /Applicationsなどにコピーする.

Flymakeが落ちる

あるソースファイルを読み込むとFlymakeがエラーとなり, 再度開こうとすると今度はEmacs全体が落ちるといったようなことが多々あった. 設定ファイルに以下のように書いてとりあえず解決.

(defadvice flymake-post-syntax-check (before flymake-force-check-was-interrupted)
  (setq flymake-check-was-interrupted t))
(ad-activate 'flymake-post-syntax-check)

Boost.Python

環境

インストール

$ brew install boost

サンプル

/* bpy.cc */
#include <boost/python.hpp>

int add(int lhs, int rhs) {
    return lhs + rhs;
}

BOOST_PYTHON_MODULE(bpy) {
    boost::python::def("add", add);
}

BOOST_PYTHON_MODULE()の引数がモジュール名になる. コンパイルと実行は以下の通り.

$ clang++ -bundle -lboost_python-mt -lpython2.7 -fPIC -o bpy.so bpy.cc
$ python
>>> import bpy
>>> bpy.add(2, 3)
5

コンパイルオプションが少しあやしい.