月別アーカイブ: 2014年7月

changelogからorg-captureに乗り換えを検討

日々の作業メモは長らくemacsのchangelog機能を使っていたのだけれど、
org-caputureが便利そうなので乗り換えを検討。

でも今のところはアジェンダ周りを使いこなせてないのでこれといった違いがないかもしれない。
作業元ファイルに自動でリンクが貼れるのは便利だけど、changelogでもファイル名は入るからffap使えば問題なかったっていう。

便利なのはメモの種類を複数設定できるところと、
ファイル名やテンプレートが割と自由に設定できるところかな?
プロジェクトごとにメモファイル分けるとか、ファイルは同じでもセクションを分けるとかできるからメモの整理・検索はしやすい。
あとはやっぱりorg書式が見やすいのがメリットかな。でも別にchangelogでもorg書式使えばいいだけのことだからorg-captureのメリットというわけではないか。

それにしてもorg-modeは機能多いなー。
使いこなすにはまだまだ時間がかかりそうです。

 

twittering-mode でエラー

Authorization failed: /usr/bin/curl exited abnormally (exit-status-60)

とか

twittering-oauth-get-access-token: Failed to retrieve a request token

とか出てつながらなくなった。

サーバーの証明書の問題?らしい。

(setq twittering-allow-insecure-server-cert t)

で証明書を検証しないようにしたら一応つながる。

 

Emacsで編集中のファイルをWindowsの標準アプリやエクスプローラーで開く

調べたらいろいろやりかたは見つかったのですが、パス名に日本語や半角スペースが含まれるとうまく動かなかったり…でわりと苦労したので、
最終的にうまく動いたやつをまとめておきます。

現在編集中のファイルのあるフォルダをエクスプローラーで開く

(defun explorer()
  "ファイルの場所をexplorerで開く"
  (interactive)
  (shell-command "explorer ."))

shell-commandでexplorerを呼びだしているだけです。
引数はbuffer-file-nameからディレクトリパスを導く方法とかいろいろあったのですが、
なんか結局”.”で動きました。

現在編集中のファイルをWindows標準のアプリで開く / diredから特定のファイルをWindows標準のアプリで開く

(defun unix-to-dos-filename(file)
  "ファイルパスの/を\に置換し、sjisに変換"
  (encode-coding-string (concat (mapcar '(lambda (x) (if(= x ?/) ?\\ x)) (string-to-list file))) 'sjis))

(defun cygstart-dired()
  "diredからファイルをWindows標準で開く"
  (interactive)
  (let ((file (dired-get-filename)))
    (message "open %s" file)
    (shell-command (concat "cygstart " (unix-to-dos-filename file)))))

(defun cygstart()
  "現在のファイルをWindows標準で開く"
  (interactive)
  (shell-command (concat "cygstart " (unix-to-dos-filename (buffer-file-name)))))

ここではcygwinに含まれるcygstartというコマンドを利用しています。これはWindows標準のアプリでファイルを開くコマンドです。
cygstartを使わずにファイル名を直接 shell-command に渡しても動きそうな気はするのですが、一部の日本語ファイル名のファイルがうまく開けませんでした。

unix-to-dos-filename はmeadowにデフォルトでついてくる関数を再現したもののようです。

 

cperl-init-faces (ignored): (void-function find-face)

cperl-mode をアップデート(Version: 20140309.122)したらシンタックスハイライトがなんだかおかしくなった。
whitespace-modeも効いていないようなので M-x whitespace-mode すると表題のエラー。

エラー内容でググると古い情報が引っ掛かった
http://www.ysnb.net/meadow/meadow-users-jp/2001/msg00716.html
ためしにcperl-mode.el をひらいてバイトコンパイルしてみるとあっさりと解決。なんぞこれ。

 

カーソル下/リージョン内の数値をインクリメント・デクリメントする

連番振ってたけど途中挿入・削除でずれちゃって一気に1ずつずらしたいとかそんなときに。
調べてみたらいろいろやり方はありそう。

evil-numbers を使う

evil-numbersでカーソル下の数値を増減させる – Life is very short

Vimにある機能の移植っぽいです。っていうかVimにそんな機能があることを今知った。
8進数, 16進数にも対応しているのは場合によっては便利かも?

cua-mode を使う

もともとは矩形選択用のelispだけど、連番挿入とかインクリメントの機能もついてるんですね。
連番挿入が普通に便利ですね。
デクリメントは少々カスタマイズが必要らしいです。

Emacsで数字をインクリメントする(ついでにデクリメントも) – Qiita

自力で実装

自由にelispインストールできない環境の人はこれで。
カーソル下の数字っぽいものをインクリメント・デクリメントする – めもめも
smart-repと組み合わせると便利なのね、なるほど。

 

今更ながらcperl-modeのインデント設定についてまとめてみる

cperl-modeのインデントまわりの設定が結構適当だったので、
ものすごく今更ですがまじめに調べてみました。

まずは基本設定。
インデントはタブ(スペース4つ分)で行います。

(setq-default tab-width 4
indent-tabs-mode t)
(setq cperl-indent-level 4)

indent-region で余計な整形をさせない

まずはこちらのコード

if($a){
$a = 1;
}
else{
$b = 1;
}

これに対してindent-regionをかけると

if ($a) {
$a = 1;
} else {
$b = 1;
}

だれもelse前の改行消してくれとか頼んでない。
中括弧の前後に余計な空白入れてくれとも頼んでない。

else前の改行については、

(setq cperl-merge-trailing-else nil)

で改行削除しなくなります。

また、

(setq cperl-indent-region-fix-constructs nil)

としておくとそもそも余計な整形をせずにインデントだけしてくれます。デフォルトの空白設定が気にくわない人はこれで。

引数の無名ハッシュや無名関数のインデント

【理想】

hoge($a, $b, {
a => 1,
b => 2,
});

hoge($a, $b, sub{
a = 1;
b = 2;
});

【現実】

hoge($a, $b, {
a => 1,
b => 2,
});

hoge($a, $b, sub{
a = 1;
b = 2;
});

前者については

(setq cperl-indent-parens-as-block t)

後者については

(setq cperl-indent-subs-specially nil)

で対応可能。
ただし、後者はcperl-modeのバージョンによっては使えないらしい。melpaから入れた最新のcperl-modeならOK。
(参考:http://d.hatena.ne.jp/syohex/20120818/1345302707)

なお、前者で最後の閉括弧の前に改行をはさむと

hogeaaa($a, $b, {
a => 1,
b => 2,
}
);

だいぶ気持ち悪い感じに。

(setq cperl-close-paren-offset -4)

とすると、

hogeaaa($a, $b, {
a => 1,
b => 2,
}
);

……ちょっとはマシだけどやっぱり微妙……。

途中改行時のインデントとか

【before】

$str = "hogehoge"
. "hogehoge"
. "hogehoge";
(setq cperl-continued-statement-offset 4)

【after】

$str = "hogehoge"
. "hogehoge"
. "hogehoge";

でもこれはどちらかというとイコールの位置で揃えてほしいかな。

タブをbackspaceで消したい

タブを消そうとしてbackspace押すとスペース3つに化けるのがうざい。

(setq cperl-electric-backspace-untabify nil)

でタブを一気に消せる。

その他

インデント関係ないけど

(setq cperl-highlight-variables-indiscriminately t)

で変数に色をつけられるのをはじめて知った。
my宣言の時だけ色がついて普段はつかないの気持ち悪いなあと思ってたのですっきり。