Làm thế nào tôi có thể có được một người cai trị ở cột 80?


81

Là một lập trình viên, tôi muốn thấy một người cai trị ở một cột cụ thể (thường là 80), vì vậy tôi thấy khi tôi vượt qua cột đó, nhưng cũng để xem tôi đang tiến gần đến mức nào để tôi có thể định dạng lại mã của mình sớm.

Các tùy chọn tôi đã tìm thấy cho đến nay đều không đạt được mục tiêu này:

  • whitespace-mode, column-enforce-modecolumn-markerchỉ đánh dấu các hàng riêng lẻ sau khi văn bản trong hàng đã vượt qua fill-column. Tôi muốn thấy khi tôi đến gần cột, không chỉ khi tôi băng qua nó.
  • fill-column-indicatorsẽ là một giải pháp tốt, ngoại trừ nó phá vỡ auto-complete-mode, company-mode, avy, và nhiều hơn nữa. Đây là những vấn đề mà dường như khó có thể sửa chữa, mỗi yêu cầu một workaround cá nhân - ví dụ, xem các company-modevấn đềcác auto-complete-modevấn đề , sau hơn hai tuổi).

Có sự thay thế nào tốt hơn không?


8
Đây không phải là một câu trả lời cho câu hỏi của bạn, nhưng một giải pháp thực tế là đặt chiều rộng của cửa sổ / khung hình của bạn thành 80 ký tự.
Eric Brown

Cám ơn vì sự gợi ý. Tôi nghĩ rằng tôi muốn có chiều rộng tùy chọn có sẵn khi cần thiết, nhưng đó chắc chắn là một tùy chọn. :-)
Jorgen Schäfer

5
Tôi sẽ thêm vào đề xuất của @ EricBrown, không thay đổi độ rộng cửa sổ thực tế mà thay vào đó là đặt lề phải của cửa sổ để không gian chỉnh sửa là 80 ký tự. (set-window-margins nil 0 (max (- (window-width) 80) 0))Vì vậy, nếu bạn có một cửa sổ rộng 120 ký tự, nó sẽ thu nhỏ không gian bạn phải thực sự hiển thị mã thành 80 ký tự. Bằng cách này, nó sẽ không làm rối cấu hình cửa sổ của bạn và bạn có thể tắt nó nếu bạn muốn. Nếu bạn có rìa, thực sự sẽ có một đường được vẽ ở 80 cột.
Jordon Biondo

1
Đây là ý chính của ý tưởng: gist.github.com/jordonbiondo/aa6d68b680abdb1a5f70 và đây là hành động: i.imgur.com/dUx4bNz.gif
Jordon Biondo

@ jordon-biondo - điều này bỏ lỡ các móc cập nhật cho thay đổi kích thước cửa sổ, xem: bitbucket.org/snippets/ideasman42/zexMG5
ideaman42

Câu trả lời:


39

fill-column-indicatorlà giải pháp hoàn thiện nhất và nếu bạn tìm thấy mã dựa trên lớp phủ mà nó xung đột, bạn có thể thêm mã để tạm dừng fci-modetrong khi mã xung đột đang hoạt động. Ví dụ: đoạn mã sau làm cho nó hoạt động với 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
Hoặc xem github.com/company-mode/company-mode/issues/ cấp để biết giải pháp tương tự company-mode.
Dmitry

Xin chào, cảm ơn đã chia sẻ ý tưởng. Làm thế nào để tôi có được điều này để làm việc? Tôi có mã trong .emacs của tôi, nhưng tôi cho rằng tôi phải thêm một số hook để nó hoạt động?
PierreE

Có, ví dụ trên khuyên popup-createpopup-delete- tùy thuộc vào trường hợp sử dụng của bạn, bạn có thể cần tư vấn các chức năng khác nhau.
sanityinc


21

Đây là một tùy chọn mạnh mẽ hơn, nó gần như không có gì (đôi khi chế độ công ty là một ngoại lệ đáng chú ý), nhưng không thuận tiện như fill-column-indicator.

Sử dụng định dạng dòng tiêu đề để đánh dấu cột thứ 80 trên tiêu đề.
Một cái gì đó như sau nên đủ:

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

Bạn nên thay đổi số lượng khoảng trắng trong chuỗi đầu tiên đó tùy thuộc vào kích thước của rìa bên trái của bạn. Nhưng khác hơn, điều này sẽ làm việc hợp lý tốt. Nó không thuận tiện như một thước đo trong bộ đệm thực tế, nhưng nó giúp.

