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

2012年8月30日木曜日

Darkroom.el を更新

 ほったらかしておいた darkroom.el をちょこっと修正しました。
 X window 用ですが、windowsでも動くようにしてみました。
ただしWinのフルスクリーン機能はテストしてません。動けばいーなー(遠い目)


以下から
git clone git://github.com/yama-natuki/darkroom.el.git
して取得して load-path の通ったディレクトリに放り込んでください。

 後は ~/.emacs

(require 'darkroom)
(global-set-key [f11] 'darkroom-mode)
 と書いて、F11キーを押せばDarkroomモードにトグル動作します。


 ほったらかしていましたけど、ちょくちょく自分では便利に使っていました。全画面にすると集中度合いに全然違いますものね。


2010年9月11日土曜日

Emacsから校正支援する

 Emacs から 日本語の校正支援をする Emacs lisp を作ってみました。


インストール

 github からダウンロードしてきた yspel.el ~/emacs.d/ などの load-path の通った場所に置いてください。
 git コマンドからなら、
git clone git://github.com/yama-natuki/yspel
で落とせます。
 落としてきたら ~/.emacs
(require 'yspel)
と書いておきます。


使い方

  • 校正したいテキストファイルを開きます。
  • 開いたら M-x yspel としてyspel を起動します。
  • ウィンドウが分割され、校正箇所がリストアップされます。
  • pキーとnキーでリストを上下に移動します。
  • リターンキーで該当箇所にジャンプします。
  • ウィンドウを閉じるときは q キーです。



 Yahoo API を利用して校正支援をおこなっています。
 yahoo API の制限で校正できるファイルサイズは 100KB までです。あまり大きいテキストだとうまくいかないかもしれせん。
 だいたい4000文字ぐらいが安心?
 文書が大きい場合は範囲選択して分割して M-x yspel するようにしてください。


 取りあえず、動くものを作った。多分動くと思う(^_^;)
 原稿や論文などの校正にお役立てください。メールを送信する前とかにもいいですね。

 まーしかしあれですね、Emacsはプログラムだけでなく普通の文章を書くのにも最高の道具ですね。Emacsから広辞苑は引けるわ、Emacsから英辞郎もひけるわ、Emacsから翻訳もできるわ、Emacsからはてなキーワードを調べられるわ、Emacsから原稿枚数も計算できるわ、Emacsから校正支援もできるわ。Emacs最高です。

2010年8月11日水曜日

Emacs でファイルをsudoで開き直す。その2

 前回、root所有のファイルをsudoで自動的に開き直してくれる Emacs lisp の記事を書きました。わりと好評だったようでよかったです。
 今回、rootユーザだけでなく、他のユーザのファイルも同様に開いて編集したいとのリクエストがきたので、修正してみました。以下になります。差し替えて使ってみてください。

(defun file-other-p (filename)
"Return t if file FILENAME created by others."
(if (file-exists-p filename)
(/= (user-real-uid) (nth 2 (file-attributes filename))) t))

(defun file-username (filename)
"Return File Owner."
(if (file-exists-p filename)
(user-full-name (nth 2 (file-attributes filename)))
(user-full-name (nth 2 (file-attributes (file-name-directory filename))))))

(defun th-rename-tramp-buffer ()
(when (file-remote-p (buffer-file-name))
(rename-buffer
(format "%s:%s"
(file-remote-p (buffer-file-name) 'method)
(buffer-name)))))

(add-hook 'find-file-hook
'th-rename-tramp-buffer)

(defadvice find-file (around th-find-file activate)
"Open FILENAME using tramp's sudo method if it's read-only."
(if (and (file-other-p (ad-get-arg 0))
(not (file-writable-p (ad-get-arg 0)))
(y-or-n-p (concat "File "
(ad-get-arg 0) " is "
(if (file-exists-p (ad-get-arg 0)) "read-only." "newer file.")
" Open it as "
(file-username (ad-get-arg 0)) "? ")))
(th-find-file-sudo (ad-get-arg 0))
ad-do-it))

(defun th-find-file-sudo (file)
"Opens FILE with root privileges."
(interactive "F")
(set-buffer (find-file (concat "/sudo:"
(file-username file) "@" (system-name) ":" file))))



 これで他のユーザのファイルでもそのユーザとして開いて編集する事ができます。



2010/08/15:修正


 新規ファイルを開こうとするとエラーになってしまうのを修正した。

2010/08/16:修正


 他ユーザの新規ファイルを開けるようにした。
 再度ダウンしなおして差し替えてください。

2010年3月1日月曜日

Emacs でファイルをsudoで開き直す

 tramp の最初の一回目の認証で待たされる感覚が嫌いなので、私はよくsudo をやらずにそのままファイルを開いてしまいます。そうして「ああ、やっぱり編集したい」となり、sudo で開きなおします。
 作業の流れ的に美しくありませんし、毎回引っかかるのでストレスにもなります。
 vim ですと「:e sudo:%」でカレントファイルを sudo で開きなおしてくれるようです。いいなあ。

 ということで 自動的に sudo で開きなおしてくれる機能を作ろうかと思ったら、すでにあったのでそれを導入します。
 元のlispは、書き込み不可なファイルすべてをsudoで開きなおすか聞いてくるのでうっとおしいので、少し修正しました。
 root所有なファイルを開いた時だけ、sudoで開き直すか聞いてくるようにしました。

 以下を ~/.emacs にコピペしします。

(defun file-root-p (filename)
"Return t if file FILENAME created by root."
(eq 0 (nth 2 (file-attributes filename))))

(defun th-rename-tramp-buffer ()
(when (file-remote-p (buffer-file-name))
(rename-buffer
(format "%s:%s"
(file-remote-p (buffer-file-name) 'method)
(buffer-name)))))

(add-hook 'find-file-hook
'th-rename-tramp-buffer)

(defadvice find-file (around th-find-file activate)
"Open FILENAME using tramp's sudo method if it's read-only."
(if (and (file-root-p (ad-get-arg 0))
(not (file-writable-p (ad-get-arg 0)))
(y-or-n-p (concat "File "
(ad-get-arg 0)
" is read-only. Open it as root? ")))
(th-find-file-sudo (ad-get-arg 0))
ad-do-it))

(defun th-find-file-sudo (file)
"Opens FILE with root privileges."
(interactive "F")
(set-buffer (find-file (concat "/sudo::" file))))



 これで dired や C-x C-f で普通にファイルを開いても、それがroot所有なファイルならば自動的にsudoで開きなおすか聞いてくれます。おかげでtrampを意識しなくて済むのでとても楽になりました。

2010年2月10日水曜日

darkroom.el をちょこっと修正

 事前にcolor-themeを設定しなくても済むようにしました。自動で保存・復元します。
 こちらから落としなおして下さい。

バグ
 DDSKK を起動すると背景色が復元しない><
 追記:ddskk をcvs先端にしたら直った。ということでオールクリアー。

2010年2月8日月曜日

Emacs で DarkRoom

 DarkRoom とはフルスクリーンでただ文章を書くことのみに集中させるというシンプルなエディタです。
 しかしこれが言うのとやるのとでは全然違います。最近のPCは画面も大きくなり、横長になり、様々なウィジットをデスクトップにちりばめ、タスクトレイにいろんアイコンが並んでいる。気がつくと情報過多なデスクトップになっているのです。その事に気づかされました。


でまあ、当然これをEmacsでもできないかとなと思い、やってみました。



 以下の Emacs lisp を darkroom.el という名前で load path の通った場所に保存してください。
 次に ~/.emacs に、
(require 'darkroom)
(global-set-key [f11] 'darkroom-mode)
と追記すればOKです。
 後は F11 キーを押せばフルスクリーンでDarkRoomモードになります。
;;; darkroom.el --- 
;; Copyright (C) 2010  yama
;; Author: yama ;; Keywords: 
;;  $Id: darkroom.el,v 1.10 2010/02/25 10:22:02 yama Exp $ 
;; This program is free software; you can redistribute it and/or modify;; it under the terms of the GNU General Public License as published by;; the Free Software Foundation, either version 3 of the License, or;; (at your option) any later version.
;; This program is distributed in the hope that it will be useful,;; but WITHOUT ANY WARRANTY; without even the implied warranty of;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; use color-theme
;;; Usage
;;; (require 'darkroom);;; M-x darkroom
;;; Code:(require 'color-theme)


;;; Config ---------------------------------------------------------(defvar darkroom-left-margin  30
  "left margin")

(defvar darkroom-right-margin 30
  "right margin")

(defvar dark-mode-on nil
  "Non-nil if DarkRoom mode is enabled.
Don't change this variable directly, you must change it by one of the
functions that enable or disable Dark Room mode.")

;;; -------------------------------------------------------------------

(defun fullscreen (&optional f)
  "Chenge FullScreen. for Emacs23"
      (interactive)
      (set-frame-parameter f 'fullscreen
                           (if (frame-parameter f 'fullscreen) nil 'fullboth)))

(defun darkroom-mode ()
  "simple writing environment."
  (interactive)
  (if (equal dark-mode-on t) (darkroom-mode-disable)
    (darkroom-mode-enable)))

(defun darkroom-mode-enable ()
  (setq dark-mode-on t)
  (setq darkroom-default-background-color
        (cdr (assoc 'background-color default-frame-alist)))
  (fset 'color-theme-snapshot (color-theme-make-snapshot))
  (sleep-for 0.05)
  (color-theme-simple-1)
  (fullscreen )
  (set-cursor-color "yellow") ;; cursor color  (tool-bar-mode 0)
  (menu-bar-mode 0)
  (display-time-mode 1)
  (scroll-bar-mode)
  (set-face-foreground 'mode-line "gray25")
  (set-face-background 'mode-line "gray1")
  (if (equal (intern-soft "elscreen-version") nil) nil
    (elscreen-toggle-display-tab))
  (auto-fill-mode 1))

(defun darkroom-mode-disable ()
  (setq dark-mode-on nil)
  (add-to-list 'default-frame-alist
               '(background-color . darkroom-default-background-color))
  (color-theme-snapshot)
  (scroll-bar-mode)
    (if (equal (intern-soft "elscreen-version") nil) nil
    (elscreen-toggle-display-tab))
  (display-time-mode 0)
  (sleep-for 0.05)
  (fullscreen ))
    
(defun window-count ()
  (length (window-list (selected-frame) 1)))

(defun set-margin ()
  (set-window-margins (selected-window)
                      darkroom-left-margin
                      darkroom-right-margin))

(defun dark-window-update ()
  (if (equal dark-mode-on t)
      (if (> (window-count) 1)
          (progn
            (set-window-margins (selected-window) 0 0)
            (set-window-margins (previous-window) 0 0))
        (set-margin))
  (set-window-margins (selected-window) 0 0)))

(add-hook 'window-configuration-change-hook 'dark-window-update)


(provide 'darkroom)
;;; darkroom.el ends here




 低機能です。フルスクリーンにする部分がEmacs23からの機能を使っているので、emacs23以上で使用してください。そこを書き換えればemacs22とかでも動作するはず。
 あらためて こうして全画面で作業をしていると、twitter や ウェブブラウズとかしなくなり、気が散らずに作業できるんだなあと。というか今までどんだけ注意力散漫だったんだろうと思いましたw


 さあ皆さんも思う存分執筆に集中して下さいw


ps.
# 端末で起動してフルスクリーンにすればいいじゃんという突っ込みはなしで;;



●追記:
 color-theme の設定書いただけで反映するの忘れてた(^_^;) 修正しましたので落とした方は再度落とし直して下さい。

●2012/08/30 追記:
 続き→ http://ubulog.blogspot.jp/2012/08/darkroomel.html

2009年10月10日土曜日

Emacsのタイトルバーにホスト名を表示させる

 Granzchesta's ぷち日常天国 さんの方で Emacs で tramp使用時にタイトルバーにホスト名を入れられないかどうか悩んでいたみたいなので試してみました。
 以下を ~/.emacs に追記。

;;; tramp でリモートホスト名をフレームに表示する。
(defun my-tramp-hostname ()
"tramp host name."
(if (buffer-file-name)
(if (string-match "\\`/\\([^[/:]+\\|[^/]+]\\):" (buffer-file-name))
(tramp-file-name-host (tramp-dissect-file-name (buffer-file-name)))
"local") nil ))
;; フレームにセット
(setq frame-title-format '("%b - " (:eval (my-tramp-hostname))))

 Emacsはテキストエディタなんですから決っして文字列操作が弱いわけではありません。テキストエディタなのに弱いとはこれいかに。

2009年8月9日日曜日

Emacsで行を右寄せをする

 昔作ったやつです。
 標準だと、M-x set-justification-right で右寄せしてくれます。がこれだとタブと空白で埋めてくれるので、空白だけで右寄せしてくれるものを作りました。

インストール

  1.  下の方のelispを right-line.el という名前で、~/.lisp などに保存します。
  2.  ~/.emacs

    (require 'right-line)
    (global-set-key "\C-cr" 'justify-right-line) ; 行を右寄せする
    と書いておきます。


使い方

 右寄せしたい行の上にカーソルを持っていき、C-c r とすれば右寄せされます。
 選択範囲内の右寄せも出来ます。
 桁数は C-u 桁数 M-x set-fill-column で。デフォルトだと C-x f かな?

right-line.el


;;; right-line.el --- 右寄せ
;; $Id: right-line.el,v 1.6 2007/10/11 09:55:17 yama Exp yama $
;; last updated : 2007/10/16 15:00:41 JST

;; Copyright (C) 2007 yama

;; Author: yama <yama@localhost>
;; Keywords:

;; This file is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 2, or (at your option)
;; any later version.

;; This file is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING. If not, write to
;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
;; Boston, MA 02110-1301, USA.

;;; Commentary:

;; 行を右寄せする。範囲選択していれば範囲選択部分を右寄せする。

;;; ToDo


;;; Code:

(defun yama-region-active-p ()
"リージョンアクティブならtを返す.
2007年10月06日(土曜日) 12:45:08 JST by yama"

(if (and transient-mark-mode mark-active) t nil))

(defun right-line ()
"2007年09月15日(土曜日) 14:46:17 JST
カレント行を空白で埋めて、右寄せする"

(interactive)
(save-excursion
(end-of-line)
(let ((ln(- fill-column (current-column))))
(beginning-of-line)
(insert-char ?\ ln))))


(defun right-line-region (start end)
"選択範囲内を空白で埋めて右寄せする。範囲選択されてなければカレント行を右寄せする
2007年10月06日(土曜日) 12:44:41 JST by yama"

(interactive "r")
(save-excursion
(save-restriction
(goto-char start)
(unless (bolp)
(beginning-of-line)
(setq start (point)))
(goto-char end)
(unless (bolp)
(beginning-of-line)
(setq end (point)))
(narrow-to-region start end)
(let ((max-line (count-lines start end))
(count 0))
(goto-char (point-min))
(while (< count max-line)
(right-line)
(next-line)
(setq count (1+ count)))))))

(defun justify-right-line (start end)
"カレント行を右寄せする。範囲選択されているなら範囲内を右寄せする.
2007年10月16日(火曜日) 14:08:05 JST by yama"

(interactive "r")
(if (yama-region-active-p)
(right-line-region start end)
(right-line)))

(provide 'right-line)
;;; right-line.el ends here



 報告書とか文書の末尾の署名なんかに利用すると便利です。
 自分で作って使っていなかったり・・・orz

2009年8月2日日曜日

Emacsの起動時間を調べる

Emacs23.1 がリリースされましたねー。めでたいめでたい。やんややんや。
もっともだいぶ前から使っていたんで新鮮さはないんですが、やっぱりアンチエイリアスの効いたフォントは美しい。

んで、emacs23から追加された関数を使って、Emacsの起動に掛かった時間を表示する機能など。小ネタです。

;;;====================================
;;;; boot-time
;;;====================================
;;; 起動するまでにかかった時間を表示。
(defun boot-time ()
" 起動するまでにかかった時間を表示。"
(interactive)
(message "起動時間:%s秒"
(- (cadr after-init-time) (cadr before-init-time))))


M-x boot-time で起動時間が表示されます。

2009年5月3日日曜日

hatena-keyword.el をちょこっと修正

Emacsからはてなキーワードを辞書のように引く hatena-keyword.el を修正しました。
とりあえずメジャーモードを実装して、履歴機能も付けました。
これで はてなキーワード をリンクをたどって読み歩くことが出来るように。

ここから落として下さい。

2009年4月23日木曜日

Emacsからはてなキーワードを引く hatena-keyword.el

 現在 Emacs から和英・英和・翻訳・国語辞書・などを SDIC lookup を使って引けるようにしているんですが、電子辞書版の「現代用語の基礎知識」が2007年度版で止まっており、最近のカタカナ語や新語などに対応できていませんでした。

 ということで最近の新語に対応するため、Emacsからはてなキーワードを辞書のように引くものを作ってみました。
 自分で使うには満足な状態なのと、これ以上手を入れる気もなく、埋もれさすのもあれなので公開しておきます。

 最近は小学生の間でも辞書を読むことがブームだそうで。はてなキーワードの散策なんていかがでしょうか。




●インストール

 w3mを使っていますので事前に入れておいてください。
sudo apt-get w3m-el あるいは w3m-el-snapshot

 として w3m を入れたら、~/.emacs に、
(require 'w3m-load)
としておきます。
 後は以下に貼ってあるEmacs lisp を、 hatena-keyword.el という名前で load path の通った場所に保存してください。
 次に ~/.emacs に、
(require 'hatena-keyword)
(global-set-key "\C-ck" 'hatekey)
と追記すればOKです。


●使い方


 調べたい単語の上で C-c k とすれば単語の意味を別ウィンドウで表示します。
 q キーで終了します。
 リンクされたキーワードの上でリターンキーを押すと、そのキーワードを検索して表示します。
 TABキーでキーワードにジャンプします。Shift + TAB で逆順。
 ←キーで過去に表示したキーワードに戻ります。


・hatena-keyword.el

;;; hatena-keyword.el ---

;; Copyright (C) 2009 yama

;; Author: yama <yama.natuki+elisp@gmail.com>
;; Keywords:

;; $Id: hatena-keyword.el,v 1.28 2009/05/03 13:35:06 yama Exp yama $

;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.

;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.

;;; Commentary:

;; はてなキーワードをEmacsから検索して表示するlispです。
;; Emacsからはてなキーワードを辞書のように扱えます。
;; より詳しい情報は、http://ubulog.blogspot.com/

;;; Install

;; (1) emacs-w3m を利用しています。事前に用意して下さい。
;; (2) このファイルをload-pathの通った場所に置きます。
;; (3) ~/.emacs に以下を追記します。
;; (require 'hatena-keyword)
;; (global-set-key "\C-ck" 'hatekey)

;;; Usage:

;; C-c k でカーソル付近の単語を調べます。
;; TABキーでリンクされたキーワードにカーソルを移動します。
;; Shift + TAb で逆順。
;; リンク上でリターンキーを押すとそのキーワードを検索して表示します。
;; リンクがキーワードではない場合はw3mでリンク先を開きます。
;; ←キーで表示したキーワードを戻ることが出来ます。

;;; ToDo

;;



;;; Code:

(require 'url)
(require 'xml)
(require 'w3m)

;;; configuration

(defvar hatenakey-window-height 14
"*Height of window to show entrys and contents.
検索結果表示ウインドウの高さ"
)

(defvar hatena-coding-system 'utf-8
"文字エンコードの指定。utf-8,euc-jp,shift_jis.")



(defconst hatenakey-version "1.1")
(defconst hatenakey-buffer-name "*hatena-word*"
"検索結果表示バッファの名前")

(defconst hatenakey-history-name "*hatena-history*"
"履歴バッファの名前")

(defvar hatenakey-history '()
"履歴スタック")

(defvar hatena-keyword-mode nil
"Non-nil if Hatena Keyword mode is enabled.
Don't change this variable directly, you must change it by one of the
functions that enable or disable Hatena Keyword mode."
)

;; Define keymap
(defvar hatekey-mode-map
(let ((map (make-sparse-keymap)))
(define-key map " " 'scroll-up)
(define-key map "b" 'scroll-down)
(define-key map "q" 'view-kill-window)
(define-key map "\t" 'w3m-next-anchor)
(define-key map [tab] 'w3m-next-anchor)
(define-key map [(shift tab)] 'w3m-previous-anchor)
(define-key map [backtab] 'w3m-previous-anchor)
(define-key map [left] 'hatena-view-previous-page)
(define-key map "\C-m" 'hatena-keyword-jump)
map))


;;; main ------------------------------------------------------

(defun hatekey-version ()
"バージョンを返す。"
(interactive)
(message "hatena-keyword %s" hatenakey-version))


(defun hatena-keyword-mode ()
"はてなキーワード を表示するメジャーモードです.
調べたい文字列の上で \\[
hatekey] を実行することによりキーワードを検索して表示します。
\\<hatekey-mode-map>

key binding
--- -------
\\[
view-kill-window] quit.
\\[
scroll-up] scroll-up
\\[
scroll-down] scroll-down
\\[
w3m-next-anchor] Go to Next Keyword Link
\\[
w3m-previous-anchor] Go to previous keyword Link
\\[
hatena-view-previous-page] Back to History.
\\[
hatena-keyword-jump] jump to keyword
"

(interactive)
(setq major-mode 'hatena-keyword-mode
mode-name "hatekey"
buffer-read-only t)
(use-local-map hatekey-mode-map)
(run-hooks 'hatena-keyword-mode-hook))


(defun hatena-url-restructure (keyword)
"はてなのurlを構築する。"
(concat "http://d.hatena.ne.jp/keyword?word="
(w3m-url-encode-string keyword hatena-coding-system)
"&mode=rss2&ie="
(symbol-name hatena-coding-system)))

(defun my-keyword (url)
"キーワードの解説を返す。"
(interactive)
(set-buffer (url-retrieve-synchronously url))
(if (string-match "200 OK" (buffer-substring (point-min) 20))
(progn
(let* ((root (xml-parse-region (point-min) (point-max)))
(base (car (xml-get-children (car root) 'item)))
(my-desc (nth 2 (car (xml-get-children base 'description)))))
(if (eq my-desc nil) (setq my-desc "No Match") nil)
(if (hatena-buffer-p) (setq buffer-read-only nil))
(set-buffer (get-buffer-create hatenakey-buffer-name))
(erase-buffer)
(insert (decode-coding-string my-desc hatena-coding-system))
(w3m-buffer)
(if (hatena-window-p)
(progn
(select-window (hatena-window-p))
(hatena-keyword-mode))
(split-window-vertically
(- (window-height) hatenakey-window-height))
(set-window-buffer (next-window) (current-buffer))
(select-window (next-window))
(hatena-keyword-mode))))
(message "%s" "Not Found")))


(defun hatena-buffer-p ()
"はてなバッファの存在チェック"
(if (get-buffer hatenakey-buffer-name)
(set-buffer hatenakey-buffer-name)))

(defun hatena-window-p ()
"はてなウィンドウのチェック。"
(get-buffer-window (get-buffer hatenakey-buffer-name)))

(defun hatekey (keyword &optional flag)
"はてなキーワードを検索する。"
(interactive
(list (cond ((or (eq last-command 'mouse-drag-region)
(and (boundp 'transient-mark-mode) transient-mark-mode
(boundp 'mark-active) mark-active)
(eq last-command 'exchange-point-and-mark))
(buffer-substring-no-properties
(region-beginning) (region-end)))
(t (thing-at-point 'word)))
current-prefix-arg))
(if (eq (fboundp 'w3m-buffer) nil) (message "w3m-buffer関数が見つかりません。")
(if flag nil
(let* ((keyword (read-from-minibuffer "Search word: " keyword)))
(my-keyword (hatena-url-restructure keyword))
(hatenakey-history-push keyword)))))


(defun hatenakey-close-window ()
"検索表示バッファを表示しているウインドウを消去する関数"
(interactive)
(let ((w (get-buffer-window hatenakey-buffer-name))
(b (get-buffer hatenakey-buffer-name)))
(if w
(progn
(bury-buffer b)
(if (= (window-height w) hatenakey-window-height)
(delete-window w)
(set-window-buffer w (other-buffer))
(select-window (next-window)))))))

(defun hatena-this-keyword ()
"現在位置のリンクのキーワードを返す。urlならw3mで開く。"
(let ((url (w3m-print-this-url)))
(if (string-match "keyword" url)
(replace-regexp-in-string
"http://d.hatena.ne.jp/keyword/" "" url)
(w3m-browse-url url))))

(defun hatena-keyword-jump ()
"pointのキーワードを検索"
(interactive)
(if (hatena-this-keyword)
(progn
(let ((key (hatena-this-keyword)))
(my-keyword (hatena-url-restructure key))
(hatenakey-history-push key)))))

(defun view-kill-window ()
"検索結果表示ウィンドウを削除する関数"
(interactive)
(if (get-buffer hatenakey-buffer-name)
(progn
(hatenakey-close-window)
(kill-buffer hatenakey-buffer-name)
(setq hatenakey-history '())
(delete-other-windows))))

(defun hatenakey-history-name-p ()
"履歴バッファが存在するかどうか"
(set-buffer (get-buffer-create hatenakey-history-name)))

(defun hatenakey-history-push (keyword)
"履歴にキーワードを追加する。"
(setq hatenakey-history (cons keyword hatenakey-history)))

(defun hatenakey-history-pop ()
"履歴からキーワードを取り出す。履歴からは消える。"
(setq hatenakey-history (cdr hatenakey-history))
(car hatenakey-history))

(defun hatena-view-previous-page ()
"一つ前に見たキーワードへ戻る。"
(interactive)
(my-keyword (hatena-url-restructure (hatenakey-history-pop))))

(provide 'hatena-keyword)
;;; hatena-keyword.el ends here

 きっかけは、現代用語の基礎知識を調べるうちにはてなキーワードが現代用語の基礎知識にいくつか採用という記事を思い出し、じゃあはてなキーワードを辞書代りに使用してもいいんじゃないか。というものでした。
 辞書のように、というのがポイントです。はずせません><

追記:
動作環境書いてなかったorz
ubuntu 8.04.2 LTS、Emacs22,23 emacs-w3m は以前CVSから取ってきたもので動作しています。
w3mどうしましょうかねー。はてなからhtml要素で返ってくるので、フォーマットするのにw3m利用するのが一番簡単で手っ取り早いんですよねえ。その分w3mに依存するけど。
w3m使わなければ可搬性も高まるのだろうけど・・・

追記:
(require 'w3m-load) を書き忘れていたので追記。

追記:2009/04/26
 リンクされたキーワードにジャンプするようにした。
 w3mべったりになった。

追記:2009/05/03
 メジャーモードを実装。履歴を戻る機能を付けた。
 変数を初期化していない凡ミスを直した。

追記:2009/05/04
 コードの色付けが変だったので直した。face2htmlだと量が多いとうまくいかないみたい。htmlizeに変更した。

2009年3月9日月曜日

Emacs23 で Wanderlust

Emacs23 で Wanderlust で日本語フォルダが扱えなかった。他にネットで似たような情報がなかったので、うちだけの問題なのだろう。けっこうごちゃごちゃいじってあるので、自分でもわけがわからないw
 wl付属のutf7.el を削除すれば直ったというケースもあるようだけど、うちでは無理だった。
凹んだ(×_×)

 でまあ、emacs23になってから utf7 まわりがおかしいのだろうなと思っていたのだけど、wl のデバッグログを眺めていたら、デコードされたフォルダ名の先頭に空白が・・・・・・・・BOMだったorz

原因が判明したのでググって、 /usr/share/emacs/23.0.60/lisp/gnus/utf7.el に以下の変更を。

(defconst utf7-utf-16-coding-system
(cond ((mm-coding-system-p 'utf-16-be-no-signature) ; Mule-UCS
'utf-16-be-no-signature)
((and (mm-coding-system-p 'utf-16-be) ; Emacs 21.3, Emacs 22 (BOM?)
;; Avoid versions with BOM.
(= 2 (length (encode-coding-string "a" 'utf-16-be))))
'utf-16-be)
+ ((and (mm-coding-system-p 'utf-16be) ; Emacs 22 and later
+ ;; Avoid versions with BOM.
+ (= 2 (length (encode-coding-string "a" 'utf-16be))))
+ 'utf-16be)
((mm-coding-system-p 'utf-16-be-nosig) ; ?
'utf-16-be-nosig))
"Coding system which encodes big endian UTF-16 without a BOM signature.")
Emacs23 になって utf-16-beutf-16be になっているせいらしい・・・なんでやねん。

 同じようにwl付属のutf7.elも変更しないといけないのだけど、こちらは ~/.wl にバージョン判定で切り抜けるようにした。

(cond ( (string-match "^23\." emacs-version)
(defconst utf7-utf-16-coding-system
(and (fboundp 'find-coding-system)
(find-coding-system 'utf-16be))
"Coding system which encodes big endian UTF-16.")))

 結果は、見事に動作するようになった。 

・参考
 http://d.hatena.ne.jp/defiant/20081112/1226461505
 http://article.gmane.org/gmane.emacs.bugs/16892

2009年2月11日水曜日

Emacsでanthy.elのキーバインド変更

mizunoさんところで ATOKっぽいローマ字バインドが欲しがっているみたいなのでやっってみた。
 以下を ~/.emacs に追記。

;anthy.el ローマ字変換テーブル再定義&キーバインド再定義
(setq anthy-rkmap-keybind
'(
;; \C-p
(("hiragana" . 16) . "katakana")
(("katakana" . 16) . "hiragana")
;; q
(("hiragana" . 113) . "katakana")
(("katakana" . 113) . "hiragana")
;; \C-j
(("alphabet" . 10) . "hiragana")
(("walphabet" . 10) . "hiragana")
;; \C-q
(("hiragana" . 17) . "hankaku_kana")
(("hankaku_kana" . 17) . "hiragana")
)
)


;;Anthyキーバインド設定
(setq anthy-wide-space " ")
(anthy-change-hiragana-map "la" "ぁ")
(anthy-change-hiragana-map "li" "ぃ")
(anthy-change-hiragana-map "lu" "ぅ")
(anthy-change-hiragana-map "le" "ぇ")
(anthy-change-hiragana-map "lo" "ぉ")
(anthy-change-hiragana-map "ltu" "っ")
(anthy-change-hiragana-map "zz" "っ")
(anthy-change-hiragana-map "lya" "ゃ")
(anthy-change-hiragana-map "lyu" "ゅ")
(anthy-change-hiragana-map "lyo" "ょ")
(anthy-change-hiragana-map "lwa" "ゎ")

な感じで。
とはいえSKKを使うようになってからAnthyは使っていないので突っこまれても困るけど。
anthy.el自身を直接いじるのはスマートではないのでこんな感じでどーでせう。

2008年10月17日金曜日

howmで保存時の設定

 howm という Emacs 使いなら絶対使っとけみたいなキラーアプリがあります。いわゆるメモ取りソフトなんですが、全文検索も出来て、リンクも出来て、しかもただのテキストファイルだから加工も容易で、ToDoアプリとしても使えて、スケジューラーとしても使えて、お勧めです。

 それで howm をメモソフトとして使っているのですが、基本的にメモはプライベートなモノなので他人に見られないようhowmのメモを保存時にパーミッションを600に変えるようにします。
 以下を~/.emacs に追記。

;;; 保存時処理
;;; 保存時にパーミッションを"600"にする。
(add-hook'howm-after-save-hook
(lambda ()
(let ((name (buffer-file-name)))
(set-file-modes name 384)))) ; 600

2008年10月16日木曜日

Emacsでオートセーブファイルの作成場所を変える

 オンラインストレージで Dropbox.com というのがありまして。こいつがとても凄くて、~/Dropbox/ にファイルを放り込むだけで自動的にファイルがアップされ、ファイルの履歴も取れて、同期も早くて、linuxでもMacでもWindowsでも使えるという夢のようなサービスなんですが、
 この~/Dropbox/内のファイルをEmacsで編集すると自動的に「#」の付いた自動保存ファイルが作成され、それがDropboxに同期されて履歴として残ってしまうという。
 これが激しくウザいので、~/Dropbox/以下では自動保存ファイルを作らないようにします。
~/.emacs に以下を追記。

(setq auto-save-file-name-transforms
`((".*/Dropbox/.*" ,temporary-file-directory t)))
これで ~/Dropbox/ 以下のオートセーブファイルは /tmp/ 以下に作成されるようになります。

2008年10月15日水曜日

Emacsの保存関係の設定

 Emacs には自動保存機能がデフォルトで有効になっています。
 ファイルを編集すると、ファイル名の前後に「」を付けたバックアップファイルが作成され、随時編集内容がこのファイルに保存されていきます。
 このため何らかの理由でファイルを保存しそこなったとしても、このバックアップファイルからリカバリできる仕組みになっています。
 この自動保存はデフォルトでは30秒ごとか、300打鍵ごとにオートセーブされるようになっています。
 間隔が長い、あるいは短かいと感じたのなら調整しましょう。それぞれ、
(setq auto-save-timeout 30)   ; 自動保存する間隔。秒。
(setq auto-save-interval 300) ; 300打鍵ごとに自動保存
の値を変えることで変更出来ます。

簡易履歴機能

 Emacsでは簡易的ながら複数の世代に渡るバックアップの履歴を取ることが出来ます。つまり、前の編集内容。さらにその前の編集内容、さらにさらに・・・
 編集して保存して、やっぱり以前の状態に戻したい。さらにはその前の編集した内容の方がよかったので、なんていうことにも対応出来て便利です。
 この世代バックアップファイルは、ファイル名の末尾に「.~1~」のようなサフィックスを付けられて保存されていきます。番号は自動的に増えていきます。
 バックアップファイルは元のファイルを同じ場所に保存されいきます。しかしこれではバックアップファイルだらけになって少々鬱陶しいのでバックアップファイルは専用ディレクトリを作ってそこに全部保存されるようにします。

(setq make-backup-files t) ; バックアップファイルを作成する。
;;; バックアップファイルの保存場所を指定。
(setq backup-directory-alist
(cons (cons "\\.*$" (expand-file-name "~/.backup"))
backup-directory-alist))

(setq version-control t) ; 複数のバックアップを残します。世代。
(setq kept-new-versions 5) ; 新しいものをいくつ残すか
(setq kept-old-versions 5) ; 古いものをいくつ残すか
(setq delete-old-versions t) ; 確認せずに古いものを消す。
(setq vc-make-backup-files t) ; バージョン管理下のファイルもバックアップを作る。
 これでバックアップファイルは~/.backup/以下に保存され、最新の世代から5つと、古い方から5つ残されていきます。

保存時実行属性付与

 定番ネタです。
 シェルスクリプトを作って保存したときに、いっしょに実行属性を付けてくれます。地味ながらも大変有り難い機能です。
 こちらを参考、というか丸写し(^_^;)

;;;====================================
;;;; シェルスクリプト保存時にchmod +x を自動実行する
;;;====================================
(defun make-file-executable ()
"Make the file of this buffer executable, when it is a script source."
(save-restriction
(widen)
(if (string= "#!" (buffer-substring-no-properties 1 (min 3 (point-max))))
(let ((name (buffer-file-name)))
(or (equal ?. (string-to-char (file-name-nondirectory name)))
(let ((mode (file-modes name)))
(set-file-modes name (logior mode (logand (/ mode 4) 73)))
(message (concat "Wrote " name " (+x)"))))))))
(add-hook 'after-save-hook 'make-file-executable)


 以上、地味ながらも確実にEmacsの使い心地を向上させてくれる大事な保存関連の設定でした。

2008年4月6日日曜日

PuTTYでEmacsを256色で表示する。

puttyでemacsを使っていると、8色表示しかできていない。これだとさすがに色分け表示がきついので256色表示を出来るようにしてみた。
以下導入メモ。

PuTTY側

terminfo で xterm-256color を使う。
puttyは256色表示できるので、まず、puttyの設定を行う。
まず、
xterm 256色モードを使うことを許可する
にチェックを入れる。
次に、端末のタイプを表す文字列に、
xterm-256color
と指定する。

ubuntu側

xterm-256colorの設定を入れる。
sudo apt-get install ncurses-term



これで、emacs -nw として起動してcolor-themeなどから好きな色を選べばOK.

2008年3月12日水曜日

Emacsから印刷する

前回を踏まえてEmacsから印刷してみます。
~/.emacsに以下を追記します。
;;;====================================
;;;; print - 印刷設定
;;;====================================
;;; Postscript で印刷
(setq my-print-command-format "nkf -e | e2ps -a4 -p | lpr")
(defun my-print-region (begin end)
(interactive "r")
(shell-command-on-region begin end my-print-command-format))
(defun my-print-buffer ()
(interactive)
(my-print-region (point-min) (point-max)))
これだけ。

あとは、M-x my-print-buffer でカレントバッファがプリントアウトされます。印刷範囲を指定したい時は、範囲選択をしてから、 M-x my-print-region です。

2008年3月4日火曜日

Emacsからrubyのドキュメントを閲覧する

疲れた。そもそもrubyのリファレンスをEmacsから見たいだけなのに、なぜにどうしてこうも苦労しないといけないのか。

とりあえず、いろいろごちゃごちゃやってしまったんだけど、忘れないようにメモ。

インストールメモ


手順1

ここから基本セット+リファレンスを落とす。
wget http://i.loveruby.net/archive/refe/refe-0.8.0-withdoc.tar.gz
tar zxvf refe-0.8.0-withdoc.tar.gz
cd refe-0.8.0-withdoc/refe-0.8.0
ruby setup.rb config
ruby setup.rb setup
sudo ruby setup.rb install


これでrubyのリファレンスを閲覧するためのrefeリファレンスがインストールされる。

手順2

次にEmacsで見るための rrse.el を入れる。
rrseはここから落としてくる。
wget http://www.kmc.gr.jp/~ohai/rrse/rrse-0.3.tar.gz
tar zxvf rrse-0.3.tar.gz
cd rrse-0.3
sudo cp rrse-* /usr/local/bin
cp rrse.el ~/.lisp
rrse-refe-listdescs, rrse-ri-listdescs, rrse-merga-tables, rrse-make-table は/usr/local/bin にコピー。rrse.el は~/.lisp に放り込む。
そしてデータベースを作成する。
rrse-make-table --refe
~/.rrse/ 以下にデータベースが作成される。

手順3

後は~/.emacsに以下を追記する。
;;;====================================
;;;; rrse - ruby マニュアル
;;;====================================
;;; ruby マニュアルReFeをEmacsから閲覧する。
(load "rrse")
(rrse-setup)

(add-hook 'ruby-mode-hook
'(lambda ()
(define-key ruby-mode-map [f1] 'rrse-help)))


これで準備完了。
後は、Emacsでなにか適当にrubyファイルを開いてruby-modeで、メソッドの上にカーソルを持っていけば、ミニバッファに簡単なリファレンスが表示される。
 詳しい情報は、その状態で、M-x rrse-help あるいは、F1 キーを押せば詳しいリファレンスが表示される。

globメソッドの上にカーソルを持っていくと、ちゃんとミニバッファに簡易な要約と、rrse-helpで詳しい情報が表示されている。

2008年2月20日水曜日

EmacsのWanderlustの設定をちょこっと修正

前回のWanderlustの導入から操作にも慣れてきて、普段日常でも使えるようになってきました。
以前よりまめにメール出すようになったしねw

ということで少し設定をいじったのでメモ。

メールヘッダ

前回のは冗長すぎたので以下のように修正。
~/.wl に以下を追記。
;; summary-mode ですべての header を一旦除去
(setq wl-message-ignored-field-list '("."))
;; 表示するヘッダ。
(setq wl-message-visible-field-list
'("Cc:" "^Subject:" "^From:" "^To:" "^Cc:"
"^X-Mailer:" "^X-Newsreader:" "^User-Agent:"
"^X-Face:" "^X-Mail-Count:" "^X-ML-COUNT:"
))
全てのメールヘッダを表示するには、H キー。元に戻すにはもう一度 H キーか、「.」ピリオドを押す。生のメールヘッダを見たいときは、M キー。

WanderlustをEmacs標準のメーラーに

C-x m で 新規メール作成画面になるのだけれども、これをWanderlustが立ち上がるように設定する。
~/.emacs に以下を追記。

;;;====================================
;;;; Wanderlust - メールソフト
;;;====================================
;;; wl の設定は~/.wl に。
;;; 標準のメーラーをWanderlustにする。
(autoload 'wl-user-agent-compose "wl-draft" nil t)
(if (boundp 'mail-user-agent)
(setq mail-user-agent 'wl-user-agent))
(if (fboundp 'define-mail-user-agent)
(define-mail-user-agent
'wl-user-agent
'wl-user-agent-compose
'wl-draft-send
'wl-draft-kill
'mail-send-hook))

メール作成モード(ドラフトモード)の初期設定

~/.wl に以下を追記。
;;; メール編集モードフック。
(add-hook 'wl-draft-mode-hook
'(lambda ()
(setq paragraph-start '"^\\([  ・○<\t\n\f]\\|(?[0-9a-zA-Z]+)\\)")
(auto-fill-mode t)
(set-fill-column 60)
))

シグネチャ(署名)挿入時のセパレータを削除する

~/.wl に以下を追記。
(setq signature-separator "")
(add-hook 'wl-mail-setup-hook
(lambda ()
(require 'signature)
(local-set-key "\C-c\C-w" 'insert-signature)))

アドレス帳を暗号化する

EasyPG などのEmacsからgpgを透過的に扱うパッケージを入れてあれば簡単に出来ます。
~/.addresses ファイルをgpgを使って暗号化し、出来た ~/.addresses.gpg ファイルを ~/.wl に、
;;; アドレス帳の指定。EasyPGで透過的に扱える。
(setq wl-address-file "~/.addresses.gpg")
などとして指定するだけ。
あとはWanderlust起動時に自動的にパスフレーズを聞かれるので入力すればOK。