Любой способ сделать приглашения и предыдущий вывод не редактируемыми в режиме оболочки / условия?

9

Это по общему признанию поверхностный вопрос.

Хотя он ansi-termначинает работать правильно, когда я впервые открываю его, после нескольких команд он начинает переходить в «редактируемый» режим, например, когда я выполняю C-a(начало строки), а затем C-k(строка уничтожения), он стирает всю подсказку.

Для моего эстетического здравомыслия, есть ли способ сделать подсказки и предыдущий вывод недоступными (для shell)? (Обновлено, чтобы исключить ансимин с учетом значимых различий.)

Я использую Zsh в Emacs 24.4; ОС - это LXDE (Ubuntu 14.04) через Virtual Box.

(В идеале я бы все еще мог перемещать курсор ...)

мороженщик
источник
1
Вы случайно не в "странной" ОС? Обычно в режиме оболочки Ca переходит к началу командной строки после подсказки, а второй Ca требуется для перехода к самому началу. В Windows и Solaris (в прошлой жизни) я обычно обнаруживал, что Ca прыгнул с самого начала, тогда как на MacOS, Linux и т. Д. Он работает, как и ожидалось.
Марк Ауффлик
@Mark A: Я обновил исходный пост, чтобы добавить еще несколько деталей, включая мою текущую настройку.
айсман
Описанное поведение анси-терма звучит так, будто вы переключились в линейный режим либо по странному умолчанию, либо C-c C-j. Попробуйте выяснить это значение по умолчанию или переключитесь в режим char с помощью C-c C-k.
Васамаса
1
Поскольку shell-mode/ term-modeсоответственно делают / не являются производными comint-mode, вы задаете два совершенно разных вопроса одновременно здесь. Можно разделить это на два отдельных вопроса?
purple_arrows

Ответы:

16

Comint -derived режимы (как shell, ielm, ...) поддержка функции фильтра, следующий фрагмент кода делает вывод и приглашение только для чтения:

(setq comint-prompt-read-only t)

(defun my-comint-preoutput-turn-buffer-read-only (text)
  (propertize text 'read-only t))

(add-hook 'comint-preoutput-filter-functions 'my-comint-preoutput-turn-buffer-read-only)

Что касается ansi-term(который не является производным от comint ), он имеет два режима работы, char modeкоторые максимально соответствуют привязкам оболочки и выполняемого в ней программного обеспечения и line modeпозволяют редактировать буфер по своему усмотрению . Обычно вы должны оставаться в char mode(привязанном к C-c C-k) и иногда переключаться в line mode(привязанном к C-c C-j) для редактирования вывода команды.

wasamasa
источник
Это было действительно красиво, но перестало работать… :( У меня есть рабочее решение, которое требует значительно больше кода → github.com/michalrus/dotfiles/commit/…
Michal Rus
Не знаю, у меня все еще работает на 25.2.
Васамаса
В некотором смысле это означает, что вы не можете удалить этот текст, но вы можете вставить новый, чередуя с этим неизменным.
Михал Рус
1
Я вижу, не проверял это специально.
Васамаса
Ой, еще одно изменение для тех, кто ищет. Я пропустил несколько лазеек раньше. Этот работает отлично для меня. github.com/michalrus/dotfiles/blob/…
Михал Рус
2

При смешивании termс shell-modeпеременной, comint-use-prompt-regexpкажется, время от времени устанавливается значение. Это вызывает поведение, похожее на то, что вы описали: в режиме shell C-a перейдет к началу строки, C-kуничтожит всю строку, включая приглашение.

Простое исправление - сброс comint-use-prompt-regexpс C-: (setq comint-use-prompt-regexp nil)принудительным использованием в режиме оболочки текстовых свойств, о которых знают клавиши перемещения курсора.

Описание того, как это работает, приведено в руководстве по GNU Emacs здесь: https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell-Prompts.html.

ataylor
источник
1

Попробуйте настроить переменную comint-prompt-read-onlyна t.

Это повлияет shell-modeи на других comint-mode, но не на это term-mode.

purple_arrows
источник