2013年02月23日

最近の麦汁さんのPHPのためのEmacsの設定

最近PHPやってます。 前にもやってたけど当時はほとんどコード書いてなかったので がっつりPHPのコードを書いているのは今年に入ってからになりますね。

そんな2ヶ月未満なPHP初心者のEmacs設定晒します><

PHP関係設定

php-mode-improved

まず使っているモードはphp-mode-improved。 こいつは適当にel-get-installしたら入ってくる。

で、

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

とでもしておけばphpなファイルを開いた時にphp-modeになってくれると。

インデント

で、最近はタブ4なインデントを使ってるとかで今は

(add-hook 'php-mode-hook
          (lambda ()
            (defun ywb-php-lineup-arglist-intro (langelem)
              (save-excursion
                (goto-char (cdr langelem))
                (vector (+ (current-column) c-basic-offset))))
            (defun ywb-php-lineup-arglist-close (langelem)
              (save-excursion
                (goto-char (cdr langelem))
                (vector (current-column))))
            (c-set-style "stroustrup")    ; インデントは4文字分基本スタイル
            (c-set-offset 'arglist-intro 'ywb-php-lineup-arglist-intro) ; 配列のインデント関係
            (c-set-offset 'arglist-close 'ywb-php-lineup-arglist-close) ; 配列のインデント関係
            (c-set-offset 'arglist-cont-nonempty' 4) ; 配列のインデント関係
            (c-set-offset 'case-label' 4) ; case はインデントする
            (make-local-variable 'tab-width)
            (make-local-variable 'indent-tabs-mode)
            (setq tab-width 4)
            (setq indent-tabs-mode t)))   ; インデントにタブを使う

こんな感じ。

普通は

(setq php-mode-force-pear t)

とでもしてpear規約を守る方向がいいと思います。 最近はPSRとかもあるけど。

みんな大好きflymake

リアルタイムに文法チェックぐらいしたいよね。 そんな貴方にflymake。 Emacsに同梱されているのであとはphp用に設定を追加したらいい。 ってことでこんな感じ。

;; flymake
(defun flymake-php-init ()
  (let* ((temp-file (flymake-init-create-temp-buffer-copy
                     'flymake-create-temp-inplace))
         (local-file (file-relative-name
                      temp-file
                      (file-name-directory buffer-file-name))))
    (list "php" (list "-l" local-file))))
(push '(".+\\.php$" flymake-php-init) flymake-allowed-file-name-masks)
(push '("(Parse|Fatal) error: (.*) in (.*) on line ([0-9]+)" 3 4 nil 2) flymake-err-line-patterns)

(add-hook 'php-mode-hook (flymake-mode t))

補完系

それから補完とか欲しいよね。 じゃあ el-get-install で php-comoletion でも入れようか。

(add-hook 'php-mode-hook
          (lambda ()
            (require 'php-completion)
            (php-completion-mode t)
            (define-key php-mode-map (kbd "C-o") 'phpcmp-complete))) ;php-completionの補完実行キーバインドの設定

C-o とか書いているけど実は使ってない。 むしろphp-completionは みんな大好きauto-completeのために使っている。

ってことで

(add-hook 'php-mode-hook
          (lambda ()
            (make-local-variable 'ac-sources)
            (setq ac-sources '(
                               ac-source-words-in-same-mode-buffers
                               ac-source-php-completion
                               ac-source-filename
                               ac-source-etags
                               ))))

ac-source-etagsとかするために el-get-install で auto-complete-etags を入れてたりする。

ともかくこれで

  • 他に開いているバッファ
  • php-completion
  • ファイル名
  • etags

から自動補完の候補を作ってくれる。

etagsは今のところ、プロジェクトのディレクトリで手動で

$ ctags -e **/*.php --exclude=.git

とかして吐いている。

この状態で適当にphpファイルを開いて適当に編集すると 自動補完するためのTAGファイルの場所を聞いてきたりので指定する。 Emacs立ち上げ直してPHPファイルをいじる度に聞かれるのはうざいけど まあ立ち上げたら基本的に終了させないので気にしないことにした。

自動改行

セミコロン入力してから改行するのってだるいよね! セミコロン入れたら改行でいいよね! とかそんな感じの設定

;; セミコロンとかで自動的に改行する
;; パクリ元 http://insnvlovn.blogspot.jp/2010/04/emacs-php-mode.html
(add-hook 'php-mode-hook
          (lambda ()
            (c-toggle-auto-hungry-state t)
            (setq c-hanging-braces-alist
                  '(
                    (class-open nil)
                    (class-close nil)
                    (defun-open before after)
                    (defun-close nil)
                    (inline-open nil)
                    (inline-close nil)
                    (brace-list-open nil)
                    (brace-list-close nil)
                    (block-open nil)
                    (block-close nil)
                    (substatement-open before after)
                    (statement-case-open before after)
                    (extern-lang-open nil)
                    (extern-lang-close nil)
                    ))))

マニュアルを開くために

eldocを入れてるとマニュアルを読むのに便利。

(add-hook 'php-mode-hook
          (lambda ()
            (setq php-doc-directory "~/Documents/php-chunked-xhtml")
            (require 'tree-mode)
            (require 'windata)
            (require 'help-dwim)
            (require 'php-doc nil t)
            (local-set-key (kbd "\C-c h") 'php-doc)
            (set (make-local-variable 'eldoc-documentation-function)
                 'php-doc-eldoc-function)
            (eldoc-mode 1)))

requireしているのは多分 el-get-install とかで入れる必要がある。

こんな感じにしておくと C-c h した時にマニュアルをブラウザ(自分の設定だとemacs-w3m)で見れたり、 あとは関数を適当に書いたらその引数なんかの情報がミニバッファに現れたり、 M-x php-doc-tree とかするとドキュメントツリーが見れたりする。 今の今まで気付いてなくて使ったことないけど。

context-skk

ddskk使いのプログラマなら当然context-skk-modeは使ってるよね。 使ってない君は今すぐ

(require 'context-skk)

しよう。 いちいちコードを書く時に日本語入力をOFFにする煩わしさから開放されるぞ!

で、これだけを設定しても実はphpには利かなかったりするので

(add-to-list 'context-skk-programming-mode 'php-mode)

しておこう。

PHPはあんまり関係ない系

上で書いたことはphp-modeで動くようにした感じのものだけども それ以外にもいろいろ便利なのがあるのでそれも書いとく。

magit

最近なら当然リポジトリはGitだよね。 いやmercurialでもいいんですけど僕はGit派です。 そしてgit-svnする派です。 ならば当然これ使うよねって感じのがmagit

https://github.com/magit/magit

今のところ設定はこんな感じ

(require 'magit)
(require 'magit-svn)
(setq magit-diff-options '("-w" "-b"))

実はそんなに使いこなしていない。てへっ。

edbi

EmacsからDBをいじるのに使うやつ

https://github.com/kiwanami/emacs-edbi

PerlでCPANからほげほげしたりなどで 導入の敷居が若干高いけど大分おいしいツール。

今のところ設定はこれだけ

(require 'edbi)
(autoload 'e2wm:dp-edbi "e2wm-edbi" nil t) ; e2wmとの連携

これ単品より後述のe2wmから利用するとすっごいおいしい。

e2wm

こいつはEmacsをIDEっぽくするやつ

https://github.com/kiwanami/emacs-window-manager

こいつもel-getで手に入るから適当に放り込もう。

今のところ設定は

(require 'e2wm)
(global-set-key (kbd "M-+") 'e2wm:start-management)
(e2wm:add-keymap
 e2wm:pst-minor-mode-keymap
 '(("prefix 9" . e2wm:dp-edbi)
   ) e2wm:prefix-key)

(require 'e2wm-vcs)

;; C-c ; m に magit パースペクティブ変更を割り当て
(e2wm:add-keymap
 e2wm:pst-minor-mode-keymap
 '(("prefix m" . e2wm:dp-magit))
 e2wm:prefix-key)

こんな程度で過ごしている。

C-c ; 9 でedbiなパースペクティブが表示されるようにしている。 うまく繋がると画面左にDBのテーブル一覧、 画面上にSQL入力するところ、 画面下の広いところにテーブル内容とかそういうのが表示されるようになっておいしい。

magit用パースペクティブも導入してるのでコミットする時も快適。 差分見て「うわ、デバッグ文残ってるじゃん恥ずかし!」 ということで修正して保存した瞬間magitに戻るあたりかなりおいしい。便利。

実はne2wmという拡張もあるけどそこまで手を出し切れてない感じ。

という感じで過ごしていますです。 足りてない設定もいっぱいあるのでそれはまた今度いじろう。

タグ:Emacs PHP 開発
posted by 麦汁 at 00:06 | Comment(0) | TrackBack(0) | emacs | このブログの読者になる | 更新情報をチェックする

2013年01月20日

にゃんにゃん画像をまとめてwgetしたいにゃん

あけましておめでとうございます。 ここ最近さぼってますが今年もよろしくお願い致します。 よし挨拶おわり。

そんなことより僕はプログラマらしく猫画像をDLしたいのです。 大概のプログラマは猫ちゃんが大好きなのです。 にゃんにゃん画像をDLしたいのです。 本当は別のにゃんにゃん画像をDLしたいのですが この場では猫画像をDLしたいことにしておきます。

というわけでよくある猫画像まとめ記事の画像をまとめてDLしたいことにします。

とりあえずそういうことなら RubyでMechanizeでも使えば作れそうな気がするけど 最近コードを書く気力に欠けているのでそれは無しってことにします。 gem入れるのだるいし。

そこでwgetなわけですよ。 やつにはページ内のコンテンツを丸ごとDLする機能があるからな。

ってことで試行錯誤した結果こんなオプションを使用することに

オプション追加引数説明
-pページコンテツを丸ごとDL
-HホストをまたいでDLする
-Dblog.livedoor.jp,livedoor.blogimg.jpDL許可するドメインのリスト
-ndディレクトリ作らない
-nHホストのディレクトリ作らない
-np上の階層は追い掛けない
-Rhtml除外する拡張子
-Ajpg,JPG,jpeg,JPEGDL許可する拡張子
-qお静かに
-Nローカルにあるのより新しいのをDL

というわけで実際にDLする際のコマンドはこんな感じに。

wget -p -q -N -D blog.livedoor.jp,livedoor.blogimg.jp -nd -nH -np -H  -R html -A jpg,JPG,jpeg,JPEG URL

うわー長ったらしい。 そうだwgetはconfigファイルが使えた! そいつを使ってやろう!

ってことで試行錯誤した結果がこんな感じ。

page-requisites = on
spanhosts = on
domains = blog.livedoor.jp,livedoor.blogimg.jp
cutdirs = 999
addhostdir = off
noparent = on
reject = html
accept = jpg,JPG,jpeg,JPEG
quiet = on
timestamping = on

上の表のオプションと順番を一致させた感じで書いている。 domainsは多分鍛え上げる必要がある。

ちなみにwgetrc周りはあまり情報がなくって man wgetのoptionsの項目と wgetのソース内の src/init.cの124行目ぐらいあたりで定義されているcommands[]を見比べて調べる感じになってた。

で、これを ~/images.wgetrcにでも置いて

wget --config=$HOME/images.wgetrc URL

みたいに実行すると。わあい! みんな大好きにゃんにゃん画像がまとめてDLできたよお! でもどうでもいいゴミ画像もたくさんあるよう。

しょうがないから適当に10kb以下のファイルは削除しておこう。 10kbなのは割と適当。 本当はDLすらしないのが一番だがwgetにそこまでの機能はなさそうだ。

ってことでfindで10kb以下のjpg,jpeg,JPG,JPEGを探してrmすることに。

wget --config=$HOME/images.wgetrc URL ; find . -maxdepth 1 -size -10k -regex ".*[jpg|jpeg|JPG|JPEG]"|xargs rm

また長くなった。仕方ない。不慣れなshell scriptだ。

#!/bin/sh

url=$1
dir="$HOME/nyan-nyan"

mkdir -p $dir
cd $dir
wget --config=$HOME/images.wgetrc $url
jpegs=`find $dir -maxdepth 1 -size -10k -regex ".*[jpg|jpeg|JPG|JPEG]"`

if [ "$jpegs" != "" ]; then
    rm $jpegs
fi

まあこれを適当に~/bin/imgdl.shにでも置いたら確かに

imgdl.sh URL

な感じでDLできるんだけど いちいちTerminalに切り替えるのはだるい。

そうだ。どうせWebブラウジングはEmacsでやるから、 Emacsからバックグラウンドでこれを呼び出せば!

(defun w3m-download-images ()
  "現在閲覧中のページの画像をDLする。"
  (interactive)
  (apply 'start-process `("imgdl.sh" nil "imgdl.sh" ,w3m-current-url ">" "/dev/null"))
  (message "downloading images..."))
(define-key w3m-mode-map "\C-c\ i" 'w3m-download-images)

これでemacs-w3mで閲覧中にC-c iしたら バックグラウンドで~/nyan-nyanににゃんにゃん画像を落としておけるぞ! やったね!

というわけでwgetで遊びたいだけだったのに結局少々コードを書いてしまいましたとさ。 ま、いいや。

posted by 麦汁 at 11:36 | Comment(2) | TrackBack(0) | emacs | このブログの読者になる | 更新情報をチェックする

2012年09月14日

Favstar.fmの表示が変わったのでemacs-w3mのfilterも書き換えた

最近Favstar.fmの画面表示がバージョンアップしましたよね。

よりモダンな感じになり、色々な評判が聞こえてきたりするのですが、 僕にとって大事な問題が別でありましたね。

そう。それは、emacs-w3mでまた見づくなってしまったところ。

以前もそのままだと見づらかったので emacs-w3mに組込まれている機能、w3m-filterを活用して 自分でfilterを定義していたのですが 今回の変更でそいつが無駄になってしまいました。

それでも僕はFavstarをemacs-w3mから見たい。

ということでfilterを設定しなおしました。

以下がそれ。

(defun w3m-filter-favstar (url)
  (w3m-filter-delete-regions url "<div class='fs-has-meta-top fs-user-page' id='fs-root'>" "<div id='fs-root-scroll-container'>")
  (w3m-filter-delete-regions url "<div class='fs-meta fs-top'>" "<ul class='unstyled' id='fs-feed-list'>")
  (w3m-filter-delete-regions url "<div class=\"fs-toolbar\"><div class=\"fs-container fs-left\">" "<div class='fs-shadow'></div>")
  (w3m-filter-delete-regions url "</li><li class=\"fs-title\">" "")
  (w3m-filter-replace-regexp url "<li data-type='tweet'>" "<hr /><li data-type='tweet'>")
  (w3m-filter-replace-regexp url "\"><img alt=" "<img alt=")
  (w3m-filter-delete-regions url "<img alt=" ">")
  (w3m-filter-replace-regexp url " title=\"@" "> "))

emacs-w3mからなら、fav,RTした人の名前と数さえわかれば十分なので こんな感じであれこれ削ってます。 (っていうか上に出てくるあいさつとか邪魔い)

これで快適ふぁぼ稼ぎライフ!

posted by 麦汁 at 20:36 | Comment(0) | TrackBack(0) | emacs | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。