2009-10-05 4 views
20

emacsには、これらのカーソル移動コマンドが組み込まれているのか、どこかにスニペットを書かなければならないのか疑問に思っています。私は彼らがかなりspiffyを見つけるとvimで定期的に使用してください。私は今までemacsの文書でそれらを見つけていません。 VIMでemacsはvimのshift-hとshift-lに相当します

、彼らは次のようになり: シフト-H - >画面 シフトMの先頭に移動カーソル - >画面 シフト-Lの中央に移動カーソル - >移動カーソルに画面の一番下にある

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

これまでのうちの1つが見つかりました。 alt-rはvimのシフト-mと同じように見えます。カーソルを中央の行の最初の列に移動します。

答えて

28

使用:

  • Alt+0 Alt+r - ウィンドウ
  • Alt+- Alt+rのトップ -

厳密ウィンドウの下部には、これらは、ボトム画面の上部とM-- M-rためM-0 M-rのように記述されるべきです画面のMは、Metaキーを意味し、通常はAltにマッピングされます。

次のように私は、これらのキーストロークを働いた:

M-rは、コマンドmove-to-window-lineを実行します。私はC-h k M-rでこれを見つけました。 Ctrl+h,k,Alt+rThe key sequence C-h k means tell me what the next key sequence does.コマンド名を教えてくれました。また、コマンドに数値引数を渡して、行きたい行を選択することもできます。何も渡さなければ、あなたは見たようにポイントをウィンドウの中央に移動します。

数値の引数をコマンドに渡すときは、typing a number while holding down Metaです。それ自身のマイナス記号は-1を意味すると解釈されます。さて、画面の上部に移動するには、0行目と1行目の-1行目を渡します。これにより、上記のキーシーケンスが得られます。

move-to-window-lineを別のキーlook at Joe's answer to this questionにバインドする場合は、

+2

使用: - 'M- = Mr' - あなたは(それは参考になりましEmacsのデフォルトを変更するかもしれないので、中央のウィンドウの – huntar

+0

smartparensは、SP-スプライス-S式-殺害-around''に 'Mr'をバインドウィンドウ移動 - トップ - ボトム)をMRに変換する。 –

8

使用したい機能がその定義である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. 

あなたはページの一番下に移動するには、ページの上部と-1に行くこと0とそれを呼ぶだろう。これらは、無名関数または名前付き関数を持つ鍵にバインドすることができます。両方の例が示されている。

無名関数

(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) 
0

あなたがEmacsの23を使用している場合は、それは単にC-lです。初めてセンターに行くと、2回目が上に移動し、3回目が下に移動します。

EDIT:

ウィンドウの中央/上/下に現在の行を置く

おっと、私の悪いです、。しかしそれでも便利:)

2

ジョーさんとDaveさんの答えに追加するには、中央を取得することができます。

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

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

+2

私はこの回答を+1しますが、あなたのコードブロックはフォーマットされていません(はい、私は賢いです!) – mgalgs

+0

中途半端な作業をするためには以下を実行する必要があります。 '(ウィンドウに移動する(/ -buffer-height(get-buffer-window))2)) 'を実行します。 –

7

Emacs 23.2では、Mrはあなたが望むものを正確に行います。

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

追加の設定やカスタム機能は必要ありません。

1

move-to-window-lineは、window-buffer-heightを尊重していません。したがって、バッファサイズがウィンドウよりも小さい場合、Vimが持つ動作は実際には提供されません。 'z'はVimのztzm、およびzbを思い起こさせるので、私は端末からEmacsを使用せず、フレームの最小化にも気をつけないので、プレフィックスキーを再利用することにしました(そして、 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) 
関連する問題