Answers:
您想要C-M-u
哪个运行命令backward-up-list
。
向后移出一级括号。 该命令还将对当前语言模式定义的其他类似括号的表达式起作用。
如果ESCAPE-STRINGS为非nil(因为它是交互式的),则也移出封闭字符串。
Emacs-24.5 -Q
在一个字符串,但我与CMU得到:up-list: Scan error: "Unbalanced parentheses"
?
这样是可行的:
(defun exit-string-backwards ()
(interactive)
(goto-char (nth 8 (syntax-ppss))))
在lispy-mode中,按
[会将您带到包含列表的开头,退出任何字符串。一旦进入列表的开头,您就可以轻松到达其他部分,例如,到达Emacs-beta
印刷结束2m。
这实际上是一个非常有趣的Emacs Lisp编程问题。我们可以保留前向字符或后向字符,直到发现光标下的字符不是字符串的一部分。
您可以使用字体来确定字符是否在字符串中。这是我从flyspell学到的绝妙技巧。从理论上讲,它不是完美的,但在现实世界中,它几乎可以在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模式下的代码,它将焦点移至该{
字符而不是第一个单引号字符。对于printf("hello world")
c ++模式下的代码,它将无法正常工作。我用Emacs 24.5进行了测试
backward-char
或者forward-char
将光标移到边缘的外侧。
)
。因此,取决于模式,您的代码具有不同的行为。
这是多样化的另一种方式(我倾向于使用更多方式)。该解决方案不特定于字符串,但也适用于此用例。
iy-go-to-char
(在Melpa上也可用)。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
。