फ़ाइलों को एक-वाक्य-प्रति-पंक्ति के साथ संपादित करना


28

पृष्ठभूमि की एक बिट।

मैं अपने लेटेक्स दस्तावेजों को संस्करण-नियंत्रित करने की कोशिश कर रहा हूं, और अगर मैं एक-वाक्य-प्रति-पंक्ति दृष्टिकोण अपनाता हूं तो इस पहल की प्रभावशीलता में बहुत सुधार होगा ।

उदाहरण के लिए, मेरे दस्तावेज़ जैसा दिखेगा निम्नलिखित है।

Some text here.
New stencence on the same paragraph.
Some more text, still on the same paragraph.

This is another paragraph.

मेरा प्रश्न सरल है।
Emacs के साथ मैं कितना स्वचालित / सुधार कर सकता हूं?

निम्नलिखित दो बिंदु मेरे मन में हैं।

  1. मेरे वाक्य लंबे हैं , इसलिए मुझे वास्तव में उन्हें भरने के बिना लाइनों को लपेटने की आवश्यकता है। यही है, मेरी स्क्रीन पर कई लाइनों पर एक बहुत लंबे वाक्य को प्रदर्शित करने की आवश्यकता है, लेकिन इसे ".tex" फ़ाइल में एकल पंक्ति होने की आवश्यकता है । यह अधिमानतः एक तरह से किया जाएगा जो समीकरणों को लपेटता नहीं है।

    visual-line-modeखिड़की की चौड़ाई पर लपेटता है, वह बहुत चौड़ा है। मुझे कुछ ऐसा चाहिए जो लाइनों को लपेटता है और उनकी चौड़ाई को 80 या उससे अधिक वर्णों तक सीमित करता है। जैसे fill-paragraphसामान्य रूप से करते हैं, लेकिन वास्तव में फ़ाइल में लाइनों को तोड़ने के बिना।

  2. मैं प्रत्येक वाक्य के बाद मैन्युअल रूप से लाइन को तोड़ सकता हूं, लेकिन अगर मैं प्रति पंक्ति एक वाक्य fill-paragraphभी auto-fill-modeडाल सकता हूं (या शायद यहां तक ​​कि ) कॉन्फ़िगर कर सकता हूं तो यह बहुत बेहतर होगा ।

1
वास्तव में आप किस तरह के सुधार / स्वचालन कर रहे हैं? क्या आप जानना चाहते हैं कि इस तरह से फाइलों में प्रभावी ढंग से कैसे संपादित किया जाए?
रंगी लिन सेप

@ रंजीलिन हाँ। मेरे द्वारा बताया गया पहला बिंदु मेरे लिए सबसे महत्वपूर्ण है। लेकिन इसे और अधिक प्रभावी बनाने के लिए कुछ भी स्वागत योग्य है।
मालाबार

पहले बिंदु में विवरण जैसा दिखता है visual-line-mode। लेकिन उस पंक्ति को लपेटने के अलावा, आपको प्रत्येक वाक्य के बाद एक नई पंक्ति वर्ण को भी सम्मिलित करने की आवश्यकता है, सही?
कौशल मोदी

@kaushalmodi हां, लेकिन प्रत्येक वाक्य के वास्तविक होने के बाद की नई रूपरेखा, यह फ़ाइल में होनी चाहिए। दृश्य रेखा मोड के साथ समस्या यह है कि यह डिफ़ॉल्ट रूप से बहुत चौड़ा है। अगर इसे कम करने का कोई तरीका है, तो यह बहुत अच्छा होगा।
मालाबार

@ मलबारबा: क्या आप जानते हैं कि क्यों? मेरे लिए, यह अब तक का सबसे उपयोगी रैपिंग मोड है ...
Tikhon Jelvis

जवाबों:


11

यदि आप ऐसा कुछ चाहते हैं, visual-line-modeलेकिन कॉन्फ़िगर करने योग्य है, तो आप कोशिश कर सकते हैं longlines-modeजो कि मैं अपने अधिकांश गद्य के लिए उपयोग करता हूं। द्वारा कॉन्फ़िगर की गई चौड़ाई के साथ longlines-modeअपने पाठ को समान रूप से लपेटता visual-line-modeहै fill-column

यहां fill-columnसेट के साथ एक स्क्रीनशॉट है 70(विंडो वास्तव में दाईं ओर और भी अधिक फैली हुई है)।

