26

このVim Relative Line Numbersのようなものが emacs に存在するかどうかを知っている人はいますか? 私は vimpulse を使用していますが、これは非常に便利です。私はいくつかのLispを知っているので、そうでない場合は、正しい方向にポイントが得られれば、自分で作成しようとすることができます.

更新:正しい応答のおかげで、私はこれを思いつきました.vimpulseのヤンクと削除と組み合わせるために、現在の行に1、前の行に-1を表示します。

助けてくれたすべての人に感謝します!Vimが行うこととまったく同じではないことはわかっていますが、ゼロから始まるvimの相対行番号は何に役立ちますか?? 愚かなヴィム。

(defvar my-linum-current-line-number 0)

(setq linum-format 'my-linum-relative-line-numbers)

(defun my-linum-relative-line-numbers (line-number)
  (let ((test2 (1+ (- line-number my-linum-current-line-number))))
    (propertize
     (number-to-string (cond ((<= test2 0) (1- test2))
                             ((> test2 0) test2)))
     'face 'linum)))

(defadvice linum-update (around my-linum-update)
  (let ((my-linum-current-line-number (line-number-at-pos)))
    ad-do-it))
(ad-activate 'linum-update)
4

6 に答える 6

13

(2012-03-16:行番号が右揃えになり、正しい面に表示されるようになりました。)

ここでの問題は、カスタムlinum-format関数が呼び出されるまでに、ポイントが問題の行に(によって)すでに移動されているlinum-update-windowため、2つの行の違いを確立するためにそれを使用できなくなることです。すべての行にゼロを出力するだけです。

がありますが、これはポイントがバッファの先頭に移動された後にlinum-before-numbering-hook実行されるため、この目的には役立ちません。

linum-update次のコードは、現在の行番号を保存するためのアドバイスを使用して問題を解決し、カスタムlinum-format関数で使用できるようにします。

数値を右揃えにするために%3d、100行を超えるコードを表示する単一のウィンドウがひどくありそうにないことに基づいて、最初はハードコードされたフォーマット文字列を使用しました。ただし、のファンである場合follow-mode(または単に同じバッファに複数のウィンドウがある場合)、その状況は非常に起こりやすくなります。そのため、コードは動的に必要な列の数を計算するようになりました。を使用すると、デフォルトのlinum形式linum-before-numbering-hookで採用されているアプローチよりも効率的になります。dynamic

コメントアウトするadd-hookと、より高速な非動的アプローチが使用されることに注意してください。

(defvar my-linum-format-string "%3d")

(add-hook 'linum-before-numbering-hook 'my-linum-get-format-string)

(defun my-linum-get-format-string ()
  (let* ((width (1+ (length (number-to-string
                             (count-lines (point-min) (point-max))))))
         (format (concat "%" (number-to-string width) "d")))
    (setq my-linum-format-string format)))

(defvar my-linum-current-line-number 0)

(setq linum-format 'my-linum-relative-line-numbers)

(defun my-linum-relative-line-numbers (line-number)
  (let ((offset (- line-number my-linum-current-line-number)))
    (propertize (format my-linum-format-string offset) 'face 'linum)))

(defadvice linum-update (around my-linum-update)
  (let ((my-linum-current-line-number (line-number-at-pos)))
    ad-do-it))
(ad-activate 'linum-update)
于 2011-08-03T14:28:43.950 に答える
10

このための Scott Jaderholm のコードに出くわし、この質問を見たことを思い出したので、関連する行へのリンクを彼の .emacsに投稿することにしました。

更新: MELPAを使用している場合(使用する必要があります) M-x package-install RET linum-relative、.

于 2011-10-24T21:12:44.677 に答える
5

関連するメモとして、特定の行に移動するだけの場合、ace-jump-modeace-jump-line-modeには、画面に表示されている特定の行にジャンプできるコマンドが用意されています。ただし、行には数字ではなく文字を使用します。

エースジャンプモードのスクリーンショット

于 2014-01-30T15:28:33.170 に答える
4

M-x linum-modelinum-format変数を見てください。

linum-format は `linum.el' で定義された変数です。
その値は動的です

ドキュメンテーション:

行番号の表示に使用される形式。
"%7d" のようなフォーマット文字列、必要に応じて幅を調整するための `dynamic'、または行番号を引数として呼び出され、その行に表示される文字列に評価される関数のいずれかです。
`linum-before-numbering-hook' も参照してください。

于 2011-07-29T15:51:26.860 に答える