80桁目でルーラーを取得するにはどうすればよいですか?


81

プログラマーとして、特定の列(通常は80)にルーラーを表示したいので、両方ともその列を横切ったときに表示されますが、コードに早期に再フォーマットできるようにどれだけ近いかを確認します。

私がこれまでに見つけたオプションは、すべてこの目標を達成していません。

  • whitespace-modecolumn-enforce-mode、およびcolumn-marker行のテキストがすでに経過した後にのみ、個々の行をハイライトfill-column。コラムを横切ったときだけでなく、コラムに近づいたときを見たいです。
  • fill-column-indicator良い解決策になる、それが壊れる除きauto-complete-modecompany-modeavy、そしてより多くの。これらは、それぞれが個々の回避策を必要とする修正するのは難しいように見える問題である-例えば、参照の問題問題)、2歳以上、後者を。company-modeauto-complete-mode

より良い代替手段はありますか?


8
これはあなた自身の質問に対する答えではありませんが、実用的な解決策はウィンドウ/フレームの幅を80文字に設定することです。
エリックブラウン14

提案をありがとう。必要に応じてオプションの幅を利用できるようにしたいと思いますが、それは確かにオプションです。:-)
ヨルゲンシェーファー14

5
@EricBrownの提案に追加して、実際のウィンドウ幅を変更せずに、編集スペースが80文字になるようにウィンドウの右マージンを設定します。(set-window-margins nil 0 (max (- (window-width) 80) 0))したがって、120文字幅のウィンドウがある場合、実際にコードを表示するために必要なスペースを80文字に縮小します。この方法では、ウィンドウ構成が台無しにならず、必要に応じてオフに切り替えることができます。フリンジがある場合、実際には80列で線が引かれます。
ジョードンビオンド14

1
ここにアイデアの要点があります:gist.github.com/jordonbiondo/aa6d68b680abdb1a5f70そしてここにそれが動作しています:i.imgur.com/dUx4bNz.gif
ジョーダン

@ jordon-biondo-これはウィンドウサイズ変更の更新フックを逃します。bitbucket.org
ideasman42

回答:


39

