Яку комбінацію клавіш використовувати для навігації з рядка


9

Коли я перебуваю в середині лунгунгового струни, як і в наступному

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

Чи можу я пропустити з нього, безпосередньо перед першим "(після Emacs-beta) ярликом?


Насправді не відповідь C-r " C-b.
Ім'я

Відповіді:


12

Emacs 25 або новіші

Ви хочете, C-M-uяка виконує команду backward-up-list.

Переміщення назад з одного рівня в дужках. Ця команда також буде працювати над іншими виразами, подібними до дужок, визначеним поточним мовним режимом.

Якщо ESCAPE-STRINGS не має нульового рівня (як це відбувається в інтерактивному режимі), вийдіть і з додаючих рядків.


Ви повинні згадати, що це лише 25 років.
або-або

@ abo-abo Це не так: я тільки тестував це в 24.5.1. Я не впевнений, коли це було додано, але якщо хтось зможе дізнатись, я його відредагую.
няня

@ abo-abo На жаль, вибачте, ви маєте рацію.
няня

Я Emacs-24.5 -Qв рядку, але я отримую з CMu up-list: Scan error: "Unbalanced parentheses":?
Dieter.Wilhelm

1
@ Dieter.Wilhelm Правильно: як ви бачите за моїм коментарем та редагуванням, я помилився. Він працюватиме лише в Emacs 25 або новіших версіях.
няня

3

Це можливо зробити так:

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

У Lispy-режимі натискання [приведе вас до початку списку, що містить список, після виходу з будь-якого рядка. Щойно ви починаєте список, ви можете легко дістатися до інших частин, наприклад, щоб дійти до кінця Emacs-betaнатискання 2m.


1

Це насправді дуже цікаве питання програмування 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


Це йде до правого краю, ОП попросив до точки перед лівим краєм. Що робити, якщо Lisp-режим не активований?
Ім'я

(Гото краю шляху зіставлення-шрифт особа -1) йдуть до лівого краю, backward-charабо forward-charпри переміщенні курсора з боку краю.
Чень бен

Гаразд, приємна ідея, але якщо запустити її, коли активовано текстовий режим, бали продовжуються ). Отже, залежно від режимів, ваш код має різну поведінку.
Ім'я

Він використовує той же алгоритм, що і flyspell. Тож він підтримує всі основні режими підтримки flyspell
Чень Бін

0

Ось ще один спосіб (який я, як правило, більше використовую), просто для різноманітності. Рішення не характерне для рядків, але воно працює і для цього випадку використання.

  • Встановити iy-go-to-char(також доступна на Melpa).
  • Bind 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(за замовчуванням), натискання "ще раз переведе вас до наступного "явища чару.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.