열 80에서 통치자를 어떻게 구할 수 있습니까?


81

프로그래머로서 특정 열 (보통 80)에서 눈금자를보고 싶습니다. 따라서 해당 열을 교차 할 때와 얼마나 가까운 지 확인하여 코드를 조기에 다시 포맷 할 수 있습니다.

지금까지 찾은 옵션은 모두이 목표를 달성하지 못합니다.

  • whitespace-mode, column-enforce-modecolumn-marker행의 텍스트가 이미를 통과 한 후에 만 ​​개별 행을 강조 표시합니다 fill-column. 열을 가로 지르는 것만이 아니라 기둥에 가까워지는 것을보고 싶습니다.
  • fill-column-indicator좋은 해결책이 될 것입니다, 그것은 나누기를 제외하고 auto-complete-mode, company-mode, avy, 등. 다음은 각 개별 해결을 필요로 해결하기 어려운 것 같다 문제입니다 - 예를 들어, 참조 문제문제 ), 두 살 이상 후자를.company-modeauto-complete-mode

더 나은 대안이 있습니까?


8
이것은 귀하의 질문에 대한 답은 아니지만 실용적인 해결책은 창 / 프레임의 너비를 80 자로 설정하는 것입니다.
Eric Brown

제안 해 주셔서 감사합니다. 필자는 필요할 때 옵션 너비를 사용하는 것을 선호한다고 생각하지만 확실히 옵션입니다. :-)
Jorgen Schäfer

5
@EricBrown의 제안에 추가하고 실제 창 너비를 변경하지 않고 편집 공간이 80자가되도록 창의 오른쪽 여백을 설정하십시오. (set-window-margins nil 0 (max (- (window-width) 80) 0))따라서 120 자 너비의 창을 사용하면 실제로 코드를 표시해야하는 공간이 80 자로 줄어 듭니다. 이렇게하면 창 구성이 엉망이되지 않고 원하는 경우 끄기로 전환 할 수 있습니다. 변두리가있는 경우 실제로 80 개의 열에 선이 그려집니다.
Jordon Biondo

1
여기에 생각의 요점이다 : gist.github.com/jordonbiondo/aa6d68b680abdb1a5f70는 여기에 그 행동에 있습니다 i.imgur.com/dUx4bNz.gif
조던 Biondo

@ 조던 - biondo -이, 창 크기 조정에 대한 업데이트 후크를 벗어났습니다 참조 : bitbucket.org/snippets/ideasman42/zexMG5을
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.
Dmitry

아이디어를 공유해 주셔서 감사합니다. 이것을 작동 시키려면 어떻게해야합니까? 내 .emacs에 코드가 있지만 작동하려면 후크를 추가해야한다고 가정합니까?
PierreE

예, 위의 예는 조언 popup-create하고 있으며 popup-delete사용 사례에 따라 다른 기능을 조언해야 할 수도 있습니다.
sanityinc


21

여기에 더 강력한 하나의 옵션이 있으며, 거의 예외가 아닙니다 (때로는 회사 모드가 주목할만한 예외 임). 그러나 편리하지는 않습니다 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에서 이것은 적어도 일부 경우에 회사 모드를 깨뜨릴 것입니다. Emacs 24.3은 창의 ​​높이를 계산할 때 헤더 행을 올바르게 고려하지 못합니다. 따라서 회사는 높이가 중요한 경우, 즉 버퍼의 맨 아래에 적절한 팝업을 표시하지 않습니다.
lunaryorn

1
이것은 정말 흥미로운 아이디어입니다. 너무 나쁘다 나는 두 가지 답변을 올바른 것으로 표시 할 수 없다. "patch fci"답변에는 몇 가지 단점이 있으며 상황에 따라 더 나은 선택이 될 수있다. 감사합니다!
Jorgen Schäfer

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.

여기 실제로 작동합니다.

여기에 이미지 설명을 입력하십시오

Quoth (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 페이지 에는 특정 열을 표시하거나 과거를 지나갈 때 알려주는 다양한 방법에 대한 많은 정보가 있습니다.

내가 사용하는 것은 모드 라인 위치 입니다.

그러나 열에 세로 줄 표시 ( Column Marker , Fill-Column Indicator ) 및 공백 모드를 사용하여 열을 지나는 텍스트를 강조 표시하는 것도 있습니다.

(행이 모든 행의 모든 ​​텍스트에서 가장 오른쪽에 있어야하는 경우 항상을 켤 수 picture-mode있지만 여기서는 임시 해결 방법으로 만 유용 할 수 있습니다.)

요청시 긴 줄을 찾는 방법은 긴 줄 찾기를 참조하십시오 .


6

정확히 원하는 것은 아니지만 @ Malabarba ♦와 같은 눈금자가 공간을 낭비합니다. 여기에 더 나은 해결책이 있습니다.

에 내장 된 패키지가 emacs-goodies-el전화 (단말기에 설치하는 것이 좋습니다) 하이라이트 - 이상 - 필 column.el은 , 당신이 추가 .emacs또는 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.