Общим решением проблемы этого типа являются клавиатурные макросы (не путать с (Emacs) LISP-макросами). По сути, Emacs позволяет вам записывать последовательность нажатий клавиш и впоследствии «воспроизводить их». Это может быть очень удобным инструментом в ситуациях, когда написание пользовательского кода LISP кажется излишним.
Например, вы можете создать следующий макрос клавиатуры (введите комбинации клавиш слева, справа показаны объяснения для каждого нажатия клавиши):
C-x ( ; start recording a keyboard macro
C-x h ; mark whole buffer
C-w ; kill region
(require 'file-name) ; insert a require statement into the buffer
C-x C-s ; save buffer
C-x C-f ; find file
file-name.el <RET> ; specify the name of the file
M-< ; move to the beginning of the buffer
C-u C-y ; insert the previously killed text, leaving point where it is
(provide 'file-name) <RET> <RET> ; insert a provide statement into the buffer
C-x ) ; stop recording the keyboard macro
Теперь вы можете повторно воспроизвести этот макрос в другом буфере, набрав C-x e или , сохраните его для дальнейшего использования. Вы также можете привязать макрос к ярлыку, как функция.
Однако у этого подхода есть один недостаток: вы хотите иметь возможность фактически указывать имя файла, а не просто использовать строку «имя-файла» каждый раз. Это немного сложно - по умолчанию клавиатурные макросы не предоставляют общих возможностей для запросов пользователя (за исключением очень минимального C-x q , как описано здесь ).
В Emacs Wiki есть некоторые обходные пути для этого, однако вместо того, чтобы запрашивать пользователя в минибуфере, иногда бывает достаточно запустить макрос, убив текущую строку и сохранив ее текст в регистр.
C-x (
C-e C-<SPC> C-a ; mark current line
C-x r s T ; copy line to register T
C-k C-k ; kill current line
... ; actual macro
C-x )
Теперь, когда вы хотите использовать свой макрос, вы сначала должны написать желаемое имя файла в пустой строке, а затем выполнить C-x e в этой строке. Всякий раз, когда в макросе необходимо указать значение имени файла, вы можете извлечь его из регистра T:
C-x r i T ; insert file-name into buffer
Например, для оператора provide
в вышеприведенном макросе вы можете написать: (предоставить 'C-x r i T) . Обратите внимание, что этот метод (вставка) также работает в минибуфере, и, конечно, вы можете сохранить несколько строк в разных регистрах.
Может показаться сложным, но на практике это довольно легко.