fill-column-indicatorは最も成熟したソリューションであり、競合するオーバーレイベースのコードを見つけた場合fci-modeは、競合するコードがアクティブな間にコードを追加して中断することができます。たとえば、次のコードは次のコードで動作しauto-completeます。

  (defun sanityinc/fci-enabled-p () (symbol-value 'fci-mode))

  (defvar sanityinc/fci-mode-suppressed nil)
  (make-variable-buffer-local 'sanityinc/fci-mode-suppressed)

  (defadvice popup-create (before suppress-fci-mode activate)
    "Suspend fci-mode while popups are visible"
    (let ((fci-enabled (sanityinc/fci-enabled-p)))
      (when fci-enabled
        (setq sanityinc/fci-mode-suppressed fci-enabled)
        (turn-off-fci-mode))))

  (defadvice popup-delete (after restore-fci-mode activate)
    "Restore fci-mode when all popups have closed"
    (when (and sanityinc/fci-mode-suppressed
               (null popup-instances))
      (setq sanityinc/fci-mode-suppressed nil)
      (turn-on-fci-mode)))

5
または、の同様のソリューションについては、github.com / company-mode / company-mode / issues /…をご覧くださいcompany-mode
ドミトリー14

こんにちは、アイデアを共有してくれてありがとう。これを機能させるにはどうすればよいですか?.emacsにコードがありますが、動作させるためにいくつかのフックを追加する必要があると思いますか?
ピエール

はい、上記の例では、助言popup-createpopup-delete-あなたのユースケースに応じて、さまざまな機能を助言する必要がある場合があります。
sanityinc


21

より堅牢な1つのオプションを次に示します。ほとんど何も破られません(時折、企業モードは注目に値する例外です)が、ほど便利ではありませんfill-column-indicator

header-line-format を使用 して、ヘッダーの80番目の列をマークします。
次のようなもので十分です。

(setq-default header-line-format 
              (list " " (make-string 79 ?-) "|"))

左フリンジのサイズに応じて、最初の文字列のスペースの数を変更する必要があります。しかし、それ以外は、これはかなりうまく機能するはずです。実際のバッファのルーラーほど便利ではありませんが、役立ちます。

プログラミングバッファにのみ適用するように設定することもできます。

(defun prog-mode-header-line ()
  "Setup the `header-line-format' on for buffers."
  (setq header-line-format 
        (list " " (make-string 79 ?-) "|")))

(add-hook 'prog-mode-hook #'prog-mode-header-line)

結果:
次のようになります(最初の行は実際にはバッファ内ではなく、ヘッダー内にあります)。

-------------------------------------------------------------------------------|
;; This is what your buffer should look like all the way up to column number 80.
(setq some-dummy-variable we-are-all-friends)

1
Emacs 24.3では、少なくともいくつかの場合には、これもCompany Modeを壊すことに注意してください。Emacs 24.3は、ウィンドウの高さを計算するときに、ヘッダー行を正しく考慮しません。その結果、会社は、高さが重要な場合、つまりバッファーの最下部にある場合、適切なポップアップを描画できません。
lunaryorn 14

1
これは本当に興味深いアイデアです。残念なことに、2つの答えを正しいとマークすることはできません。「パッチfci」の答えにはいくつかの欠点があり、状況によってはこれがより良い選択になります。ありがとうございました!
ヨルゲンシェーファー14

10
もありM-x ruler-modeます。
sanityinc

これは、番号の後に開始しません(行番号が表示されるとき)
-ideasman42

17

さまざまなバグが原因で多くの苦労をした後fill-column-indicator、私はそれを設定から完全に削除しました。

現在使用しているのは、長すぎる行を強調表示する組み込みのEmacs機能です。これはさらに良く見えますが、fill-column-indicatorバグがなくても今は有効にしません。

最初に、セットアップを取得できます。

(setq-default
 whitespace-line-column 80
 whitespace-style       '(face lines-tail))

次に、必要な場所で有効にします。プログラミングコンテキストでのみ使用します。

(add-hook 'prog-mode-hook #'whitespace-mode)

9

より良い代替手段はありますか?

Emacs 27は、バッファローカルマイナーモードdisplay-fill-column-indicator-modeとそのグローバル対応モードを介して、列の埋め込みインジケーターをネイティブにサポートしますglobal-display-fill-column-indicator-mode

これが動作中です:

ここに画像の説明を入力してください

クォート(emacs) Displaying Boundaries

14.15 Displaying Boundaries
===========================

Emacs can add an indicator to display a fill column position.  The fill
column indicator is a useful functionality specially in prog-mode to
indicate the position of an specific column.

   You can set the buffer-local variables
‘display-fill-column-indicator’ and
‘display-fill-column-indicator-character’ to activate the indicator and
controls how the indicator looks.

   Alternatively you can type ‘M-x display-fill-column-indicator-mode’
or ‘M-x global-display-fill-column-indicator-mode’ which enables the
indicator locally and globally respectively and also chooses the
character to use if none is set already.  It is possible to use the
first one to activate the indicator in a hook or the second one to
enable it globally.

   There are 2 buffer local variables and 1 face to customize this mode:

‘display-fill-column-indicator-column’
     Specifies the column number where the indicator should be set.  It
     can take positive numerical values for the column or the special
     value ‘t’ which means that the variable ‘fill-column’ will be used.

     Any other value disables the indicator.  The default value is ‘t’.

‘display-fill-column-indicator-character’
     Specifies the character used for the indicator.  This character can
     be any valid char including unicode ones if the actual font
     supports them.

     When the mode is enabled through the functions
     ‘display-fill-column-indicator-mode’ or
     ‘global-display-fill-column-indicator-mode’, the initialization
     functions check if this variable is ‘non-nil’, otherwise the
     initialization tries to set it to U+2502 or ‘|’.

‘fill-column-indicator’
     Specifies the face used to display the indicator.  It inherits its
     default values from shadow but without background color.  To change
     the indicator color you need to set only the foreground color of
     this face.

7

このEmacsWikiページには、特定の列をマークする方法や、別の方法で列を通過したことを知らせる方法に関する多くの情報があります。

私が使用しているのはMode Line Positionです。

しかし、列に垂直線を表示すること(列マーカー塗りつぶし列インジケーター)や、空白モードを使用して列を通過するテキストを強調表示することもできます。

(行をすべての行のすべてのテキストの右端に配置する必要がある場合は、いつでもオンにすることができますがpicture-mode、一時的な回避策としてのみここで役立つ可能性があります。)

オンデマンドで長い行を見つける方法については、「長い行見つける」も参照してください。


6

厳密にはあなたが望むものではありませんが、@ Malabarba♦のようなルーラーはスペースを浪費します。より良い解決策は次のとおりです。

emacs-goodies-el(端末にインストールすることをお勧めします)にhighlight-beyond-fill-column.elと呼ばれる組み込みパッケージがあり、これをあなたの.emacsorに追加しますinit.el

(setq-default fill-column 80)
(add-hook 'prog-mode-hook 'highlight-beyond-fill-column)
(custom-set-faces '(highlight-beyond-fill-column-face
                    ((t (:foreground "red" )))))

fill-columnスニペットで80 を超えるテキストは、の色で強調表示されredます。好きなように顔を設定できます。


1

以来fill-column-indicatorかなり重いです、この解決策は、現在の行の右側の文字を示しています。

したがって、入力しているときに、制限を超える前に行の制限を確認できます。

これはマイナーモードを定義しますhl-line-margin-mode

;; Global, ensures one active margin for the active buffer.
(defvar hl-line-margin--overlay nil)

(defun hl-line-margin--overlay-clear ()
  "Clear the overlays."
  (when hl-line-margin--overlay
    (delete-overlay hl-line-margin--overlay)
    (setq hl-line-margin--overlay nil)))

(defun hl-line-margin--overlay ()
  "Create the line highlighting overlay."
  ;; Remove in the event of a changed buffer,
  ;; ensures we update for a modified fill-column.
  (when (and hl-line-margin--overlay
             (not (eq (current-buffer)
                      (overlay-buffer hl-line-margin--overlay))))
    (hl-line-margin--overlay-clear))
  (unless hl-line-margin--overlay
    (setq hl-line-margin--overlay (make-overlay 0 0))
    (let ((space `((space :align-to ,fill-column)
                   (space :width 0))))
      (overlay-put hl-line-margin--overlay 'after-string
                   (concat (propertize " " 'display space 'cursor t)
                           (propertize " " 'face '(:inverse-video t))))))
  (let ((eol (line-end-position)))
    (unless (eql eol (overlay-start hl-line-margin--overlay))
      (move-overlay hl-line-margin--overlay eol eol))))

(defun hl-line-margin-mode-enable ()
  "Turn on `hl-line-margin-mode' for the current buffer."
  (add-hook 'post-command-hook #'hl-line-margin--overlay nil t))

(defun hl-line-margin-mode-disable ()
  "Turn off `hl-line-margin-mode' for the current buffer."
  (hl-line-margin--overlay-clear)
  (remove-hook 'post-command-hook #'hl-line-margin--overlay t))

;;;###autoload
(define-minor-mode hl-line-margin-mode
  "Show a character at the fill column of the current line."
  :lighter ""
  (cond (hl-line-margin-mode
         (jit-lock-unregister #'hl-line-margin-mode-enable)
         (hl-line-margin-mode-enable))
        (t
         (jit-lock-unregister #'hl-line-margin-mode-disable)
         (hl-line-margin-mode-disable))))

これを使用しevil-mode、これを挿入モードに制限する場合は、次のフックを追加できます。

(add-hook 'evil-insert-state-entry-hook #'hl-line-margin-mode-enable)
(add-hook 'evil-insert-state-exit-hook #'hl-line-margin-mode-disable)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.