৮০ কলামে আমি কীভাবে একজন শাসক পেতে পারি?


81

প্রোগ্রামার হিসাবে, আমি কোনও নির্দিষ্ট কলামে (সাধারণত ৮০) কোনও শাসক দেখতে চাই, উভয়ই আমি যখন দেখি যে আমি যখন এই কলামটি অতিক্রম করি তখনি আমি এটির কতটা কাছাকাছি আসছি তাও দেখার জন্য যাতে আমি আমার কোডটি পুনরায় ফর্ম্যাট করতে পারি।

আমি এখন পর্যন্ত যে বিকল্পগুলি পেয়েছি সেগুলি সবই এই লক্ষ্য অর্জন করছে না:

  • whitespace-mode, column-enforce-modeএবং column-markerকেবলমাত্র সারিটির পাঠ্য ইতিমধ্যে পাস করার পরে পৃথক সারিগুলি হাইলাইট করুন fill-column। আমি যখন দেখতে পাচ্ছি কলামটি যখন সন্নিকটে চলেছি তখনই নয়, যখন আমি এটিটি অতিক্রম করি।
  • fill-column-indicatorএকটি ভাল সমাধান হতে পারে, ব্যতীত তা ভঙ্গ auto-complete-mode, company-mode, avy, ড। এই সমস্যাগুলি এটি ঠিক করার জন্য প্রতিটি একজন ব্যক্তি কার্যসংক্রান্ত প্রয়োজন কঠিন বলে মনে হয় - যেমন, দেখতে ইস্যু এবং ইস্যু , দুই বছর বয়সী উপর আধুনিক)।company-modeauto-complete-mode

এর চেয়ে ভাল বিকল্প আছে কি?


8
এটি প্রতি আপনার প্রশ্নের উত্তর নয়, তবে ব্যবহারিক সমাধান হ'ল আপনার উইন্ডো / ফ্রেমের প্রস্থ 80 টি অক্ষরে সেট করা।
এরিক ব্রাউন

পরামর্শের জন্য ধন্যবাদ. আমি মনে করি প্রয়োজনের সময় আমি alচ্ছিক প্রস্থটি পাওয়া পছন্দ করব তবে এটি অবশ্যই একটি বিকল্প। :-)
জর্জেন শোফার

5
আমি @ এরিক ব্রাউন এর পরামর্শে যুক্ত করব, উইন্ডোটির প্রকৃত প্রস্থ পরিবর্তন করবেন না, বরং উইন্ডোর ডান প্রান্তটি সেট করুন যাতে সম্পাদনার স্থানটি 80 টি অক্ষর is (set-window-margins nil 0 (max (- (window-width) 80) 0))সুতরাং আপনার যদি 120 টি অক্ষরের প্রশস্ত উইন্ডো থাকে তবে এটি 80 টি অক্ষরে কোডটি প্রদর্শন করার জন্য স্থানটি সঙ্কুচিত করবে। এইভাবে এটি আপনার উইন্ডো কনফিগারেশনটিকে বিশৃঙ্খলা করবে না এবং আপনি চাইলে এটি অফ টগল করতে পারেন। আপনার যদি সীমানা থাকে তবে আসলে 80 কলামে আঁকা একটি লাইন থাকবে।
জর্ডন বিওনদো

1
এই ধারণার সংক্ষিপ্তসার এখানে : gist.github.com/jordonbiondo/aa6d68b680abdb1a5f70 এবং এখানে এটি কার্যকর হয়: i.imgur.com/dUx4bNz.gif
জর্ডন

@ Jordon-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
দিমিত্রি

হাই, ধারণা ভাগ করে নেওয়ার জন্য ধন্যবাদ। আমি এটি কীভাবে কাজ করব? আমার .emacsগুলিতে কোডটি রয়েছে তবে আমি মনে করি এটির কাজ করার জন্য আমাকে কিছু হুক যোগ করতে হবে?
পিয়েরি

