GNU screenのattach時に環境変数を自動的に引き継ぐ

GNU screenを使っていれば, 作業の途中でログアウトするときにdetachしておいて, 作業を再開するときにattachすれば, 作業途中の端末の状態がそのまま維持されるのでとてもべんり. たとえば, 最初作業していたのとは別のホストからsshでログインしてattachなんてこともできる.

ただし, 最初にscreenを立ち上げたのとは別の端末でattachすると, screenは最初に立ち上げた端末の環境変数のままになっていて, 別のホストから接続していることを認識できず面倒な思いをすることがある. 今回はこれをなんとかしたという話.

続きを読む

オペレータが入力されたら相対行番号を表示

Yokohama.vimの行削除のスライドみてて、オペレータが入力されたら、その行から相対的行番号を一時的に左側に表示すればいいんではないかと思った。Vimスクリプトでそんなことできるかどうかは知らんけど。

https://twitter.com/m2ym/status/25606822787

という話があったので, Vimpulseでやってみた.

続きを読む

Emacs (Viper/Vimpulse)で日本語の文節を扱う

というか、Emacsだとうまく文節ごとに削除してくれたりするんだろうか。それだったらすごいな。

http://twitter.com/tyru/status/19890157313

という話があったので, どうなっているか調べてみた. まず移動に関して, Emacsの単語移動コマンドforward-word/backward-word (M-f/M-b)は, 日本語の場合は文節(のようなもの)に働くらしく, 動作を見る限りは, 漢字の連続+ひらがなの連続をひとまとまりと見なしている感じ. 完全な文節ではないけれど, カーソル移動の単位として用いるには問題ないレベル. 実際にどういう処理をしているのか調べようと思ったけれど, forward-wordはEmacs LispではなくCで書かれているようで, ソースコードを読むのは面倒なので諦めた.

続きを読む

Emacs (Vimpulse)でtext-objectでも使えるコメントアウトoperator

EmacsでviをエミュレートするViperを強化してVimをエミュレートするようにしたのがVimpulse. ここ最近開発が活発で, 設計もかなりスマートになって, ゆくゆくは本家Viperを置き換えることを目指すまでになっている. 入れる場合は最新版をgit cloneする.

ぼちぼち散歩 Vimでoperator-userを使って他のプラグインをoperatorとして使えるようにしてみたを見て, Vimpulseでもコメントアウト/アンコメントするoperatorがあったら便利そうなので作ってみた.

続きを読む

複数のメジャーモードを文脈に応じて切り替え

multi-mode.elを使うと, 一つのバッファ内で文脈に応じてメジャーモードを切り替えることができる. けれど, カーソル位置を受け取って, 切り替えるべきメジャーモードとその有効範囲を返す関数を定義しないといけなくて, 使い方が難しい.

そこで, 開始・終了の正規表現と, その範囲内で有効になるメジャーモードを指定するとmulti-modeに渡すべき関数を作って登録してくれる関数を書いた.

続きを読む

Emacsサーバを適切に終了する

emacs --daemon

でサーバを起動しておいて, 複数のターミナルウィンドウから

emacsclient -nw

することで, ターミナルモードでも単一のEmacsプロセスで複数フレームの編集ができる. これはとてもべんり. でもごく稀にサーバを再起動したいことがあって, killすればよいかと思ったら, ターミナルが崩れて悲惨なことになってしまった.

emacsclient -e '(kill-emacs)'

とすれば正常にサーバプロセスを停止できるけれど, これだといちいち

The current server still has clients; delete them? (yes or no)

と訊かれてしまう. 調べてみるとserver-kill-emacs-query-functionが呼ばれているせいらしいので, これをkill-emacs-query-functionsからremove-hookしてみたけれど, うまくいかない. 途方に暮れていると, Emacsのサーバ機能を実装している server.el のソースコードがこんなふうになっているのを見つけた:

...
;;;###autoload
(defun server-start (&optional leave-dead)
...
  (interactive "P")
  (when (or (not server-clients)
        ;; Ask the user before deleting existing clients---except
        ;; when we can't get user input, which may happen when
        ;; doing emacsclient --eval "(kill-emacs)" in daemon mode.
        (if (and (daemonp)
                 (null (cdr (frame-list)))
                 (eq (selected-frame) terminal-frame))
            leave-dead
          (yes-or-no-p
           "The current server still has clients; delete them? ")))
...
emacs.git - Git mirror of Emacs CVS repo

ハードコードされとる!

仕方ないので,

emacsclient -e '(progn (defun yes-or-no-p (p) t) (kill-emacs))'

とすることにした. ただし, 保存されていないバッファがあった場合のメッセージもおそらく表示されないので注意.