入門GNU Emacs(10章)
emacsのカスタマイズ方法は3つあるが、どの方法でも.emacsが編集される
- Customを使う
- Optionを使う(裏ではCustomeが実行される)
- .emacsを編集する
Customを使う
- M-x customize Enter を実行し、Customを起動する
- ハイパーリンク(?)を辿って、設定したい項目を編集する
- 設定した項目の[State] or ページ上部の共通オプションから変更した内容を反映する
一つ一つリンクを辿るのではなく以下のような方法で直接編集画面にも飛べる
- M-x customize-option を使って、目的の項目を表示(Tabで自動補完が使える)
- M-x customize-apropos を使って、正規表現マッチングで設定項目を表示
.emacsを使う
.emacs はスタートアップファイルと呼ばれるもので、以下のようなものが存在する。
名称 | 役割 |
---|---|
.emacs.elc | .emacs をバイトコンパイルしたもので直接編集することは出来ない |
.emacs.el | 正式な名前のスタートアップファイル |
.emacs | よく使われる名前のスタートアップファイル |
Emacs は表の上から順にスタートアップファイルを探し、
最初に見つかったものを読み込んだらそれ以降のファイルは読み込まない。
なので、複数のファイルに散らして設定を行うことはできない。
また、emacs の起動時に "-q" オプションを渡すと、スタートアップファイルを読み込まないで起動する。
.emacs が間違っていて emacs が起動しなくなった時に、.emacsをデバッグ・修正出来る。
その他
3章で扱った内容だったが、その時は関係ないかなぁと思ってスルーした「動的略称機能」。
ちゃんと読んでみると補完機能*1だ。
キーバインド | 機能 |
---|---|
M-/ | 編集中のバッファにある文字列から編集中の文字列を補完する |
参考サイト
.emacsのサンプル@The very unofficial dotemacs home
- 作者: Debra Cameron,James Elliott,Marc Loy,Eric Raymond,Bill Rosenblatt,宮下尚,半田剣一,新井貴之,鈴木和也
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2007/03/12
- メディア: 大型本
- 購入: 14人 クリック: 331回
- この商品を含むブログ (117件) を見る
*1:とはいえ、編集中のバッファに対する補完だから、モジュールが分かれてる場合は機能しないか
Pythonクックブック(1章)
初めてのPythonを一通り読み終えたので、今度は実践的なコードを読んで勉強してみる。
今の自分に理解できる部分がどれぐらいあるかな。
オブジェクトの型判定
あるオブジェクトがどのクラスのインスタンスかを判定するにはisinstance()を使う。
type()の復帰値とis演算子を使うのはポルモーフィズムを壊すため良くない方法。
type()の復帰値は引数の型を返すので、決まりきった型との比較しか出来ない。
以下の場合は、文字列オブジェクト以外が渡されるとFalseとなる。
type(object) is type('')
isinstance()の場合、サブクラスの場合もちゃんとTrueと返してくれる。
[kobakoba0723@fedora13-intel64 ~]$ cat isstring.py #!/usr/bin/env python class SubString(str): def __init__(self, string): str.__init__(self) self.data = string def __repr__(self): return self.data def isAString(object): return isinstance(object, basestring) def isExactlyString(object): return type(object) is type('') s = "hoge" print '%s is a string ? ->' % (s, ), isAString(s) print '%s is a exactly string ? ->' % (s, ), isExactlyString(s) instance = SubString("piyo") print '%s is a string ? ->' % (instance, ), isAString(instance) print '%s is a exactly string ? ->' % (instance, ), isExactlyString(instance) [kobakoba0723@fedora13-intel64 ~]$ python isstring.py hoge is a string ? -> True hoge is a exactly string ? -> True piyo is a string ? -> True piyo is a exactly string ? -> False [kobakoba0723@fedora13-intel64 ~]$
Pythonの型判定に対する一般的な方法はduck typingと呼ばれる方法で、
If it walks like a duck and quacks like a duck, it must be a duck "アヒルのように歩き、アヒルのようにガーガー鳴くなら十分アヒルだ"
ある型の特徴的な演算が出来るのであれば、同一の型だと見なすってことなのかな。
文字列の連結
小さな文字列をつなげて大きな文字列を作る時には、join()を使うのが良い方法*1。
あと、複数の変数の連結時に定数的なテキストをいくつか間に挟みたい時には%演算子を使うのが良い。
いずれの場合も+演算子を使うのはおすすめされていない。
文字列はimmutableなオブジェクトなので、文字列に対する演算は必ず新しい文字列の生成を伴う。
str.join()を使うと、引数として与えたシーケンスをstrで連結した文字列を一度に返してくれるので、
中間文字列の生成を伴わない分処理が早い。
%演算子の場合、処理速度というよりも、色々な書式を変換して結合できたり、桁数の制御が出来ることが利点
join()を使うと1桁程度速度の違いが出る。
[kobakoba0723@fedora13-intel64 ~]$ cat combinestr.py #!/usr/bin/env python import random import time list_a = [] list_b = [] for i in range(50): list_a.append(chr(random.randint(33, 126)) * 5) for i in range(50): list_b.append(chr(random.randint(33, 126)) * 5) string1 = '' string2 = '' start_time = time.time() for char in list_a: string1 += char for char in list_b: string2 += char end_time = time.time() operator_time = end_time - start_time string1 = '' string2 = '' start_time = time.time() string1 = ''.join(list_a) string2 = ''.join(list_a) end_time = time.time() join_time = end_time - start_time print '=' * 10 print 'Combine Character in List as String' print '\toperator: %e, join: %e' % (operator_time, join_time) print '=' * 10 large_string = '' start_time = time.time() large_string = string1 + 'hoge' + string2 + 'piyo' end_time = time.time() plus_operator_time = end_time - start_time large_string = '' start_time = time.time() large_string = "%s hoge %s piyo" % (string1, string2) end_time = time.time() percent_operator_time = end_time - start_time print '=' * 10 print 'Combine String' print '\tplus: %e, percent: %e' % (plus_operator_time, percent_operator_time) print '=' * 10 [kobakoba0723@fedora13-intel64 ~]$ python combinestr.py ========== Combine Character in List as String operator: 3.314018e-05, join: 4.053116e-06 ========== ========== Combine String plus: 1.907349e-06, percent: 3.099442e-06 ========== [kobakoba0723@fedora13-intel64 ~]$
その他
Pythonの評価方法に対するアプローチはEAFPというものらしく、
is's Easy to Ask Forgiveness than Permission. 'ごめんなさいはお願いしますよりも楽'
読み始める前の懸念についていえば、
半分ぐらいは理解できた気がするけど、全く意味が分からないレシピもある。
それに、理解はできるけど使うケースが想定できないってのもいっぱいある。
自分でコードを書くようになると違ってくるんだろうなぁ。
- 作者: Alex Martelli,Anna Martelli Ravenscroft,David Ascher,鴨澤眞夫,當山仁健,吉田聡,吉宗貞紀
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2007/06/26
- メディア: 大型本
- 購入: 11人 クリック: 423回
- この商品を含むブログ (85件) を見る
*1:この方法は、PEP8にもおすすめの方法として載ってた。