Umieść bieżącą nazwę pliku w minibuforze

12

Jak wstawić nazwę pliku aktywnego bufora plików do polecenia?

Kiedy wywołuję polecenie, które wymaga nazwy pliku, często robię to z bufora plików i chcę nazwę tego pliku , wpisując polecenie w minibuforze.

Szukam hipotetycznej C-x, którą mogę wpisać podczas tworzenia linii poleceń w minibuforze.

Jeśli więc bieżący bufor jest plikiem o nazwie Lorem Ipsum.txt, wpisuję to:

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

że M-xgrepRETprezentuje minibufora skłoniło do grepkomendy. W odpowiedzi wpisałem argument wzorca wyrażenia regularnego ( 'foo') i wstawiłem argument nazwy pliku ( C-x). Ten minibufor skończy jako:

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

Jakie istniejące polecenie pobiera nazwę bieżącego bufora plików? Jakie jest domyślne przypisanie klucza?

duży nos
źródło
3
Dziwię się, że nikt nie wspomniał M-n. Nie wszędzie działa, ale działa w wielu miejscach. Ponadto, ponieważ grepujesz, możesz polubić lgrep i rgrep, które, jak sądzę, są bardziej interaktywne.
Malabarba

Odpowiedzi:

18

Jakie istniejące polecenie pobiera nazwę bieżącego bufora plików?

Niestety nie ma gotowego polecenia do tego, ale możemy je wykonać w następujący sposób:

(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)))))

Magia polega na funkcji okna wybranego przez minibufor ; robi to dobrze, wybierając ostatni bufor przed aktywacją minibufora. W przeciwnym razie użycie tylko nazwy pliku-bufora nie spowoduje przeniesienia nazwy pliku do minibufora. Co ciekawe, tej samej funkcji można użyć w zwykłym buforze lub minibuforze do wstawienia nazwy pliku. Nie jest wymagane specjalne leczenie.

Jakie jest domyślne przypisanie klucza?

Nie ma żadnego, ale możesz wybrać wygodny i przypisać go w następujący sposób:

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

Umieść powyższe wiersze kodu lisp w pliku init.el.

Działa to w najbardziej trywialnych przypadkach, ale trudno przewidzieć, jakie konflikty może mieć z jakimikolwiek trybami aktywnymi podczas wywoływania tej funkcji.

Co jeśli bufor nie odwiedza prawidłowej nazwy pliku, takiej jak bufor scratch? Następnie ten błąd jest wyświetlany w obszarze echa:

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

Wybranie prawidłowego bufora z poprawną nazwą pliku przed wywołaniem skrótu pozwoli uniknąć takich błędów.

Istnieje kilka innych rozwiązań, takich jak powyższe, ale różnią się one głównie sposobem obsługi wyjątków lub zastąpień wszelkich konfliktów. Na przykład niektórzy stosują przechwyty trybu, aby ta funkcja była dostępna tylko w niektórych trybach.

Użytkownik Emacsa
źródło
Myślę, że aby to zadziałało, należy enable-recursive-minibuffers.
Dieter.Wilhelm,
Jeśli polecenie ma być używane tylko w minibuforze, zamiast (define-key minibuffer-local-map (kbd "C-c f") 'name-of-the-file)'. In addition to this useful function I also created the function nazwy- C-c bbufora można użyć następującego powiązania, z którym się połączyłem i wstawia bieżącą nazwę bufora.
Dov Grobgeld
2

Podczas korzystania dired-xze skrótu klawiaturowego C-x C-jjest powiązany dired-jump. Tak więc z bufora plików kończysz na właściwej linii i możesz skopiować jego nazwę za pomocą w. Następnie możesz wkleić go do mini bufora.

Inną możliwością łagodnego wpisywania nazwy pliku jest standardowe uzupełnianie pliku mini bufora Emacsa. Wystarczy wpisać pierwsze znaki nazwy pliku, a następnie TAB.

Dieter.Wilhelm
źródło
1
Możesz skopiować nazwę pliku do bieżącej linii Dired po prostu za pomocą w(polecenia dired-copy-filename-as-kill).
Drew
-1

Pytanie wymaga istniejącej komendy Emacsa, aby to zrobić.

Jak stwierdziłem wcześniej:

Niestety nie ma na to gotowej komendy

co okazuje się odpowiedzią na to pytanie.

duży nos
źródło
Istnieją sposoby na złagodzenie przypadku użycia, a inni sugerowali indywidualne rozwiązania w zakresie kodowania, więc myślę, że twoje stwierdzenie jest nieprawidłowe. Nie poprosiłeś specjalnie o out-of-the-box Emacsa!
Dieter.Wilhelm,
W tym celu poprosiłem konkretnie o istniejące polecenie, więc tak, ta odpowiedź jest poprawna.
bignose