風待ち

プログラミングの勉強や日々の出来事のログなど

vimを使いだして20年がすぎようとしている頃、emacsを使い始めた。そして、半年後、暗黒面に落ちた。

それを入れた時、最初は軽い気持ちだった。

けれど、 指は確かに覚えていた。

使い慣れた操作は、あのエディタに戻るべきかと思わせた。

しかし、冷静な心が言う。

emacsのエディタ部分以外は、vimよりもいいじゃないか。

今ではもう、ほとんど、emacsから外にでていないだろ?

vim script と emacs lisp を比べて見ろ。もどりたいのか?

そして、決意する。

少数派でもいいじゃないか。

ダークサイドに落ちても、使いたいんだ。

Evil 最高です。

開発者の方に心から感謝します。

init.el

(setq evil-toggle-key "C-`")
(require 'evil)
(setq evil-emacs-state-cursor '("green" box))
(setq evil-motion-state-cursor '("orange" box))
(setq evil-normal-state-cursor '("yellow" box))
(setq evil-visual-state-cursor '("blue" box))
(setq evil-insert-state-cursor '("purple" (bar . 2)))
(setq evil-replace-state-cursor '("red" bar))
(setq evil-operator-state-cursor '("red" bar))
(evil-mode 1)

(global-set-key "\C-z" nil)

(require 'powerline)
(require 'powerline-evil)
(powerline-evil-vim-color-theme)

【emacs自分メモ】emacsで括弧を入力したら閉じ括弧も入力してくれる。コーテーションを入力したら閉じる方も入力してくれる設定

なぜ、半年使ってきて、この設定をしていないかったのか?

なぜ、なんの疑問もなく、毎回、キーを叩いていたのか?

vimの時には真っ先に設定してたのに。

init.el

(electric-pair-mode 1)

【emacs自分メモ】emacsで文字をコピーした時に、OSのクリップボードにも入れる

クリップボードの履歴を残せるようなツールを使っていると、emacsと共有できた方が便利なので。

init.el

(setq x-select-enable-clipboard t)

emacsの*scratch*バッファでテンプレートエンジンのmustache.elを使って雑にSQLを作ってみる。

mustache.elを見つけたので使ってみる。

Emacs Lisp自体ほとんどわかっていないので勉強もかねてやってみた。

*scratch*バッファだから、順番に”C-j”して実行して行けば、テンプレートの{{key}}で書かれたところを埋めたSQLが手に入る。

利用したライブラリは下記の3つ

*scratch*バッファ

;;テンプレートを作る
(setq template "
update users set user_id = '{{new-id}}' where user_id = '{{old-id}}';
delete from item_info where user_id = '{{old-id}}';
")

;;ハッシュテーブルを作る
(require 'ht)
(setq context (list
           (ht ("new-id" "new-foo") ("old-id" "old-foo"))
           (ht ("new-id" "new-bar") ("old-id" "old-bar"))
           (ht ("new-id" "new-baz") ("old-id" "old-baz"))))

;;SQLをmustache.elで作る
(require 'dash)
(require 'mustache)

(-map (lambda (m) (princ (mustache-render template m))) context)

;;再帰でもやってみる
(defun my-render (tmpl lst)
  (cond
   ((null lst) (princ "commit;\n"))
   (t (progn
    (princ (mustache-render tmpl (car lst)))
    (my-render tmpl (cdr lst))))))

(my-render template context)

業務で単純なSQLをたくさん書かないと行けない時は、Excelを使って作っている。

ただ、Excelだと一対一のSQLは作りやすいけど、一つのキーで複数のテーブルを更新しに行く一対多のSQLは作りづらいから、こういうやり方も覚えておくと便利かもしれない。

追記

READMEを読んだら、リストをループさせるテンプレートの書き方も載ってた。

当たり前だけど、公開されているドキュメントは一通り見ておいて損はないね。

(require 'mustache)
mustache

(require 'ht)
ht

(mustache-render "
{{#hoge-list}}
* {{hoge}}
{{/hoge-list}}
"
         (ht ("hoge-list"
              (list
               (ht ("hoge" "hogehoge1"))
               (ht ("hoge" "hogehoge2"))))))
"
* hogehoge1
* hogehoge2
"

ちょっとだけ違う似たようなバッチをたくさん作らないといけなくなったので、Node.jsでHandlebars.jsを使えばいいやと思ったけど、どうやらPythonでもpybars3ってのでHandlebarsが使えるみたいなので、そっちでやってみる。

大量に似たようなバッチを作らないといけなくなり、Node.jsでやるかっと思ったら、目の前のPCには入ってない。

WinPythonは入っていて、WinPythonにはpybars3もインストール済みなようなので、日本語の情報がないことに不安を感じつつも使ってみることにした。

GitHub pybars3

入ってなければ

pip install pybars3

WindowsのCMDバッチだから、ファイルのエンコードは「cp932」

settings.json

[
  {
    "file_name": "A.bat",
    "message": "AAAA",
    "users": [{"name": "山田"}, {"name": "鈴木"}]
  },
  {
    "file_name": "B.bat",
    "message": "BBBB",
    "users": [{"name": "田中"}, {"name": "佐藤"}, {"name": "山本"}]
  }
]

template.hbs

@echo off

echo.
echo message: {{message}}

echo.
echo users:
{{#for users}}
echo * {{name}}
{{/for}}

exit /b

json_to_cmd.py

# -*- coding: utf-8 -*-

import json
from pybars import Compiler

def main():
    with open("settings.json", "r", encoding="cp932") as f:
        settings = json.load(f)

    with open("template.hbs", "r", encoding="cp932") as f:
        source = f.read()

    compiler = Compiler()
    template = compiler.compile(source)
    helpers = {"for": _for}

    for setting in settings:
        output = template(setting, helpers=helpers)
        with open(setting["file_name"], "w", encoding="cp932") as f:
            f.write(output)

def _for(this, options, items):
    result = []
    for thing in items:
        result.extend(options["fn"](thing))

    return result

if __name__ == "__main__":
    main()

Handlebarsそのものとは違うような気がしないでもないが、一応できた。

この感じでJSONとテンプレートを用意すれば、ちょっと違うけど別物っていうバッチを簡単に生み出せるから、楽ができそうだ。

やっぱり、退屈なことはPythonにやらせなきゃいけないからね。