जब मैं निम्न की तरह एक looooong स्ट्रिंग के बीच में हूँ
(setq Emacs-beta "Which keyboard shortcut to use for navigating out of a string")
क्या मैं "शॉर्टकट से पहले (इमैक-बीटा के बाद) से पहले इसे छोड़ सकता हूं ?
जब मैं निम्न की तरह एक looooong स्ट्रिंग के बीच में हूँ
(setq Emacs-beta "Which keyboard shortcut to use for navigating out of a string")
क्या मैं "शॉर्टकट से पहले (इमैक-बीटा के बाद) से पहले इसे छोड़ सकता हूं ?
जवाबों:
आप चाहते हैं C-M-uजो कमांड चलाता है backward-up-list।
कोष्ठक के एक स्तर से पीछे की ओर ले जाएँ। यह कमांड वर्तमान भाषा मोड द्वारा परिभाषित अन्य कोष्ठक जैसी अभिव्यक्तियों पर भी काम करेगा।
यदि ESCAPE- स्ट्रिंग्स गैर-शून्य है (जैसा कि यह अंतःक्रियात्मक रूप से है), साथ ही साथ तारों को संलग्न करें।
Emacs-24.5 -Qएक स्ट्रिंग में है, लेकिन मैं CMU साथ हो रही है: up-list: Scan error: "Unbalanced parentheses"?
यह इस तरह से उल्लेखनीय है:
(defun exit-string-backwards ()
(interactive)
(goto-char (nth 8 (syntax-ppss))))
में lispy-मोड , दबाने
[युक्त सूची के शुरू करने के लिए आप लाने के लिए, किसी भी स्ट्रिंग बाहर निकलने होगा। एक बार जब आप सूची की शुरुआत में होते हैं, तो आप Emacs-betaप्रेस के अंत तक पहुंचने के लिए, उदाहरण के लिए, अन्य भागों तक आसानी से पहुंच सकते हैं 2m।
यह वास्तव में एक बहुत ही दिलचस्प 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 के साथ परीक्षण किया
backward-charया forward-charयदि आप कर्सर को किनारे के बाहर ले जाते हैं।
)। इसलिए मोड के आधार पर, आपके कोड में अलग-अलग व्यवहार होते हैं।
यहाँ एक और तरीका है (जो मैं अधिक उपयोग करने के लिए जाता हूं) बस विविधता के लिए। समाधान स्ट्रिंग्स के लिए विशिष्ट नहीं है, लेकिन यह इस उपयोग के मामले के लिए भी काम करता है।
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, तो "एक बार फिर से दबाने पर आपको अगली "चार घटना में ले जाया जाएगा ।
C-r " C-b।