1行で終わる php-mode のインデント
いろいろ設定するより php-mode で提供しているのをそのまま設定するのがよかった。結局ソース嫁という話。
(add-hook 'php-mode-hook 'php-enable-default-coding-style)
c-mode で c-set-style している場合、その設定を継承してしまう可能性があるのでそこは注意する。(c-basic-offset が 8 になってる! とか)
プロジェクトごとに設定したいなら .dir-locals.el で制御する。
((php-mode . ((eval . (php-set-style "psr2")))))
XXXX という文字列を含んだファイルを探すための、もうひとつのやりかた
find してからの xargs grep -n のほうが便利ではあるけど、ファイル名だけがほしい場合というのもある。
find の -exec 節は、コマンドの終了ステータスで真偽が決まる。
grep の終了ステータスはマッチすれば 0 を返すから、そのマッチしたファイルは -print アクションに進み、出力される。
$ find "${DIR}" -type f -exec grep -m1 -s -F "XXXX" {} \; -print
[追記] --files-with-matches / -l オプションのほうがいいのかも
$ find "${DIR}" -type f | xargs grep -l -F "XXXXX"
範囲を生成するようなあれ(パース編)
きのうのつづきで範囲構文を解析することにする。
パーサはさくっと構文解析ライブラリにまかせる。
python パーサ
で検索しただけだけど、BNF っぽく書けることで雑に採用。
もっとも BNF がこれでいいのかは自信がないが、doctest が通ってるしいいことにしよう。
$ sudo easy_install pip $ sudo pip install lark-parser
チュートリアルを眺めつつ、こんなかんじで書けた。
#!/usr/bin/env python # coding: utf-8 ''' >>> list(parse("1")) [1] >>> list(parse("1,2")) [1, 2] >>> list(parse("1,2,5-7")) [1, 2, 5, 6, 7] >>> list(parse("1,2,5-7,9-10,13")) [1, 2, 5, 6, 7, 9, 10, 13] ''' import itertools from lark import Lark, Transformer, v_args @v_args(inline=True) class RangeSyntax(Transformer): concat = itertools.chain def constant(self, x): return itertools.repeat(int(x), 1) def range(self, start, end): return xrange(int(start), int(end) + 1) parser = Lark(''' ?expr : expr "," expr -> concat | NUMBER "-" NUMBER -> range | NUMBER -> constant %import common.NUMBER %import common.WS %ignore WS ''', start='expr', parser='lalr', transformer=RangeSyntax()) parse = parser.parse if __name__ == '__main__': import doctest doctest.testmod()