[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31. カーソルとカーソル移動関連 (2007/11/30)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=about%20cursor"
"MeadowMemo/カーソルとカーソル移動関連"へのコメント(2007/12/28)


この章で紹介していること

ファイルやディレクトリを開いた際には,カーソルを移動させて目的の場所へ移動する必 要があります.

基本的にはカーソルキーなどでカーソルを移動させる(基本については 10.2 代表的なキーバインド ― チュートリアルで基本操作を学ぶ (2003/11/24) を参考 に) だけで,行うことができます.

しかし,標準の動作では不満なところもあります.そこで,ここでは,カーソルやカーソ ル移動に関連した設定を紹介します.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.1 基本的なカーソル移動 (2005/03/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=basic%20cursor"
"MeadowMemo/基本的なカーソル移動"へのコメント(無し)

通常のカーソル移動

通常のカーソル移動は単純です.カーソルキーや C-p(上) ,C-n(下) , C-b(左) ,C-f(右) でカーソルを移動できます.もちろん,カーソルキーで も同じことが可能です.

しかし,これでは,一文字一文字 (あるいは一行一行) 移動する必要があり,多くの行を 移動するのはとても面倒です.そこで, Ctrl (コートロール) を押しながら左右のカーソ ルキーを押すと,単語単位で移動することができます.また, Ctrl (コートロール) を押 しながら上下のカーソルキーを押すと,段落単位で移動できるようになります.

段落とは,改行のみの行 (空行) で区切られた文章を指します.

しかし,日本語では行頭に全角のスペースを入れたりして,段落を作ることも多くありま す.しかし,標準設定では,全角のスペースがあっても段落とは認識してくれません.

この段落を認識させる方法は設定で変えることができます.

例えば,以下の設定を.emacs に追加すると,行頭の全角スペースや「・○」も段落の区切 りとみなされます.

ただし,モードによっては設定が上書きされ,この設定が効かない場合もあります.

 
(setq paragraph-start '"^\\([  ・○<\t\n\f]\\|(?[0-9a-zA-Z]+)\\)")

設定済み Meadow では設定してあります.

指定した文字数だけ移動

カーソルキーでカーソルを移動できますが,これでは一行や一文字ずつしか移動できませ ん.

そこで,C-u 5 下カーソルキーとしてみてください.これで, 5 行分カーソルが移 動します.

このように,C-u に続けて数字を入力すると,指定した回数だけカーソルを移動で きます.例えば,C-u 5 右カーソル で 5 文字,カーソルを右へ移動できます.

画面をスクロール

さらに,C-vM-v も便利です.これは,テキストを 1 画面分スクロール し,カーソルを画面の一番上へ移動させます.

C-vM-v は,カレントバッファをスクロールさせますが,他のウィンドウ をスクロールさせることもできます.C-M-vC-M-VC-x o で移動 するバッファをスクロールさせることができます.

しかし,これらのスクロールでは,カーソルの位置が上へ行ってしまい,一瞬カーソルを 見失ってしまいます.そこで,以下を.emacs に追加するとカーソルの位置を変えないよう にできます.

 
(setq scroll-preserve-screen-position t)

設定済みMeadowでは設定してあります.

ファイルの最初/最後へ移動

1 画面ずつ移動するのが面倒な場合には,M-<M-> があります.M-< で一番最初へ,M-< で一番最後へ移動できます.さらに,M-x goto-line で 指定した行へ移動することができます.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.2 カーソル関連の設定 (2005/03/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=cursor%20elisp"
"MeadowMemo/カーソル関連の設定"へのコメント(無し)

Meadow でなくてもそうですが,文字が入力される部分にはカーソルが表示されています. そして,マウスの位置を教えるために,マウスカーソルが表示されています.

この章では,このカーソルやマウスカーソルに関連した設定を紹介します.

カーソル関連で,他の章で紹介したものは以下を参考に.

31.2.1 マウスカーソルを編集中に消す (2005/03/01)   
31.2.2 カーソルの在処をわかりやすく − jiggle (2005/03/01)   
31.2.3 アイドル中にカーソルを点滅 ― blinking-cursor (2005/03/01)   



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.2.1 マウスカーソルを編集中に消す (2005/03/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=hide%20mouse"
"MeadowMemo/マウスカーソルを編集中に消す"へのコメント(無し)
要約

テキストを入力している時に,マウスカーソルは必要ありません.そこで,テキスト入力 中にマウスカーソルを消すことができます.

何が問題なのか?

テキストの入力時にはマウスカーソルは必要ありません.それどころか,マウスカーソル の位置によっては,文字と被って邪魔でさえあります.

何ができるのか?

文字の入力中にマウスカーソルを消すことができます.

設定済みMeadowでは

設定してあります.

インストール方法

標準機能ですので,インストールは不要です.

設定方法

以下を参考に設定します.

 
;; 0=消さない それ以外=消えるまでの時間 (ミリ秒)
(setq w32-hide-mouse-timeout 1000)
;; nil=消さない t=キー入力でマウスカーソルが消える
(setq w32-hide-mouse-on-key t)

詳しい使い方

普通に文字入力を行うだけです.すると,マウスカーソルは自動的に消えます.

その後で,マウスカーソルを移動させると,元の場所に現れます.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.2.2 カーソルの在処をわかりやすく − jiggle (2005/03/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=jiggle"
"MeadowMemo/カーソルの在処をわかりやすく−jiggle"へのコメント(無し)
要約

バッファを切り替える時にカーソルを動かします.それにより,別バッファでどの位置に カーソルがあるか分かりやすくなります.

何が問題なのか?

現在のバッファと別のバッファではカーソル位置が異なります.このため,バッファを切 り替えた時に,カーソルがどこにあるかすぐには分かりません.

何ができるのか?

バッファの移動後にカーソルを移動させて,目立たせ,カーソル位置を分かりやすくする ものです.

設定済みMeadowでは

インストールしてありませんので,自分でインストールと設定が必要です.

インストール方法

jiggle をダウンロード後,ロードパスの通っ たところへ置きます.

設定方法

以下を .emacs に追加します.

 
(require 'jiggle)
(jiggle-mode 1)

詳しい使い方

バッファを切り替えてみてください.すると,カーソルがおかしな動きをしてアピールし ませんか?



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.2.3 アイドル中にカーソルを点滅 ― blinking-cursor (2005/03/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=blinking-cursor"
"MeadowMemo/アイドル中にカーソルを点滅―blinking-cursor"へのコメント(無し)
要約

Emacs を操作していないアイドル中にカーソルを点滅させます.

情報源

ELL

何ができるのか?

Meadow/Emacs を操作していない時には,カーソルが点滅して,居場所が分かりやすくな ります.

設定済みMeadowでは

インストールしていませんので,インストールと設定が必要です.

インストール方法

blinking-cursor.el からダウンロードして,ロードパスの通ったところに保存します.

設定方法

以下を .emacs に追加します.

 
(require 'blinking-cursor)
(blinking-cursor-mode 1)

詳しい使い方

Meadow/Emacs を放置しておくと,カーソルが点滅します.また,カーソルの色も,デフォ ルトなら金色,青色と変化します.

変化するカーソル色については,以下のようにして設定できます.

 
(setq blinking-cursor-colors
      ["gold" "blue" "red" "black"])



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.3 カーソル移動によるスクロール (2005/03/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=cursor%20move"
"MeadowMemo/カーソル移動によるスクロール"へのコメント(無し)

ここでは,単純に上下にカーソルを移動させた時のカーソル移動をカスタマイズする方法 を紹介します.

31.3.1 カーソル移動を加速する (2005/03/01)   
31.3.2 カーソル移動で全ファイルをループ (2005/03/01)   
31.3.3 C-下カーソルでも新しい行を作りたい (2005/03/01)   



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.3.1 カーソル移動を加速する (2005/03/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=highspeed%20scroll"
"MeadowMemo/カーソル移動を加速する"へのコメント(2007/12/28)
要約

上下キーによるカーソル移動を加速させることができます.

何が問題なのか?

長いファイルを上下キーでカーソル移動させるのは大変です.

C-v を使えばいいのでは,というのは置いといて...

何ができるのか?

上下キーのよるカーソル移動を何回か連続して行うと加速させることができます.

設定済み Meadow では

設定済みですが,初期状態では無効になっています.M-x customize-option RET mmemo-scroll-speedup RET でオンにしてください.その後,「Save for Future Sessions」上で RET を押し,再起動します.

その他の設定は,M-x customize-group RET Meadow-Memo RET から行うことができ ます.

設定方法

以下を .emacs に追加します.

 
;; 10 回ごとに加速
(defvar scroll-speedup-count 10)
;; 10 回下カーソルを入力すると,次からは 1+1 で 2 行ずつの
;; 移動になる
(defvar scroll-speedup-rate 1)
;; 800ms 経過したら通常のスクロールに戻す
(defvar scroll-speedup-time 800)

;; 以下,内部変数
(defvar scroll-step-default 1)
(defvar scroll-step-count 1)
(defvar scroll-speedup-zero (current-time))

(defun scroll-speedup-setspeed ()
  (let* ((now (current-time))
         (min (- (car now)
                 (car scroll-speedup-zero)))
         (sec (- (car (cdr now))
                 (car (cdr scroll-speedup-zero))))
         (msec
          (/ (- (car (cdr (cdr now)))
                (car
                 (cdr (cdr scroll-speedup-zero))))
                     1000))
         (lag
          (+ (* 60000 min)
             (* 1000 sec) msec)))
    (if (> lag scroll-speedup-time)
        (progn
          (setq scroll-step-default 1)
          (setq scroll-step-count 1))
      (setq scroll-step-count
            (+ 1 scroll-step-count)))
    (setq scroll-speedup-zero (current-time))))

(defun scroll-speedup-next-line (arg)
  (if (= (% scroll-step-count
            scroll-speedup-count) 0)
      (setq scroll-step-default
            (+ scroll-speedup-rate
               scroll-step-default)))
  (if (string= arg 'next)
      (line-move scroll-step-default)
    (line-move (* -1 scroll-step-default))))

(defadvice next-line
  (around next-line-speedup activate)
  (if (and (string= last-command 'next-line)
           (interactive-p))
      (progn
        (scroll-speedup-setspeed)
        (condition-case err
            (scroll-speedup-next-line 'next)
          (error
           (if (and
                next-line-add-newlines
                (save-excursion
                  (end-of-line) (eobp)))
               (let ((abbrev-mode nil))
                 (end-of-line)
                 (insert "\n"))
             (line-move 1)))))
    (setq scroll-step-default 1)
    (setq scroll-step-count 1)
    ad-do-it))

(defadvice previous-line
  (around previous-line-speedup activate)
  (if (and
       (string= last-command 'previous-line)
       (interactive-p))
      (progn
        (scroll-speedup-setspeed)
        (scroll-speedup-next-line 'previous))
    (setq scroll-step-default 1)
    (setq scroll-step-count 1)
    ad-do-it))

詳しい使い方

普通にカーソル移動を行うと, 10 回ごとに加速するようになります.

コメント

何となく欲しくなって,適当にでっちあげてみたもの.使ってみると,意外に便利で愛用 してます.

時々,1行移動させるつもりが,2行移動しちゃったりしますけど.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.3.2 カーソル移動で全ファイルをループ (2005/03/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=scroll%20allfile"
"MeadowMemo/カーソル移動で全ファイルをループ"へのコメント(無し)
要約

上下のカーソルキーでの移動で,バッファ端まできたら次のバッファへ移動します.

情報源

バッファの切り替え関数は Junk emacs lisp より流用しています.

何ができるのか?

上下のカーソルキーでカーソルを移動させ,バッファの最後までくると,次のバッファへ 移動します.さらに,そのバッファの最後にくると,次のバッファへと移動できます.

ま,単なる思い付きなので,実用性は求めないように.

設定済みMeadowでは

設定していません.

設定方法

以下を .emacs に追加します

 
(defun my-select-visible (blst n)
  (let ((buf (nth n blst)))
    (cond ((= n (- (length blst) 1))
           (other-buffer))
          ;; buffer を一つしか開いていなければ
          ;; other-buffer に任せる
          ((not
            (= (aref (buffer-name buf) 0) ? ))
           buf)
          ;; mini-buf は要らない
          (t (my-select-visible
              blst (+ n 1))))))

(defun my-grub-buffer ()
  (interactive)
  (let ((blst (if (< emacs-major-version 20)
                  (reverse (buffer-list))
                  (reverse
                   (cdr
                    (assq
                     'buffer-list
                     (frame-parameters)))))))
    ;; frame の buffer-list って
    ;; どうやって返すんだっけ?
    (switch-to-buffer
     (my-select-visible blst 0))))

(defadvice next-line
  (around next-line-allfile activate)
  (let ((pt (point)))
    (condition-case err
        ad-do-it
      (error ()))
    (when (and (= pt (point))
               (interactive-p))
        (bury-buffer)
        (goto-char (point-min))
      )))

(defadvice previous-line
  (around previous-line-allfile activate)
  (let ((pt (point)))
    (condition-case err
        ad-do-it
      (error ()))
    (when (and (= pt (point))
               (interactive-p))
        (my-grub-buffer)
        (goto-char (point-max))
        )))

詳しい使い方

カーソル移動をするだけです.バッファの上下端にくると,次のバッファへ移動します.

うまく動かない

dired などは上下カーソルに別の関数を割り当てているので,動作しません.

コメント

これを少し変えて,以下のようにすると,現在のバッファだけをループできます.つまり, カーソルが一番下まできたときに,下カーソルを入力すると一番上に移動するのです.

 
(defadvice next-line
  (around next-line-allfile activate)
  (let ((pt (point)))
        (condition-case err
            ad-do-it
          (error ()))
    (when (and (= pt (point))
               (interactive-p))
      (goto-char (point-min))
      )))

(defadvice previous-line
  (around previous-line-allfile activate)
  (let ((pt (point)))
    (condition-case err
        ad-do-it
      (error ()))
    (when (and (= pt (point))
               (interactive-p))
        (goto-char (point-max))
        )))



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.3.3 C-下カーソルでも新しい行を作りたい (2005/03/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=paragraph%20newline"
"MeadowMemo/C-下カーソルでも新しい行を作りたい"へのコメント(無し)
要約

設定によるが,バッファ端で下カーソルキーを押すことで,新しい行を追加することがで きる.これを,C-下カーソルキーでも可能にする.

何が問題なのか?

next-line-add-newlines が nil 以外の値であれば,下カーソルキーをバッファの下端で 押すと新しい行を作ることができます.

しかし,C-下カーソルキーで移動していると,行を作ることはできません.

何ができるのか?

C-下カーソルキーで移動しても,行を作ることができます.

設定済みMeadowでは

設定していません.

設定方法

以下を .emacs に追加します

 
(defadvice forward-paragraph
  (around forward-paragraph-new-line activate)
  (let ((cp (point)))
    ad-do-it
    (if (and (= cp (point))
             (not (= (point) (point-min))))
        (next-line 1))))

詳しい使い方

C-下カーソル ではもバッファの末尾で止まらずに,新しい行を作っ てくれるようになります.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.4 1 行ずつスクロールさせる (2005/03/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=1line%20scroll"
"MeadowMemo/1行ずつスクロールさせる"へのコメント(無し)
要約

多くのテキストエディタと同様に,カーソル移動時に画面を1行ずつスクロールさせる.

何が問題なのか?

多くのテキストエディタはカーソルを移動させると, 1 行ずつスクロールします.

しかし,Meadow では半画面ずつのスクロールします.

好みの問題ですが,最初は躊躇うかもしれません.

何ができるのか?

1行ずつスクロールさせることができます.

設定済みMeadowでは

設定してあります.

設定方法

以下を.emacsに追加します.

 
(setq scroll-conservatively 35
       scroll-margin 0
       scroll-step 1)

ただし,これは通常のバッファでのカーソル移動のみ有効です. shell では,半画面ずつ 移動することもあります.そこで, shell モードのために,以下も設定しておきます.

 
(setq comint-scroll-show-maximum-output t)

詳しい使い方

普通にカーソルを移動させると1行ずつのスクロールになります.ただし,場合によって は,半画面ずつスクロールしてしまうこともあるようです.

標準機能以外にも同様に1行ずつスクロールさせるための Elisp がありますので,ここで 紹介しておきます.

31.4.1 1 行ずつスクロールさせる ― ce-scroll (2005/03/01)   
31.4.2 1 行ずつスクロールさせる設定 (2005/03/01)   



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.4.1 1 行ずつスクロールさせる ― ce-scroll (2005/03/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=scroll%20step"
"MeadowMemo/1行ずつスクロールさせる―ce-scroll"へのコメント(無し)
要約

1行ずつのスクロールを可能にする

何が問題なのか?

Meadow には 1 行ずつスクロールさせるための設定がありますが,これを使っても半画面 でスクロールしてしまい,不便です.

インストール方法は?

Applause's Emacs-Lisp and Patch か らダウンロードして,ロードパスの通ったところへコピーしておきます.

設定方法は?

.emacs に以下を追加します.

 
(load "ce-scroll")
(setq ce-smooth-scroll nil)

2 行目はなくてもいいです.好みで設定しておきます.

詳しい使い方は?

これで,普通にカーソルを移動させるだけで, 1 行ずつのスクロールと物理行移動が可 能になります.物理行移動については 31.11 長い文章でのカーソルの移動 − 物理行移動 (2007/11/30) を参照ください.

うまく動かない

ただ,時々挙動が変です.設定によっては,干渉するものもあります.例えば,

 
(setq scroll-preserve-screen-position t)

を設定していると,期待通りの動作になりません.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.4.2 1 行ずつスクロールさせる設定 (2005/03/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=sane-next-line"
"MeadowMemo/1行ずつスクロールさせる設定"へのコメント(無し)

何ができるのか?

1 行ずつスクロールさせる設定です.「 S.Namba 」さんによるものです.

設定方法は?

以下を.emacs に追加します.

 
(defun sane-next-line (arg)
  "Goto next line by ARG steps with scrolling sanely if needed."
  (interactive "p")
  ;;(let ((newpt (save-excursion (line-move arg) (point))))
  (let ((newpt (save-excursion (next-line arg) (point))))
    (while (null (pos-visible-in-window-p newpt))
      (if (< arg 0) (scroll-down 1) (scroll-up 1)))
    (goto-char newpt)
    (setq this-command 'next-line)
    ()))

(defun sane-previous-line (arg)
  "Goto previous line by ARG steps with scrolling back sanely if needed."
  (interactive "p")
  (sane-next-line (- arg))
  (setq this-command 'previous-line)
  ())

(defun sane-newline (arg)
  "Put newline\(s\) by ARG with scrolling sanely if needed."
  (interactive "p")
  (let ((newpt (save-excursion (newline arg) (indent-according-to-mode) (point))))
    (while (null (pos-visible-in-window-p newpt)) (scroll-up 1))
    (goto-char newpt)
    (setq this-command 'newline)
    ()))

(global-set-key [up] 'sane-previous-line)
(global-set-key [down] 'sane-next-line)
(global-set-key "\C-m" 'sane-newline)
(define-key global-map "\C-n" 'sane-next-line)
(define-key global-map "\C-p" 'sane-previous-line)



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.5 C-v によるページ単位の移動 (2005/03/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=scroll-up"
"MeadowMemo/C-vによるページ単位の移動"へのコメント(無し)

C-v とすると, 1 画面単位でスクロールすることができます.これにより,下カー ソルキーよりも大きな移動を行うことができます.

逆方向の移動は M-v です.これにより,上カーソルキーよりもずっと大きな移動を 行うことができます.

この章では,こういったページ単位での移動に関連した Elisp などを紹介します.

31.5.1 ページ単位の移動時に末尾の行をハイライト (2005/03/01)   
31.5.2 画面のスクロールを取り消す ― unscroll (2005/03/01)   
31.5.3 C-v のスクロールをループさせる (2005/03/01)   



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.5.1 ページ単位の移動時に末尾の行をハイライト (2005/03/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=highlight-context-line"
"MeadowMemo/ページ単位の移動時に末尾の行をハイライト"へのコメント(無し)
要約

C-v でスクロールした時,以前表示していた部分の最後をハイライトすることで, どこからが新しいかを明確にできる.

何が問題なのか?

C-v では, 1 画面分画面がスクロールします.ただし,この時, next-screen-context-lines で設定されている値だけ,重複して表示されます.このため, 1 画面分スクロールさせると,以前,どこが画面の末尾だったのか分からなくなってしま います.

何ができるのか?

スクロール時に,画面の末尾だった場所をハイライトしてくれます.それにより,以前表 示していた部分がどこまでなのかがすぐに分かるようになります.

設定済みMeadowでは

インストールしてありませんので,インストールと設定が必要です.

インストール方法

XEmacs: Lisp Code - Highlight Context Line より, highlight-context-line.el をダウンロー ドします.そして,ロードパスの通ったところへ置きます.

設定方法

以下を .emacs に追加します.

 
(require 'highlight-context-line)
;; ハイライトのフェイス
(setq highlight-context-line-face 'region)

詳しい使い方

これで,C-vM-v でスクロールさせると,画面の末尾,あるいは,画面の 先頭だった行がハイライトされるはずです.

うまく動かない

少しずれるようです,,,そのため,C-v の方は使えますが,M-v の方は画 面外になってしまうこともあります (next-screen-context-lines の値によっては使える かもしれません) .

また,もしもハイライトされなければ,M-x help-for-help k C-vとして, C-v に割り当てられている関数を確認してください.これが「 scroll-down 」以外 であれば,

 
(defadvice lcomp-select-completion-window-or-scroll-down
  (around highlight-context-line-down activate)
  ad-do-it
  (if (not (car (ad-get-args 0)))
      (highlight-context-line-do-highlight -1)))

のように個別にアドバイスを追加する必要があります. defadvice の後にある関数名を変 えるだけなので,簡単です.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.5.2 画面のスクロールを取り消す ― unscroll (2005/03/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=unscroll"
"MeadowMemo/画面のスクロールを取り消す―unscroll"へのコメント(無し)

要約

スクロール後,実行するとそれを取り消し,元の状態に戻すことができる.

何ができるのか?

C-v を何回か押してスクロールさせると,元の場所を見失ってしまいます.

そんな時は慌てずに,C-x C-x じゃなくてこれを使いましょう.そうすれば,すぐ に元の場所に戻ることができます.

インストール方法

unscroll.el をダウン ロードして,ロードパスの通ったところへ置きます.

設定方法

以下を .emacs に追加します.

 
(load "unscroll")

詳しい使い方

M-x unscrollとすると,スクロールを取り消すことができます.

コメント

直前のスクロールしか覚えてませんので,連続して入力しても意味がありません.無制限 に unscroll ができると面白いかもしれないなぁ.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.5.3 C-v のスクロールをループさせる (2005/03/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=loop%20scroll"
"MeadowMemo/C-vのスクロールをループさせる"へのコメント(無し)
要約

C-v で画面の下端までいくと,次はバッファの先頭へ移動し,永遠にループさせることが できます.

何ができるのか?

C-v を何度か入力すると画面の下端でエラーが出てストップします.何度 C-v を入力してもエラーが出るだけです.

この設定を入れると 1 度エラーが出て,さらに C-v を入力すると,画面の先頭へ 移動します.これで,永遠にスクロールを続けることができます.

もちろん M-v でも可能です.

設定済みMeadowでは

設定していません.

設定方法

以下を.emacs に追加します.

 
(defvar loop-scroll-up nil)
(defadvice scroll-up
  (around loop-scroll-up activate)
  (let ((pt (point)))
    (condition-case err
        ad-do-it
      (error
       (if (and (interactive-p)
                (eq last-command 'scroll-up)
                loop-scroll-up
                (= pt (point)))
           (progn
             (goto-char (point-min))
             (setq loop-scroll-up nil))
         (setq loop-scroll-up t)
         (message "End of Buffer"))))))

(defvar loop-scroll-down nil)
(defadvice scroll-down
  (around loop-scroll-down activate)
  (let ((pt (point)))
    (condition-case err
        ad-do-it
      (error
       (if (and (interactive-p)
                (eq last-command 'scroll-down)
                loop-scroll-down
                (= pt (point)))
           (progn
             (goto-char (point-max))
             (setq loop-scroll-down nil))
         (setq loop-scroll-down t)
         (message "Beginning of Buffer"))))))

詳しい使い方

普通に C-v を実行するだけです.これでループするようになります.

うまく動かない

何らかの Elisp を入れて,C-vM-v のコマンドがデフォルトと違うと動 作しません.その場合には適当に関数名を変える必要があります.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.6 自動的にスクロールさせる (2005/03/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=auto%20scroll"
"MeadowMemo/自動的にスクロールさせる"へのコメント(無し)

C-v などを実行しなくても自動的にスクロールさせる方法です.だらだらと長文を 読む時にいいでしょう.

31.6.1 自動的にスクロール ― idle-scroll (2005/03/01)   
31.6.2 多機能な自動スクロール ― vel (2005/03/01)   



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.6.1 自動的にスクロール ― idle-scroll (2005/03/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=idle%20scroll"
"MeadowMemo/自動的にスクロール―idle-scroll"へのコメント(無し)
要約

自動で,一行ずつスクロールさせることができます.

何ができるのか?

指定した秒が経過するたびに,自動的に 1 行スクロールさせることができます.

インストール方法

idle-scroll.el をダウンロー ドしてロードパスの通ったところへ置きます.

設定方法

以下を .emacs に追加します

 
(load "idle-scroll")

詳しい使い方

M-x idle-scroll-mode でスクロールが開始します.スクロール速度は M-x set-variable RET idle-scroll-seconds RET 10 RET という風に指定します.

これで, 10 秒経過すると 1 行スクロールします.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.6.2 多機能な自動スクロール ― vel (2005/03/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=vel"
"MeadowMemo/多機能な自動スクロール―vel"へのコメント(無し)
要約

自動スクロールできます.スクロール中に方向や速度も簡単に変更できます.

何が問題なのか?

idle-scroll で自動スクロールできますが,これでは方向が変更できませんし,速度の変 更も面倒です.

何ができるのか?

自動スクロールができます.しかも,スクロール中に上下カーソルキーで速度の変更もで きます.

インストール方法

vel.el をダウンロードし,ロードパス の通ったところへ置きます.

設定方法

以下を.emacs に追加します.

 
(require 'cl)
(require 'vel)

詳しい使い方

M-x vel-mode-enable で vel-mode にします.この状態で,M-下カーソル と すると,スクロール開始します.さらに,M-下カーソル下カーソル を入 力すると,速度が変わります.逆に M-上カーソル上カーソル を入力す ると減速やスクロール方向を変えることができます.SPC などでスクロールを終了 させることができます.

また,マウスによる操作もできます.M-x vel-mode-enable で有効にします.そし て,マウスの右ボタンを押し,押したままで,マウスカーソルを上下に動かすと,その方 向へスクロールします.

コメント

 
(setq-default vel-mode t)

としておくと,常にオンにできます.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.7 ファイルの任意の場所へ移動 ― bookmark (2005/03/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=file%20bookmark"
"MeadowMemo/ファイルの任意の場所へ移動―bookmark"へのコメント(2007/12/28)

ある程度巨大なファイルを多数編集するようになると,カーソルの移動が大変面倒になっ てきます.

Meadow/Emacs には多様なカーソル移動コマンドがありますが,実際に移動したい先はあ る関数であったり,ある章の開始部分であったりと,ある特定の場所であることが多いも のです.

この時便利なのが,bookmark です.これは文字通り,ファイルの任意の場所にブックマー クをつけて,その場所へ一気にジャンプする機能.

この機能は標準で附属してます.設定も必要ありません.

使い方は以下のようになります.

31.7.1 バッファにしおりをつける ― bm (2005/03/01)   



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.7.1 バッファにしおりをつける ― bm (2005/03/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=bm"
"MeadowMemo/バッファにしおりをつける―bm"へのコメント(2008/11/14)
要約

バッファの任意の場所にしおりをつけておき,その場所へ順番に移動していくことができ ます.

何が問題なのか?

長いファイルやよく参照する箇所のあるファイルを編集する場合,何度もカーソルを移動 させる必要があります.あるいは,バッファを 2 つに分けて編集していても,何かの拍子 に 1 つになってしまうということもあります.

何ができるのか?

バッファの任意の箇所にしおりをつけておき,そのしおりを順番に巡回することができま す.

これにより,任意の場所へ簡単に移動することができます.

ただし,複数のバッファにしおりをつけても,巡回できるのは,現在のバッファにあるし おりだけです.

設定済みMeadowでは

設定済みですので,そのままで利用できます.

インストール方法

bm.el をダウンロードし,ロードパス の通ったところへ移動します.

設定方法

以下を.emacs に追加します.

 
(require 'bm)
(global-set-key [?\C-\;] 'bm-previous)
(global-set-key [?\C-\:] 'bm-next)
(global-set-key [?\C-\M- ] 'bm-toggle)

詳しい使い方

まず,ALT+Ctrl+SPC で現在行にしおりをつけます.これで,その行の色が変わりま す.他にも何ヶ所か同じようにして,しおりをつけておきます.

そして,C-;C-: を押します.すると,しおりをつけた場所へ順番にカー ソルが移動します.C-; へ次のしおりへ,C-: が前のしおりへ移動になりま す.

移動後,カーソル行を 1 行目に

モードによっては以下のような設定も便利でしょう.これだと, shell モードで,移動後, 現在行がバッファの 1 行目になります.

 
      '(shell-mode
        ))

;;この条件をみたす場合,移動後 (recenter 0) する
(setq bm-goto-top-condition
      (lambda ()
        (or
         ;;irbsh のプロンプトを bookmark したとき
         (and (eq major-mode 'inferior-ruby-mode)
              (looking-at "^irbsh\\["))
         )))

(defadvice bm-goto (after bm-goto-top activate)
  (if (or (memq major-mode  bm-goto-top-mode-list)
          (funcall bm-goto-top-condition))
      (recenter 0)))

移動前に現在行をしおりに追加

以下を追加すると,C-;C-: での移動前に現在行をしおりに設定できます. これにより,現在行へすぐに戻ることができます.

 
(defun bm-set-bookmark-befor-goto ()
  (if (or (bm-bookmark-at (point))
          (string= last-command 'bm-next)
          (string= last-command 'bm-previous))
      ()
    (bm-toggle))
  )

(defadvice bm-goto  (before set-bookmark-before-next activate)
  "advice"
  (bm-set-bookmark-befor-goto)
  )

移動前にマークをつけておく

移動前にマークをつけておく設定です.これで,移動後 C-x C-x ですぐに移動前の 場所へ戻ることができます.

 
(defadvice bm-goto (before bm-mark-set activate)
  (unless (bm-bookmark-at (point))
    (push-mark)))



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.8 マウスがあるフレームをアクティブに ― follow-mouse (2005/03/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=follow%20mouse"
"MeadowMemo/マウスがあるフレームをアクティブに―follow-mouse"へのコメント(無し)
要約

マウスカーソルが上にあるフレームやバッファをアクティブにできます

何が問題なのか?

ウィンドウを分割するために,C-x 2 としたり,フレームを作るために C-x 5 2としたりすることはよくあります.

このように分割したりした後で,そのフレームやバッファに切り替えるためにはマウスカー ソルを移動させ,クリックする必要があり面倒です.

何ができるのか?

マウスカーソルを移動させるだけで,そのフレームやバッファをアクティブにすることが できます.

設定済みMeadowでは

インストールしてありませんので,インストールと設定が必要です.

インストール方法

follow-mouse.el をダウンロー ドし,ロードパスの通ったところへ置きます.

設定方法

以下を.emacs に追加します.

 
(require 'follow-mouse)

詳しい使い方

M-x turn-on-follow-mouse でオンにします.これで,マウスカーソルを移動させる だけで,C-x o のようなバッファの切り替えなどができます.

M-x turn-off-follow-mouse でオフにできます.

コメント

ミニバッファにカーソルが移動した時の挙動があやしい.うまく操作できることもあれば, 操作できずにバッファにカーソルが行ってしまうこともあるよう.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.9 現在行をバッファの 1 行目へ (2003/04/03)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=line-to-top-of-window"
"MeadowMemo/現在行をバッファの1行目へ"へのコメント(無し)

要約

現在行をバッファの1行目にすることができる.

何ができるのか?

今,カーソルがある行をバッファの 1 行目へ移動させることができます.関数や文章など で,丁度いいところから表示させたい時に便利です.

設定済みMeadowでは

設定していません.

設定方法

以下を.emacs に追加します.適当なキーへ割り当てておくと便利です.

 
(defun line-to-top-of-window ()
  "Move the line point is on to top of window."
  (interactive)
  (recenter 0))



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.10 カーソルのある行をハイライト ― hl-line (2005/03/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=hl-line"
"MeadowMemo/カーソルのある行をハイライト―hl-line"へのコメント(無し)
要約

現在,カーソルがある行を強調表示することで,今編集している箇所を分かりやすくしま す.

何が問題なのか?

カーソルの印だけでは,ちょっと目をそらすと,どこを編集していたのか見失うことがあ ります.

何ができるのか?

カーソルがある行を強調表示することで,現在行が分かりやすくなります.

設定済みMeadowでは

設定済みです.

(ただし,バージョンによっては設定でエラーになることもあったため,無効になってい ることもあります.)

設定は以下のようになっています.背景色をもとに適当にフェイスを決定しています.黒 のように濃い色だと,あまり意味を成しませんが.

 
;; 現在行に色をつける
(defface face-for-hl-line
  '((((class color)
      (background dark))
     (:background "white"))
    (((class color)
      (background light))
     (:background "black"))
    (t
     ())) nil)

(require 'hl-line)
(custom-setq-if-not 'hl-line-face 'face-for-hl-line)
(global-hl-line-mode)
(defun egoge-wash-out-colour-back (colour)
  "Return a colour string specifying
 a washed-out version of COLOUR."
  (if (string= colour "black")
      "gray13"
    (let ((basec (color-values
                  (face-attribute
                   'default :background)))
          (list nil))
      (apply 'format "#%02x%02x%02x"
             (dolist (cv (color-values colour)
                         (nreverse list))
               (push
                (/ (/ (+ cv (* 2 (car basec)))
                      3) 256) list))))))

(defun egoge-wash-out-face-back (face)
  "Make the foreground colour of FACE
 appear a bit more pale."
  (let ((colour (face-attribute face :background)))
    (unless (eq colour 'unspecified)
      (set-face-attribute
       face nil
       :background
       (egoge-wash-out-colour-back colour)))))

(defun hl-line-face-reset ()
  (set-face-attribute
   'face-for-hl-line nil
   :background
   (face-attribute 'default :background))
  (egoge-wash-out-face-back 'face-for-hl-line)
  (frame-update-face-colors (selected-frame)))

(defadvice color-theme-install-at-point
  (after hl-line-face-setup activate)
  (hl-line-face-reset))

(add-hook 'after-init-hook 'hl-line-face-reset)

インストール方法

標準で付属しています.

設定方法

以下を .emacs に追加します.フェイスは好きなように変えてください.

 
(setq hl-line-face 'underline)
(global-hl-line-mode)

詳しい使い方

これで,現在行に指定したフェイスが付けられます.

コメント

好きな色を使うためには,以下のようにしてフェイスを作成して,それを使うようにしま す.

 
(defface hlline-face
  '((((class color)
      (background dark))
     (:background "blue" :foreground "white"))
    (((class color)
      (background light))
     (:background "ForestGreen"))
    (t
     ()))
  "*Face used by hl-line.")
(setq hl-line-face 'hlline-face)



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.11 長い文章でのカーソルの移動 − 物理行移動 (2007/11/30)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=physical-line"
"MeadowMemo/長い文章でのカーソルの移動−物理行移動"へのコメント(無し)

Emacs では通常

 
|一行が長い文章は途中で折り返されま\|
|す. 折り返した時は文末に\が表示さ\\|
|れます               |
|ここで次の段落が続く        |

このように一行が長い時, 折り返されて表示されます. そして, 今「一行」の「一」にカー ソルがある時に, カーソルを1個下へ動かすと,「ここ」と書いてあるところへ移動します.

しかし, これは感覚的ではなく, 非常に使いにくいです. この場合, 「ここ」ではなくカー ソルが「す」へ移動して欲しいですね.

このようなカーソル移動を可能にするための設定をいくつか紹介します.

注意事項

このような動作は可能ですが,時々変な動作をすることもあります.

このため,適当な文字数で折り返す癖をつけることをお勧めします (16.5 段落の設定を変更する ― auto-fill (2003/06/27) を参 考に) .

その他の Elisp

ここで,紹介したもの以外には ce-scroll という Elisp があります.これについては, すでに 31.4.1 1 行ずつスクロールさせる ― ce-scroll (2005/03/01) で紹介していますので,そちらを参照ください.

31.11.1 物理行移動 ― physical-line-mode (2007/11/30)   
31.11.2 物理行移動 ― previous/next-window-line (2005/03/01)   
31.11.3 見た目上の折り返しを変える ― word-wrap (2005/03/01)   



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.11.1 物理行移動 ― physical-line-mode (2007/11/30)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=physical-line-mode"
"MeadowMemo/物理行移動―physical-line-mode"へのコメント(無し)
要約

物理行移動が可能になります.また,特定のモードでは使わないように設定することもで きます.

何ができるのか?

物理行での移動が可能になります.

設定済みMeadowでは

設定済みですので,そのままで利用できます.

インストール方法は?

小松さんのページ よりダウンロー ド後, ロードパスの通ったディレクトリに置きます.

設定方法は?

以下を .emacs に記入します

 
(load "physical-line")
(physical-line-on)
;; dired-mode では使わない
(setq physical-line-ignoring-mode-list '(dired-mode))

詳しい使い方

Meadow を再起動すると物理行移動が可能になります.

うまく動かない

Emacs22ではうまく動作しないようです.これは, physical-line.el の方を使うことで直る ようです.ただ,これでも, C-e が変みたいですが.

同じ機能を実現するものとして, physical-line もあります.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.11.2 物理行移動 ― previous/next-window-line (2005/03/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=previous-window-line"
"MeadowMemo/物理行移動―previous/next-window-line"へのコメント(無し)
要約

物理行移動を可能にする設定です.

設定済みMeadowでは

設定していません.

設定方法

以下を .emacs に追加します.

 
(global-set-key "\C-p" 'previous-window-line)
(global-set-key "\C-n" 'next-window-line)
(global-set-key [up] 'previous-window-line)
(global-set-key [down] 'next-window-line)
(defun previous-window-line (n)
  (interactive "p")
  (let ((cur-col
         (- (current-column)
            (save-excursion (vertical-motion 0) (current-column)))))
    (vertical-motion (- n))
    (move-to-column (+ (current-column) cur-col)))
  (run-hooks 'auto-line-hook)
  )
(defun next-window-line (n)
  (interactive "p")
  (let ((cur-col
         (- (current-column)
            (save-excursion (vertical-motion 0) (current-column)))))
    (vertical-motion n)
    (move-to-column (+ (current-column) cur-col)))
  (run-hooks 'auto-line-hook)
  )



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

31.11.3 見た目上の折り返しを変える ― word-wrap (2005/03/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=word-wrap"
"MeadowMemo/見た目上の折り返しを変える―word-wrap"へのコメント(無し)

要約

見た目上の折り返しを変化させ,物理行移動を可能にする

何ができるのか?

物理行での移動ができます.

ただし,見た目上の折り返しを変えて,改行と見なす処理を行っています.そのため,リー ドオンリーのバッファには利用できません.

設定済みMeadowでは

インストールしていません.

インストール方法

から,コピーして, word-wrap.el の名前でロードパスの通ったところへ保存します.

設定方法

以下を.emacs に追加します.

 
(require 'word-wrap)

詳しい使い方

M-x word-wrap-mode として,オンにします.これで,物理行移動が可能になります. 必要に応じて, hook に追加しておくといいでしょう.


[ << ] [ >> ]           [表紙] [目次] [索引] [検索] [上端 / 下端] [?]