Jak uzyskać nazwę bieżącego bufora w emacsie?

19

Jedną z głównych cech, których mi brakuje w Vimie, jest to, że zawsze zapisuje nazwę pliku bieżącego pliku w %buforze ( więcej informacji ). Umożliwia to łatwe uruchamianie poleceń, takich jak:

;; compile current file
:! gcc %
;; source current file (useful when I'm editing .vimrc
:source %
;; get the size of current file
:! du -sh %
;; etc, etc...

Chciałbym mieć podobną funkcjonalność pod emacs(wersja 24, jeśli to robi różnicę), a mianowicie mieć łatwy sposób wstawienia nazwy pliku otwartego w bieżącym buforze.

Przykłady tego, co chcę zrobić

W tym miejscu opisuję kilka podstawowych przypadków użycia, aby lepiej wyjaśnić, kiedy czuję potrzebę takiego skrótu

  1. Kompilacja: Kiedy M-x compilewpisuję emacs, prosi mnie o polecenie kompilacji. Chciałbym wejść gcc (current-buffer)łatwo.

  2. Załaduj plik: Kiedy edytuję plik .emacs, chciałbym go załadować od razu, aby przetestować zmiany. Sposób, w jaki to robię, jest taki, M-x load-filea potem zawsze przeliteruję nazwę . e m a c s. Chciałbym mieć skrót.

  3. Uruchom procesy zewnętrzne: podałem du -shjako przykład, aby zilustrować, że chcę, aby skrót był dostępny również podczas wykonywania poleceń powłoki za pomocąM-!

Co znalazłem do tej pory

  • To pytanie tutaj na U&L. Podane odpowiedzi pokazują w zasadzie, gdzie znaleźć nazwę pliku bufora, aby można go było dodać do zabójczego pierścienia. Nie jest to dokładnie to, czego szukam, nie chcę ręcznie zabijać nazwy pliku, zanim chcę go użyć. (Również rozwiązania opisane w obu odpowiedziach nie wydają się działać tak płynnie w moich emacach i wymagają dodatkowych naciśnięć klawiszy, co sprawia, że ​​są trochę uciążliwe).

EDYCJA : Trochę niezwiązana, dowiedziałem się, dlaczego te rozwiązania nie działają. Mam włączone IDO, na lepsze lub gorsze.

  • (current-buffer)Funkcja opisana w instrukcji nie zwróci nazwę pliku w bieżącym buforze, ale nigdzie w przykładach dałem powyżej, mam oceny kod Elisp. Czy istnieje sposób na wstawienie wyniku oceny tej funkcji do bufora (mini) i powiązanie go w ten sposób ze skrótem?

Czy mylę się myśląc w ten sposób?

Obecnie uczę się używać emacsa (właściwie minęło kilka miesięcy) po latach używania Vima. Chcę uniknąć przewidywalnej pułapki „ emacs-in-a-Vim-way” . Jeśli uważasz, że to, o co proszę, nie jest zbyt wyczerpujące i powinien istnieć lepszy (czystszy?) Sposób, proszę o tym wspomnij w swoich odpowiedziach.

rahmu
źródło
O nazwie pliku w .emacs, wstaw, (global-set-key (kbd "C-i") buffer-file-name)jeśli chcesz, aby był to Ctrl + I. O .emacs, M-x load-file RETrobi to, co chcesz; nie musisz nic pisać.
Emanuel Berg,
2
Ten przepływ pracy nie łączy się zbyt dobrze z Emacsem, ponieważ wszystkie monity w dolnej linii okna znajdują się w buforze w Emacsie (zwanym minibuforem). Jeśli więc biegniesz, (buffer-file-name)gdy piszesz minibufor, dostajesz nil, bo (current-buffer)to minibufor. Możesz przełączać bufory również w minibuforze, więc trudno jest śledzić, który bufor jest tym, co myślisz o bieżącym buforze, zanim bieżący bufor, jak widzi Emacs, jest minibuforem.
Gilles „SO- przestań być zły”

Odpowiedzi:

11

Możesz umieścić funkcję w następujący sposób w swoich .emacs i przypisać ją do dowolnego klucza, który ci się podoba.

(defun insert-file-name ()
  "Insert the full path file name into the current buffer."
  (interactive)
  (insert (buffer-file-name (window-buffer (minibuffer-selected-window)))))

Zobacz także to pytanie , wydaje się być podobne.

easyb
źródło
4

Niewielki wariant odpowiedzi @ easyb polega na skopiowaniu ścieżki do pierścienia zabijania zamiast umieszczania go w buforze (przydatne w przypadku plików tylko do odczytu):

(defun filename ()   
    "Copy the full path of the current buffer."  
    (interactive)  
    (kill-new (buffer-file-name (window-buffer (minibuffer-selected-window)))))
użytkownik338519
źródło