Когда я нахожусь в середине Looooong строки, как следующий
(setq Emacs-beta "Which keyboard shortcut to use for navigating out of a string")
Могу ли я пропустить это, прямо перед первым "
(после Emacs-бета) с ярлыком?
Когда я нахожусь в середине Looooong строки, как следующий
(setq Emacs-beta "Which keyboard shortcut to use for navigating out of a string")
Могу ли я пропустить это, прямо перед первым "
(после Emacs-бета) с ярлыком?
Ответы:
Вы хотите, C-M-u
который запускает команду backward-up-list
.
Переместиться назад на один уровень в скобках. Эта команда также будет работать с другими подобными скобкам выражениями, определенными текущим языковым режимом.
Если ESCAPE-STRINGS не ноль (как и в интерактивном режиме), также удалите вложенные строки.
Emacs-24.5 -Q
в строке, но я получаю с КУМ: up-list: Scan error: "Unbalanced parentheses"
?
Это выполнимо так:
(defun exit-string-backwards ()
(interactive)
(goto-char (nth 8 (syntax-ppss))))
В режиме lispy нажатие
[приведет вас к началу списка содержимого, выходя из любой строки. Как только вы окажетесь в начале списка, вы можете легко добраться до других частей, например, до конца Emacs-beta
печати 2m.
На самом деле это очень интересный вопрос программирования Emacs Lisp. Мы можем держать forward-char или backward-char, пока не обнаружим, что символ под курсором не является частью строки.
Вы можете использовать шрифт, чтобы решить, находится ли символ внутри строки. Это отличный трюк, который я узнал из 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
.