मैं स्तंभ 80 पर एक शासक कैसे प्राप्त कर सकता हूं?


81

एक प्रोग्रामर के रूप में, मैं एक शासक को एक विशिष्ट कॉलम (आमतौर पर 80) पर देखना चाहता हूं, इसलिए दोनों मैं यह देखता हूं कि जब मैं उस कॉलम को पार करता हूं, लेकिन यह भी देखना है कि मैं इसे कितना पास पा रहा हूं, इसलिए मैं अपने कोड को जल्दी सुधार सकता हूं।

अब तक मैंने जो विकल्प पाए हैं, वे सभी इस लक्ष्य को प्राप्त नहीं कर रहे हैं:

  • whitespace-mode, column-enforce-modeऔर column-markerकेवल पंक्ति में पाठ के बाद अलग-अलग पंक्तियों को उजागर करें fill-column। मैं यह देखना चाहूंगा कि जब मैं स्तंभ के करीब पहुंच रहा हूं, तब नहीं जब मैं इसे पार करता हूं।
  • fill-column-indicatorएक अच्छा समाधान हो सकता है, को छोड़कर यह टूट जाता है auto-complete-mode, company-mode, avyऔर भी बहुत कुछ। इन मुद्दों है कि ठीक करने के लिए, प्रत्येक एक व्यक्ति वैकल्पिक हल की आवश्यकता होती है मुश्किल लग रहे हैं - जैसे, देखने के मुद्दे और इस मुद्दे को दो वर्ष से अधिक उम्र के उत्तरार्द्ध)।company-modeauto-complete-mode

क्या कोई बेहतर विकल्प हैं?


8
यह आपके प्रश्न का प्रति उत्तर नहीं है, लेकिन एक व्यावहारिक समाधान यह है कि आपकी खिड़की / फ्रेम की चौड़ाई को 80 वर्णों तक निर्धारित किया जाए।
एरिक ब्राउन

सलाह के लिये धन्यवाद। मुझे लगता है कि आवश्यक होने पर मैं वैकल्पिक चौड़ाई उपलब्ध करना पसंद करूंगा, लेकिन यह निश्चित रूप से एक विकल्प है। :-)
जोर्गेन शेफ़र

5
मैं @ EricBrown के सुझाव से जोड़ूंगा, वास्तविक विंडो की चौड़ाई को न बदलें, बल्कि विंडो का सही मार्जिन सेट करें ताकि संपादन स्थान 80 वर्ण का हो। (set-window-margins nil 0 (max (- (window-width) 80) 0))इसलिए यदि आपके पास 120 वर्णों की चौड़ी खिड़की है, तो यह उस स्थान को सिकोड़ देगा जिसे आपको वास्तव में 80 वर्णों के लिए कोड प्रदर्शित करना है। इस तरह यह आपके विंडो कॉन्फ़िगरेशन को गड़बड़ नहीं करेगा और यदि आप चाहें तो इसे बंद कर सकते हैं। यदि आपके पास फ्रिंज हैं, तो वास्तव में 80 कॉलम पर एक रेखा खींची जाएगी।
जोर्डन बियोन्डो

1
यहाँ इस विचार का एक सार है: gist.github.com/jordonbiondo/aa6d68b680abdb1a5f70 और यहाँ यह क्रिया में है: i.imgur.com/dUx4bNz.gif
जॉर्डन

@ जोर्डन-बियॉन्डो - यह विंडो अपडेट के लिए हुक अपडेट करता है, देखें: 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
दिमित्री

नमस्ते, विचार साझा करने के लिए धन्यवाद। मैं इससे कैसे काम लूं? मेरे पास .emacs में कोड है, लेकिन मुझे लगता है कि मुझे काम करने के लिए कुछ हुक जोड़ने होंगे?
पियरे

हां, ऊपर दिया गया उदाहरण सलाह देता है popup-createऔर popup-delete- आपके उपयोग के मामले के आधार पर, आपको विभिन्न कार्यों की सलाह देने की आवश्यकता हो सकती है।
२३


21

यहां एक विकल्प है जो अधिक मजबूत है, यह लगभग कुछ भी नहीं तोड़ता है (कभी-कभी कंपनी-मोड एक उल्लेखनीय अपवाद है), लेकिन उतना सुविधाजनक नहीं है fill-column-indicator

का प्रयोग करें हैडर ऑनलाइन प्रारूप हैडर पर 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 विंडो की ऊंचाई की गणना करते समय हेडर लाइन को सही ढंग से विफल कर देता है। नतीजतन कंपनी उन मामलों में उचित पॉपअप खींचने में विफल रहती है जहां ऊंचाई महत्वपूर्ण है, अर्थात बफर के बहुत नीचे।
चंद्रोदय

1
यह वास्तव में एक दिलचस्प विचार है। बहुत बुरा मैं दो उत्तरों को सही नहीं कह सकता, "पैच फ़िसी" उत्तर में कुछ कमियां हैं और परिस्थितियों के आधार पर, यह एक बेहतर विकल्प हो सकता है। धन्यवाद!
जॉर्गेन शेफर

10
वहाँ भी है M-x ruler-mode
संन्यासी

यह संख्या के बाद शुरू नहीं होता है (जब लाइन संख्या प्रदर्शित की जाती है)
ideasman42

17

विभिन्न बगों के कारण बहुत तकलीफ के बाद fill-column-indicator, मैंने इसे अच्छे के लिए अपने कॉन्फिगर से खत्म कर दिया।

वर्तमान में मैं जो उपयोग कर रहा हूं वह बहुत लंबी हो चुकी लाइनों को उजागर करने के लिए एमएसीएस कार्यक्षमता है। यह भी बेहतर लग रहा है, मैं 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 पृष्ठ में किसी विशेष स्तंभ को चिह्नित करने के विभिन्न तरीकों के बारे में बहुत सारी जानकारी है या अन्यथा आप इसे अतीत में जाने पर जानते हैं।

मेरे द्वारा उपयोग किया जाने वाला मोड लाइन स्थिति है

लेकिन दूसरों में स्तंभ पर एक ऊर्ध्वाधर रेखा दिखाना ( कॉलम मार्कर , भरण-स्तंभ संकेतक ) और स्तंभ को पार करने वाले पाठ को उजागर करने के लिए व्हाट्सएप मोड का उपयोग करना शामिल है।

(यदि आपको सभी पंक्तियों में सभी पाठ के दाईं ओर लाइन की आवश्यकता है, तो आप हमेशा चालू कर सकते हैं picture-mode, लेकिन यह केवल अस्थायी वर्कअराउंड के रूप में यहां उपयोगी है।)

मांग पर लंबी लाइनों को खोजने के तरीकों के लिए लंबी लाइनें ढूंढें भी देखें ।


6

ठीक नहीं है कि आप क्या चाहते हैं, लेकिन @ Malabarba uler जैसे शासक अंतरिक्ष को बर्बाद कर देंगे, यहां बेहतर समाधान है:

वहाँ में एक अंतर्निहित पैकेज है 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स्निपेट में The० से आगे का पाठ रंग के साथ डाला जाएगा 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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.