LINUX.ORG.RU

emacs, C-l в comint как обычный 'clear' в терминале


0

0

Привет! Нужен сабж для интерактивных сессий, вроде run-$yourlang . Обычный recenter раздражает, хочется по C-l очистить экран, оставив только текущую строку, как и в обычном терминале. Как?

Гугол не подсказал.

★★
Ответ на: комментарий от xetf

>C-l C-l, не? Ну и (setq scroll-margin 0).

Не. Это скроллинг, когда я допустим ввожу следующую команду, выводится все равно весь буфер, мне нужно чтобы по команде все кроме последней выполненной команды или последней строки убилось.

M-x comint-truncate-buffer


Насколько я понимаю, это добавляют в хуки, чтобы буффер автоматически был не больше comint-buffer-maximum-size. Мне же надо другое - интерактивно очищать буфер до n последних строк.

volh ★★
() автор топика
Ответ на: комментарий от volh

ok, ладно, т.е. все сводится к «убить все строки кроме последней», и ничего при этом вроде не крешится.

но вот это не совсем работает:

(defun backward-kill-except-current-line()
   (interactive)
   (delete-region (point-min) (comint-line-beginning-position))
)
(define-key inferior-ruby-mode-map (kbd "C-l") 'backward-kill-except-current-line)

точнее, работает, но убивает в comint вообще все, comint-line-beginning-position ( и просто line-beginning-position ) нетово. еще в comint не работают C-a и (goto-char (line-beginning-position)).

чего дальше-то?

volh ★★
() автор топика

кстати, я же написал какую, да? то есть в емаксе уже есть «оставить только эт(и,у) строк(и,у)»? что-то вот совсем ничего не находится, явно туплю ведь.

volh ★★
() автор топика

А не совсем понятно, что надо сделать? Удалить вообще все из буфера, что перед приглашением или просто постараться сдвинуть буфер так, чтобы приглашение оказалось сверху, но при этом буфер не очищать? Или очистить буфер до нескольких последних строк, и приглашение сдвинуть вверх?

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Раньше хотел сдвинуть буфер, чтобы текущая, последняя строка, и предыдущая команда сдвинулись наверх, и при вводе следующих команд текст до той последней строки + предыдущей команды не выводился.

Сейчас устроит то что в предыдущем посте - вот та функция работает как надо в обычном режиме, но не работает в comint ( я так понимаю в этом режиме как-то похачили beginning-of-line, чтобы он указывал на символ после приглашения шелла ).

volh ★★
() автор топика
Ответ на: комментарий от volh

Первое, что приходит на ум — это очистить буфер вообще целиком от (point-min) до (point-max) и сделать холостой посыл (comint-sent-input). А вот если неоконченный ввод еще надо сохранить, то его неплохо бы скопировать перед этой операцией, а потом вставить. Я сильно в comint-mode не копался, если честно.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Кстати, есть функция comint-kill-input. Она и ввод текущий сотрет, и в килл-ринг его запишет. Можно будет вставить сразу же.

Zubok ★★★★★
()
Ответ на: комментарий от volh

>но не работает в comint ( я так понимаю в этом режиме как-то похачили beginning-of-line, чтобы он указывал на символ после приглашения шелла ).

(forward-line 0) попробуй.

Zubok ★★★★★
()
Ответ на: комментарий от volh

Насколько я понимаю, это добавляют в хуки, чтобы буффер автоматически был не больше comint-buffer-maximum-size.

Ты бы docstring до конца дочитал: «or bound to a key».

Мне же надо другое - интерактивно очищать буфер до n последних строк.

(defun comint-clean-buffer (arg)
  (interactive "P")
  (let ((comint-buffer-maximum-size (or arg 0)))
    (comint-truncate-buffer)))

(define-key comint-mode-map (kbd "C-l") 'comint-clean-buffer)

C-10 C-l - очистит всё кроме последних 10 строк.

slackophile
()

сорри что не отвечал, не было интернета

всем спасибо.

volh ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.