Коли я перебуваю в середині лунгунгового струни, як і в наступному
(setq Emacs-beta "Which keyboard shortcut to use for navigating out of a string")
Чи можу я пропустити з нього, безпосередньо перед першим "
(після Emacs-beta) ярликом?
Коли я перебуваю в середині лунгунгового струни, як і в наступному
(setq Emacs-beta "Which keyboard shortcut to use for navigating out of a string")
Чи можу я пропустити з нього, безпосередньо перед першим "
(після Emacs-beta) ярликом?
Відповіді:
Ви хочете, C-M-u
яка виконує команду backward-up-list
.
Переміщення назад з одного рівня в дужках. Ця команда також буде працювати над іншими виразами, подібними до дужок, визначеним поточним мовним режимом.
Якщо ESCAPE-STRINGS не має нульового рівня (як це відбувається в інтерактивному режимі), вийдіть і з додаючих рядків.
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 Lisp. Ми можемо зберігати вперед-char або назад-char, поки ми не знайдемо, що символ під курсором не є частиною рядка.
Ви можете використовувати обличчя шрифту, щоб визначити, чи є символ всередині рядка. Це чудова хитрість, яку я навчився з мухомор. Теоретично це не ідеально, але в реальному світі він працює майже з основними режимами мови програмування на 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
.