Показать список слов вдоль нижней части кадра?


20

Я хотел бы отобразить 3 списка слов в отдельных строках по горизонтали вдоль нижней части (хотя верх будет также работать) каждого открытого кадра Emacs. Я подумал о 6 способах сделать это, и у всех них есть проблемы:

  1. Моей первой мыслью было добавить строку в мою строку режима, но УЖАСНО, вы не можете использовать символ новой строки в строке режима, он просто конвертируется в «^ J».

  2. Моей второй мыслью было провести строку в верхней части экрана и использовать строку заголовка, но она также не поддерживает символ перевода строки.

  3. Я мог бы отобразить наложение на последние 3 строки окна, но сделать это устойчивым кажется трудным - прокрутка должна была бы быть вызвана, когда точка достигла наложения, а не реального конца окна, и мне пришлось бы постоянно перемещать наложение, так как наложения находятся в текстовом пространстве, а не в окне.

  4. Я мог бы попытаться сделать выделенные окна внизу рамы. Я попытался написать код, но он не очень надежен, он не работает должным образом, когда фрейм уже содержит разделенные окна, и мне пришлось повторно привязать Cx, 1 к пользовательской версии delete-other-windows, которая игнорирует мои специальные окна, и я уверен, что есть другие угловые случаи. Также, когда окно справки открывается, оно открывается вертикально, потому что думает, что горизонтальное разделение уже есть (что технически есть, но это только для отображения окна в одну строку).

  5. У меня мог бы быть специальный фрейм для этого, но тогда моя конфигурация не будет работать в терминальном режиме, и мне нужно было бы написать скрипт моего оконного менеджера, чтобы он удерживал его вдоль нижней части экрана, делая его невыбираемым, не влияя на макет, и т. д.

  6. Я мог бы вставить текст для 3 строк прямо в минибуфер. Я получил это частично работающим, я могу вырастить минибуфер для размещения 3 строк, и я могу отобразить их. Тем не менее, всякий раз, когда любое сообщение отображается, строки исчезают, пока я не выполню другую команду, и в этот момент они появятся снова. В идеале 3 линии и область эха не должны пересекаться, чтобы я мог видеть обе. Это было бы менее раздражающим, если бы я мог надежно отфильтровать, какие сообщения отправляются в область эха - я нашел решение на EmacsWiki, но, похоже, оно не работает для сообщений, которые исходят из источника emacs C (в частности, я хотел бы получить избавиться от файла сохранения сообщений, потому что я часто сохраняю по таймеру).

Для контекста, моя цель состоит в том, чтобы постоянно отображать наиболее часто используемые слова в текущем буфере, слова, ближайшие к точке в текущем буфере, и слова, которые в последний раз использовались в текущем буфере. Я намерен иметь возможность вставлять их в буфер с помощью голосовых команд. Таким образом, я мог бы сказать «ближайшие 2» и заставить его выбрать второй пункт из списка слов ближайшей точки и вставить его. Я забочусь только о том, чтобы списки слов были видны для любого буфера, который я сейчас редактирую. Я не хочу использовать всплывающие окна, используемые различными режимами завершения кода, потому что мне нужно, чтобы списки всегда были видны.


Хороший вопрос, и хорошо поставленный. Надеюсь, вы получите несколько полезных предложений.
Дрю

Интересно о других частях # 5, кроме необходимости режима терминала (который является основным). Вы можете использовать выделенную рамку, которая расположена внизу (без проблем). Что вы подразумеваете под невыбираемым , и зачем вам это нужно? Если вы имеете в виду только чтение, то это тоже не проблема. Что вы имеете в виду, не влияя на макет ? В общем, № 5 не слишком понятен для меня.
Дрю

