Коли я перебуваю в середині лунгунгового струни, як і в наступному
(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.