行末に移動し続ける


9

キーバインディングのデフォルトはC-a/C-e、行の最初/最後に移動するためのものです。Emacsを次のように動作させるパッケージがあります。

  1. 行末でない場合は、行末にC-e移動します。それ以外の場合は、次の行の最後に移動します
  2. 行の先頭にいない場合C-aは、行の先頭に移動します。そうでない場合は、次の行の先頭に移動します。

重要なのはC-a/e、指を動かさずにすべての行の先頭/末尾に移動するために、たたき続けるだけC-n/pです。

そして、prefix(C-u)を使用すると、行の最初/最後に反対方向に移動します。


以下の回答へのコメントで、@ kaushalmodiはあなたの質問を誤って解釈した可能性があることを指摘しています。あなたがしたいですかC-a行くために「アップ」とC-e「ダウン」を行くために?つまり、「次の行」の意味は、項目1と2で同じですか。
コンスタンティン

@Constantineは、私が実際に考えなかった「C-aまでの、そしてC-e私はこの質問を投稿、誰かが与えたならば、私は思ったときに、問題ダウンに」defunあなたのようなソリューションを、誰もが彼が好きならば何をするか知っているだろうC-a「アップ」に...
コーディチャン

OK; まだ修正する価値があると思います。答えを更新します-たった1行の変更です。
コンスタンティン

回答:


11

この動作を可能にするパッケージは知りませんが、これを行う1つの方法があります。

にバインドC-h k C-aされていることを発見するために押してください。これは、私たちが変更する必要がある関数です---または単に「最初に移動する」部分を実装するために使用します。同様に、私はを見つけることができます。これは、上下に移動するために使用されます。C-amove-beginning-of-lineC-h kforward-line

関数をキーにバインドできるようにするには、その関数をコマンドにする必要があるため、interactive特別なフォームを使用する必要があります(インタラクティブの使用を参照)。C-u前置引数を取るためには、"P"コード文字が必要です。

これとbolp(行の先頭にあるeolpかどうかを確認)および(行の末尾にあるかどうかを確認する)を組み合わせて、次のように書くことができます。

(defun my-move-beginning-of-line (arg)
  (interactive "P")
  (when (bolp) (previous-line (if arg -1 1)))
  (move-beginning-of-line nil))

(defun my-move-end-of-line (arg)
  (interactive "P")
  (when (eolp) (forward-line (if arg -1 1)))
  (move-end-of-line nil))

これで、再バインドC-aC-eてこれらを呼び出すことができます。

(global-set-key [remap move-beginning-of-line] #'my-move-beginning-of-line)
(global-set-key [remap move-end-of-line] #'my-move-end-of-line)

または、とにアドバイス追加することもできます。move-beginning-of-linemove-end-of-line


これは本当に良い説明であり、エレガントな解決策です。my-move-beginning-of-line関数にタイプミスがあります.. (previous-line (if arg -1 1))または(forward-line (if arg 1 -1))(1と-1を切り替える)にする必要がありますか?
Kaushal Modi

@kaushalmodi:質問では、項目1と2の両方が「次の行」と言っていますが、これは「ダウン」と解釈しました。では、質問の作者に聞いてみましょう!:-)
コンスタンティン

ああ、私はOPの質問に自分の仮定を追加しました。あなたは正しい、またはのいずれかを使用する場合、彼は次の行に移動するように指定しています。C-aC-e
Kaushal Modi

@kaushalmodi:正解でした!回答を更新し、C-a「上向き」にしました。
コンスタンティン

8

ライブラリにmisc-cmds.elは長い間この機能がありました。

これらは、関連するコマンドと推奨されるキーバインディングです(これらのバインディングはで作成されますsetup-keys.el)。

(cond ((fboundp 'move-beginning-of-line)
       (substitute-key-definition 'move-beginning-of-line 'beginning-of-line+ global-map)
       (substitute-key-definition 'move-end-of-line 'end-of-line+ global-map))
      (t
       (substitute-key-definition 'beginning-of-line 'beginning-of-line+ global-map)
       (substitute-key-definition 'end-of-line 'end-of-line+ global-map)))
(when (boundp 'visual-line-mode-map)
  (define-key visual-line-mode-map [remap move-beginning-of-line] nil)
  (define-key visual-line-mode-map [remap move-end-of-line]       nil)
  (define-key visual-line-mode-map [home] 'beginning-of-line+)
  (define-key visual-line-mode-map [end]  'end-of-line+)
  (define-key visual-line-mode-map "\C-a" 'beginning-of-visual-line+)
  (define-key visual-line-mode-map "\C-e" 'end-of-visual-line+)))

ここでは何であるC-h f end-of-line+一例として、こう述べています。

end-of-line+ is an interactive compiled Lisp function in
`misc-cmds.el'.

It is bound to C-e, end.

(end-of-line+ &optional N)

Move cursor to end of current line or end of next line if repeated.
This is similar to `end-of-line', but:
  If called interactively with no prefix arg:
     If the previous command was also `end-of-line+', then move to the
     end of the next line.  Else, move to the end of the current line.
  Otherwise, move to the end of the Nth next line (Nth previous line
     if N<0).  Command `end-of-line', by contrast, moves to the end of
     the (N-1)th next line.

それはとてもエレガントです。
sanityinc 2014年

1

次の2つの関数は、目的のアクションを実行します。

(defun move-beginning-of-line-or-previous (&optional pre)
  "Move to the start of the line. If we are already at the start
of the line, move to the start of the previous line or, if called 
with a prefix argument, the next line."
  (interactive "P")
  (let* ((pos (point)))
    (move-beginning-of-line nil)
    (if (= (point) pos)
        (if pre
            (next-line)
          (previous-line)))))

(defun move-end-of-line-or-next (&optional pre)
  "Move to the end of the line. If we are already at the end of
the line, move to the end of the next line or, if called with a 
prefix argument, the previous line."
  (interactive "P")
  (let* ((pos (point)))
    (move-end-of-line nil)
    (if (= (point) pos)
        (if pre
            (previous-line)
          (next-line)))))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.