@Drew: Я имею в виду, что я управляю своим WM, используя клавиатуру, и вряд ли я когда-нибудь захочу сфокусировать этот кадр специально, поэтому я хочу, чтобы мои привязки следующего окна / предыдущего окна пропускали его. Точно так же я бы хотел, чтобы макеты окон действовали так, как если бы этот кадр был просто частью панели / панели задач. Изменить: везде в этом комментарии я сказал «окно», я имею в виду окно X, а не окно Emacs; р
Джозеф Гарвин

Еще одна возможность, предложенная мне, это просто использование минибуфера. Я понятия не имею, возможно ли там пассивно отображать текст, не мешая всему остальному, пытаясь его использовать, хотя ...
Джозеф Гарвин

Добавлена ​​заметка о попытке использовать минибуфер.
Джозеф Гарвин

Ответы:


8

Проведя много хакерских экспериментов, я смог получить № 6 (используя текст минибуфера) в «достаточно хорошем» рабочем состоянии. Вот скриншот:

Скриншот пояса в действии

Есть несколько ключевых частей, чтобы сделать эту работу:

  • Вставка текста в минибуфер на удивление почти делает все правильно из коробки. Текст, вставленный туда, будет отображаться.
  • Делая текст надстрочной строкой наложения вместо обычного текста, вы делаете его невыбираемым и вам не нужно беспокоиться о том, что курсор случайно попадет в него.
  • Чтобы команды подсказок минибуфера работали правильно, вы должны запретить вставку текста / наложения, когда окно минибуфера активно.
  • Если вы попытаетесь изменить размер минибуфера с помощью обычных функций изменения размера окна, вы получите ошибки, связанные с тем, что окна слишком малы. Если вы используете недокументированную функцию md-resize-minibuf, то вы можете изменить размер до нужного вам количества строк, пока вы установили мини-окна resize-nil в первую очередь.
  • Чтобы устранить исчезновение списков при появлении сообщения, вы должны сообщить функции сообщений о перехвате сообщений. Затем вы вставляете их в минибуфер самостоятельно. Вы также должны взглянуть на переменную current-message, в которой хранится то, что в последний раз отображалось в области эха (удивительно, что область эха и минибуфер технически различны, и некоторые функции исходного кода на C печатают непосредственно в область эха, не пропуская сообщение функция). Код, который я приведу ниже для этого, несовершенен, сообщения сохраняются дольше, чем обычно, что мне все еще нужно исследовать (проверка последней записи в * Сообщения * может быть проще и надежнее), но пока это «достаточно хорошо».

Вот ссылка на мою реализацию с примером пояса, отображающего список убийств. В конце концов это будет частью правильного проекта: https://gist.github.com/jgarvin/ce37d08654978fd7e4c9

Я впервые пишу значительное количество elisp, поэтому качество, вероятно, не на должном уровне, но это работает.


1

К сожалению, ни строка режима, ни строка заголовка не могут состоять из нескольких строк. Я спрашивал об этом раньше, и есть (по крайней мере, не было) какой-либо скрытой возможности сделать эту работу. Итак, 1 и 2 отсутствуют. Я также чувствую, что 3 и 6 - хаки, которые не сделают вас счастливыми в долгосрочной перспективе. 3 и 4 кажутся хорошими подходами, но заставить их работать надежно, будет достаточно инвестиций.

Поэтому я бы порекомендовал вам сначала рассказать об этом на emacs-devel . По моему опыту, в конце концов, все будет реализовано, если вы попытаетесь тщательно объяснить, чего вы хотите, и почему это хорошо. Это может занять некоторое время, по крайней мере, до следующего выпуска, но если вы прекрасно подождете немного или воспользуетесь версией для разработчиков, вы можете получить именно то, что вам нужно, с гораздо меньшими усилиями.


Спасибо за предложение связаться с emacs-devel. Несмотря на то, что я придумал решение, оно было довольно хакерским, и было бы неплохо иметь настоящий API для непосредственного рисования координат экрана, поэтому, когда у меня будет время, я, вероятно, отправлю электронное письмо по-своему.
Джозеф Гарвин
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.