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


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.