ラベル Meadow の投稿を表示しています。 すべての投稿を表示
ラベル Meadow の投稿を表示しています。 すべての投稿を表示

2011年3月8日火曜日

Scala の List クラスで map, filter, foldRight と シーケンス内包表記

1. Scala の覚えやすそうな点と、すぐに忘れそうな仕様

Scala に興味を持った理由は、「今からでも遅くない これから始めるScala(前編)」 で挙げられていた以下の特徴による。

  • オブジェクト指向と関数型言語の特徴を組み合わせています。Scalaでは、関数をオブジェクトとして扱うことができますし、高階関数も利用できるなど、関数型言語からさまざまな特徴を取り入れています。
  • Scalaは静的型付け言語ですが、型推論によって型の記述を省略することができます。変数や関数の宣言時に、コンパイラが型を推論してくれるため、型の指定をいちいち行わなくてもよいのです。
  • Trait(トレイト)という、実装を持つことができるインターフェイスを利用して、Mix-Inができます
  • 暗黙の型変換(implict conversion)などを利用して、DSL(ドメイン固有言語,Domain-Specific Language)を作成しやすくなっています。
  • マルチコア時代を意識した、分散処理ライブラリ(Actorライブラリ)が用意されています。

(太文字は引用者による)

久しぶりに本を購入して読んでいる。しかし、いつもの如く頭に入らないし、覚えたものは身に付かず抜けていく。

Scala は、統一されていて覚えやすい仕様もあれば、「何だかごちゃごちゃしていて忘れること間違いなし」と感じるところもある。結果として見やすくなるコードのために覚えておくルールの多さに圧倒されてしまったり。。 (+_+)

Guido van RossumNeopythonic: Scala? で次のように述べている。

Perhaps my biggest disappointment in Scala is that they have so many rules to make it possible to write code that looks straightforward, while being anything but -- these rules all seem to have innumerable exceptions, making it hard to know when writing simple code will work and when not.

 

a. Haskell の関数と似た名前のメソッド名

Scala は関数型の特徴を持ち合わせている。しかも型推論をしてくれる。しかし、「Haskell ではこう書けるのに、何で Scala はだめなんだろう?」と疑問を抱くことがある。例えば、

  • メソッドの引数は必ず型を指定しないといけない。

Haskell で関数を定義するとき、引数の型を省略しても型を推論してくれる。

Prelude> let add x y = x + y

Scala では引数の型を指定しなくてはならないので面倒。 (+_+)

scala> def add(x:Int, y:Int) = x + y

この辺り、オブジェクト指向と折衷しているのが理由なのだろうか?スクリプトを書くのにお手軽に使えると期待していただけにちょっと残念。

ところで、Haskell との比較で言えば、関数名が似ているのはなぜだろう?例えば、Haskell でリスト操作に不可欠な、

  • map
  • filter
  • foldr

(cf. Prelude, Data.List)

各々の言語でこれに対応した関数、メソッドを比較すると、

Python map filter reduce 2.1 組み込み関数
Ruby collect, map find_all, select inject Enumerable
Scala map filter foldRight, :\ scala.collection.immutable.List 

これを見ると Haskell の関数名に Scala が一番似ていて、次に Python 。Ruby のメソッド名はかなり異なる。

scala.collection.immutable.List  には、上記以外にも類似したメソッドが見受けられる。もちろん、Python でも関数型プログラミングを意識したモジュールには似た名前の関数が定義されているけれど。

Scala と Haskell の言語設計者は何か関係でもあるんだろうか?

Scala の設計者である Martin OderskyThe Origins of Scala で次のように述べている。

Bill Venners: How did Scala come about? What is its history?

Martin Odersky: Towards the end of my stay in Zurich, around 1988/89, I became very fond of functional programming. So I stayed in research and eventually became a university professor in Karlsruhe, Germany. I initially worked on the more theoretical side of programming, on things like call-by-need lambda calculus. That work was done together with Phil Wadler, who at the time was at the University of Glasgow. One day, Phil told me that a wired-in assistant in his group had heard that there was a new language coming out, still in alpha stage, called Java. This assistant told Phil: "Look at this Java thing. It's portable. It has bytecode. It runs on the web. It has garbage collection. This thing is going to bury you. What are you going to do about it?" Phil said, well, maybe he's got a point there.

The answer was that Phil Wadler and I decided take some of the ideas from functional programming and move them into the Java space. That effort became a language called Pizza, which had three features from functional programming: generics, higher-order functions, and pattern matching. Pizza's initial distribution was in 1996, a year after Java came out. It was moderately successful in that it showed that one could implement functional language features on the JVM platform.

(太字斜体は引用者による)

一緒に仕事したという Philip Wadler と言えば、The Haskell 98 Language Report Preface に名前があるように、Haskell の言語仕様を決める委員会の editor であり、Glasgow Haskell Compiler 発祥の University of Glasgow で教授をしていた人物。「モナドって何?」と調べていれば行き当たるであろう Monads for functional programming の著者。

… ということは、関数名が Haskell に似ていたとしても、あながち偶然でもないということだろうか?

 

b. 他によく似た名前の関数を持つ言語は?

Scala が影響を受けた言語について調べてみると、

Java, Pizza, Haskell … と順にある。

Fold (higher-order function) - Wikipedia には fold 系の関数の各言語の一覧が載せられている。この中で Scala の foldRight に似ている名前を持つ言語は Ocaml と Scheme 。それぞれ関数名は fold_rightfold-right

  • List より : map, filter, fold_right
Scheme は、

うーん、こちらの方が名前は似てるなぁ。結局、どの言語が一番影響を与えて関数名が決まったんだろう???

 

それはさておき、リスト操作における重要な関数である、

で練習した関数を Scala でも手を動かして覚えることに。 (+_+)

 

c. Meadow で Scala のスクリプトを実行

… とその前に、「オブジェクト指向プログラマが次に読む本 -Scalaで学ぶ関数脳入門」には Scala の実行方法として以下の 3 つが挙げられていた。

  • シェルで対話的に実行する
  • スクリプトを記述して実行する
  • プログラムを記述して実行する

対話的というのは REPL のことで、ちょっと試したいときに使う。それ以外は main メソッドを持つシングルトンオブジェクトを書いてコンパイルして実行しないといけない思っていた。その中間に位置する実行方法があったのに気づかず。。 (+_+)  これからはスクリプトとして書いて実行してみよう。

( cf. Getting Started with Scala の Script it! )

以前、エディタで Scala を実行する方法をいくつか見た。

やはり、Meadow を使っていこうかな。

方法は、

  1. REPL を使うときのようにエディタに書いて
  2. M-x scala-run-scala を実行
  3. C-c C-l でスクリプトを実行。

( cf. EmacsでつくるScala開発環境 前編(scala-mode) - tototoshiの日記 )

 

2. map

まずは、リストの要素を 2 倍にすることから。

