emacs上で…

シェルコマンドの実行結果を今開いているバッファに出力

(defun shell-command-output-to-buffer (str) (interactive "scommand: ")
  (print (shell-command-to-string str) (current-buffer)))

この様な関数を作っておくと便利かもしれない。
例えば、emac上で M-x shell-command-output-to-buffer と入力してから、「pwd」と入力すると今開いているバッファの親ディレクトリのパスが絶対パスでバッファに入力される。

#こんな感じ
"/home/<user_name>/up
"

カレントディレクトリのrubyコード実行する関数を作るとさらに便利

.emacs

(defun ruby-eval-buffer (print?)
  "Evaluate the buffer with ruby."
  (shell-command-on-region (point-min) (point-max) "ruby")
  (if (equal print? "t")
      (insert-buffer-substring-as-yank "*Shell Command Output*")))

;;ruby-modeに対応付けておく。
(defun my-ruby-mode-hook ()
(define-key ruby-mode-map "\C-c@" (lambda () (interactive) (ruby-eval-buffer "f")))
(define-key ruby-mode-map "\C-c`" (lambda () (interactive) (ruby-eval-buffer "t"))))

(add-hook 'ruby-mode-hook 'my-ruby-mode-hook)

(setq auto-mode-alist
      (append '(("\\.rb$" . ruby-mode))	auto-mode-alist))

「C-c@」でカレントバッファに書いてあるコードの実行結果を表示。*1「C-c`」*2でカレントバッファに書いてあるコードの実行結果を今開いているバッファに表示する。

これを使うとこんなことができる

  • directoryをたくさん作っているとどこに何を入れているのか分からなくなってしまう。
    • それぞれのdirectoryにどんなファイルが入っているか説明するreadme.txtを作る?
    • directoryの名前を入力しなくちゃいけない
    • でもそれってけっこうめんどう…

そんなときに

def output a
  max = a.inject(0){ |max, e| max = e.length if max < e.length; max}
  a.each do |e|
    puts "#{e}#{" "* (max - e.length)} :"
  end
end

#readme.txtを作りたいディレクトリのパス
Dir.chdir ENV["HOME"] #ホームディレクトリのパス
targets =  Dir["*"].select{|e| File.directory? e}
# p targets #=>
# ["data", "memo", "box", "up", "script", "book-read", "test", "tmp"]
output targets
#ここにカーソルをおいて"C-c`"

このようなコードを書いて、*3"C-c`"で現在カーソルがある位置のところに以下のような文章が挿入される。

data      :
memo      :
box       :
up        :
script    :
book-read :
test      :
tmp       :

あとはてきとうにコピペして説明を付け加えれば完成。

*1:shell-command*は特に出力を指定しない場合"*Shell Command Output*"に実行結果を表示する

*2:"`"はShift + "@"で入力

*3:"C-c@"で実行結果を確認してからの方がいいかも