लॉन्गलाइन्स-मोड रैपिंग टेक्स्ट का एक उदाहरण।

कॉन्फ़िगर fill-paragraphकरना साफ-सुथरा होगा, लेकिन मुझे यकीन नहीं है कि यह कैसे करना है। इसके बजाय, यहां एक उचित अस्थायी हैक है: अपने .चरित्र को TeX मोड में इलेक्ट्रिक करें, एक नई पंक्ति सम्मिलित करें। इसमें उपयुक्त मोड हुक जो भी हो, उसमें इसे रीबाइंड करना शामिल है:

(defun my-electric-dot ()
  (interactive)
  (insert ".\n"))
(defun my-tex-hook ()
  (local-set-key (kbd ".") 'my-electric-dot))
(add-hook 'TeX-mode-hook 'my-tex-hook)

1
Longlines-mode को इंगित करने के लिए बहुत बहुत धन्यवाद! मैं इसे समीकरणों को लपेटने और इंडेंटेड लाइनों के लुक को ठीक करने में कामयाब रहा। यहाँ है जिस्ट gist.github.com/c532f77144ddf86b4ea4.git
मालाबार

@ मालाबार: कूल। मैं शायद उन परिवर्तनों में से कुछ का उपयोग खुद करूँगा! आपका लिंक ठीक से काम नहीं करता है; यहाँ एक वेब-फ्रेंडली संस्करण है: gist.github.com/Bruce-Connor/c532f77144ddf86b4ea4
Tikhon Jelvis

धन्यवाद। इसके अलावा, उल्लेख करना भूल गया, कि सलाह लेटेक्स-अतिरिक्त पैकेज से एक फ़ंक्शन का उपयोग करती है।
मालाबार

वैसे, यह ध्यान देने योग्य है कि लॉन्गलाइन्स-मोड 24.4 में अप्रचलित के रूप में चिह्नित है (ऐसा नहीं है कि यह एक समकक्ष विकल्प है),
मालाबार

2
इलेक्ट्रिक डॉट अच्छी तरह से काम नहीं कर रहा है क्योंकि डॉट्स का उपयोग केवल वाक्यों को समाप्त करने के लिए नहीं किया जाता है, बल्कि सभी प्रकार के अन्य उद्देश्यों के लिए भी किया जाता है। एक डॉट को बदलने के लिए बेहतर होगा कि दो रिक्त स्थान के बाद एक डॉट द्वारा एक नई रेखा का अनुसरण किया जाए।
tmalsburg

13

(1) के लिए, मैं एक बढ़े हुए मार्जिन का उपयोग करूंगा, ताकि visual-line-modeवांछित पर रेखाएं लपेटें fill-column। यह हालांकि, दोनों पाठ लाइनों और समीकरणों को प्रभावित करेगा।

(2) के रूप में, एक को भरने M-qऔर सही ढंग से पैराग्राफ को भरने के लिए एक कस्टम फिलिंग कमांड को परिभाषित कर सकता है । मैं अभी तक ऑटो-फिलिंग के लिए सही व्यवहार के साथ एक कमांड लिखने में कामयाब नहीं हुआ हूं।

यह सब एक मामूली मोड में लपेटना निम्नलिखित की तरह लग सकता है। यह बहुत सुंदर कोड नहीं है, लेकिन ज्यादातर मामलों में काम करना चाहिए। (मैं समस्याओं को ध्यान दिए बिना कुछ समय के लिए unfill-paragraphमेरे पास कार्य किया init.elहै)।

(define-minor-mode ospl-mode
  "One Sentence Per Line"
  :init-value nil
  :lighter " ospl"
  :keymap (let ((map (make-sparse-keymap)))
            (define-key map (kbd "M-q") 'ospl/fill-paragraph)
            map)

  (if ospl-mode
      (progn
        (visual-line-mode 1)
        (setq right-margin-width (- (window-body-width) fill-column)))
    (visual-line-mode -1)
    (setq right-margin-width 0))

  ;; Account for new margin width
  (set-window-buffer (selected-window) (current-buffer)))


(defun ospl/unfill-paragraph ()
  "Unfill the paragraph at point.

This repeatedly calls `join-line' until the whole paragraph does
not contain hard line breaks any more."
  (interactive)
  (forward-paragraph 1)
  (forward-paragraph -1)
  (while (looking-at paragraph-start)
    (forward-line 1))
  (let ((beg (point)))
    (forward-paragraph 1)
    (backward-char 1)
    (while (> (point) beg)
      (join-line)
      (beginning-of-line))))


(defun ospl/fill-paragraph ()
  "Fill the current paragraph until there is one sentence per line.

This unfills the paragraph, and places hard line breaks after each sentence."
  (interactive)
  (save-excursion
    (fill-paragraph)         ; takes care of putting 2 spaces if needed
    (ospl/unfill-paragraph)  ; remove hard line breaks

    ;; insert line breaks again
    (let ((end-of-paragraph (make-marker)))
      (save-excursion
        (forward-paragraph)
        (backward-sentence)
        (forward-sentence)
        (set-marker end-of-paragraph (point)))
      (forward-sentence) 
      (while (< (point) end-of-paragraph)
        (just-one-space)
        (delete-backward-char 1)
        (newline)
        (forward-sentence))
      (set-marker end-of-paragraph nil)))) 

पैराग्राफ भरने से बहुत काम आता है, काश मैं दो उत्तर स्वीकार कर पाता। बस के unfill-paragraphसाथ बदलें ospl/unfill-paragraph। मार्जिन भी काम करता है, लेकिन इंडेंटेड टेक्स्ट खराब दिखता है और वे समीकरण भी लपेटते हैं, जबकि मैं अपनी दो समस्याओं को ठीक करने के लिए लॉन्गलाइन्स विधि को हैक करने में कामयाब रहा।
मालाबार

निश्चित, धन्यवाद। जैसा कि मैंने कहा था, मैंने लंबे समय तक unfill-paragraph(अविभाजित) रहा है init.el। मैंने अभी इसे स्थिरता के लिए कल उपसर्ग किया और एक बग पेश किया ....
ffevotte

हाँ, मुझे लगा कि यह कुछ ऐसा था। मुझे यह भी एहसास हुआ कि हम शायद कुछ ऐसा करके पैराग्राफ को अनफिल कर सकते हैं (let ((fill-column 1000000)) (fill-pragraph))। हालांकि अभी तक इसका परीक्षण नहीं किया गया है।
मालाबार

हां, ऐसा समाधान काम करता है। मुझे सिर्फ जादू की कमी नहीं है (लेकिन मेरा कोड बहुत सुंदर नहीं है, इसलिए कोई भी तर्क दे सकता है जो बेहतर है ...)
ffevotte

1
इस घोल से प्यार करें। क्या टिप्पणी लाइनों को कई लाइनों में तोड़ने से बचने का एक सरल तरीका है?
रामप्रसाद

9

यदि आप git diff --color-words या latexdiff का उपयोग करते हैं तो क्या आपके संस्करण-नियंत्रण के मुद्दों को टाला / हल किया जाएगा? फिर आप बदले हुए शब्दों को देख सकते हैं।


2
रंग शब्द वास्तव में बड़ा है! लेकिन मुझे अब भी अन्य लोगों के योगदान को मर्ज करने और पुराने कमिट्स को वापस करने के दौरान संघर्ष से बचने में मदद करने के लिए ओल्प्स दृष्टिकोण की आवश्यकता है।
मालाबार

2

इसमें सुधार करने कि मैं कई वर्षों के लिए (कई बार) का इस्तेमाल किया है का एक तरीका यह द्वारा एक दूसरे के बाद बहने के रूप में लाइन टूट के साथ वाक्य प्रदर्शित करने के लिए है तह की सुविधाओं का उपयोग कर लाइन ब्रेक tex-fold(AUCTeX का एक हिस्सा)।

इसका मतलब है कि यह

Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Mauris pellentesque fringilla justo, quis dapibus velit tincidunt quis?
Quisque varius ligula arcu, ut imperdiet risus maximus nec.

से मुड़ा हुआ है

Lorem ipsum dolor sit amet, consectetur adipiscing elit⁎ Mauris pellentesque fringilla justo, quis dapibus velit tincidunt quis❓  Quisque varius ligula arcu, ut imperdiet risus maximus nec⁎

मैंने हाल ही में इसे एक पैकेज में एक मामूली मोड के रूप में एक साथ रखा है। शायद किसी और को भी यह उपयोगी लगेगा: https://github.com/andersjohansson/tex-fold-linebreaks

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.