Я хотел бы создать функцию, которая делает "быстрый просмотр" файла, который находится под указанием в dired.
Я хотел бы, чтобы это работало, так как я удерживаю функциональную клавишу, которая затем делает файл видимым в буфере, но когда я отпускаю эту клавишу, буфер закрывается, и восстановленный буфер возвращается. Я не хочу закрывать временный буфер с помощью C-x k
.
Есть ли способ сделать эту функциональность в Emacs? Кажется возможным, если я смогу связать функции с нажатием / нажатием клавиши.
key-bindings
dired
keymap
Эрик Браун
источник
источник
Ответы:
Вот мой супер хакерский способ имитировать привязку событий нажатия клавиш вниз / вверх, используя таймеры.
В целом, я хотел бы предложить ответ Сигмы, но вы попросили способ закрыть предварительный просмотр, отпустив, поэтому я обязан попробовать.
По сути, вы можете привязать некоторую функцию, которая будет вашей функцией «keydown», к привязке клавиш, и внутри этого действия запустить таймер простоя, который выполняет функцию, которая является вашей функцией «keyup», до тех пор, пока вы удерживаете по заданным клавишам функция «keydown» будет срабатывать снова и снова, и это будет препятствовать работе таймеров простоя. Конечно, вам нужно компенсировать тот факт, что команда будет запускаться снова и снова, вероятно, связав ключ с какой-то noop-функцией в вашей функции «keydown», а затем повторно связав функцию «keydown» в функции «keyup».
Таким образом, для вашего варианта использования ваша функция «keydown» откроет буфер предварительного просмотра с содержимым файла в точке и в этом буфере предварительного просмотра свяжет тот же комбо-ключ с какой-то noop-подобной командой. Ваша функция «keydown» также запустит таймер простоя, который удалит ваш буфер предварительного просмотра и вернет вас туда, где вы были.
Короче говоря, вот код:
Свяжите эту функцию с комбинацией клавиш (которую я использовал C-M-v), когда вы нажимаете ее поверх имени файла, он открывает новый буфер, отображающий содержимое файла в момент, когда вы отпустите, вы будете переключены обратно к оригиналу буфера.
Также вот гиф этого в действии, все, что я делаю, это:
Одна важная вещь, которую нужно отметить, это секунды таймера простоя, в моем коде, который я использовал,
.7
но это своего рода магическое число, вы хотите, чтобы оно было действительно маленьким, но если вы видите, что предварительный просмотр мигает дважды, попробуйте увеличивать его на 1/10 в секунду каждый раз пока вы не найдете подходящее место для вашей машины.* Также обратите внимание, что в функции я пытаюсь сделать некоторую фонификацию буфера предварительного просмотра, но я не смог заставить его работать, это будет следующим шагом в том, чтобы сделать его более полезным. **
источник
Error running timer: (void-variable buffer)
с этим, похоже, чтоbuffer
вар не доступен внутриrun-with-idle-timer
?Как указано в комментариях, функции связаны с ключами, а не с событиями. Но чтобы сделать шаг назад, я не уверен, что понимаю, почему для вас важно удерживать клавишу нажатой, пока вы (предположительно) читаете содержимое файла. Это также было бы несовместимо с основными (и разумными) действиями, такими как прокрутка, чтобы получить больше. Не говоря уже о том, что если это займет некоторое время, это может стать неудобным :)
Как насчет повторения ключа вместо этого? Нечто подобное следующему может быть основным каркасом функционального эквивалента:
В любом случае, я более сложен для вашего случая использования, чем отвечаю на ваш вопрос на данный момент, так как это не имеет ничего общего с привязками нажатия / нажатия :)
источник
dired-view-file
! Я отредактировал свой код, чтобы использовать его. Да, я полагаю, что в этом сценарии важно не переходить к другому ключу.Вместо того, чтобы показывать файл при нажатой клавише, что было бы очень трудно реализовать, я предлагаю показывать файл, пока не будет нажата следующая клавиша.
Вот вариант, который показывает файл в другом окне, который я считаю более удобным пользовательским интерфейсом.
Вы не сможете сделать так много, как прокрутить в буфере. Возможно, имеет смысл реализовать режим «быстрого просмотра», в котором принимаются команды прокрутки, но другие входные события приводят к выходу из режима быстрого просмотра и интерпретируются в соответствии с предыдущим режимом, таким как Isearch.
С помощью
v
(dired-view-file
) вы получаете что-то промежуточное: буфер редактируется в режиме просмотра , где вы можете прокручивать, искать и т. Д., Но закрытие буфера - это простое нажатие клавишиq
.источник
Другая возможность, если вы используете мышь, - поместить нужный предварительный просмотр во всплывающую подсказку . Затем, когда вы наводите указатель мыши на имя файла (со свойством
help-echo
), появится окно предварительного просмотра.Я использую эту технику в Dired + , например, чтобы (опционально) показывать превью изображений, связанных с файлами изображений, при наведении указателя мыши на имена файлов.
Вы можете увидеть эффект этого, выполнив это после загрузки
dired+.el
:Убедитесь , что
tooltip-mode
включен:(tooltip-mode 1)
.Убедитесь, что этот параметр
diredp-image-preview-in-tooltip
имеет ненулевоеnil
значение (размер миниатюры илиfull
полноразмерное изображение).Наведите указатель мыши на имя файла изображения в Dired.
Вы можете использовать код функции
diredp-mouseover-help
как вдохновение для выполнения того, что вы хотите (отобразить «быстрый просмотр» при наведении курсора мыши). Посмотрите вызовы этой функции, чтобы узнать, как ее использовать. Вот один из таких звонков:источник
image-dired
работает нормально, но все, что я вижу, когдаmouse-1: visit this file/dir in another window
dired+.el
и будете следовать другим указаниям, которые я дал. Это не ванильная особенность Emacs. Я пытался описать, как вы можете развернуть свой собственный код, чтобы делать то, что вы хотите.dired+.el
Код очень близко, я думаю, что вы говорите , что вы хотите. Но да, подсказки при наведении курсора мыши требуют использования мыши. Если вы этого не сделаете, то предложение использовать всплывающую подсказку не очень поможет. ;-)Из буфера Dired, vперейдите к файлу в режиме только для просмотра, иq выйдет из режима просмотра и вернет вас в буфер с задержкой. Это быстрый способ предварительного просмотра файла, и он дает возможность прокрутки и даже поиска в буфере.
Я не думаю, что в emacs есть возможность передавать любые низкоуровневые сообщения нажатия клавиш, которые он получает от операционной системы. Это может быть частично по историческим причинам. Терминалы, доступные хакерам (читай «программистам») в то время, когда emacs разрабатывался в 1970–1980-х годах, работали не с событиями клавиш вверх / вниз в реальном времени, а с простым вводом символов и escape-последовательностей. По сей день emacs все еще может работать впечатляюще хорошо в рамках простого терминала или сеанса SSH, используя только простые символы ASCII и escape-последовательности.
Это не означает, что функциональность за последние годы значительно не расширилась и включает такие функции, как меню, управление несколькими кадрами и взаимодействие с мышью. Нет никакой причины (которую я знаю), что emacs нельзя было бы изменить (по своей сути), чтобы сделать низкоуровневые ключевые сообщения доступными для расширений, но я бы не стал задерживать дыхание.
( Отказ от ответственности: этот пост следует воспринимать как мнение и предположение, а не как факт.)
источник
Я дал свое решение в этом вопросе /programming/26409768/how-to-show-buffer-content-in-real-time-in-other-window-when-focus-is-in- буфер
и мой ответ - изменить поведение клавиш навигации
n
иp
показать файл в другом окне. Фокус остается в буфере, и мы убиваем посещенный буфер, когда продолжаем просмотр.Я создал вспомогательный режим, чтобы легко включить / отключить эту функцию. Обратите внимание, что у нас все еще есть клавиши со стрелками для «нормальной» навигации. Позвоните
M-x dired-show-mode
(или,ranger-mode
поскольку это функция, которую я обнаружил в файловом менеджере рейнджера ).Код: (любые отзывы и сообщения об ошибках приветствуются!) Https://gitlab.com/emacs-stuff/my-elisp/blob/master/dired-show.el
источник
Вам нужно будет опрашивать очередь событий до тех пор, пока не будет прочитано другое событие или его нет. Нагрузка на процессор заметна, хотя и достаточно низкая.
источник