হ্যাঁ, উপরের উদাহরণটি পরামর্শ দেয় popup-createএবং popup-delete- আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে আপনার বিভিন্ন কার্যাবলী সম্পর্কে পরামর্শ দেওয়ার প্রয়োজন হতে পারে।
সানাইটিইঙ্ক


21

এখানে একটি বিকল্প যা আরও দৃust়, এটি প্রায় কিছুই ভেঙে দেয় না (মাঝেমধ্যে কোম্পানী-মোড একটি উল্লেখযোগ্য ব্যতিক্রম হ'ল) ​​তবে এর মতো সুবিধাজনক নয় 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
মনে রাখবেন ইমাস 24.3 এ এটি কমপক্ষে কিছু প্রান্ত ক্ষেত্রে কোম্পানির মোডকেও ভেঙে ফেলবে। উইন্ডোটির উচ্চতা গণনা করার সময় ইম্যাক্স 24.3 সঠিকভাবে শিরোনামের লাইনটিকে অ্যাকাউন্টে ফেলতে ব্যর্থ হয়। ফলস্বরূপ উচ্চতা গুরুত্বপূর্ণ যেখানে বাফারের একেবারে তলদেশে কোম্পানি উপযুক্ত পপআপগুলি আঁকতে ব্যর্থ।
চন্দ্রালগ্ন

1
এটি একটি সত্যিই আকর্ষণীয় ধারণা। খুব খারাপ আমি দুটি উত্তর সঠিক হিসাবে চিহ্নিত করতে পারি না, "প্যাচ এফসিআই" উত্তরটির কিছু ত্রুটি রয়েছে এবং পরিস্থিতির উপর নির্ভর করে এটি আরও ভাল পছন্দ হতে পারে। ধন্যবাদ!
জর্জেন শ্যাফার

10
এছাড়াও আছে M-x ruler-mode
স্যানিটিনিক

এটি সংখ্যার (যখন লাইন সংখ্যা প্রদর্শিত হবে) পরে আরম্ভ করতে পারে না
ধারনাবিদ 42

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

এর চেয়ে ভাল বিকল্প আছে কি?

ইমাক্স 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

এই ইম্যাক্সউইকি পৃষ্ঠায় একটি নির্দিষ্ট কলাম চিহ্নিত করতে বিভিন্ন উপায় সম্পর্কে প্রচুর তথ্য রয়েছে বা অন্যথায় আপনি যখন এটি পেরিয়ে যাবেন তখন আপনাকে জানায়।

আমি যেটি ব্যবহার করি তা হ'ল মোড লাইন অবস্থান

তবে অন্যদের মধ্যে কলামে একটি উল্লম্ব রেখা দেখানো ( কলাম মার্কার , ফিল-কলাম ইন্ডিকেটর ) এবং কলামটি অতিক্রম করে এমন পাঠ্যকে হাইলাইট করার জন্য হোয়াইটস্পেস মোড ব্যবহার করা অন্তর্ভুক্ত রয়েছে।

(আপনার যদি সমস্ত সারিতে সমস্ত পাঠ্যের ডানদিকে লাইনটি প্রয়োজন হয় তবে আপনি সর্বদা চালু করতে পারেন picture-modeতবে এটি কেবলমাত্র অস্থায়ী কর্মক্ষেত্র হিসাবে কার্যকর)

চাহিদা অনুযায়ী দীর্ঘ লাইনগুলি খুঁজে পাওয়ার উপায়গুলির জন্য লং লাইনগুলিও দেখুন ।


6

আপনি যা চান ঠিক তা নয়, তবে @ মালবারবা-এর মতো শাসক স্থান নষ্ট করবে, এখানে আরও ভাল সমাধান রয়েছে:

হাইলাইট-অতিক্রম-ফিল-কলাম.এলemacs-goodies-el নামে একটি অন্তর্নির্মিত প্যাকেজ রয়েছে (এটি টার্মিনালে ইনস্টল করার পরামর্শ দিন) , এটি আপনার বা এতে যুক্ত করুন :.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-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.