用于导航到字符串的键盘快捷键


9

当我在looooong字符串中间时,如下所示

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

我可以跳过第"一个快捷方式的第一个(在Emacs-beta之后)吗?


并不是一个真正的答案C-r " C-b
命名

Answers:


12

Emacs 25或更高版本

您想要C-M-u哪个运行命令backward-up-list

向后移出一级括号。 该命令还将对当前语言模式定义的其他类似括号的表达式起作用。

如果ESCAPE-STRINGS为非nil(因为它是交互式的),则也移出封闭字符串。


您应该提到它只有25。
abo-abo

@ abo-abo不是:我只是在24.5.1中进行了测试。我不确定何时添加它,但是如果有人可以找到,我将对其进行编辑
nanny

@ abo-abo糟糕,很抱歉,您是对的。
保姆2015年

我是Emacs-24.5 -Q在一个字符串,但我与CMU得到:up-list: Scan error: "Unbalanced parentheses"
Dieter.Wilhelm 2015年

1
@ Dieter.Wilhelm对:您通​​过我的评论和编辑可以看到,我错了。它只能在Emacs 25或更高版本中使用。
保姆2015年

3

这样是可行的:

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

lispy-mode中,按 [会将您带到包含列表的开头,退出​​任何字符串。一旦进入列表的开头,您就可以轻松到达其他部分,例如,到达Emacs-beta印刷结束2m


1

这实际上是一个非常有趣的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进行了测试


到达右边缘,OP要求到达左边缘之前的点。如果未激活lisp模式怎么办?
名称

(goto-edge-by-comparing-font-face -1)移到左侧边缘,backward-char或者forward-char将光标移到边缘的外侧。
陈彬

好的,不错的主意,但是如果您在激活文本模式时运行它,这些点会紧随其后)。因此,取决于模式,您的代码具有不同的行为。
命名

它使用与flyspell相同的算法。因此,它支持所有的主要模式flyspell支持
陈彬

0

这是多样化的另一种方式(我倾向于使用更多方式)。该解决方案不特定于字符串,但也适用于此用例。

  • 安装iy-go-to-char(在Melpa上也可用)。
  • 绑定iy-go-to-char-backwardiy-go-to-char您的首选绑定。对于这种解释起见,假设你势必iy-go-to-char-backwardC-c C-,iy-go-to-charC-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(默认值),则"再次按下将带您进入下一个"字符。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.