ちょっとしたdirectoryの整理をemacs上で簡単に。

こんな状況のとき

本来は

linuxとかshをよく知っている人には
コマンドを上手につなげて簡単にできるような処理なのかもしれません。
でも、やり方が分からないのでrubyの力を借りることにします。

でもrubyの場合。

ruby -r fileutils -e '..'」とやっているうちに何が何だかわからなくなってしまいます><。
見やすい状態でコードが書きたいです。(具体的にはemacsで)

そこで、

.emacs

(defun ruby-eval-buffer (&optional print?)
  "Evaluate the buffer with ruby."
  (shell-command-on-region (point-min) (point-max) "ruby")
  (if print?
      (insert-buffer-substring-as-yank "*Shell Command Output*")))
(add-hook 'ruby-mode-hook
	  (lambda ()
	    (define-key ruby-mode-map "\C-c@"
	      (lambda () (interactive) (ruby-eval-buffer)))
	    (define-key ruby-mode-map "\C-c`" 
	      (lambda () (interactive) (ruby-eval-buffer t)))
	    ))		

を追加しておくと、「C-c@」で現在開いているバッファの内容をrubyに実行させることができます。
(C-c`だと実行結果を現在のバッファに書き込みます。(rcodetool.elを入れてからあまり使わなくなりました))
そんなわけで、例えば"*scratch*"のmodeをruby-modeに変えた後に
以下のようなコードを書いてからC-c@で"~/box/"内のファイルを"~/box/used/"に移動することができます。
emacsなのでコードを書くのが楽です。

p = (ENV["HOME"]+"/box")
Dir.chdir(p)
t =  Dir["*"].reject{ |e| File.directory? e}
require 'fileutils'
FileUtils.move(t,p+"/used/", :verbose => true, :noop => true)
#:noopがtrueになっているので移動はしません。
#(本当に移動させたいときには:noopをなくします。)

rubyでaccumulate-nを作ってみた

module Enumerable
  def accumulate_n(init)
    (0..self.first.size-1).inject([]) do |result, i|
      x = self.map{ |e| e[i]}
      result << x.inject(init){ |re,e| yield(re,e)}
    end
  end
end
a = (0..3).map{ |e| e * 3}.map{ |e| [e,e+1,e+2]}
a # => [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]]

a.accumulate_n(0){ |re,e| re + e} # => [18, 22, 26]
a # => [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]]

"で""とか(で()とか

ruby-electricの機能を
他の言語を書いている時にも使いたいと思っていました。

具体的にはこんな感じ

  • "{"と入力しただけで自動で"{}"と入力してくれる
  • 入力したかっこの中にカーソルを置いてくれる

他の言語でも設定すればできるらしいので

http://d.hatena.ne.jp/khiker/20080118
http://d.hatena.ne.jp/gan2/20071227/1198759894
の2つをみながら設定してみました。

実際にしたこと

parenthesis.elをダウンロード。
http://www.oti-orz.mydns.jp/~khiker/file/20080119/parenthesis.el
.emacsに以下を追加

(require 'parenthesis)
(defun f (name)
  (let ((modehook (intern (concat name "-mode-hook"))))
    (add-hook modehook
	      (lambda ()
		;; { で{}を書く
		(define-key (current-local-map) "{" 'insert-braces)
		;; ( で()を書く
		(define-key (current-local-map) "(" 'insert-parens)
		;; " で""を書く
		(define-key (current-local-map) "\'" 'insert-single-quotation)
		;; " で""を書く
		(define-key (current-local-map) "\"" 'insert-double-quotation)
		;; [ で[]を書く
		(define-key (current-local-map) "[" 'insert-brackets)
		))))

(setq parenthesis-add-language  '("javascript" "py" "text"))
;;pythonがpy-mode-mapなのが不思議
(let ((x parenthesis-add-language))
  (while (car x)
    (f (car x))
    (setq x (cdr x))))

これでpythonでもjavascriptでも文章を書くときでもカッコを書くのが楽になりました。