[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ナロイングとは、バッファの特定部分に集中して残りの部分を 不用意に変更しないようにするEmacsの機能である。 初心者に混乱を与えないように、ナロイングは、通常、無効にしてある。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ナロイングすると、バッファの残りの部分は存在しないかのように見えなくなる。 たとえば、バッファのある部分のみで単語を置き換えるような場合には、 利点となる。 望みの範囲にナロイングすれば、その部分だけで置き換えを行える。 文字列検索もその範囲内のみで行えるので、 たとえば、文書のある部分を編集する場合、編集範囲にナロイングしておけば それ以外の範囲の文字列を拾うことがない。 (narrow-to-region
のキーバインドは C-x n n である)
しかし、ナロイングするとバッファの残りの部分が見えなくなるため、 偶然にナロイングしてしまうとファイルのその部分を削除してしまったと思うような 読者を怯えさせる。 さらに、(通常C-x uにバインドされる)コマンドundo
でも、 ナロイングを無効にしない(また、そうすべきでもない)ので、 コマンドwiden
によりバッファの残りの部分が見えるようになることを 知らない人は絶望することになる (widen
はC-x wにバインドしてある)。
ナロイングは人間にとってと同様にLispインタープリタにとっても有用である。 Emacs Lisp関数は、しばしば、バッファの一部分に働くように設計されている。 逆に、ナロイングしてあるバッファの全体に働く必要があるEmacs Lisp関数もある。 たとえば、関数what-line
は、ナロイングが有効な場合にはそれを無効にし、 処理を終了するともとのようにナロイングする。 一方で、what-line
からも呼ばれる関数count-lines
では、 ナロイングを用いてバッファの操作範囲を限定し、終了するときにもとに戻す。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
save-restriction
(2004/08/07)
save-restriction
"へのコメント(無し)
Emacs Lispでは、スペシャルフォームsave-restriction
を用いて、 設定されているナロイングの範囲を記録できる。 Lispインタープリタがsave-restriction
式に出会うと、 save-restriction
の本体を実行し、それらがナロイング範囲を 変更した場合にはもとに戻す。 たとえば、バッファをナロイングしてあるときに、save-restriction
に続く コードでナロイングを取り除いた場合には、完了後にsave-restriction
は バッファのナロイングをもとに戻す。 コマンドwhat-line
では、 コマンドsave-restriction
の直後にあるコマンドwiden
で バッファに設定されたナロイングを取り除く。 関数が終了する直前にもとのナロイングが復元される。
save-restriction
式の雛型は単純である。
(save-restriction 本体... ) |
save-restriction
の本体は、1つ以上の式であり、 Lispインタープリタが順番に評価する。
save-excursion
とsave-restriction
を続けて使う場合には、 save-excursion
は外側で使うべきである。 逆順に使うと、save-excursion
を呼んでEmacsが切り替えたバッファの ナロイングを記録し損なうことがある。 つまり、save-excursion
とsave-restriction
とを一緒に使う場合には、 つぎのように書く。
(save-excursion (save-restriction 本体...)) |
状況によっては,save-excursion
と save-restriction
のスペ シャルフォームを一緒に書かずに,適切な順番で書かなければなりません.
例を示します.
(save-restriction (widen) (save-excursion body...)) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
what-line
(2004/08/07)
what-line
"へのコメント(無し)
コマンドwhat-line
は、カーソルが位置する行の行数を調べる。 この関数では、コマンドsave-restriction
とsave-excursion
の 使用例を示す。 関数の完全なテキストはつぎのとおりである。
(defun what-line () "Print the current line number (in the buffer) of point." (interactive) (save-restriction (widen) (save-excursion (beginning-of-line) (message "Line %d" (1+ (count-lines 1 (point))))))) |
関数には、予想どおり、説明文とinteractive
式がある。 続く2つの行では関数save-restriction
とwiden
を使っている。
スペシャルフォームsave-restriction
は、 カレントバッファに設定されているナロイングを記録し、 save-restriction
の本体のコードを評価したあと、 記録したナロイングを復元する。
スペシャルフォームsave-restriction
に続いて、widen
がある。 この関数は、what-line
が呼ばれたときにカレントバッファに設定されている ナロイングを無効にする (このナロイングはsave-restriction
が記録している)。 このワイドニングにより、バッファの先頭から行数を数えられるようになる。 さもないと、参照可能なリージョン内に制限されてしまう。 設定されていたもとのナロイングは、 スペシャルフォームsave-restriction
を終了する直前に復元される。
widen
の呼び出しに続いて、save-excursion
があり、 カーソル(つまり、ポイント)とマークの位置を記録し、 save-excursion
の本体のコードでポイントを移動する 関数beginning-of-line
を呼んだあとにそれらを復元する。
(式(widen)
は、save-restriction
とsave-excursion
のあいだに ある。 2つのsave- ...
式を続けて順に書く場合には、 save-excursion
を外側にすること。)
関数what-line
の最後の2行で、バッファの行数を数えて、 エコー領域にその数を表示する。
(message "Line %d" (1+ (count-lines 1 (point))))))) |
関数message
はEmacsの画面の最下行に1行のメッセージを表示する。 第1引数は二重引用符のあいだにあり、文字列として表示される。 ただし、この文字列には、これに続く引数を表示するための `%d'や`%s'や`%c'が含まれてもよい。 `%d'は、引数を10進数で表示するので、 メッセージは`Line 243'のようになる。
`%d'のかわりに表示される数は、関数のつぎの行で計算される。
(1+ (count-lines 1 (point))) |
このコードは、1
で示されるバッファの先頭から(point)
までの 行数を数え、それに1を加える (関数1+
は、引数に1を加える)。 1を加えるのは、たとえば、2番目の行のまえには1行しかないからであり、 count-lines
は現在行の直前までの行数を数える。
count-lines
が処理を終了するとエコー領域にメッセージが表示され、 save-excursion
がポイントとマークの位置をもとに戻す。 さらに、save-restriction
はもとのナロイングの設定を復元する。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
バッファの後半にナロイングしていて最初の行を参照できないような場合であっても、 カレントバッファの最初の60文字を表示する関数を書いてみよ。 これには、save-restriction
、widen
、goto-char
、 point-min
、buffer-substring
、message
を始め、 さまざまな関数をポプリのように混ぜ合わせて使う必要がある。
[ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |