80. sütunda bir cetvel nasıl bulabilirim?


81

Bir programcı olarak, belirli bir sütunda (genellikle 80) bir cetvel görmek istiyorum, her ikisi de bu sütunu geçtiğimde görüyorum, ama aynı zamanda kodumu erken biçimlendirmek için ne kadar yakınlaştığımı da görüyorum.

Şimdiye kadar bulduğum seçeneklerin hepsi bu hedefe ulaşmıyor:

  • whitespace-mode, column-enforce-modeve column-markeryalnızca satırdaki metinler zaten geçtikten sonra ayrı satırları vurgulayın fill-column. Ne zaman sütuna yaklaştığımı görmek istiyorum, sadece üstünü çizdiğimde değil.
  • fill-column-indicatoriyi bir çözüm olacağını, kırılır hariç auto-complete-mode, company-mode, avyve daha fazlası. Bunlar, her bir birey geçici çözüm gerektiren düzeltmek zor görünüyor konular - örneğin bkz sorunu ve sorunu ), iki yıldan daha yaşlı ikincisi.company-modeauto-complete-mode

Daha iyi alternatifler var mı?


8
Bu, kendi başınıza sorunuza bir cevap değildir, ancak pratik bir çözüm, pencerenizin / çerçevenizin genişliğini 80 karaktere ayarlamaktır.
Eric Brown

Önerin için teşekkürler. Gerektiğinde isteğe bağlı genişliğin mevcut olmasını tercih ederim, ancak bu kesinlikle bir seçenek. :-)
Jorgen Schäfer

5
@ EricBrown'un önerisine ekleyeceğim, gerçek pencere genişliğini değiştirmeyeceğim, pencerenin sağ kenar boşluğunu ayarlayacağım, böylece düzenleme alanı 80 karakter olacaktı. (set-window-margins nil 0 (max (- (window-width) 80) 0))Böylece 120 karakter genişliğinde bir pencereniz varsa, gerçekte kodu görüntülemek için gereken alanı 80 karaktere kadar küçültür. Bu sayede, pencere yapılandırmanıza bulaşmaz ve dilerseniz kapatıp açabilirsiniz. Saçaklarınız varsa, aslında 80 sütuna çizilen bir çizgi olacaktır.
Jordon Biondo


@ jordon-biondo - Bu, pencere boyutlandırma güncelleme kancalar özlüyor bkz: bitbucket.org/snippets/ideasman42/zexMG5
ideasman42

Yanıtlar:


39

fill-column-indicatoren olgun çözümdür ve çakıştığı yer paylaşım kodunu bulursanız fci-mode, çakışan kod etkinken askıya alınacak kod ekleyebilirsiniz . Örneğin, aşağıdaki kod çalışmasını sağlar 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
Veya benzer bir çözüm için github.com/company-mode/company-mode/issues/… 'e bakınız company-mode.
Dmitry

Merhaba, fikri paylaştığın için teşekkürler. Bunun işe yaramasını nasıl sağlayabilirim? .Emac'larımda kod var, ancak çalışması için bazı kancalar eklemem gerekiyor?
PierreE

Evet, yukarıdaki örnek tavsiyede bulunur popup-createve popup-delete- kullanım durumunuza bağlı olarak, farklı işlevler önermeniz gerekebilir.
sanityinc


21

İşte daha sağlam olan bir seçenek, neredeyse hiçbir şey kırmıyor (zaman zaman şirket modu kayda değer bir istisnadır), ama kadar uygun değildir fill-column-indicator.

Kullanım header-line-formatını başlığına 80 sütunu işaretleyin.
Aşağıdaki gibi bir şey yeterli olmalı:

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

Sol saçak boyutuna bağlı olarak, o ilk dizgideki boşluk sayısını değiştirmelisiniz. Ancak bunun dışında, bu oldukça iyi çalışmalıdır. Gerçek tampondaki bir cetvel kadar elverişli değil, ancak yardımcı oluyor.

Ayrıca yalnızca programlama tamponlarına uygulanacak şekilde de ayarlayabilirsiniz.

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

Sonuç:
Aşağıdakine benzer bir şey edinmelisiniz (ilk satır aslında arabellekte değil, başlığındadır).

-------------------------------------------------------------------------------|
;; 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'te bunun en azından bazı durumlarda, Şirket Modu'nu da bozacağına dikkat edin. Emacs 24.3, bir pencerenin yüksekliğini hesaplarken başlık satırını doğru şekilde hesaplayamıyor. Sonuç olarak, Şirket, yüksekliğin önemli olduğu durumlarda, yani tamponun en altında, uygun pop-up'lar çizemez.
lunaryorn

1
Bu gerçekten ilginç bir fikir. Çok kötü İki cevabı doğru olarak işaretleyemiyorum, "patch fci" cevabının bazı dezavantajları var ve şartlara bağlı olarak, bu daha iyi bir seçim olabilir. Teşekkür ederim!
Jorgen Schäfer

10
Bir de var M-x ruler-mode.
sanityinc

Bu, numaradan sonra (satır numaraları görüntülendiğinde)
başlamaktan çekinmez

17

Çeşitli hataların fill-column-indicatorortaya çıkması nedeniyle çok fazla acı çektikten sonra , bunu benim yapılandırmamdan tamamen elimine ettim.

Şu anda kullandığım şey, çok uzun satırları vurgulamak için yerleşik Emacs işlevselliği. Bu daha iyi görünüyor, fill-column-indicatorhatasız olsa bile şimdi etkinleştiremem .

Bir başlangıç ​​için kurulumumu alabilirsin:

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

Sonra istediğiniz yerde etkinleştirin. Sadece programlama bağlamında kullanıyorum:

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

9

Daha iyi alternatifler var mı?

Emacs 27, yerel olarak arabellek küçük modu display-fill-column-indicator-modeve genel karşılığı ile doğal olarak bir doldurma sütunu göstergesini destekleyecektir global-display-fill-column-indicator-mode.

İşte eylemde:

görüntü tanımını buraya girin

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

Bu EmacsWiki sayfası , belirli bir sütunu işaretlemenin ya da başka bir yere geçtiğinizde size bildirmenin farklı yolları hakkında birçok bilgi içerir.

Kullandığım mod Mode Line Position .

Ancak diğerleri, sütunda dikey bir çizgi gösterilmesini ( Sütun İşaretçisi , Dolgu-Sütun Göstergesi ) ve sütundan geçen metni vurgulamak için boşluk modunu kullanmayı içerir.

(Satırın tüm satırlardaki tüm metnin sağında olması gerekiyorsa, her zaman açabilirsiniz picture-mode, ancak bu muhtemelen yalnızca geçici bir geçici çözüm olarak kullanışlıdır.)

Talep üzerine uzun çizgiler bulma yolları için ayrıca Uzun Çizgiler Bulma bölümüne bakın .


6

Tam olarak istediğinizi değil, ama @ Malabarba like gibi cetvel alan israf olacak, işte size daha iyi bir çözüm:

Highlight-beyond-fill-column.elemacs-goodies-el adında yerleşik bir paket var (terminale kurmanız önerilir) , bunu ya da :.emacsinit.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-columnSnippet'te 80 olan metin , rengiyle vurgulanır red. Yüzü istediğiniz gibi ayarlayabilirsiniz.


1

Yana fill-column-indicatoroldukça ağırdır, bu çözüm akım hattının sağında bir karakter gösterir.

Yani yazarken, sınırı geçmeden önce satır sınırını görebilirsiniz.

Bu küçük modu tanımlar 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))))

Kullanmak evil-modeve bunu mod eklemek için sınırlamak istiyorsanız, aşağıdaki kancaları ekleyebilirsiniz:

(add-hook 'evil-insert-state-entry-hook #'hl-line-margin-mode-enable)
(add-hook 'evil-insert-state-exit-hook #'hl-line-margin-mode-disable)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.