Будь-який спосіб зробити підказки та попередній вихід непридатними в оболонці / режимі?


9

Це, безумовно, поверхове питання.

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

З моєї естетичної обгрунтованості, чи є спосіб зробити підказки та попередній вихід непридатними (для shell)? (Оновлено, щоб виключити ansi-термін з огляду на значущі відмінності.)

Я використовую zsh в Emacs 24.4; ОС є LXDE (Ubuntu 14.04) через Virtual Box.

(В ідеалі я все-таки зможу перемістити курсор навколо ...)


1
Ви випадково знаходитесь на "чудовій" ОС? Зазвичай у режимі оболонки Ca після переходу підскакує до початку командного рядка, а для переходу до самого початку потрібен другий Са. У Windows та Solaris (у колишньому житті) я зазвичай виявляв, що Са підскочив до самого початку, коли на MacOS, Linux тощо він працює, як очікувалося.
Марк Оффлік

@ Марк A: Я оновив оригінальний пост, щоб включити ще кілька деталей, включаючи мою поточну настройку.
iceman

Описана поведінка ансі-терміну звучить так, ніби ви перейшли в режим лінійного режиму або за дивними умовами за замовчуванням, або C-c C-j. Спробуйте дізнатися цей за замовчуванням або переключитися на режим char за допомогою C-c C-k.
wasamasa

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) для редагування виводу команд.


Це було дуже красиво, але я перестав працювати ... :( У мене є робоче рішення, яке займає значно більше коду → github.com/michalrus/dotfiles/commit/…
Michal Rus

Данно, досі працює для мене 25.2.
wasamasa

Це означає, що ви не можете видалити цей текст, але ви можете вставити новий, переплітаючись з цим незмінним.
Міхал Русь

1
Я бачу, не тестував це конкретно.
wasamasa

На жаль, ще одна зміна для всіх, хто шукає. Я раніше пропустив кілька лазівки. Цей відмінно працює для мене. github.com/michalrus/dotfiles/blob/…
Michal Rus

2

При змішуванні termзі shell-modeзмінною, comint-use-prompt-regexpздається, час від часу встановлюється. Це викликає поведінку трохи так, як ви описали: в режимі оболонки 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


1

Спробуйте налаштувати змінну comint-prompt-read-onlyдо t.

Це вплине shell-modeі на інші, похідні comint-mode, але ні term-mode.

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