स्ट्रिंग से बाहर नेविगेट करने के लिए किस कीबोर्ड शॉर्टकट का उपयोग करना है


9

जब मैं निम्न की तरह एक looooong स्ट्रिंग के बीच में हूँ

(setq Emacs-beta "Which keyboard shortcut to use for navigating out of a string")

क्या मैं "शॉर्टकट से पहले (इमैक-बीटा के बाद) से पहले इसे छोड़ सकता हूं ?


वास्तव में उत्तर नहीं C-r " C-b
नाम

जवाबों:


12

25 या नए Emacs

आप चाहते हैं C-M-uजो कमांड चलाता है backward-up-list

कोष्ठक के एक स्तर से पीछे की ओर ले जाएँ। यह कमांड वर्तमान भाषा मोड द्वारा परिभाषित अन्य कोष्ठक जैसी अभिव्यक्तियों पर भी काम करेगा।

यदि ESCAPE- स्ट्रिंग्स गैर-शून्य है (जैसा कि यह अंतःक्रियात्मक रूप से है), साथ ही साथ तारों को संलग्न करें।


आपको उल्लेख करना चाहिए कि यह केवल 25 है।
abo-abo

@ abo-abo यह नहीं है: मैंने अभी 24.5.1 में इसका परीक्षण किया है। मुझे यकीन नहीं है कि जब इसे जोड़ा गया था, लेकिन अगर किसी को पता चल जाए तो मैं इसे संपादित करूंगा।
नानी

@ abo-abo उफ़, मुझे क्षमा करें, आप सही हैं।
नानी

मैं साथ हूँ Emacs-24.5 -Qएक स्ट्रिंग में है, लेकिन मैं CMU साथ हो रही है: up-list: Scan error: "Unbalanced parentheses"?
डायटर। विल्हेम

1
@ Dieter.Wilhelm Right: जैसा कि आप मेरी टिप्पणी और संपादन द्वारा देख सकते हैं, मुझसे गलती हुई थी। यह केवल 25 Emacs या नए में काम करेगा।
नानी

3

यह इस तरह से उल्लेखनीय है:

(defun exit-string-backwards ()
  (interactive)
  (goto-char (nth 8 (syntax-ppss))))

