Як включити відступи в нижчій схемі?

Там, здається, немає ніяких відступу в невірній схемі за промовчанням. Принаймні, коли я виконую M-x run-scheme , результуючий репліка взагалі не вставляє мій код.

Як я можу це змінити? Переважно без нічого такого, як гейiser або інші обгортки.

1

1 Відповіді

Я думаю, проблема полягає в тому, що RET , імовірно, відображається у вигляді comint-send-input , що не робить відступу.

Що я роблю, це карта Cj до newline-and-indent і залиште RET зіставлено з comint-send-input . Тому я натискаю C-j , щоб ввести нову лінію та відступити новий рядок або RET , щоб фактично надіслати форму для оцінки. (Фактично я мапу C-j до paredit-newline , але newline-and-indent має працювати, якщо ви не використовуєте Paredit).

Звичайно, ви можете змінити їх і використовувати RET для newline-and-indent з Cj для comint-send-input .

В якості прикладу відображення одного з цих ключів це буде позначати C-j до newline-and-indent :

(with-eval-after-load 'cmuscheme
  (define-key inferior-scheme-mode-map (kbd "C-j") #'newline-and-indent))

( cmuscheme - з історичних причин - це назва пакунка, що реалізує underfer-scheme-mode , тобто Scheme REPL.)

Редагування:

Ось щось, що, здається, працює, хоча я не протестував його широко:

(defun comint-send-input-indent ()
  (interactive)
  (comint-send-input)
  (unless (save-excursion (forward-char -1)
                          (eq (field-at-pos (point)) 'output))
    (indent-for-tab-command)))

(with-eval-after-load 'cmuscheme
  (define-key inferior-scheme-mode-map (kbd "RET") #'comint-send-input-indent))

Ідея полягає в тому, щоб викликати comint-send-input , а потім перевірити, чи є точка (курсор) безпосередньо перед підказкою. Якщо це не так (оскільки comint-send-input просто ввів нову лінію), зателефонувати за indent-for-tab-command , яка відповідним чином вставляє лінію.

Інше редагування:

З другої думки, я думаю, що це визначення, мабуть, має сенс:

(defun comint-send-input-indent ()
  (interactive)
  (let ((parens (or (car (syntax-ppss)) 0)))
    (if (zerop parens)
        (comint-send-input)
      (newline-and-indent))))

Для отримання додаткової інформації див. C-h f syntax-ppss RET (і краще C-h f parse-partial-sexp RET ). Короткий варіант полягає в тому, що вони можуть розповісти нам, наскільки глибокий перегляд гніздування в точці, тому ми можемо використати це, щоб вирішити, чи потрібно newline-and-indent або comint-send-input .

2
додано
@Darklightus, мій поганий, я відредагував відповідь, щоб навести приклад. Якщо ви хочете замінити RET , просто замініть "C-j" з "RET"
додано Автор Jorriss, джерело
@васамаса, це дійсно здається, що це повинно бути можливим. Фактично, в попередньому тестуванні Emacs 25 я використовую (я не пробував інші версії) comint-send-input вже вводить нову лінію (а не надсилає введення), але не відступає новий рядок, якщо форма неповна. Проте, після швидкого читання джерела, мені незрозуміло, як це працює. Хм, мені доведеться подивитися на це пізніше.
додано Автор Jorriss, джерело
У Emacs Lisp (і Common Lisp) progn є еквівалентом begin схеми. Однак, визначення функції з (progn (newline-and-indent) (comint-send-input)) не працює; ви хочете зробити одну або іншу, а не одну , а потім іншою. Важко розібратися, коли робити це. (Крім того, функціональні органи є неявним progn , як це було на схемі, тому ви, ймовірно, насправді не використовуватиме progn у цьому конкретному випадку, оскільки форми будуть в функція)
додано Автор Jorriss, джерело
Я зараз запитав про це в списку розсилки довідки Emacs та оновити мою відповідь з будь-якою відповідною інформацією.
додано Автор Jorriss, джерело
Тут , як ви це зробите. Однак, якщо я не пройду щось, я все ще не вірю, що він дасть вам потрібну функціональність.
додано Автор Jorriss, джерело
@Darklightus, я відредагував відповідь з новим заклинанням, який, здається, працює. Я буду редагувати далі з тим, що навчаюсь у списку. Дякую!
додано Автор Jorriss, джерело
Я міг уявити собі спосіб написати єдину команду "Вчимо правильну річ". В принципі, різниця між формою, яку можна відправити до підпроцесу, та форму, яка потребує відступу від решти, полягає в тому, що перша є повною (читати: збалансована), тоді як остання не є.
додано Автор ICodeForCoffee, джерело
Вибачте, але я дійсно нове для emacs. Як я можу відобразити ці ключі?
додано Автор Snakist_へびーん, джерело
Якщо RET робить comint-send-input за замовчуванням, але я просто хочу, щоб відступи в додаток до цього, я не міг зробити як newline-and-indent і comint-send-input ? Тоді замість того, щоб використовувати два ключі, я міг використовувати лише один. Як я можу це зробити? Я б використав begin в інших лиспах, але, здається, нічого не робить (крім розбиття emacs). Крім того, рішення добре працює, до речі.
додано Автор Snakist_へびーん, джерело
Я дійсно не розумію, чому б не зробити це, а потім інше. Ми вже робимо comint-send-input , і тепер ми хочемо newline-and-indent перед цим.
додано Автор Snakist_へびーん, джерело
Я намагався визначити його як (progn (newline-and-indent) (comint-send-input) , але порушує M-x run-scheme для деяких дивних причин.
додано Автор Snakist_へびーん, джерело
@ jbm так, ви маєте рацію, новий рядок, що знаходиться там comint-send-input , руйнує ефект. Тепер я отримую чудовий відступ наступного рядка, за яким слідує нерозмірна нова рядок. Я думаю, я просто чекаю відповіді з списку розсилки. Спасибі за вашу допомогу до сих пір!
додано Автор Snakist_へびーん, джерело
Я трохи змінив це, видаливши нові рядки між comint-send-input і newline-and-indent . Тепер це майже ідеальне: єдиною проблемою є те, що коли фактично отримують результат назад, він друкує його після введення без нового рядка, наприклад, (+2 3) 5 , а не новий рядок до 5. Я не можу Подивіться, як я можу це виправити, тому сподіваємось, хтось надішле чудову відповідь у списку розсилки. Перш ніж забути про це (якщо нічого не відбудеться), я прийму вашу відповідь, але, будь ласка, дайте мені оновлення, якщо все станеться.
додано Автор Snakist_へびーん, джерело
@ jbm останній, здається, працює так, як я хотів. Я, звичайно, ще не інтенсивно використовував це, але, як видається, до цих пір працює чудово. Велике спасибі!
додано Автор Snakist_へびーん, джерело