21

emacsにこれらのカーソル移動コマンドが組み込まれているのか、それともそれらを書く必要があるのか​​、どこかにスニペットを見つける必要があるのか​​ 疑問に思っています. 私はそれらがかなり気の利いたものであり、vimで定期的に使用しています。これまでのところ、emacs のドキュメントでそれらを見つけていません。

vim では、次のようになります: shift-h -> カーソルを画面の一番上に移動する shift-m -> カーソルを画面の中央に移動する shift-l -> カーソルを画面の一番下に移動する

明確にするために、カーソルをドキュメントの上部/下部に移動するのではなく、ドキュメントの現在表示されている部分、つまり現在画面に表示されている部分の上部/下部に移動するだけです。

私はこれまでにそのうちの1つを見つけました。alt-r は vim の shift-m に相当するようです。カーソルを中央の行の最初の列に移動します。

4

6 に答える 6

30

使用する:

  • Alt+0 Alt+r- ウィンドウの上部
  • Alt+- Alt+r- ウィンドウの下部

厳密にM-0 M-rは、画面の上部と画面M-- M-rの下部のように記述します。Whereは、通常 にマップされるキーをM意味します。 MetaAlt

これらのキーストロークを次のように計算しました。

M-rコマンドを実行しmove-to-window-lineます。私はこれをC-h k M-r、すなわちで見つけました。Ctrl+h, k, Alt+r. キー シーケンスC-h kとは、次のキー シーケンスが何をするかを教えてくれることを意味します。 コマンド名と、コマンドに数値引数を渡して、移動したい行を選択できることを教えてくれました。何も渡さない場合は、ご覧のようにポイントがウィンドウの中央に移動します。

Meta を押しながら数値を入力することで、数値引数をコマンドに渡します。マイナス記号は単独で -1 を意味します。ここで、画面の上部に移動するには行 0 を渡し、画面の下部には行 -1 を渡します。これにより、上記のキー シーケンスが得られます。

move-to-window-line別のキーにバインドしたい場合は、Joe's answer to this question を見てください

于 2009-10-05T12:44:35.317 に答える
9

使用したい関数はmove-to-window-lineで、その定義は次のとおりです。

move-to-window-line is an interactive built-in function in `C source
code'.

It is bound to M-r.
(move-to-window-line arg)

Position point relative to window.
With no argument, position point at center of window.
An argument specifies vertical position within the window;
zero means top of window, negative means relative to bottom of window.

0ページの上部に移動するには a を、ページの下部に移動するには a を使用して呼び出し-1ます。これらは、匿名関数または名前付き関数を使用してキーにバインドできます。両方の例が示されています。

無名関数

(global-set-key [(f4)] (function
                        (lambda ()
                          "Go to top of page."
                          (interactive)
                          (move-to-window-line 0))))

(global-set-key [(f4)] (function
                        (lambda ()
                          "Go to bottom of page."
                          (interactive)
                          (move-to-window-line -1))))

名前付き関数

(defun my-top-of-page ()
  "Go to top of page."
  (interactive)
  (move-to-window-line 0))

(defun my-bottom-of-page ()
  "Go to bottom of page."
  (interactive)
  (move-to-window-line -1))

(global-set-key [(f4)] 'my-top-of-page)
(global-set-key [(shift f4)] 'my-bottom-of-page)
于 2009-10-05T13:33:47.540 に答える
7

Emacs 23.2 では、Mr はまさにあなたが望むことを行います。

このコマンドを最初に呼び出すと、現在表示されているウィンドウの中心にポイントが移動し、次の連続する呼び出しで上と下に移動します。

追加の構成やカスタム関数は必要ありません。

于 2010-05-21T19:11:17.170 に答える
2

ジョーとデイブの回答に追加するには、次の方法で中間を取ることができます。

(defun bp-goto-center()
  "move cursor to middle line"
  (interactive)
  (move-to-window-line (/ (window-height) 2)))

bp(組み込み関数や他の人の関数と区別するために、すべての関数の前に追加します...自由に削除してください。)

于 2009-10-05T13:57:55.407 に答える
1

move-to-window-lineを尊重しないことがわかりましたwindow-buffer-height。したがって、バッファサイズがウィンドウよりも小さい場合、実際には Vim の動作は提供されません。私は端末から Emacs を使用したり、そのフレームを最小化することを気にしたりしないので、'z' が Vim のzt, zm, and zb(また、これから以下を Emacs と組み合わせて使用​​するとC-l、全体的に同じ効果が得られます)。

(define-prefix-command 'ctl-z-map)
(defun move-to-window-line-top ()
  (interactive)
  (move-to-window-line 0))
(defun move-to-window-line-middle ()
  (interactive)
  (let* ((wb-height (window-buffer-height (get-buffer-window)))
        (actual-height (if (> wb-height (window-height))
                           (window-height)
                         wb-height)))
    (move-to-window-line (/ actual-height 2))))
(defun move-to-window-line-bottom ()
  (interactive)
  (move-to-window-line -1)
  (beginning-of-line))
(define-key ctl-z-map (kbd "h") 'move-to-window-line-top)
(define-key ctl-z-map (kbd "m") 'move-to-window-line-middle)
(define-key ctl-z-map (kbd "l") 'move-to-window-line-bottom)
(global-set-key (kbd "C-z") 'ctl-z-map)
于 2012-05-12T23:49:02.163 に答える
0

Emacs 23 を使用している場合は、単にC-l. 1回目は中央、2回目は上、3回目は下になります。

編集:

おっと、悪いことに、現在の行がウィンドウの中央/上部/下部に配置されます。それでも便利です:)

于 2009-10-05T13:34:04.257 に答える