Haskell で書くなら、

Prelude> let l = [1..5]
Prelude> map (\x –> x * 2) l

セクションを利用すると、

map (*2) l

 

a. map メソッドにおける型変数

map メソッドの型を見ると、(scala.collection.immutable.List)

def map [B] (f: (A) ⇒ B) : List[B]

メソッドで型変数 B が宣言されている。

なぜこの型変数 B が書かれているのかと言えば、List クラスの型変数 A

class List [+A] …

はリストの要素の型を表しており、map メソッドの引数で要素を変換する関数、

f: (A) ⇒ B

により、元の要素の型とは異なる型になる可能性があるため。(型変数の前に `+’ が付いている意味は横に置いておく。)

この辺り、Java で似たような実装を試したときを参考に。

とりあえず、map メソッドを使う分には詳細を理解する必要はない。

 

b. 無名関数と引数の型を省略

Scala で無名関数を定義するときは、以下のような形式。

(引数:型) => 式

例えば、数値が与えられたら 2 倍する関数を定義するなら、

val f = (x:Int) => x * 2

Haskell で

–>

と書くところを

=>

とすることに注意。また、面倒だけれど、無名関数の引数は型を指定しなければならない。

リストの要素を 2 倍するには、

val l = List(1,2,3,4,5)
l.map((x:Int) => x * 2)

(以下、上記変数 l を使う。)

map 関数の引数として無名関数を与えると、引数の型をしなくてもよい。

l.map((x) => x * 2)

これは変数 l が

List[Int]

という型であり、リストの要素が Int 型だとわかることを利用して、先ほどの map メソッドに当てはめると、

def map [B] (f: (Int) ⇒ B) : List[B]

となり、map メソッドの第1引数の関数の引数の型を推論できるため。

ついでに、引数が 1 つだと ( ) も省略できる。

l.map(x => x * 2)

 

c. 無名関数の引数の省略

また、Haskell のセクションに似た書き方も用意されている。無名関数の引数は、

_

で代用できるので、

l.map(_*2)

 

d. メソッド呼び出し . の省略

それから、メソッドの呼び出しである . も省略できる。

l map (_*2)

シンプルに書けたけれど、ここまでの道程が長い。。(+_+)

 

e. 変更可能なリストを利用する場合

ところで、上記のリストは変更不能な (imutable) リストを利用した。 Scala ではこの使用が推奨されている。

これに対して、変更可能なリストを使いたい場合は、

  • scala.collection.mutalble

を使う。

scala.collection.mutable.LinkedList の要素を追加するメソッド は

def :+ (elem: A) : LinkedList[A]

これを利用すると、

import scala.collection.mutable.LinkedList

var result = LinkedList[Int]()
for (e <- l){
  result = result.:+(e * 2)
}
println(result)

変更可能な変数は var を使って宣言。

result 変数を更新している箇所は、以下のように置き換えることができる。

result = result :+ e * 2

更に省略するなら、

result :+= e * 2

慣れないと、なぜこういう風に書けるのかわからなくなってしまうけれど。 ^^;

 

f. シーケンス内包表記

The Scala Language Specification には、

For Comprehension

と書かれており、A Tour of Scala では Sequence Comprehensions とある「シーケンス内包表記」。

List comprehension - Wikipedia に for と yield を使った説明がされていることより、

「リスト内包表記」

と同じような機能を持つようだ。これを使うなら、

for (e <- l) yield e * 2

Ruby の yield や、Python の yield と同じ予約語名なので頭の中が混乱してきた。。 (+_+)

 

3. filter

次に、filter メソッド。型を見ると、引数に述語 (predicate) を与えれば良いことがわかる。

(cf. scala.collection.immutable.List, Haskell の Prelude 散策 (2) - 述語)

def filter (p: (A) ⇒ Boolean) : List[A]

map メソッドと同じように徐々に省略できるところを省いていくと、

val l = List(1,2,3,4,5)
l.filter((x:Int) => x > 3)
l.filter((x) => x > 3)
l.filter(x => x > 3)
l.filter(_>3)
l filter (_>3)

シーケンス内包表記では、

for (e <- l; if e > 3) yield e

( ) を使わずに { } で書くと ; も省略できる。

for { e <- l
      if e > 3
} yield e

他の言語における for とちょっと違うので、混同しないように注意が必要。

 

4. foldRight

最後に、リストの値を集約する foldRight メソッド。(scala.collection.immutable.List)

def foldRight [B] (z: B)(f: (A, B) ⇒ B) : B

map, filter メソッドと違い引数が 2 つ。しかも、それぞれの引数が独立しているように見える括弧の書き方。

以下のようなシグニチャでないことに注意。

def foldRight [B] (z: B, f: (A, B) ⇒ B) : B

各々の引数を括弧で括る書き方は、Scala におけるカリー化の手段。引数のリストがあると言えばいいのかな?

カリー化とは、Chapter 8. Functional Programming in Scala によると、

… currying transforms a function that takes multiple parameters into a chain of functions, each taking a single parameter.

In Scala, curried functions are defined with multiple parameter lists,

def cat(s1: String)(s2: String) = s1 + s2

Of course, we could define more than two parameters on a curried function, if we like.

(太字は引用者による)

メソッドの引数が複数の括弧 ( )  で囲まれている様は、「複数の仮引数のリストを持っている」と言えば良いみたい。つまり、メソッドの引数の括弧が一つというのは、引数の書き方としては特殊な一例に過ぎないと。括弧ごとにメソッドの呼び出しを行うことができ、残りの引数を順に与えていき、最終的に全体の関数と同じ関数の連鎖が生まれる。

foldRight の場合で言えば、

リスト.foldRight(値)

により、foldRight の第 2 引数を受け取る関数が生成される。

では、foldRight を使って、要素を全て足す計算をしてみる。先ほどと同じく、徐々に省略した書き方をすると、

val l = List(1,2,3,4,5)
l.foldRight(0)((x:Int, y:Int) => x + y)
l.foldRight(0)((x,y) => x + y)
l.foldRight(0)(_+_)
(l foldRight 0)(_+_)

 

a. 別名 :\

foldRight と同じ機能のメソッドとして :\ がある。

def :\ [B] (z: B)(op: (A, B) ⇒ B) : B

なぜこんな形のメソッドがわざわざ定義してあるかと言えば、以下の foldr を説明した図を見れば一目瞭然。

http://en.wikipedia.org/wiki/Fold_(higher-order_function)

Fold (higher-order function) - Wikipedia, the free encyclopedia via kwout

上記と同じ計算をするなら、

l.:\(0)(_+_)
(l :\ 0)(_+_)

これまた慣れないと読みずらい。

 

b. foldLeft と /:

foldRight はリストを右 (末尾) から左 (先頭) へと計算を進めるのに対して、foldLeft は左 (先頭) から右 (末尾) へと計算を行なう。

(l foldRight 100)(_-_)    // (1-(2-(3-(4-(5-100))))) => -97 (l foldLeft 100)(_-_)     // (((((100-1)-2)-3)-4)-5) => 85

foldLeft の別名は /: 。foldRight の :\ とは対照的。

(l :\ 100)(_-_)
(100 /: l)(_-_)

: で終わるメソッド名は右結合なので、第1引数を左に置く。この例外的なルールにより、左から計算を畳み込んでいく様をコードから連想できるようになっている。

. によるメソッドの呼び出しで書くなら、

l./:(100)(_-_)

こういう例外的なことが存在することが良いことなのか悪いことなのか。うーん…

 

c. reduceRight とreduceLeft

Haskell では foldr の第2引数がなく、リストの要素のみに二項演算子を適用していく関数名は foldr1 。

Prelude> foldr1 (+) [1..5]
15

scala には foldRight1 というメソッドはなく、reduceRight が代わりに存在する。

l reduceRight (_+_)

当然ながら、対照的な reduceLeft もあり。

l reduceLeft (_+_)

 

d. map , filter を foldRight で書き直し

次に、map メソッドで要素を 2 倍した関数を foldRight で書き直したい。

Haskell では以下のように書ける。

Prelude> foldr ((:).(*2)) [] [1..5]
[2,4,6,8,10]

Scala では空リストを Nil で表現する。

scala.collection.immutable.Nil

object Nil extends List[Nothing] with Product

これを利用して、以下のように書けばいいのかと思いきや、エラーとなる。 (+_+)

(l foldRight Nil)(_*2::_)

エラーがでないようにするには、foldRight の第1引数の型を明示する。

(l foldRight List[Int]())(_*2::_)

理由は、Programming in Scala (p326) によると、

Generally, when tasked to infer the type parameters of a polymorphic method, the type inferencer consults the types of all value arguments in the first parameter list but no arguments beyond that.

(太字は引用者による)

メソッドの型推論は、仮引数のリストのうち、最初の実引数を調べることによって行われるようだ。

foldRight の型で言えば、

def foldRight [B] (z: B)(f: (A, B) ⇒ B) : B

引数 z を元に型推論が行われる。

Nil の型について :: メソッドを使って調べてみると、

scala> Nil
res0: scala.collection.immutable.Nil.type = List()

scala> 1::2::3::Nil
res1: List[Int] = List(1, 2, 3)

scala> "hoge"::"piyo"::"fuga"::Nil
res2: List[java.lang.String] = List(hoge, piyo, fuga)

:: メソッドに与える引数の型により、返り値の型が決まる。

ところで、foldRight の第1引数 z の型変数は B と書かれており、リストの要素から型を決めることができない。仮引数 z に Nil を与えても型が決まらない。だから、型を指定しなければならないということかな。

(l foldRight List[Int]())(_*2::_)

この場合の foldRight の型は以下のような感じ。

def foldRight(z: List[Int])(f: (Int, List[Int]) ⇒ List[Int]) : List[Int]

ごちゃごちゃしていて頭混乱するなぁ~。

 

map の定義

map 関数を foldRight メソッドを使って定義するなら、

def mymap[A,B](l: List[A], f:(A) => B) :List[B] = (l :\ List[B]())(f(_)::_)

Haskell では、型を明示しなくても推論してくれるのでシンプルに書ける。

mymap f = foldr ((:).f) []

 

filter の定義

filter メソッドを使った 3 以上要素を抽出する関数を :\ メソッドで書き直すなら、

(l :\ List[Int]())((x,y) => if (x>3) x::y else y)

filter メソッドを :\ メソッドを使って定義するなら、

def myfilter[A](l: List[A], p: (A) => Boolean) :List[A] = 
  (l :\ List[A]())((x,y) => if (p(x)) x::y else y)

Haskell なら、

myfilter p = foldr (\x y -> if p x then x:y else y) []

 

5. その他

a. Range で数値のリストを生成

ついでなので、範囲を表わす scala.collection.immutable.Range を使い、1 から 10 まで足してみる。

((1 to 10) :\ 0)(_+_)
(1 to 10) reduceRight (_+_)
(1 to 10) sum

 

b. ブロックを使って副作用

純粋関数型でないメリットは、変数の更新や副作用を簡単に書けること。( それがバグの温床にもなるけれど… )

ブロック { } を foldRight で用いると計算途中の値を出力できたりする。ブロックは最後の式の値が返されるので、以下のように書くと、計算途中の変数の値を出力可能。

((1 to 5) :\ 0){ (x,y) =>
  println(y)
  x + y
}

結果は、

0
5
9
12
14
res647: Int = 15

これは Ruby の inject メソッドを書くときに似ている。

puts (1..5).inject(0){ |x,y|
  puts x
  x + y
}

実行すると結果は、

0
1
3
6
10
15

あ~、Ruby の inject メソッドは左から右へと畳み込んでいくんだったか。つまり、Scala で書くと、

(0 /: (1 to 5)){ (x,y) =>
  println(x)
  x + y
}

2010年12月30日木曜日

Meadow で Scala - 空白を含むパスはトラブルの元

Notepad++ で Scala を書く場合、起動は軽いけれどコードの補完をしてくれない。 Eclipse では 補完はしてくれるけれど起動が遅く、メモリの消費が大きい。補完も今一な気が。。 (+_+) やっぱ Meadow を使うのがいいのかな?

上記を参考に Meadow で Scala を利用できるようにした。

 

Scala のインストールされているディレクトリへのパスが空白を含まないように変更

しかし、当初 scala-mode を使えるように設定した後、 REPL を起動しようと M-x scala-run-scala を実行したら、

'c:\Program' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

とエラーが表示された。

これは、scala を c:\Program Files\scala にインストールしていたのがダメだったようだ。 c:\scala に再インストールしたら scala-run-scala で起動できるようになった。

 

elisp のあるディレクトリへのパスが空白を含まないように変更

次に ENSIME を利用するための設定をした後、M-x ensime を実行。しかし、

Failed to connect to Swank: server process exited.

とエラーが表示される。

The Swank Protocol について調べても判然とせず。

The Emacs ENSIME client communicates with the server using the Swank protocol.

と説明があるので、server を起動していそうなバッチファイルを、ENSIME をインストールしたディレクトリにおいて適当な引数を与えて実行。(cf. scala - How to make ensime work in windows? - Stack Overflow)

bin/server.bat 12345

結果はコマンドラインに、

server listening on XXXXX

と表示される。これに対して telnet で

telnet 127.0.0.1 XXXXX

と試みると接続がされる。Meadow において、M-x ensime-connect をしても同様に接続可。

ところで、複数の PC で Meadow の設定を共有するために設定ファイル・elisp は Dropox へ置いている。エラーの原因はまたもこのパスだった。

Dropbox へのパスは以下の通り、空白が含まれていた。

C:\Users\ユーザ名\Documents\My Dropbox

これを Dropbox の Preferences > Advanced の ‘Dropbox location’ にて、空白を含まない場所へ変更。

C:\Users\ユーザ名\Documents\Dropbox

これにより、M-x ensime で ENSIME を実行すると、正常に動作してくれるようになった。

 

関連記事

2010年10月30日土曜日

コマンドプロンプトから現在のフォルダをエクスプローラで開く

1. コマンドプロンプトから、エクスプローラを開く

コマンドプロンプトで、カレントディレクトリをエクスプローラで開きたい。

そのためには、マンドライン上で以下のコマンドを入力する。

explorer .

explorer の代わりに start でもいい。

 

2. エクスプローラから、コマンドプロンプトを開く

逆に、エクスプローラからコマンドラインを開く場合は、以下を参考に。

一番楽なのは Open Command Prompt Shell Extension をインストールすることかな。

Vista ではエクスプローラ上で、Shift キー押しながら右クリックすると、コマンドプロンプトを開けること知らなかった。。 (+_+)

 

3. Meadow でエクスプローラを開く

Meadow の dired でエクスプローラを開きたい場合の設定はこちら

2010年7月24日土曜日

Meadow で Undo, やり直し

一般的なアプリケーションにおける「元に戻す」「やり直す」

Windows や Mac の一般的なアプリーケーションにおける 「元に戻す」「やり直し」の操作は、

Windows 7 のショートカット キー

Ctrl + Z 元に戻す
Ctrl + Y 操作をやり直す

 Mac OS X のキーボードショートカット

command + Z 前のコマンドの取り消し
shift + command + Z 前のコマンドのやり直し

しかし、操作を 「やり直す」 ということが滅多にないので、これにショートカットキー Ctrl + Y が付けられていることを長いこと知らなかった。 ^^; 友人から「初心者向け PC の検定問題にあった」と聞いて、はじめてそんなキーが割り当てられていることに気づかされ、「使わない機能に対しては、その存在すら意識が向かないものだなぁ」とつくづく感じた。いや、しかし、Mac 使ってたときは上記のショートカットキーを使っていたような気もするんだけれど。。

img07-24-2010[1]

それはともかく、

元に戻す  >>  元に戻す  >>  元に戻す

によって行なった操作は、

やり直し  >>  やり直し  >>  やり直し

により、また元の状態に戻る。

 

Meadow の Undo

Meadow で操作を「元に戻す」には、

C-/

Undo の `u’ の字が割り当てられているキー操作を使うなら、

C-x u

 

操作の繰り返し

元に戻す操作を繰り返したいとき、上記 C-x u を連続して入力するのは面倒なので、

C-x z

と組み合わせる。 2.2 ファイルの作成,編集 によると、

バッファに対して何らかの編集作業を行った後,その作業を繰り返す場合には, C-x zを入力します.これにより,前に行った作業を反復して実行できます.このように操作の反復を行うことを``Redo''といいます.Redoを繰り返すことによって,作業を効率的に行えます.なお,C-x zは,一度実行した後は zを押すだけで繰り返しを行えます.Undoと組み合わせることで,一度取り消した作業を再びやり直すUndoを繰り返し行うなどの作業を行えます.

(太字は引用者による)

つまり、 EmacsWiki: Category Undo で述べられているように、

Having once undone a change with ‘C-x u’ or `C-_’, you can repeat the undo command by pressing ‘C-x z’, which is ‘repeat’. So the overall sequence of C-x u C-x z z z z z undoes changes back through time, and may be easier to type than `C-_ C-_ …’.

(太字は引用者による)

 

やり直し

これに対して、「やり直す」操作は、

一般のWindowsアプリのundoのつもりで使ってると混乱するんですよ。

具体的には「undo:ひとつ前のコマンドを取り消す」なんですが、「undo」自体もコマンドと認識されるので、undoコマンドでundoをundo できるっていう(※連続してundoしてるかぎりは直前のundoがundoされることはない)。つまり一般的なアプリでいうところのredoをundo コマンドひとつでやってしまうっていう。慣れたら便利だけど慣れないときもい。

(080525(Sun) emacsメモその2・undo/redo編 - BKCのBの方 より)

例えば、間違えて 

C-/

により Undo し過ぎたら、

C-g

を入力して、再び

C-/

を入力する。

つまり、

C-/   >>   C-/   >>   C-/

によって行なった操作は、

C-g   >>   C-/   >>   C-/   >>   C-/

により、また元の状態に戻る。

 

参考サイト

Key Index - GNU Emacs Manual

2010年1月24日日曜日

Meadow の dired でよく使うキー操作

良く使う基本操作

Meadow で必ずお世話になるのは dired 。

M-x dired

で起動し、表示したいディレクトリを指定。

 

日付で並び換え

ディレクトリが開かれたら、まずは日付で並び換え

s

の後、目的のファイルを探す。

C-s または C-r でインクリメンタルに目的の場所へ移動し Enter 。

 

ヘルプ

操作方法を忘れたら、

?

これだけは忘れられない。

 

すぐに忘れる表示の更新 g

dired でディレクトリを開いた後、新たに作成したファイルは表示されない。はじめこの仕様に戸惑った。 (+_+) 表示を更新するには GNU Emacsマニュアル: ディレクトリエディタdired によると、

g

これすぐに忘れる。 (+_+) なんで `g’ なのかな?更新のイメージとキーを結びつけられない。

 

ディレクトリの作成も dired で +

Meadow/Emacs memo: ディレクトリ表示 ― dired など の基本的な操作を見たら、

+

でディレクトリを作成できたことにはじめて気がついた。いつも make-directory で作ってた。 ^^;

 

Explorer との連携をするための設定

いつか設定しようと思っていたエクスプローラとの連携。重い腰をあげ、Meadow/Emacs memo: ディレクトリ表示 ― dired など の「エクスプローラを起動する設定」を .emacs に追加。

これで dired で

E

により dired で開いていたディレクトリがエクスプローラで表示される。

編集中のファイルを開いている状態でも M-x explorer でそのファイルがあるディレクトリが開かれる。

快適~ ^^

2009年12月27日日曜日

Meadow の設定ファイル (.emacs) をDropbox へ

1. 設定ファイルと .el ファイルを Dropbox へ移動させる

PC を移行するとき、 Meadow の再設定を最小限にしたい。そのために Dropbox を使うことにした。今のところ、php-mode をDropbox 上へ移動しただけ。

他のモードやその他諸々の .el ファイル、 .emacs も Dropbox 上へ置くことにした。

 

2. Dropbox 上の .emacs の内容を起動時に読み込ませる

Meadow の設定ファイル .emacs は、環境変数 %HOME% で指定したホームディレクトリにある。これを Dropbox 上へ移動する。ただし、移動後のファイルを、Meadow の起動時にロードする必要がある。

これを実現するための方法は以下の 2 つ。

Dropbox 上にあるファイルを .emacs から読み込む方法。

091227-001

Dropbox に .emacs を置き、ホームディレクトには .emacs へのリンクを置くという方法。

091227-002

今回は後者のシンボリックリンクを使うことにした。

 

3. シンボリックリンクの作成

シンボリックリンクの作成は、以下を参照。

 

関連記事

2009年11月9日月曜日

Meadow で自動保存をやめる

Meadow でファイルを編集していると、自動的に `ファイル名~’ が作成される。あまりもこのファイルが散らかってきたので、この際自動保存をやめることにした。

バックアップファイルについての設定 によると、

この設定をオフにしてバックアップファイルをつくらせないようにするには, make-backup-filesnilにしておきます.

これを参考に ~/.eamcs に以下のように記述。

(setq make-backup-files nil)

M-x load-file で ~/.emacs をロードしなおす。

 

Emacsでファイルの自動保存 (auto-save-buffers) には、

僕は 以前 からファイルを自動で保存するように Emacs の設定を行っている。…

… キー操作が 0.5 秒ないときに更新の あったファイルがすべて自動的に保存されるようになる。この設定 を行ってから 2年以上の間、C-x C-s をまったく打たなくなった。

と書かれていたけれど、これはまたの機会に試してみよう。

 

ubulog: Emacsの保存関係の設定 には、

… バックアップファイルは専用ディレクトリを作ってそこに全部保存されるようにします。

という設定が書かれていたので、こちらの方が良かったかなぁ。

 

参考

2009年10月3日土曜日

Eclipse で正規表現によるテキストの置換 – Meadow と比較して

コメントアウトするとき

Meadow (Emacs) で指定した範囲を正規表現で置換したい場合、

  1. 範囲の選択
  2. M-x replace-regexp

により、やや癖のある正規表現を入力をして置換。コードをコメントアウトしたいときにこの操作を多用。

Eclipse をベースにした IDE を使っていると、コードをコメントアウトする操作は、

  1. 範囲の選択
  2. Ctrl + /

Meadow をカスタマイズして使いこなせないので、Eclipse は楽だなと感じる。

 

Eclipse の検索と置換で正規表現を利用

なぜかわからないけれど、Meadow ではちょっとした修正でも replace-regexp を使って置換しようという気になる。これに対して、Eclipse ではちょっとした修正なら手動でチョコチョコと手直しするのが習慣化していた。しかも、それに疑問も感じずに。。 (+_+)

さすがに面倒になってきたので、Eclipse でも正規表現でテキストの修正ができるように、操作を手に馴染ませることにした。

例えば、以下のコードの 2 ~ 4 行目を

                    with (_area.style) {
                        cssFloat = "right";
                        width = "35%";
                        padding = "10px";
                    }

次のように変換したいとする。

                    area.style.cssFloat = "right";
                    area.style.width = "35%";
                    area.style.padding = "10px";
方法

091003-005.pngまずは、Ctrl + F で 検索と置換のダイアログを表示させる。

正規表現で置換をするために、Options > Regular expressions をチェック。ただし、マウスは使いたくないので、Regular expressions の下線のある文字に注目して、Alt + x でチェック。手が思考に対応して自然に動いてくれるようにしたいので、なるべくキーボード操作で終えるように試みる。

選択した範囲のみ置換がされるために、Scope > Selected Lines もチェック。

ショートカットを覚えるのには、例えば Regular expressions なら、頭の中で発音するときに `エクスプレッション’ の太文字のところを強調していれば、そのうち慣れるかも。

正規表現モードにすると、Find と Replace With フィールドで Ctrl + Space で正規表現の候補を表示してくれる。候補を閉じたい場合は Esc 。もしくは Find フィールドから Replace With フィールドに移りたいなら、候補が表示されていても Alt + e でフォーカスを移動できる。

 

後は正規表現。

  • Find : (^\s*)(.+)
  • Replace With: $1area.style.$2

Find なら Alt + n, 置換しながら検索するなら Alt + d

Meadow の replace-regexp と違い、素直に正規表現を書けるのがうれしい。 ^^ 細かな正規表現のルールを覚えなくても、グループ化と後方参照でそこそこなんとかなりそう。

 

Meadow (Emacs) の場合

上例を Meadow でするなら `\’ の入力は、

replace-regexpでは,グループ化やバックスラッシュそのものの入力は

"\( \)"
\\
(Emacsの正規表現,re-builderとreplace-regexpの違い - yaottiの日記 - Emacsグループ より)

後方参照は、GNU Emacsマニュアル: 探索と置換 によると、

newstringの中の`\d'(dは数字)は、 regexpの中のd番目の括弧のグループ化部分に一致した部分を表します。置き換えるテキスト内に`\'を含めるには、 `\\'と入力する必要があります。

よって、次のように入力する。

  1. replace-regexp
  2. \(^ *\)\(.+\)
  3. \1_area.\2

グループ化の括弧を \ でエスケープしたり、後方参照が $1 ではなくて \1 のように書くことに注意と。

 

関連記事

2009年1月14日水曜日

Meadow (Emacs) のライブラリをポータブルに - Dropbox へ配置

1. php-mode のインストールと設定

Emacs で PHP を編集するために、php-mode を利用する。

SourceForge.net: PHP mode for Emacs からダウンロードして解凍。

設定方法は、Installation - PHP Mode Manual を参考にして、

  1. Emacs Lisp のライブラリに php-mode.el を置く。
  2. .emacs に以下を追記。
(load "php-mode")
(add-to-list 'auto-mode-alist
     '("\\.php[34]?\\'\\|\\.phtml\\'" . php-mode))

PHP ファイルを Emacs で開いた場合、表示が次のように変わる。

g2413

 

拡張子を追加

Drupal のソースファイルの拡張子は .php ではなく、.module, .inc 。この拡張のファイルを開いたときも、php-mode を利用したい。

Installation - PHP Mode Manual  を参考にして、

(add-to-list 'auto-mode-alist '("\\.module\\'" . php-mode))
(add-to-list 'auto-mode-alist '("\\.inc\\'" . php-mode))

 

2. Dropbox に Emacs のライブラリを置く

現在、Emacs のライブラリはローカルに配置している。どの場所にいても、同じライブラリを使いたいので、ライブラリを Dropbox フォルダに置くことにした。

My Documents\My Dropbox

に eslips フォルダを作成。上記の php-mode.el を置いた。

初期設定ファイル (~/.emacs) に、ライブラリのフォルダを認識させるために、以下を記述。

(add-to-list 'load-path "~/My Documents/My Dropbox/elisp")

 

3. その他

設定に関する関数や変数を調べたい場合、

正規表現におけるバックスラッシュについては、

2009年1月13日火曜日

Emacs Lisp で関数と変数のドキュメントを表示する

1. 関数や変数の意味を知りたい

Emacs の初期設定ファイル (.emacs) に、以下の記述があったとする。

(add-to-list 'load-path "~/hoge/")

add-to-list や load-path の意味を知りたい。

 

2. 関数のヘルプを表示する

Emac Lisp において、関数の役割がわからないとき、

describe-function

コマンドにより、その場で問い合わせることができる。

例えば、関数 add-to-list のヘルプを表示したいときは、その関数の上にポイントを移動して、

  • Ctrl + h f
とキーを入力する。その結果、エコー領域に、次のように表示されるので、RET を押す。
Describe function (default add-to-list): 

add-to-list 関数のヘルプは、以下のように表示された。

(add-to-list list-var element &optional append compare-fn)
Add element to the value of list-var if it isn't there yet. …

コマンドにバインドされたキーの覚え方は、

  1. ヘルプ h
  2. 関数(function) f

 

3. 変数のヘルプを表示する

ヘルプには、add-to-list 関数の第1引数はリストだと書かれている。

初期設定ファイル (.emacs) の適当な場所で

load-path

と書き、行末で以下のキーを入力。

  • C-c C-e

これにより、エコー領域に emacs lisp のライブラリである、ディレクトリ一覧が表示される。ただし、この場合、load-path の接頭辞にある、アポストロフィをとって評価することに注意。

Emacs Lisp プログラミング: リスト処理 によると、

リストの直前に付けた1つのアポストロフィ'クオート(quote)と呼ぶ。リストの直前にこれを付けると、 そのリストに関しては何もせずに字面どおりに扱うことをLispに指示する。 リストの直前にクオートがない場合には、リストの先頭要素を特別扱いし、コンピュータが従うべきコマンドとなる(Lispでは、これらのコマンドを関数(functions)と呼ぶ)。

ソースコード上で、変数のヘルプを見たいときは、

describe-variable

をコマンドを利用する。

変数の上にポイントを移動して、

  • C-h v

を入力する。これにより、エコー領域に以下のように表示されたら、RET を押す。

Describe variable (default load-path): 

コマンドにバインドされたキーの覚え方は、

  1. ヘルプ h
  2. 変数(variable) v

 

4. キー入力にバインドされたコマンドを表示

関数や変数のヘルプを表示させるためのキー入力に対応したコマンドを知るには、

describe-key-briefly

コマンドを利用する。このコマンドは、以下のキー入力にバインドされている。

  • C-h c

覚え方は、

  1. ヘルプ h
  2. コマンド (command) c

 

4. ヘルプの表示させ方を忘れた場合に備えて

コマンドを忘れてしまった場合に備えて、

describe

だけを覚えておく良い。

describeの意味 - 英和辞書 - goo辞書

1III[名]([副])/wh-節/wh- to do](人に)…を(文字・言葉で)述べる, 記述する, 表現する((to ...)). ⇒DEPICT[類語]

describe an event
事件を描写する

describe ... to a person [=describe to a person ...]
人に…を説明する

Describe to me how the accident happened.
その事故のてんまつを私に話してください(▼×Describe me how ... とはいわない).

M-x describe を入力したら、Tab キーを押すと、コマンドの候補が表示される。

describe という単語すら、忘れることがあるので、

  • M-x help

により、ヘルプが表示されることだけは覚えておくこと。

 

関連記事

2008年10月26日日曜日

Meadow (Emacs) で矩形領域をカット & ペースト

C-x r k → C-x r y

微妙に使わないものは何度でも忘れてしまう。 (+_+) どうやって忘れないようにしようか。

C-k → C-y

このカット&ペーストのパターンはさすがに忘れないのでこれを基本形と考え、

C-x

は、コマンド実行 command e`x’ecute 。そして矩形の`r’ectangle 。

… いつまで覚えていることができるかな。

 

その他

最近やっと M-x goto-line と入力しなくても、M-g g で特定の行へジャンプする入力を手が覚えてくれた。 ^^; これは Go! Go! と覚えた。

 

参考サイト

2008年8月2日土曜日

Meadow で Ruby のファイル (Shift_JIS) を開いたら文字化け – emacs-rails の rails.el

あれ?エンコーディングが Shift_JIS である Ruby のファイルを Meadow で開いたら、文字化けしている。 (@_@;)  どうやら Shift_JIS のファイルを UTF-8 で開いているみたいだ。

080802-001

 

以前に ruby-mode を設定したときに何かしてしまったかな?

Ruby関連のファイルがUTF-8で開かれるようになった - gan2 の Ruby 勉強日記 によると、

rails.el の下から6行目をコメントアウトすることにした。

;; (modify-coding-system-alist 'file "\\.rb$"     'utf-8)

結局これが一番分かりやすい気がする。

そういえば、 Meadow を netinstall するとき、ついでだから開発用のパッケージを色々と入れてやれ思い、ruby-mode 以外にも emacs-rails を入れたんだった。 ^^;

080802-003

 

C:\meadow\packages\lisp\emacs-rails に上記で指摘されていた rails.el があった。これを開いて同じようにコメントアウトしたら、Shift_JIS で文字化けしなくなった。 ^^

2008年6月28日土曜日

Windows で困ったときの強制ログオフ

あれ?コンピュータの動きがおかしい。 CPU が何かに占有されているわけではないのに、特定のアプリケーションの反応がなくなってしまった。タスクマネジャーでそのアプリを強制終了させようとしても、タスクマネジャーの動きもおかしい。反応してくれない。ログオフしようと思ってもできない。どうしよう ... (@_@;)

 

ブルースクリーンのトラウマ

以前は気軽にリセットスイッチを押していたけれた。しかし、オーバークロックして落ちてブルースクリーン、Windows XP が起動しなくなってクリーンインストールという経験をしてから、何かトラブルがあった場合には、極力 Windows の力で再起動もしくはシャットダウンをさせたいと思うようになった。

さて、現状を確認しよう。画面には反応しないアプリ多数。頼みの綱のタスクマネジャーもダメ。ただ、 先ほどまで使っていた Meadow は生きているようだ。 そこで、 Meadow からシェルを起動、コマンドを入力してログオフさせることにした。

 

shutdown.exe

まず、Meadow から シェルを起動する。

M-x shell

コマンドラインより、help を入力しても該当するコマンドが見つからず。 (@_@;) 適当に shutdown と入力してみる。

d:\meadow\bin>shutdown
shutdown
使用法: shutdown [-i | -l | -s | -r | -a] [-f] [-m \\コンピュータ名] [-t xx] [-c "コメント"] [-d up:xx:yy]

    引数なし        このメッセージを表示します (-? と同じです)
    -i            GUI インターフェイスを表示します。このオプ
                ションは最初に指定する必要があります
    -l            ログオフ (-m オプションとは併用できません)
    -s            コンピュータをシャットダウンします
    -r            コンピュータをシャットダウンして再起動します
    -a            システム シャットダウンを中止します
    -m \\コンピュータ名    シャットダウン/再起動/中止するリモート コン
                ピュータの名前です
    -t xx            シャットダウンのタイムアウトを xx 秒に設定
                します
    -c "コメント"        シャットダウンのコメントです (127 文字まで)
    -f            実行中のアプリケーションを警告なしに閉じます
    -d [u][p]:xx:yy        シャットダウンの理由コードです
                u = ユーザー コード
                p = 計画されたシャットダウンのコード
                xx = 重大な理由コード (255 以下の正の整数)
                yy = 重大ではない理由コード (65535 以下の正の
                整数)

shutdown –l というのがよさそうだ。 Meadow のシェルからコマンドを入力する。しばらくすると、アプリケーションが終了し、無事ログオフできた。

 

コマンドラインから以外には

もし、今回のように Meadow が起動していなかった場合、「スタート > ファイル名を指定して実行」 ( Windows キー + R ) でダイアログを表示させ、 shutdown –l と入力する。タスクマネージャが生きているようであれば、タスクマネージャを起動 ( Alt + Ctrl + DEL ) して、アプリケーションタブ右下の「新しいタスク...」ボタンを押して、同様に shutdown –l と入力する。

 

リモートシャットダウンダイアログ

ちなみに、上記コマンドラインの i オプションを利用すると、次のような GUI が表示された。

080628-001

2008年6月27日金曜日

Windows で MinGW と Meadow を使い C 言語をコンパイル

1. 「プログラミング言語 C」

本棚を整理していたら、なつかしい本が出てきた。

プログラミングをはじめたときはオブジェクト指向真っ盛りで、C 言語は本棚の隅に追いやられていた。

必ず一度は通る定番の言語として、古典と呼ばれる本だけは押さえておきたかった。しかし、購入しただけで、本棚の隅に追いやっていた。 ^^;

訳者まえがきを読むと、隔世の感がある。

郵便だと、アメリカとのやりとりには約 2 週間かかるが、電子メールならすぐ連絡がつく。 1981 年当時と比べると隔世の感がある。(…)

1989年5月

 

2. MinGW を利用する

プログラミング言語C に掲載されているコードを Windows 上で試したい。Windows 上で C ができる環境を整えることにした。

ゴテゴテした IDE を利用せず、なるべくシンプルな環境にしたい。適当に C コンパイラをインストールし、Meadow で C のコードを編集するという方針にする。

タダで始めるC/C++プログラミング for Windows の中で紹介されていた MinGW を試してみることにする。

MinGW は UNIX 用の C/C++ コンパイラの GCC を Windows に移植し,Windows ネイティブなプログラムを作成するためのヘッダファイルなどを整備するプロジェクトです。

サイトから MinGW-5.x.x.exe をダウンロードして下さい。Latest File Releases に無い場合には,SourceForge.net の [View ALL Project Files] から選んでください。

より UNIX 風に使いたい場合には,UNIX に似たコンソールを提供する MSYS (Minimal SYStem) も使うと良いでしょう。

同じく GNU Compiler Collection として Cygwin がある。Cygwin は、UNIX 環境を Windows 上に再現するという感じ。今回はコンパクトな MinGW を利用する。

 

3. MinGW と Cygwin の違い

MinGW – Wikipedia によると、 Cygwin との違いは、

MinGWはCygwin 1.3.3からフォークした。Cygwin、MinGWいずれもUnixソフトウェアのWindowsへの移植に使用されるが、異なる方針を採っている。 CygwinはLinuxや他のUNIXシステムに見られるような、Windows上に完全なPOSIX層を提供することを目標にしており、互換性のために必要であれば性能も犠牲にしている。一方でMinGWはフリーのコンパイラと各種ツールのみを行い、性能を重視している。

ライセンスについては、 Routine-Work:/topics/MinGW/overview.html によると、

cygwin1.dll が GPL であるということは cygwin1.dll をリンクするすべてのプログラムにも GPL が適応されるということです. つまりすべてのソースコードを GPL に従ってと公開する必要があります.

MinGW の基本部分のライセンスはパブリックドメインです.また Win32 API のインポートライブラリとヘッダについても自由に使うことのできるライセンスとなっています.

 

4. MSYS

MinGW プロジェクトには、 MinGW 以外にも MSYS というのがある。

MSYS – Wikipedia によると、

Windows上で動作するシェル(Bash)やテキスト操作ユーティリティ(gawk,sed, findutil)、ソースコードパッチ用ツール(diffutil), アーカイブツール(tar, bzip, zlib)を統合したパッケージである。MinGWを補う目的で作られた。

後で必要になってから、インストールすることにした。

 

5. MinGW のインストール

SourceForge.net: Files から MinGW-5.1.4.exe をダウンロードしてインストール。

環境変数 Path に c:\MinGW\bin を追加し、再ログイン。

 

6. Meadow の設定

インデントスタイルを設定した。スタイルはもちろん K&R 。

字下げスタイル – Wikipedia

K&Rスタイルとは、ブライアン・カーニハンデニス・リッチーの著書『プログラミング言語C』で使われた字下げスタイルであり、C言語で一般に使われている。

CC-mode の簡単な使い方 を参考に .emacs に以下のように記述した。

(add-hook 'c-mode-hook
	  '(lambda()
	     (c-set-style "k&r")))

 

参考サイト

Emacs Lisp は全く知らないので、いつかは一通り目を通そう。^^;

2008年6月21日土曜日

Meadow でブログを書く - html-mode を使って

1. Windows Live Writer の調子が悪い

普段、ブログを書くのには、Windows Live Writer を使っている。WLWは、SKK-IME と相性が悪い。SKKIME が「直接入力」になっている状態で Ctrl + l を押すと、「画像の挿入」ダイアログが表示され、その後、アプリケーションが落ちる。

最近、頻繁にこの症状が起こり、書きかけの文章が消えてしまった。

プログラムのコードを貼り付けるときは、html の編集用に切り替え、blockquote と pre タグを直接書いている。これが今一使いづらい。

そこで、Windows Live Writer 以外でも、ブログを快適に書けないか試してみることにした。

 

2. Emacs の html-mode を使う

Meadow で HTML ファイルを表示すると、タグが色付けされる。モードは html-mode になる。

html-mode は、機能はシンプル。しかし、ブログを書くとき、タグをそれほど使わないので、必要にして十分。

html-mode のヘルプを表示させ (C-c C-h) 、機能を分類してみた。以下では、C-c を押した後のキーのみを書いている。

一般的なタグの入力、h タグ、段落、アンカー、そして、ブラウザでプレビューを覚えれば十分。

それから、

  • 整形するときは全部を選択 (C-c h) しておいてから M-x indent-region (C-M-\) 。
  • 文字を書いた後にタグで囲みたいときは、対象の文字列を選択した後にコマンドを入力する。

とりあえず、これまで Windows Live Writer で書いた記録が残っているので、

  1. それを Meadow で HTML を編集。
  2. 投稿するときだけ Windows Live Writer を使う

というスタイルにしてみる。

2008年6月19日木曜日

Meadow の シェルコマンドで Python を実行

  1. ユーザー環境変数 PATH に Python.exe があるディレクトリ (C:\Python25) を追加する。
  2. 再起動

これで、M-! python ファイル名 を実行できる。

ユーザー環境変数を変更したら、Meadow を再起動するだけで変更が反映されると思ったけれど、ダメだった。 (+_+) 再起動じゃなくて、再ログインだけでもよかったのかな?

Meadow (Emacs) で指定範囲にあるコードを実行して結果で置き換える

  1. 実行したいコードを選択
  2. C-u M-|
  3. ミニバッファで、実行するためのプログラム名を入力

そもそも C-u とは、GNU Emacs Manual - Arguments によると、
引数を設定するには,C-u(universal-argument)コマンドの後ろに数字を入力する方法もあります.
なので、上記の方法は、選択した文字列を引数として、シェルコマンドに渡しているというイメージか。

参考

http://www.argv.org/bep/common/refcard/refcard.txt

関連記事

2008年6月15日日曜日

Meadow (Emacs) で shell-command の補完

プログラムの実行

Meadow を使ってスクリプトを書いていると、頻繁に行うのが書いたスクリプトの実行。

M-! スクリプト名

右手の親指で Alt , 小指で Shift キーを押し、左手の薬指で 1 のキーを押す。これが習慣になると、 M-! を頭の中で言うのではなくて、「コマンドの実行」と心で思うと、自然に手が動くようになってくる。しまいには、 M-! であることを忘れ、手の動きから「コマンドの実行は何のキーだっけ?」と推測するようになる。 ^^;

 

履歴から実行

一度、実行したスクリプトなら、M-! の後に、すぐ上矢印キーに手がのびる。 M-p でヒストリーを辿るという手の動きは習慣化されていない。 HHKB なので、M-! のアクションから、 Fn + [ という手の移動が最小でやりやすい。

 

選択範囲を実行

さすがに「すぐに忘れる脳みそ」だけあって、範囲を選択して実行 なんて、すっかり頭から抜けていた。復習。復習。手になじませる。 ^^;

!

と形が似ている

|

で、! とは対照的な場所に位置している。よって、手の動きも対照的。

 

コマンドの入力時に補完

shell-command で不満なのは、M-x で実行するコマンドのように TAB キーを押したら補完してくれるのかと思いきや、そうではないこと。頻繁に行う操作なので補完されるようにしたい。

shell-command.el を導入するとこれが可能となる。 「shell-command のコマンド入力に補完が効くようにする」 の説明に従い shell-command.el をダウンロードして c:\meadow\site-lisp\ に置き、 .emacs に以下を設定。

(require 'shell-command)
(shell-command-completion-mode)

追記 (2009.12.27)Dropbox に Emacs のライブラリを置いたのに伴い、shell-command も Dropbox に置くことに。

 

M-x load-file ~/.emacs で .emacs を再読み込み後に M-! を入力すると、以前とは違って現在編集しているファイルが存在するディレクトリが表示されている。ここで例えば ruby を実行したいなら、 r と入力後に TAB キーを押すと、 r で始まる .exe の候補が表示される。

ruby.exe を選択した後、動かしたいファイル名の先頭の文字を入力し、 TAB を押せばさっとファイル名が補完されるようになる。 ^^

2008年6月10日火曜日

Meadow (Emacs) で特定の範囲の文字列をカット(削除)する

エディタは、Meadow をよく使う。全体からすると、わずかな機能しか使えてないので、愛用しているとはとても言えないけれど、基本的な機能を使うだけでも、このエディタに十分な魅力を感じる。
特に便利だと思えるのは、特定の範囲の文字列をカット (削除) するとき。キーボードから手を離さなくてもスムーズに操作できる。こういうのをマウスでちまちまやっていると、精神的に疲労してしまう。 (+_+) マウスって、細かい作業をするとき、結構、目に負担をかけている気がする。

方法

  1. 前方検索  (C-s 文字列)
  2. 後方検索 (C-r) で、検索した文字列の先頭へ移動
  3. RET    (C-m)
  4. 前方検索で、カットしたい範囲の末尾の文字列へ移動
  5. マークとポイントを入れ替える。(C-x C-x)
  6. カット (C-w)

追記 (2009.10.21) : 3 番目の RET は、Ctrl + Space の方がキーボード押しやすいかも。
もしくは、2-3 の手順の代わりに Alt + B で単語の先頭に移動すれば、マークも付けてくれるので早い。細かく移動したいなら、普通に Ctrl + B でよい。
ただ、使っていて思うのは、カットしたい先頭でマーク付けて、Alt+ F で選択範囲を伸ばすことが多いような。。 ^^;
追記 (2009.11.7) : Ctrl - m で Return と同じなので、こちらの方が手の移動距離が少ないので楽。

ポイントがファイルの先頭にある状態で、以下の赤い下線の部分を削除したいとする。
080610-4

「you」を前方検索。 (C-s)
080610-5

後方検索 (C-r)
080610-6

リターンキーを押す。 (RET) もしくは C-m
080610-7

「file」を前方検索。 (C-s)
080610-8

マークとポイントを入れ替える。 (C-x C-x)
080610-9

カット。 (C-w)
080610-10

参考

2008年6月9日月曜日

Meadow で ruby-mode

Meadow をインストールしたので、 次に ruby-mode を入れることにした。 Ruby をインストールしたフォルダ上で *.el をファイル検索したら、

C:\ruby\src\ruby-1.8.6-p111\misc

にいくつか .el ファイルを発見。これを

C:\meadow\site-lisp

の中に配置した。

追記 (2009.12.27) : Meadow のパッケージで Ruby をインストールすると、

packages\lisp\ruby

.el ファイルに配置されるので、上記のようにする必要はない。

 

ruby-mode.elなどの使い方 によると、  ~/.emacs に以下の記述を追加。

(autoload 'ruby-mode "ruby-mode"
  "Mode for editing ruby source files" t)
(setq auto-mode-alist
      (append '(("\\.rb$" . ruby-mode)) auto-mode-alist))
(setq interpreter-mode-alist (append '(("ruby" . ruby-mode))
                                     interpreter-mode-alist))
(autoload 'run-ruby "inf-ruby"
  "Run an inferior Ruby process")
(autoload 'inf-ruby-keys "inf-ruby"
  "Set local key defs for inf-ruby in ruby-mode")
(add-hook 'ruby-mode-hook
          '(lambda ()
            (inf-ruby-keys)))

M-x load-file で ~/.emacs を再読み込みする。(または、Meadow を再起動。)