39

Emacs でホーム キーをスマートに動作させることはできますか? スマートとは、文字番号 0 に移動する代わりに、最初の非空白文字に移動し、2 回目のプレスで 0 に移動し、3 回目のプレスで最初の非空白文字に戻るということです。スマートエンドもいいですね。

4

7 に答える 7

63
(defun smart-beginning-of-line ()
  "Move point to first non-whitespace character or beginning-of-line.

Move point to the first non-whitespace character on this line.
If point was already at that position, move point to beginning of line."
  (interactive "^") ; Use (interactive) in Emacs 22 or older
  (let ((oldpos (point)))
    (back-to-indentation)
    (and (= oldpos (point))
         (beginning-of-line))))

(global-set-key [home] 'smart-beginning-of-line)

スマートエンドが何をするのかよくわかりません。通常、末尾の空白がたくさんありますか?

注:この関数と Robert Vuković の関数の主な違いは、カーソルが既にそこにあったとしても、最初のキー押下で常に最初の非空白文字に移動することです。その場合、私のものは列0に移動します。

また、彼は私が使用した(beginning-of-line-text)場所を使用し(back-to-indentation)ました。これらは非常に似ていますが、いくつかの違いがあります。 (back-to-indentation)行の最初の非空白文字に常に移動します。 (beginning-of-line-text)重要でないと見なされる非空白文字を通過することがあります。たとえば、コメントのみの行では、コメント マーカーではなく、コメントのテキストの最初の文字に移動します。ただし、どちらの関数も、どちらの動作を好むかによって、どちらの回答でも使用できます。

于 2008-09-28T06:36:27.700 に答える
12

これは GNU Emacs で動作しますが、XEmacs では試していません。


(defun My-smart-home () "Odd home to beginning of line, even home to beginning of text/code."
    (interactive)
    (if (and (eq last-command 'My-smart-home)
            (/= (line-beginning-position) (point)))
    (beginning-of-line)
    (beginning-of-line-text))
)

(global-set-key [home] 'My-smart-home)
于 2008-09-28T06:37:38.853 に答える
6

この便利な機能に感謝します。今はずっと愛用して使っています。1 つだけ小さな変更を加えました: (interactive) は (interactive "^") になります。

emacs ヘルプより: 文字列が shift-select-mode で始まる場合、^' and非 nil の場合、Emacs は最初に関数 `handle-shift-select' を呼び出します。

基本的に、これにより、shift-select-mode を使用している場合、現在の位置から行の先頭まで shift-home が選択されます。これは、ミニバッファーで特に役立ちます。

于 2010-09-27T10:26:40.620 に答える
4

最初のスマートホーム関数に実行させたいこと、つまり、行の最初の非空白文字に移動する、インデントに戻る関数が既にあることに注意してください。デフォルトでは Mm にバインドされています。

于 2008-09-29T01:57:39.750 に答える
2

まさにそれを行うパッケージがありますmwim(Move Where I Mean)

于 2015-12-27T04:19:31.833 に答える
0

@Vucovic コードをbeggining-of-line最初にジャンプするように調整します。

(defun my-smart-beginning-of-line ()
  "Move point to beginning-of-line. If repeat command it cycle
position between `back-to-indentation' and `beginning-of-line'."
  (interactive "^")
  (if (and (eq last-command 'my-smart-beginning-of-line)
           (= (line-beginning-position) (point)))
      (back-to-indentation)
    (beginning-of-line)))

(global-set-key [home] 'my-smart-beginning-of-line)
于 2014-09-06T10:13:49.430 に答える