Синтаксис висвітлює звужені літерали рядка python як код

У мене є деякі Python код, який має деякі довгі рядки літерали, що містять більше код Python. Ці рядки повинні в більшості випадків рівномірно фарбуватися, як це відбувається за замовчуванням.

Тим не менш, я хотів би, щоб я міг кілька разів звузити свій буфер до будь-якого з цих рядків, а потім мати синтаксис emacs підсвічувати їх так, як якщо б вони були кодом, а не рядками в коді (тобто як би "" " не було у вихідному буфері)

Чи є спосіб зробити це, що не передбачає багато elisp?

ПРИМІТКА: Мені не потрібно обов'язково потрібно звуження, просто, здавалося, краще змінити підсвічування синтаксису, як це, як у повному буфері було б заплутаним ...

5
Чи не вирішили б проблему звуження лише до вмісту рядка, не включаючи лапки?
додано Автор Louis Salin, джерело
@jmlorenzi після того, як ви вузькі, ви можете змінити основний режим для підтримки будь-якого виділення, яке ви хочете. Потім змініть його назад, коли ви розширюєте. @lindydancer говорить про пакет edit-string , але він не підтримує виділення, як ви хочете.
додано Автор Louis Salin, джерело
Нещодавно я бачив, як хтось робить щось подібне в режимі HTML, але зараз я пам'ятаю, де я його бачив. У всякому разі, основна ідея полягала в тому, щоб скопіювати вбудований код в новий буфер і показати його, використовуючи відповідний основний режим. Після того, як це зроблено, послідовність чарівних ключів (подібно до C-c C-c) буде скопіювати результат назад, де він спочатку має справу. На жаль, це зажадає написання деякого elisp, я боюся.
додано Автор Daniel McPherson, джерело
@JordonBiondo У моєму, звуження до рядка (без лапок) не змінює підсвічування ...
додано Автор Faito Dayo, джерело
@Lindydancer Дякуємо! Я думав, що щось подібне має бути виконаним, але моє вміння elisp дійсно низьке ... Сподіваюся, я отримаю деякий час, щоб спробувати зробити це ...
додано Автор Faito Dayo, джерело

1 Відповіді

Це можна зробити за допомогою polymode .

(require 'polymode)
(defcustom pm-host/python
  (pm-bchunkmode "python"
                 :mode 'python-mode
                 :font-lock-narrow nil)
  "Python host chunkmode"
  :group 'hostmodes
  :type 'object)

(defcustom pm-inner/python
  (pm-hbtchunkmode "python"
                   :mode 'python-mode
                   :head-reg  "\"\"\""
                   :tail-reg  "\"\"\"")
  "Python typical chunk."
  :group 'innermodes
  :type 'object)

(defcustom pm-poly/python
  (pm-polymode-one "python"
                   :hostmode 'pm-host/python
                   :innermode 'pm-inner/python)
  "Python typical polymode."
  :group 'polymodes
  :type 'object)

(define-polymode poly-python-mode pm-poly/python)
  1. C-x b test.py RET
  2. M-x poly-python-mode RET

У цьому режимі рядки з потрійними цитатами виділяються як код Python. (Звичайно, це не дуже гарна ідея, але ви можете перемикати її).

enter image description here

Наразі polymode , як видається, має проблеми з оновленням блокування шрифту. Проте це має спрацьовувати на практиці.

4
додано
@PythonNut Це не працює для мене ... Може бути, проблеми з блокування шрифтів ви згадуєте? Які ці питання? Я використовую Emacs 24.3.1
додано Автор Faito Dayo, джерело
Я бачу зараз ... Дійсно зміна тексту сил оновлення ... це шкода, що не є автоматичним. Так чи інакше, велике спасибі за відповідь !!
додано Автор Faito Dayo, джерело
@elethan, як я зауважу наприкінці, здається, є деякі проблеми, пов'язані з блокування шрифтів при перемиканні. Я дивлюся на це, і, швидше за все, виникне питання, щоб побачити, чи можна це вирішити.
додано Автор PythonNut, джерело
@elethan Ах, основні режими не перемикаються. ;) Для повернення до неполімоду потрібно використовувати python-mode .
додано Автор PythonNut, джерело
@jmlorenzi що ж таке проблема? Якщо проблема полягає в тому, що вона не вмикається, спробуйте внести зміни до коду python всередині лапок. Це повинно змусити його виділити. Це помилка, про яку я мав на увазі.
додано Автор PythonNut, джерело
Я сподіваюся, що це працює для ОП, але для мене це, здається, чудово працює! Ви говорите, що ви можете перемикати його, але як ви це робите? Я можу включити його, але не можу зрозуміти, як вимкнути його ...
додано Автор Lord Loh., джерело
Але коли я кажу, що я не можу вимкнути його, я маю на увазі, що я не можу зрозуміти команду. Я розумію, що підсвічування синтаксису не зникає, але коли я повторно зателефонував poly-python-mode , я все ще бачу PM у моєму режимі, що вказує вона все ще активна
додано Автор Lord Loh., джерело
Добре, перехід назад до python-mode працює як шарм! Я не розумію, що я коли-небудь виходив з режиму Python ... (До речі, я нагороджу баунті після того, як сайт дозволить мені теж.
додано Автор Lord Loh., джерело
ІТ КПІ - Python
ІТ КПІ - Python
625 учасників

Канал обговорень про всякі штуки зі світу пайтону. Прохання: 0. мати повагу одне до одного; 1. не матюкатися в сторону людей; 2. не захламляти тред повідомленнями по одному слову;