में lispy-मोड , दबाने [युक्त सूची के शुरू करने के लिए आप लाने के लिए, किसी भी स्ट्रिंग बाहर निकलने होगा। एक बार जब आप सूची की शुरुआत में होते हैं, तो आप Emacs-betaप्रेस के अंत तक पहुंचने के लिए, उदाहरण के लिए, अन्य भागों तक आसानी से पहुंच सकते हैं 2m


1

यह वास्तव में एक बहुत ही दिलचस्प Emacs लिस्प प्रोग्रामिंग सवाल है। हम फॉरवर्ड-चार या बैकवर्ड-चार रख सकते हैं, जब तक कि हमें कर्सर के नीचे का वर्ण स्ट्रिंग का हिस्सा नहीं लगता।

आप यह तय करने के लिए फ़ॉन्ट चेहरे का उपयोग कर सकते हैं कि चरित्र स्ट्रिंग के अंदर है या नहीं। यह एक बेहतरीन ट्रिक है जिसे मैंने फ्लाईस्पेल से सीखा था। सिद्धांत रूप में यह सही नहीं है, लेकिन वास्तविक दुनिया में यह Emacs23, Emacs24, Emacs25 पर लगभग किसी भी प्रोग्रामिंग भाषा के प्रमुख मोड के साथ काम करता है

यहाँ पूरा कोड है:

(defun font-face-is-similar (f1 f2)
  (let (rlt)
    ;; (message "f1=%s f2=%s" f1 f2)
    ;; in emacs-lisp-mode, the '^' from "^abde" has list of faces:
    ;;   (font-lock-negation-char-face font-lock-string-face)
    (if (listp f1) (setq f1 (nth 1 f1)))
    (if (listp f2) (setq f2 (nth 1 f2)))

    (if (eq f1 f2) (setq rlt t)
      ;; C++ comment has different font face for limit and content
      ;; f1 or f2 could be a function object because of rainbow mode
      (if (and (string-match "-comment-" (format "%s" f1)) (string-match "-comment-" (format "%s" f2)))
          (setq rlt t)))
    rlt))

(defun goto-edge-by-comparing-font-face (&optional step)
"Goto either the begin or end of string/comment/whatever.
If step is -1, go backward."
  (interactive "P")
  (let ((cf (get-text-property (point) 'face))
        (p (point))
        rlt
        found
        end)
    (unless step (setq step 1)) ;default value
    (setq end (if (> step 0) (point-max) (point-min)))
    (while (and (not found) (not (= end p)))
      (if (not (font-face-is-similar (get-text-property p 'face) cf))
          (setq found t)
        (setq p (+ p step))))
    (if found (setq rlt (- p step))
      (setq rlt p))
    ;; (message "rlt=%s found=%s" rlt found)
    (goto-char rlt)))

उपयोग:

  • (goto-edge-by-comparing-font-face 1)दाएं किनारे पर जाएं, (goto-edge-by-comparing-font-face -1)बाएं किनारे पर जाएं
  • यह किसी भी विशिष्ट प्रमुख-मोड पर निर्भर नहीं है, आप इसे किसी भी भाषा में कहीं भी उपयोग कर सकते हैं

backward-up-listउपयोगकर्ता के दृष्टिकोण से बहुत विश्वसनीय नहीं है क्योंकि यह एक सामान्य आदेश के आधार पर डिज़ाइन किया गया है scan-sexps। उदाहरण के लिए, if (true) { return 'hello world'; }js2-mode में कोड के लिए , यह {पहले एकल उद्धरण वर्ण के बजाय फ़ोकस को वर्ण में ले जाएगा । printf("hello world")C ++ - मोड में कोड के लिए , यह काम नहीं करेगा। मैंने 24.5 Emacs के साथ परीक्षण किया


यह दाहिने किनारे पर जाता है, ओपी ने बाएं किनारे से पहले बिंदु पर पूछा है। यदि लिस्प-मोड सक्रिय नहीं है तो क्या होगा?
नाम

(गोटो-एज-बाय-कम्पेरिंग-फॉन्ट-फेस -1) बाएं किनारे पर जाएँ, backward-charया forward-charयदि आप कर्सर को किनारे के बाहर ले जाते हैं।
बिन

ठीक है, अच्छा विचार है, लेकिन यदि आप इसे चलाते हैं जब पाठ-मोड सक्रिय होता है, तो अंक बाद में चला जाता है )। इसलिए मोड के आधार पर, आपके कोड में अलग-अलग व्यवहार होते हैं।
नाम

यह फ्लाईप्सेल के समान एल्गोरिथ्म का उपयोग करता है। तो यह सभी प्रमुख मोड फ्लाईस्पेल समर्थन का समर्थन करता है
बिन

0

यहाँ एक और तरीका है (जो मैं अधिक उपयोग करने के लिए जाता हूं) बस विविधता के लिए। समाधान स्ट्रिंग्स के लिए विशिष्ट नहीं है, लेकिन यह इस उपयोग के मामले के लिए भी काम करता है।

  • स्थापित करें iy-go-to-char(मेलपा पर भी उपलब्ध)।
  • बाँध iy-go-to-char-backwardऔर iy-go-to-charअपने पसंदीदा बाइंडिंग के लिए। इस स्पष्टीकरण के लिए, आइए आपको बाध्य iy-go-to-char-backwardकरते हैं C-c C-,और iy-go-to-charकरने के लिए कहते हैं C-c C-.
  • अब यदि आप स्ट्रिंग के अंदर हैं, तो आप कॉल करेंगे iy-go-to-char-backwardऔर टाइप करेंगे "

    जो दिखेगी C-c C-, "। यदि आपने (डिफ़ॉल्ट) iy-go-to-char-continue-when-repeatingसेट किया है t, तो "एक बार फिर से दबाने से आपको "इससे पहले एक चार घटना हो जाएगी, और इसी तरह।

  • यदि आप स्ट्रिंग के अंदर हैं, और यदि आप अब स्ट्रिंग के अंत में जाना चाहते हैं, तो आप कॉल करेंगे iy-go-to-charऔर टाइप करेंगे "

    जो दिखेगी C-c C-. "। यदि आप (डिफ़ॉल्ट) पर iy-go-to-char-continue-when-repeatingसेट हो गए हैं t, तो "एक बार फिर से दबाने पर आपको अगली "चार घटना में ले जाया जाएगा ।

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