Помістіть поточне ім'я файлу в мінібуфер


12

Як я можу вставити ім'я файлу активного файлового буфера в команду?

Коли я викликаю команду, яка потребує імені файлу, я часто роблю це з файлового буфера і хочу, щоб ім'я цього файлу вводило команду в мінібуфер.

Я шукаю гіпотетичну форму, C-xяку я можу набрати під час формування командного рядка в мінібуфері.

Тож якщо, поки поточний буфер - це ім'я файлу Lorem Ipsum.txt, я набираю це:

M-x grep RET 'foo' SPC C-x … RET

що M-xgrepRETпредставляє мінібуфер спонукаючи для grepкоманди. У відповідь я набрав аргумент шаблону регулярних виразів ( 'foo') і вставив аргумент імені файлу ( C-x). Цей мінібуфер закінчиться так:

grep -nH -e 'foo' 'Lorem Ipsum.txt'

Яка існуюча команда отримує назву файлу буфера поточного файлу, як це? У чому полягає її прив'язка ключа за замовчуванням?


3
Я здивований, що ніхто не згадується M-n. Він працює не скрізь, але працює у багатьох місцях. Крім того, оскільки ви вітаєтеся, вам можуть сподобатися lgrep і rgrep, які я думаю, трохи інтерактивніші.
Малабарба

Відповіді:


18

Яка існуюча команда отримує назву файлу буфера поточного файлу, як це?

На жаль, для цього немає готової команди, але ми можемо зробити наступну:

(defun name-of-the-file ()
  "Gets the name of the file the current buffer is based on."
  (interactive)
  (insert (buffer-file-name (window-buffer (minibuffer-selected-window)))))

Магія полягає у функції, обраній мінібуфером-вікном ; він робить все правильно, вибираючи останній буфер до активації minibuffer. В іншому випадку використання лише буфера-імені-файлу не призведе до того, що ім'я файлу перетвориться на мінібуфер. Цікаво, що та сама функція може бути використана в звичайному буфері або мінібуфері для вставки імені файлу. Спеціальне лікування не потрібно.

У чому полягає її прив'язка ключа за замовчуванням?

Немає такого, але ви можете вибрати зручний та призначити його так:

(global-set-key (kbd "C-c f") 'name-of-the-file)

Помістіть наведені вище рядки коду lisp у свій файл init.el.

Це працює у більшості тривіальних випадків, але важко передбачити, які конфлікти у нього можуть виникнути у будь-яких режимах, у яких ви працюєте, коли викликаєте цю функцію.

Що робити, якщо буфер не відвідує дійсне ім'я файлу, наприклад буфер нуля? Потім ця помилка відображається в області відлуння:

name-of-the-file: Wrong type argument: char-or-string-p, nil

Вибір дійсного буфера з правильним іменем файлу перед тим, як викликати ярлик, уникне таких помилок.

Існує декілька інших рішень, як описано вище, але вони в основному відрізняються тим, як вони обробляють винятки або переосмислення будь-яких конфліктів. Наприклад, деякі використовують гачки режимів, щоб зробити цю функцію доступною лише в певних режимах.


Для цього я думаю, що треба enable-recursive-minibuffers.
Dieter.Wilhelm

Якщо команда повинна використовуватись лише в мінібуфері, то замість (define-key minibuffer-local-map (kbd "C-c f") 'name-of-the-file)'. In addition to this useful function I also created the function імені C-c bбуфера може бути використане наступне прив'язка, до якої я прив’язаний , і вставляє ім'я поточного буфера.
Дов Гробгельд

2

При використанні dired-xклавіатури ярлик C-x C-jприв'язується до dired-jump. Таким чином, з файлового буфера ви опиняєтесь у потрібному рядку та зможете скопіювати його ім'я w. І тоді ви зможете вставити його в міні-буфер.

Ще одна можливість полегшити введення імені файлу - це стандартне заповнення файлу міні-буфера Emacs. Просто введіть перші символи імені вашого файла, а потім TAB.


1
Ви можете скопіювати ім'я файлу в поточний рядок Dired, просто скориставшись w(команда dired-copy-filename-as-kill).
Дрю

-1

Питання задає існуючу команду Emacs для цього.

Як було сказано раніше:

На жаль, для цього немає готової команди

що виявляється відповіддю на це питання.


Є способи полегшити ваш випадок використання та інші запропоновані рішення для кодування, тому я вважаю, що ваше твердження не є правильним. Ви не просили конкретно про нестандартний спосіб Emacs!
Dieter.Wilhelm

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