पैरेडिट मोड पर फॉर्म को ऊपर और नीचे ले जाएं


13

मैं सरसरी तौर पर स्ट्रक्चरल एडिटिंग (इंटेलीज और कर्सिव के लिए एक पैराडिट-जैसे मोड) का उपयोग कर रहा हूं और मुझे एक अच्छा कमांड मिला है, जिसे मूव फॉर्म-अप (और डाउन) कहा जाता है।

मूव अप फॉर्म ऐसा करता है ( |बिंदु है):

(+ 1 |(+ 2 3) 4) => (+ (+ 2 3) 1 4)

और नीचे ले जाएँ प्रपत्र अनुरूप है:

(+ 1 |(+ 2 3) 4) => (+ 1 4 (+ 2 3))

क्या Emacs paredit-mode पर ऐसा करना संभव है? मुझे लगता है कि यह मूल पैराडिट सेट पर नहीं है (कम से कम यह इस धोखा शीट पर वर्णित नहीं है


अच्छा लगा। अब यह एक ऐसा ऑपरेशन है जिसे मैं खुद कर सकता हूं।
PythonNut

2
एफडब्ल्यूआईडब्ल्यू, कम से कम दो उदाहरणों के लिए जो आप दिखाते हैं, सादा C-M-tएक ही चीज़ के बारे में करता है। लेकिन मुझे लगता है कि आपके कहने का मतलब यह है कि एक ही रूप आगे बढ़ना जारी है, बजाय सेक्सपेस के अगले जोड़े के लिए प्रगति की अदला-बदली।
ड्रयू

जवाबों:


13

जैसा @Drew ने सुझाव दिया है, C-M-tवही करता है जो आप चाहते हैं। नियम इस प्रकार है:

  • बिंदु को दो लिंगों के बीच में रखें।
  • प्रेस C-M-t(जो चलाता है transpose-sexp)।
  • बाईं sexp हमेशा बिंदु के साथ साथ सही करने के लिए ले जाया जाता है। यह बहुत महत्वपूर्ण है , अन्यथा आप अंत तक भ्रमित रहेंगे।

या, आप बस सोच सकते हैं कि यह ट्रांसपोज़िंग नहीं है, लेकिन बस आगे बढ़ने के लिए, आपको उस सेक्सप के बाद बिंदु को रखना होगा जिसे आप स्थानांतरित करना चाहते हैं।

हालाँकि, एक सुविधाजनक है कि जब आप बाएं लिंग को पीछे की ओर स्थानांतरित करना चाहते हैं, तो आप उसी का उपयोग करते हैं C-M-tलेकिन एक नकारात्मक उपसर्ग तर्क के साथ आपूर्ति की जाती है और यह असुविधाजनक है। एक और मुद्दा यह है कि बिंदु पिछड़े हुए ट्रांसपोज़्ड लेफ्ट सेक्सप का अनुसरण नहीं करेगा । इस समस्या को हल करने के लिए, हम इसका एक उल्टा संस्करण बनाते हैं transpose-sexps:

(defun reverse-transpose-sexps (arg)
  (interactive "*p")
  (transpose-sexps (- arg))
  ;; when transpose-sexps can no longer transpose, it throws an error and code
  ;; below this line won't be executed. So, we don't have to worry about side
  ;; effects of backward-sexp and forward-sexp.
  (backward-sexp (1+ arg))
  (forward-sexp 1))

फिर, इसे उसी के C-M-yबगल में बांधें C-M-tऔर डिफ़ॉल्ट Emacs में मुफ़्त है।

(global-set-key (kbd "C-M-y") 'reverse-tranpose-sexps)

यहाँ एक डेमो है; आप देखेंगे कि (MY-SEXP1)आगे / पीछे जाने के लिए हर समय बाईं ओर है:

यहाँ छवि विवरण दर्ज करें


5

यह लिस्पी के साथ करना संभव है , जो इसका एक उन्नत रूप है paredit-mode

आपके उपयोग के मामले के लिए:

  • w आगे बढ़ता है
  • s नीचे चला जाता है

केवल एक चीज यह है कि कर्सर को बराबर होना चाहिए, जो आपके उदाहरण में है:

(+ 1 |(+ 2 3) 4)

तुम भी साथ एक बार में कई sexps स्थानांतरित कर सकते हैं wऔर s, अगर आप उन्हें एक क्षेत्र के साथ निशान। अधिक जानकारी के लिए दस्तावेज़ देखें ।


;; वहाँ केवल उन दो आदेशों का उपयोग करने का एक तरीका है? ;; ऐसा करते समय मुझे "M-left" और "M-right" ढीला लगता है: `(ऐड-हुक 'clojure-mode-हुक (lambda) () (lispy-mode 1) (स्थानीय-सेट-की (kbd) - M - <up> ") 'lispy-Move-up) (स्थानीय-सेट-की (kbd" M- <down> ")' lispy-Move-down)))
nha

1

यहाँ एक और कमांड (लाइब्रेरी से misc-cmds.el) है जो आपके अनुरोध का बहुत अधिक उपयोग करता है। बस इसे एक ही कुंजी ( C-M-tया जो भी) से बांधें । एक सेक्सप को आगे और पीछे दोनों तरफ बार-बार ले जाने के लिए इसका उपयोग करें।

एक नकारात्मक उपसर्ग अर्ग पिछड़े को स्थानांतरित करता है, जैसे transpose-sexp, लेकिन यह एक अन्य पिछड़े प्रत्यारोपण करने के लिए तैयार बिंदु को भी छोड़ देता है। और जब दोहराते हैं, तो एक नकारात्मक उपसर्ग arg दिशा को प्रवाहित करता है।

इसलिए यदि आप आज्ञा को बांधते हैं, कहते हैं, C-oतो उस सेक्सप को स्थानांतरित करें जो बाएं से बिंदु तक दाईं ओर तीन बार, फिर बाईं ओर दो बार, फिर दाईं ओर एक बार हो।C-o C-o C-o C-- C-o C-o C-- C-o

एक संख्यात्मक उपसर्ग arg का प्रभाव केवल पहले उपयोग के लिए होता है, अर्थात, दोहराते समय नहीं - दोहराते समय, आंदोलन एक समय में एक सेक्सप होता है।

(defun reversible-transpose-sexps (arg)
  "Reversible and repeatable `transpose-sexp'.
Like `transpose-sexps', but:
 1. Leaves point after the moved sexp.
 2. When repeated, a negative prefix arg flips the direction."
  (interactive "p")
  (when (eq last-command 'rev-transp-sexps-back) (setq arg  (- arg)))
  (transpose-sexps arg)
  (unless (natnump arg)
    (when (or (> emacs-major-version 24)
              (and (= emacs-major-version 24)  (> emacs-minor-version 3)))
      (backward-sexp (abs arg)) (skip-syntax-backward " ."))
    (setq this-command  'rev-transp-sexps-back)))

(नोट: transpose-sexps24.4 में परिवर्तित व्यवहार , इसलिए यहां संस्करण परीक्षण। 24.4 से पहले, बिंदु को जारी रखने के लिए सही स्थान पर समाप्त हुआ। (उदाहरण के लिए दोहराने)। 24.4 से शुरू होना, बिंदु उसके लिए गलत जगह है। एक प्रतिगमन या एक उपयोगी सुविधा जोड़ता है या कुछ अन्य बग को देखने वाले की नजर में निश्चित रूप से ठीक करता है। ;-) मैंने इसके लिए Emacs bug # 20698 दायर किया है , बस अब।)

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