physical-line-mode は (英語的に正しいのか大いに不安ですが), Emacs 上で物理行移動を実現するマイナーモードです.
Emacs では例えば横 80 文字分の横幅のウインドウで, 1 行が 80 文字を 超えるものを表示する場合, その 1 行が 2 行にわたって表示されます. (実際には設定によって, 横スクロールをするようにもできます). こうした場合に縦方向にカーソルを移動すると, 実際には 1 行でも 2 行に見えているのだから見えているままに移動してほしいと思うのですが, 実際にはそうならずに, 論理的な次の行に進んでしまいます. それを 論理的な行ではなくて物理的な行 (つまり見えているまま) で 移動できるようにしようというのが physical-line-mode です.
http://www.taiyaki.org/debian/ にある physical-line-el パッケージを インストールして下さい. .emacs への設定は不要です.
apt を利用したい場合は, 以下の設定を /etc/apt/sources.list に 追加して下さい.
deb http://www.taiyaki.org/debian ./
http://www.taiyaki.org/elisp/physical-line/src/ から physical-line.el を適当な場所にダウンロードしてください.
必要なファイルを ~/elisp/ 以下にダウンロードしたとします. 次に ~/.emacs などに次の 2 行を追加してください. 1 行目は既に書いてあれば必要ありません.
(setq load-path (cons (expand-file-name "~/elisp") load-path)) (load "physical-line")
M-x physical-line-mode を実行するとモードラインに "PL" 表示されて カーソル移動が物理行に対応します. もう一度 M-x physical-line-mode を 実行すれば元に戻ります. また C-u M-x physical-line-mode で現在の状態に 関わらずつねに物理行に対応し, C-u - M-x physical-line-mode でその 逆になります.
Emacs 全体で物理行移動を行いたい場合は M-x physical-line-on を実行して 下さい. M-x physical-line-on を実行したのであれば M-x physical-line-mode の 実行は必要ありません. また, M-x physical-line-off で物理行移動から 論理行移動に戻ります.
2002-05-12 以降から beginning-of-line (C-a), end-of-line (C-e) も物理行 対応になりました.
physical-line-on, physical-line-off を利用して物理行移動モードを ON/OFF できます. また physical-line-ignoring-mode-list を設定することにより 特定のメジャーモードだけを論理行移動のままにすることも可能です.
(physical-line-on) ;; dired-mode と text-mode は論理行移動のままにする. (setq physical-line-ignoring-mode-list '(dired-mode text-mode))
Text に限らずたいていのメジャーモードには <モード名>-hook があるので これを利用します.
(add-hook 'text-mode-hook 'physical-line-mode-on)
"C-p", "C-n" は論理行移動のままで, カーソルの上下だけを 物理行移動させたい場合, physical-line-previous-line および physical-line-next-line を使います. これらのコマンドは physical-line-on や physical-line-mode などの状態とは関係なく物理行移動が可能です.
(global-set-key [up] 'physical-line-previous-line) (global-set-key [down] 'physical-line-next-line)
逆に常に論理行移動するためのコマンドは physical-line-logical-previous-line, physical-line-logical-next-line です.
Emacs21 上で使う場合, 物理行末にタブ文字を含んでいるテキストでは カーソル移動がおかしくなります.
原因は Emacs21 のバグにあります. Emacs21 の関数 vertical-motion が いわゆる全角文字およびタブ文字に正しく対応できていないために起きて しまうバグです. physical-line では, この vertical-motion のバグを 吸収すべく, いくつかの特別な処理をしています. しかし完全にバグを回避することは諦めました.
physical-line-mode 限定のメーリングリストではありませんが, 小松が作成している ELisp 全般に関してのメーリングリストを QuickMLで作成しました.
参加される方は, 以下のようなメールを送信してください. また Cc: に自分のメールアドレスを付けないでください. QuickML の仕様上, Cc: に参加者以外のメールアドレスがあると 参加できません.
To: elisp@taiyaki.quickml.com From: (自分のアドレス) Cc: komatsu@taiyaki.org Subject: 参加します (お名前) (本文にかるく自己紹介でもお願いします)