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

2016年7月3日日曜日

Emacs カッコの自動挿入で困っている方へ

閉じカッコの自動挿入は便利なのに・・・

Emacs では、カッコを書く時に自動的に閉じカッコを挿入してくれる設定があります。(リンク:Emacs 閉じカッコの自動挿入)

開きカッコ "(" を書くと自動で閉じカッコ ")" を書いてくれて、更にカーソルはカッコの中にあるのですぐに中身を書き始められます。

自動挿入でなかった時には、カーソルを行ったり来たりさせていたのがなくなってスムーズに書けるようになり、絶対に外せない機能です。


これは、何もないところにカッコを書き始める場合は非常に便利な機能です。

でも、すでに中身が書いてある所でそれをカッコでくくろうとすると、とたんに煩わしい機能になります。

カッコでくくりたい部分の先頭にカーソルを持ってきてカッコを書くとこんな風になります。

 y = ()a + b * c          // y = (a + b) * c と書きたいのに・・・


"M-(" で解決

これを解決するのが、リージョンを選択して M-( です。

上の場合だと、a + b の部分を選択して、M-( すると (a + b) になります。

直観的で非常に良いアイデアだと思います。

でも、惜しむらくは、()カッコにしか対応していないところです。

ダブルクォーテーションに対応した、M-" はないのか・・・。



別のアプローチ

方針は違うのですが、こんな対策を考えてみました。

「() カッコを書くとカーソルを () の中に持ってきてくれる。」

() カッコは自分で書きます。実は、閉じカッコを書くのが面倒くさいのではなくてカーソルをカッコの中に戻すのが面倒なのではないかという発想です。

よろしければ使ってみてください。 () と {} と [] と <> と "" と '' に対応しています。

https://github.com/tbhby39g/backalittle.el


インストールするには、backalittle.el を load-path のフォルダ(例えば、~/.emacs.d/lisp/)に置いて、.emacs(または、init.el) に (require 'backalittle) を書き加えれば OK です。

これを使う場合は、electric-pair-mode (or その他のカッコ自動挿入機能)は無効にしておいてください。


リンク: Emacs 閉じカッコの自動挿入
リンク: https://github.com/tbhby39g/backalittle.el

2015年2月21日土曜日

Windows でもEmacs 魂は健在です

Emacs を使うのが楽しくなってくると、それに比例して Windows を使うのがつまらなくなってくる。

そんな気持ちを和らげてくれるのが「 keyhac 」というキー操作をカスタマイズできるソフトと Emacs 用の設定です。

作者の方、ありがとうございます。便利に使わせて頂いています。

Windows へのインストールと Emacs 用の設定は「Windows 7や8(64bit)で emacs キーバインドにする方法」を参考にしました。


keyhac を使ってみると

エディタだけではなくて、エクスプローラでファイルをコピー&ペーストするときにも M-w, C-y となって、思った以上に Emacs 化されてワクワクします。

もちろん IDE も Emacs のキーバインドになるので、IDE に元々付いている微妙な Emacs モードを使う必要はありません。

アプリケーションによっては、Emacs のキーバインドにしたくない場合もあると思います。

僕の場合は、ペイントをよく使うのですが、ペイントでは C-n は下へ移動ではなくて、標準の「新規ファイル」としておきたい。

こういう時は、設定ファイルの指定の場所に適用したくないアプリケーションの実行ファイル名を "mspaint.exe" のように書くだけでOKです。(場所は設定ファイルを見ればすぐに分かります。)


C-@ でマークする方に朗報です。

僕は、Emacs ではマークを C-@ で行っています。

上記の設定では、C-@ は英語キーボードではうまくいかないとのことでコメントアウトされています。

 ## 英語キーボードを利用する場合、LC-2 の設定(数引数の指定で利用)が LC-Atmark の設定で上書きされるのでコメント化
 #keymap_emacs["LC-Atmark"]     = reset_search(reset_counter(set_mark_command))

僕が使っているのは日本語キーボードなので、コメントアウトを外してみたのですが、うまく設定されませんでした。

以下の設定を追加すると、C-@ でマークできるようになりました。

keymap_emacs["LC-(192)"]     = reset_search(reset_counter(set_mark_command))

まとめ

keyhac を使うと Windows の操作が何でも Emacs 風になります。

人の心理とは面白いもので、たったこれだけのことで Windows を使うのが楽しくなり、仕事が楽しくなります。


リンク


2015年2月8日日曜日

Emacs "FooFooFoo" をプログラミングする

Software Design の1月号の記事で、「編集はプログラミングである 」というコラムがありました。(リンク:Vim に乗り換え!?

Vim では 「FooFooFoo」と書くには、3iFoo Esc とタイプすれば良いようです。

結果として FooFooFoo と得るために、行うのは 3iFoo Esc という入力である。「これはプログラムである」と考える。

FooFooFoo

FooFooFoo とそのままタイプするのは DRY の原則に反しており、プログラマとしては避けたい(?)

Emacs で FooFooFoo をプログラミングするにはどうするか? 次のような案はどうか?


1. "Foo M-del C-y C-y C-y"

【 説明 】

Foo とタイプしてそれを切り取って3回貼り付ける。

7ストロークのタイプになり、FooFooFooとタイプするより(9ストローク)も2ストローク少なくなる。(速いかどうかはともかく)

しかし、最後のC-y C-y C-y は同じことを3回やっていて依然としてDRY違反で、モヤモヤ感は残る。


M-3 C-y というようなイメージで貼付けを3回するようプログラミングしたい。

(M-数字 は次のコマンドや入力を数字回繰り返すコマンド)

しかし M-3 はこの場合は C-y に適用できない。


2. "C-x ( Foo C-x ) M-2 C-x e"

【 説明 】

C-x ( と C-x ) はマクロの定義。最後のC-x e がマクロの実行。

C-x ( と C-x ) の間の Foo という入力がマクロとして定義され、マクロの実行をM-2 で2回繰り返す。(定義した時に1回、Fooを入力しているのであと2回繰り返して計3つのFooが入力されたことになる。)

Fooという関数を切り出して、ループで2回実行しているようなイメージ。プログラミングをしているような感じがする。


マクロはショートカットがあるので、実はもっと簡単になる。

C-x ( は F3 キーに割り当てられていて、C-x ) はF4 キーに割り当てられている。

さらに、C-x )は繰り返しのコマンド "M-数字" が適用できて、この場合にはマクロを定義して即座に数字(-1)回分実行する。

まとめると以下の "プログラム" になる。

"F3 Foo M-3 F4" (6ストローク!!)


3. まとめ

あまり実用的ではない編集方法でした。

以下を覚えておくと、この駄文を最後まで読んだ意義があるかもしれません。

 1. M-del で後ろ向きに1単語 kill する。

 2. M-数字 コマンド でコマンドを "数字" 回繰り返す。

 3. マクロの定義、実行は意外と簡単(やってみるべき!)。定義にはショートカット(F3, F4)もある。


リンク

・Emacs manual - Keyboard Macros 17.1 Basic use

・Vim に乗り換え!?




2015年2月1日日曜日

Vim に乗り換え!?

Software Design の2015年1月号は Vim の特集でした。

Emacs を使っているので、普段は Vim の記事は読まないのですが、Vim を IDE のように使うという記事に惹かれてちょっと読み始めました。

Emacs を使っていても、もう少し IDE 的にしたいと感じていたので妙に熱心に読んでしまい、気がついたら Vim をインストールしてチュートリアルをやっていました。


もう Vim への乗り換えを決意して、チュートリアルも終わった後で、ふと1文字削除しようとして我に返りました。

1文字削除するには、「編集モードに移行して x キーを押す」なのか?

これは打ち間違えた時のコストが高すぎる!

・・・何でもコマンドですると思い込んでいて Backspace で消せることには思いが至りませんでした。

とにかく、勘違いにせよ冷静になれました。

Emacs も何でもできるので IDE 的にしたければ Emacs でやればいいだけでした。

一瞬だけの Vim 乗り換えでしたが、IDE 的に拡張したいポイントを考えるいいきっかけになりました。


***

特集のコラムで Vim の編集作業はプログラミングであると言っていました。

「3iFoo Esc」と "プログラム" すると「FooFooFoo」という結果が得られるという例が挙げられていました。

モードを切り替えて入力したり編集したりすると考えるのではなく、編集作業全体(3iFoo Esc)がプログラムで、結果としてある文字が入力されている、という考え方です。

面白い考え方と思いました。

Emacs は編集モードはありませんが、様々な編集のショートカットがあるので考え方は通ずるところがあると思います。


今、Emacs を使っていて編集機能を使いこなせているとは言いがたいので、もう少しチャレンジしてみようと思いました。

普段は読まない Vim 記事ですが、いい刺激が得られました。


Software Design (ソフトウェア デザイン) 2015年 01月号 [雑誌]



2014年2月22日土曜日

Emacs 閉じカッコの自動挿入

Emacs で開きカッコを書くと自動で対応する閉じカッコを挿入するモードがありました。
Emacs 24 で導入された機能です。
機能を有効にするには、.emacs に以下のように書くだけ。

(electric-pair-mode 1)

リンク:Emacs: Insert Parenthesis/Brackets by Pair
リンク:The Emacs Editor の 26.4.3 Matching Parentheses


***

なんと、この対応は全角のカッコでもOKです。
「」とか【】でも機能します。

なんと、なんと、"" (ダブルクオート) にも対応しています。
("string") などと書く時にどういう順番でタイプするのが早いのかというのを、もう悩まなくても済みます。
( を書いて " を書くと、("") という状態になってカーソルがダブルクオートの間に来るので、後は string と書くだけ。

長年のモヤモヤが解決しました。


リンク:Emacs カッコの自動挿入で困っている方へ



2013年9月25日水曜日

Emacs バッファを読み込み専用にする

Emacs で現在編集中のファイルと同じ名前のファイルを開いたときに、どちらが元のファイルか分からなくなってしまうことがある。

ファイルのパスを表示するコマンドを見つけたが (C-x C-v)、同じ趣旨で、参照用として開いたファイルは読み込み専用にしておくと言う手もある。

コマンドは、C-x C-q

バッファを開いた状態で C-x C-q とタイプすれば読み込み専用になります。もう一度タイプすると解除されます。

読み込み専用時には、左下に "%%" が表示されるので、編集中のファイルか参照用のファイルかの区別がつきます。参照用ファイルを間違って編集することもなくなるので余計な気を使わなくて済むのもいい。

***

同じバッファ名だと区別がつかない時、バッファ名を変更するというのが王道なのかもしれませんが、M-x rename-buffer でバッファ名をタイプするのは少々面倒くさい。


<参考>

入門 GNU Emacs 第3版

<リンク> Emacs 現在のバッファのファイルパスを表示する


2013年9月23日月曜日

Emacs 現在のバッファのファイルパスを表示する

index.html とか manifest.json など、名前が決まっているようなファイルがあります。

そのようなファイルを編集している時に、過去はどうだったかと2つめの manifest.json を開くと、 もうどっちが編集中のものだったか分からなくなってしまいます。 やむなく、一回両方のファイルを閉じてもう一回開き直したりして・・・。

ファイルのパスが簡単に分ればいいのに。


ファイルのパスを表示するコマンド

Emacs で現在のバッファのファイルパスを知る方法が無いかと調べたら、こんなコマンドが有りました。

C-x C-v (find-alternate-file)

C-x C-v とタイプするとミニバッファに現在のファイルパスが表示されます。 確認できたら C-gで終了します。


C-g で終了?

実はこのコマンドは本来はファイルを間違えて開いてしまった時などに別の正しいファイルを開き直すコマンドです。
C-x C-f との違いは現在のバッファを閉じて新しいファイルを開くところです。

C-x C-v とタイプしてミニバッファに表示されたパスを編集して、目的のファイルを開く、というのが本来の使い方のようです。

今回はパスを知りたいだけなので、C-g で終了します。

<参考>

入門 GNU Emacs 第3版

<リンク> Emacs バッファを読み込み専用にする






2012年3月27日火曜日

Emacs の動画

Emacs の動画に刺激を受けたのでまとめておく。


Emacs の解説。(実はこういうので英会話のリスニングを勉強すると身に付くのではないか。)


人がエディタを使っているのを見るのは面白いし、ちょっとした癖なんかも、使い方改善のヒントになる。
高速タイピングに憧れていたが、ちょっと考えが変わって、これからは、速くなくてもいいので、
  1. 正確なタイピング
  2. snippet や補完を使い込む
ということで効率化を目指すようにしよう。





2012年1月23日月曜日

Emacs 自動保存 + バージョン管理導入

Emacs で自動保存


自動保存機能について Emacsテクニックバイブル で紹介されている。(参考とされている高林氏の記事「Emacsでファイルの自動保存 (auto-save-buffers)」も興味深いです。)

内容は、「作業中にPCが落ちてしまった時のために自動的に保存するようにしましょう。また、保存操作には2ストロークも必要なので、自動化しましょう。そして、間違って保存してしまった時のためには、バージョン管理システムを使っておこう。」というもの。

保存操作が煩わしいとはあまり感じていなかったが、それはパソコンを使い始めてからこれまでに身に染み込んでいる、ファイルは保存するものという無意識の感覚のためかもしれない。こまめに保存する癖が付いているので、保存が自動化されると思っても見なかった解放感があるかもしれない。

設定ファイル等のバージョン管理をしたいとも思っていたところだったので、自動保存をインストールして、バージョン管理システムも導入してみた。

(全く余談だが、僕は「自動保存」の仕組みには Evernote で初めて触れた。 未だに ノートを書いた後には保存ボタンを探してしまう。)



おうちサーバにバージョン管理導入


Subversion を導入した。 mod_dav_svn.so がインストールされるよう config 設定してインストール。
まずはひと通りのインストールができたが、最初の import で permission denied となってしまった。

原因は Subversion のリポジトリのパーミッションの設定が間違っていたため。
Apache を Subversion サーバとして使うので、Apache からアクセスできるようにパーミッション設定しなければならなかった。

Apache の user と group は Apache の設定ファイル(httpd.conf)に記述してある。
;; Apache の設定ファイル
User www
Group www
User と Group が www となっているのでリポジトリの所有者を合わせて変更する。
;; リポジトリのディレクトリを /var/svn/ に作成している場合
$ sudo chown -R www:www /var/svn/

今日から、自動保存+バージョン管理です。
保存は忘れてもいいけど、commit を忘れないようにしないと ... 。


参考:Emacsテクニックバイブル ~作業効率をカイゼンする200の技~


参考:実用 Subversion 第2版




2012年1月15日日曜日

Emacs のデフォルト設定での起動

Emacs の設定ファイル .emacs を編集後、起動してみたらバグっていた時に、とりあえずデフォルト設定で起動するには、 -q オプションをつけて
$ emacs -q
で起動する。



参考:入門 GNU Emacs 第3版






2012年1月9日月曜日

M-c 単語の本当の先頭を大文字にする

Emacs では M-c で単語の先頭を大文字に出来ます。
しかし単語といってもカーソルのある位置が単語の先頭とみなされてしまうので、カーソルが単語の途中にあった場合はそのカーソルの位置の文字が大文字に変換されてしまいます。

カーソルのある位置の単語が一発で変換されるようにしました。
(多分、再発明と思いますが書きたかったので。
ついでに単語の大文字化/小文字化/kill も書きました。書きたかったので。)
;; 単語の先頭に point を移動
(defun move-first-char-of-word()
  (if (eobp)
    (backward-char))
  (forward-char)
  (backward-word))

;; M-c (capitalize-word) の改善
(defun mod-capitalize-word()
  (interactive)
  (move-first-char-of-word)
  (capitalize-word 1))
(define-key global-map "\M-c" 'mod-capitalize-word)

;; M-u (upcase-word) の改善
(defun mod-upcase-word()
  (interactive)
  (move-first-char-of-word)
  (upcase-word 1))
(define-key global-map "\M-u" 'mod-upcase-word)

;; M-l (downcase-word) の改善
(defun mod-downcase-word()
  (interactive)
  (move-first-char-of-word)
  (downcase-word 1))
(define-key global-map "\M-l" 'mod-downcase-word)

;; M-d (kill-word) の改善
(defun mod-kill-word()
  (interactive)
  (move-first-char-of-word)
  (kill-word 1))
(define-key global-map "\M-d" 'mod-kill-word)

単語の上のどこにでもカーソルを持っていったときに実行する場合と、単語を打ち終わった直後(単語の後で次の単語の前)に実行する場合を想定しています。

Emacsテクニックバイブル には「同じコマンドを連続実行した時の振る舞いを変更する」ということで、連続して M-u M-u ... と 押したときには後方に向かって単語をどんどん変換していく方法が紹介されています。

紹介されている方法では、 C-a を連続で押した場合の挙動も変更になるようなのですが、 僕の場合は、C-a はすでに気に入った変更を加えているのと、単に書きたかったので書いてみました。

参考:31.18 大文字小文字の変更
参考:Emacsテクニックバイブル ~作業効率をカイゼンする200の技~
 





Emacs キーバインド C-l

Emacsテクニックバイブル を読んでいて知った。
Emacs のキーバインドで C-l は、現在のラインを画面中央に持ってくるものとなっていたが、 Emacs23 では C-l 1回で中央に、2回で最上部に、3回で最下部に持ってくるよう変更になっている。

C-l に割り当てられているコマンドが recenter → recenter-top-bottom に変更されたそうです。

参考:Emacsテクニックバイブル ~作業効率をカイゼンする200の技~





2012年1月7日土曜日

yasnippet 探検

Emacs の Org-mode でyasnippetをインストールしておくと、 "<s <tab>" と入力すると "#+begin_example" と展開されるが、設定ファイルはどうなっているのだろう?
・・・どこで設定されているのだろうか?
インストール時に作った .emacs.d/plugins の中か?
$ ls -F
cc-mode/         erlang-mode/     markdown-mode/   rst-mode/        sql-mode/
css-mode/        f90-mode/        nxml-mode/       ruby-mode/       time
emacs-lisp-mode/ html-mode/       perl-mode/       scala-mode/ 
email            latex-mode/      python-mode/     snippet-mode/ 
org-mode はない・・・。perl-mode がある・・・。
中身は?
$ ls -F perl-mode
cperl-mode/ for         if          ifee        unless      xfore       xunless 
eval        fore        ife         sub         while       xif         xwhile  


実行してみる

if の場合

if ファイルの中身は、
#name : if (...) { ... }
# --
if ($1) {
    $0
}
Emacs の perl-mode で
if<tab> 
を入力すると、
if () {
    
}
が展開されて()の中にカーソルがくる。 ()の中に条件を書いて、<tab> を打つと{}の中にカーソルが移動する(上の設定ファイル中の '$0' の位置)。 便利。


fore の場合

fore<tab>
を入力すると、
foreach my $x (@array) {
    # body...
}
が展開されて、"x" の上にカーソルがくる。ここで、
  1. そのまま変数名を打ち込むと x がその変数名に置き換わる。
  2. <tab> を打つとカーソルは 'array' のところにくる。そのまま配列名を打ち込むと array がその配列名に置き換わる。
  3. ここで <tab> を打つと今度はカーソルは '# body…' のところにくる。処理を書いて <tab> を打つと{}の外にカーソルが移動する。
便利。便利。 fore の設定の中身は、
#name : foreach ... { ... }
# --
foreach my \$${1:x} (@${2:array}) {
    ${3:# body...}
}


for の場合

for の場合は、
for<tab>
を入力すると、
for (my $var = 0; $var < expression; $var++) {
    # body...
}
が展開されて、最初の var の上にカーソルがくる。この変数を書き換えると、残りの "var" も同時に書き換わる。 すごい。
for の中身は、
#name : for (...) { ... }
# --
for (my \$${1:var} = 0; \$$1 < ${2:expression}; \$$1++) {
    ${3:# body...}
}


構文

テンプレートの構文 を参考に。

1.  $0 とか $1。 
  タブストップと呼ばれる。 tab と s-tab で行ったり来たり出来る領域。(うちでは s-tab は効かなかった。ので戻れない。)

2.  {1:var} の "var" や {2:expression} の "expression" 。 
  プレースホルダーと呼ばれる。タブストップのデフォルト値。 ユーザーが何か入力するとその文字に置き換わる。

3.  ミラー 
  同じ番号のタブストップが幾つかあった場合、プレースホルダーを書き換えると、同じ番号のタブストップにも反映される。

設定が面倒かと思ってこれまで yasnippet はインストールしていなかったが、何も設定しなくてもインストールするだけでたくさんのスニペットが使えるようになっている。 もっと早くインストールすべきだった。
で、"<s" の設定はどこにあるのでしょう?


参考:テンプレートの構文





2012年1月1日日曜日

Org Mode での yasnippet を利用した入力支援 ( #+BEGIN_SRC )

yasnippet.el をインストール


ブログを始めてから、Emacs の Org Mode で #+BEGIN_SRC ・・・ #+END_SRC と書くことが多くなったので、 ここは Emacs Lisp で #+BEGIN_SRC と入力したら自動で #+END_SRC が入力される機能を作ってみよう!!と 意気込んでみたんですが、すぐに yasnippet っていうそのままの機能のモジュールがあることを思い出した。

インストールは Emacsテクニックバイブル とか Yet Another Snippet extention を参考にして行った。


Org Mode での入力支援


yasnippet を使えば #+BEGIN_SRC - #+END_SRC の自動挿入の記述も簡単にできると思ったら、実はその記述も必要なくて Org Mode では #+BEGIN_SRC についてはすでに yasnippet のテンプレートが用意されている。 "<s <Tab>" と入力すれば、
#+begin_src  <- カーソル位置はココ

#+end_src
が挿入される。カーソル位置が begin_src の後ろに来ていて、すぐに emacs-lisp などとプログラム名が打ちやすい状態になっている。

#+BEGIN_SRC 以外にも以下のものが予め準備されている。("<"のあとに下記のアルファベット 1 文字を入力して<Tab>)
s  #+begin_src ... #+end_src 
e  #+begin_example ... #+end_example
q  #+begin_quote ... #+end_quote 
v  #+begin_verse ... #+end_verse 
c  #+begin_center ... #+end_center 
l  #+begin_latex ... #+end_latex 
L  #+latex: 
h  #+begin_html ... #+end_html 
H  #+html: 
a  #+begin_ascii ... #+end_ascii 
A  #+ascii: 
i  #+index: line 
I  #+include: line 


参考:Emacsテクニックバイブル ~作業効率をカイゼンする200の技~
 
参考:Org Mode Manual - 15.2 Easy Templates



2011年12月31日土曜日

C-a で「行頭」と「非空白文字の先頭」をトグル的に移動

Emacs で「行頭」への移動は C-a で「非空白文字の先頭」への移動は M-m というキーバインドが 割り当てられているが M-m がなかなかなじまない。
どこかのブログで C-a で「行頭」と「非空白文字の先頭」をトグル的に移動させるというアイデアを見た。
なるほど。
アイデアを拝借して覚えたての Emacs Lisp で書いてみる。
(defun move-beginning-alt()
  (interactive)
  (if (bolp)  
      (back-to-indentation)
    (beginning-of-line)))
(define-key global-map "\C-a" 'move-beginning-alt)

参考:やさしいEmacs‐Lisp講座








ブログ作成をちょっと便利に(very personal)

<body> - </body>間をコピー

僕はブログの原稿を Emacs の org-mode で書いています。
それを html ファイルに変換して、その html ファイルから必要な部分をコピーしてブログに貼り付けています。

以下は html ファイル中の必要な部分をキーボードショートカットでコピーする個人的な改善。
前述の 'paste-to-osx' を利用して <body> と </body> の間をコピーします。(参考:ターミナル Emacs - GUIアプリ間のコピペ
;; バッファ内の2つの文字列間をクリップボードにコピー
(defun paste-to-osx-between(start-str end-str)
   (interactive "scopy between first:\nsand second:")
   (save-excursion
              (goto-char (point-min))   
              (let (copystart)
                 (if (search-forward start-str nil t)
                             (setq copystart (point))
                         (error "Cannot copy. Start string \"%s\" not found" start-str))
                 (goto-char (point-max))
                 (if (search-backward end-str nil t)
                             (backward-char)
                         (error "Cannot copy. End string \"%s\" not found" end-str))
                 (paste-to-osx(buffer-substring copystart (point))))
              (message "copy done.")))

(defun copy-between-body()
   (interactive)
   (paste-to-osx-between "<body>" "</body>"))
(define-key global-map "\C-cc" 'copy-between-body)
C-c c で <body> と </body> の間のテキストをクリップボードにコピーします。
M-x paste-to-osx-between で任意の2つの文字列を指定も可能です。他の用途があればどうぞ。


参考:やさしいEmacs‐Lisp講座








2011年12月25日日曜日

ターミナル Emacs - GUIアプリ間のコピペ

参考: http://hakurei-shain.blogspot.com/2010/05/mac.html
うれしい。
blog 作成は、Emacs の org-mode で記事を書いて html 出力して、それをコピーして blog に貼りつけているのですごく便利になりました。
ただ、Emacs 内のペーストも command + V となってしまう。
以下ソースの引用。
; http://blog.lathi.net/articles/2007/11/07/sharing-the-mac-clipboard-with-emacs
(defun copy-from-osx ()
 (shell-command-to-string "pbpaste"))

(defun paste-to-osx (text &optional push)
 (let ((process-connection-type nil))
     (let ((proc (start-process "pbcopy" "*Messages*" "pbcopy")))
       (process-send-string proc text)
       (process-send-eof proc))))

(setq interprogram-cut-function 'paste-to-osx)
(setq interprogram-paste-function 'copy-from-osx)

 

初めて読む Emacs Lisp

このコードが読みたくて Emacs Lisp 始めました。
(shell-command-to-string "pbpaste"))

;; シェルコマンドとして pbpaste を実行する。
(let ((process-connection-type nil))
   (let ((proc (start-process "pbcopy" "*Messages*" "pbcopy")))

;; (process-connection-type nil)はこれから作る非同期サブプロセスとの通信はパイプであることを示す。
;; start-process はプログラム pbcopy(2回目のpbcopy) を非同期サブプロセスとして実行する。
;; サブプロセスの名前は"pbcopy"(1つ目のpbcopy)でバッファ"*Messages*"と対応付けられている。
;; pbcoyp は OSX のコマンドでコマンドラインからクリップボードへコピーする。
;; (let ((proc (start-process ... で変数 proc に start-process が返すプロセスオブジェクトが代入される。

(process-send-string proc text)
(process-send-eof proc)

;; proc すなわち pbcopy に文字列 text を送る。
;; process-send-eof は proc に eof を送る処理。(バッファを flush するため(?))
(setq interprogram-cut-function 'paste-to-osx)
(setq interprogram-paste-function 'copy-from-osx)

;; 変数 interprogram-cut-function は kill した文字列をwindow systemで使用する方法を指定する。
;; 引数として関数名で指定する。kill-new 関数や kill-append 関数が呼ばれたときにこの指定された関数も呼ばれる。
;; 変数 interprogram-paste-function は他のプログラムから kill した文字列を貼り付ける方法を指定する。


追記 (2012/1/15)
Emacs 内で kill して yank する時にも C + y ではなくて Command + V しないといけなかったのが、若干不満でした。試行錯誤しているうちに上記の "copy-from-osx" の定義は不要ということがわかりました。現在では、ターミナルにペースト機能があるので特に定義しなくてもペーストできます。( terminal でも iTerm でもできました。)
なので、
(defun copy-from-osx ()
    (shell-command-to-string "pbpaste"))
と、
(setq interprogram-paste-function 'copy-from-osx)
は削除します。
すると Emacs でコピーしたものを Emacs 内でペーストするときには C + y で出来ます。 (GUI アプリへのペーストは Command + V で貼付けできます。Emacs へのペーストも Command + V でも出来ます。)


参考:やさしいEmacs‐Lisp講座

参考:36.4 非同期プロセスの作成
参考:32.8.5 Low-Level Kill Ring
参考:OSX固有のコマンド






2011年12月23日金曜日

emacsclient with Emacs 23

Mac で Emacs の org-mode を使いたかったので、 org-mode が標準で備わっている Emacs 23 を インストールして使い始めた。(Mac に元々入っているのはEmacs 22。) すると、下記のようなエラーが出てemacsclient がうまく起動しなくなった。
emacsclient: can't find socket; have you started the server?     
To start the server in Emacs, type "M-x server-start".     
emacsclient: No socket or alternate editor.  Please use:

     --socket-name
     --server-file      (or environment variable EMACS_SERVER_FILE)  
     --alternate-editor (or environment variable ALTERNATE_EDITOR)

原因は emaceclient のバージョンが 22 になっていたため。 emacsclient と Emacs はバージョンを合わせる必要がある。
   
$ locate emacsclient
/opt/local/bin/emacsclient                     # <- コレか
/opt/local/share/man/man1/emacsclient.1.gz
/usr/bin/emacsclient                           # <- コレのどちらか
/usr/share/emacs/22.1/etc/emacsclient.1
/usr/share/man/man1/emacsclient.1.gz

$ /usr/bin/emacsclient --version
emacsclient 22.1

$ /opt/local/bin/emacsclient --version
emacsclient 23.3

$ which emacsclient
/usr/bin/emacsclient     # ver. 22.1 の方が呼ばれていた

emacsclient 23.3 の方のパスから呼び出すようにしてOK.

参考: http://www.emacswiki.org/emacs/EmacsClient#toc41
参考: Emacsテクニックバイブル ~作業効率をカイゼンする200の技~