Bạn cũng có thể thiết lập nó để chỉ áp dụng trên bộ đệm lập trình.

(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)

Kết quả:
Bạn sẽ nhận được một cái gì đó như sau (dòng đầu tiên không thực sự nằm trong bộ đệm, nhưng trong tiêu đề).

-------------------------------------------------------------------------------|
;; 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
Lưu ý rằng trong Emacs 24.3, điều này cũng sẽ phá vỡ Chế độ công ty, ít nhất là trong một số trường hợp cạnh. Emacs 24.3 không thể chính xác dòng tiêu đề vào tài khoản khi tính toán chiều cao của cửa sổ. Do đó, Công ty không thể vẽ các cửa sổ bật lên phù hợp trong trường hợp chiều cao là quan trọng, tức là ở dưới cùng của bộ đệm.
lunaryorn

1
Đây là một ý tưởng thực sự thú vị. Quá tệ Tôi không thể đánh dấu hai câu trả lời là chính xác, câu trả lời "patch fci" có một số nhược điểm và tùy thuộc vào hoàn cảnh, đây có thể là một lựa chọn tốt hơn. Cảm ơn bạn!
Jorgen Schäfer

10
Cũng có M-x ruler-mode.
sanityinc

Điều này không rút ra bắt đầu sau số (khi số dòng được hiển thị)
ideaman42

17

Sau nhiều đau khổ vì nhiều lỗi fill-column-indicatorgiới thiệu, tôi đã loại bỏ nó khỏi cấu hình của mình mãi mãi.

Những gì tôi hiện đang sử dụng là chức năng Emacs tích hợp để làm nổi bật các dòng quá dài. Điều này thậm chí trông tốt hơn, tôi sẽ không kích hoạt fill-column-indicatorngay cả khi nó không có lỗi.

Để bắt đầu, bạn có thể lấy thiết lập của tôi:

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

Sau đó kích hoạt nó ở nơi bạn muốn. Tôi chỉ sử dụng nó trong bối cảnh lập trình:

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

9

Có sự thay thế nào tốt hơn không?

Emacs 27 sẽ hỗ trợ một chỉ báo cột điền theo phương thức của chế độ phụ cục bộ đệm display-fill-column-indicator-modevà đối tác toàn cầu của nó global-display-fill-column-indicator-mode.

Đây là hành động:

nhập mô tả hình ảnh ở đây

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

Trang EmacsWiki này có nhiều thông tin về các cách khác nhau để đánh dấu một cột cụ thể hoặc nói cách khác cho bạn biết khi bạn đi qua nó.

Cái tôi sử dụng là Mode Line Position .

Nhưng những thứ khác bao gồm hiển thị một đường thẳng đứng ở cột ( Cột đánh dấu , Chỉ báo cột đầy ) và sử dụng chế độ khoảng trắng để tô sáng văn bản đi qua cột.

(Nếu bạn cần dòng ở xa bên phải của tất cả các văn bản trong tất cả các hàng, bạn luôn có thể bật picture-mode, nhưng điều đó có thể hữu ích ở đây chỉ là cách giải quyết tạm thời.)

Xem thêm Tìm dòng dài để biết cách tìm dòng dài theo yêu cầu.


6

Không chính xác những gì bạn muốn, nhưng người cai trị như @ Malabarba ♦ sẽ xóa không gian, đây là giải pháp tốt hơn:

Có một gói tích hợp trong emacs-goodies-el(khuyên bạn nên cài đặt nó trong thiết bị đầu cuối) được gọi là highlight-beyond-fill-cột.el , thêm gói này vào .emacshoặc 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" )))))

Văn bản vượt quá fill-column80 trong đoạn trích sẽ được tô sáng bằng màu của red. Bạn có thể đặt khuôn mặt như bạn muốn.


1

fill-column-indicatorkhá nặng, giải pháp này cho thấy một nhân vật ở bên phải của dòng hiện tại.

Vì vậy, khi bạn nhập, bạn có thể thấy giới hạn dòng trước khi vượt quá.

Điều này xác định chế độ nhỏ 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))))

Nếu bạn sử dụng evil-modevà muốn giới hạn chế độ này để chèn chế độ, bạn có thể thêm các móc sau:

(add-hook 'evil-insert-state-entry-hook #'hl-line-margin-mode-enable)
(add-hook 'evil-insert-state-exit-hook #'hl-line-margin-mode-disable)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.