P: Jak mogę zdobyć nowe bufory, aby uhonorować mapowanie auto-mode-alist
?
Podczas wyszukiwania pliku Emacs porównuje rozszerzenie pliku z tym, auto-mode-alist
aby określić, który tryb główny ma być używany dla bufora pliku. Czy istnieje sposób wykorzystania tych informacji w auto-mode-alist
celu określenia trybu bufora, który (jeszcze) nie jest powiązany z plikiem?
To znaczy: jeśli otworzę nowy bufor, którego nazwa ma coś, co wygląda jak rozszerzenie pliku, czy mogę uzyskać automatyczne otwieranie go w oczekiwanym trybie? Na przykład, jeśli miałbym otworzyć nowy bufor, a-new-buffer.el
który nie jest jeszcze powiązany z plikiem, chcę, aby otwierał się w emacs-lisp-mode
trybie domyślnym, a nie w trybie domyślnym.
buffers
major-mode
Dan
źródło
źródło
auto-mode-alist
wybrałeś jego tryb , bufor „ odwiedza ” plik (i to wszystko załatwia).org
bufor do testowania nowych funkcji, w których piszę do użyciaorg-mode
; b) tymczasowyR
bufor do szybkich, wyrzucanych manipulacji statystycznych; c) tymczasowy bufor tekstowy do tworzenia wiadomości e-mail. W każdym przypadku nie chcę tworzyć pliku do odwiedzenia, chcę tylko bufor usuwania, który mimo to otwiera się w odpowiednim trybie.C-x C-f
temat nie „ utworzyć plik do odwiedzenia ”. To podstawowe nieporozumienie. Po prostu robią dokładnie to, czego szukasz. To jest tylko wtedy, gdy próbujesz zapisać bufor , że plik zostanie utworzony. Jeśli nie spróbujesz zapisać bufora, plik nie zostanie utworzony. Z tego, co rozumiem do tej pory, chcesz „odwiedzić plik” (co tak naprawdę oznacza otworzyć bufor w odpowiednim trybie).Odpowiedzi:
Polecenia do przeglądania plików, takie jak
C-x C-f
nie tworzą pliku do odwiedzenia. Robią to, czego szukasz.Plik jest tworzony tylko wtedy, gdy próbujesz zapisać bufor .
Jeśli nie spróbujesz zapisać bufora, plik nie zostanie utworzony. Z tego, co rozumiem do tej pory, chcesz „ odwiedzić plik ” (co tak naprawdę oznacza otworzyć bufor w odpowiednim trybie).
źródło
n
żeby nie zapisać, albo (często) po prostu zapiszę bufor. A później podrzucam utworzony plik ... lub nie.)*scratch*
: zostaniesz poproszony o zapisanie, gdy ten palec automatycznie uderzyC-x C-s
.Jeśli od lat korzystasz z rozwiązania Jurija Linkova .
Tworzę tymczasowe bufory z czymś takim
C-x
b
test.org
C-j
. Jestmajor-mode
to określane przez rozszerzenie pliku za pośrednictwemauto-mode-alist
.Aby przetestować efekt, możesz spróbować
(prog1 (and (switch-to-buffer "my-new.org") major-mode) (kill-buffer "my-new.org"))
=>
org-mode
. Po czyszczeniuemacs -q
test wróciłbyfundamental-mode
.źródło
advice
opcja, z której korzystałem. Nie jestem pewien, czy śledzę, po co jest ta(prog1...)
część, ale ta(setq-default major-mode ...)
część jest całkiem fajna.prog1
-test tylko pokazuje, że można uzyskać oczekiwanemajor-mode
podczas przełączania do bufora. Przejrzyjsetq-default
część i uruchom test. Wróciorg-mode
Bezsetq-default
tego wrócifundamental-mode
.Zrozumiałem sposób na porady, korzystając z pomysłów pochodzących z komentarzy @ Drew i odpowiedzi @ glucas, które tutaj nagrywam, na wypadek, gdyby były przydatne dla kogokolwiek.
Krótka wersja: skorzystaj z
after
porady, aby sprawdzić, czy bufor ma powiązaną nazwę pliku, ustaw tymczasowo jeden plik, jeśli nie ma, a następnie pozwól pozostałymset-auto-mode
maszynom zająć się szczegółami. Po kilku testach (niezbyt obszernych) wydaje się, że działa dobrze.W przypadku
ido-switch-buffer
waniliiswitch-to-buffer
dwie rady to:Uważam tę opcję za pomocną w
find-file
kwestii podniesionej przez @Drew, ponieważ moje palce mogą wyprzedzić mój mózg: pamięć mięśni często przenosi mnie na terytorium przełączania do bufora, zanim w pełnifind-file
przyjdzie mi do głowy, że zrobię to, czego potrzebuję. Teraz obie opcje są dostępne.AKTUALIZACJA: mały, ale potencjalnie drażniący błąd w powyższym kodzie: ponownie uruchomi zaczep trybu na buforze za każdym razem, gdy do niego przełączysz. Poniżej podano rzeczywistą nazwę pliku z
/tmp
katalogu i pozwala uniknąć tego problemu:źródło
set-auto-mode
Funkcja ustawia tryb oparty na pliku związanego z buforem. Oto funkcja, która tymczasowo ustawiabuffer-file-name
nazwę bufora w celu ustawienia trybu:Możesz uruchomić to po zmianie nazwy bufora za pomocą porady:
Nie jestem pewien, czy jest to najlepsze miejsce, aby podłączyć to do nowych buforów. Tutaj używam
buffer-list-update-hook
, ale to jest wywoływane w większej liczbie przypadków, niż potrzebujemy.źródło
buffer-list-update-hook
ponieważchange-major-mode-hook
nie był wywoływany z oczekiwanym bieżącym buforem. Dla przypomnienia, prawdopodobnie bardziej sensowne jest doradzenie twojej funkcji bufora przełączania, tak jak @Dan w swojej odpowiedzi.Możesz użyć buforów * scratch * w celu utworzenia buforów tymczasowych, które mają ten sam tryb główny, co plik, nad którym możesz pracować.
Oto odpowiedź emacs SE, która może rozwiązać twój problem:
Jak mogę szybko przełączać między plikiem a buforem * scratch * o tym samym trybie głównym?
Odpowiedzi na pytania i odpowiedzi zostały przeze mnie opublikowane. Odpowiedź w funkcji wykonuje następujące czynności:
*scratch-X-mode*
jeśli jeszcze nie istnieje, i przełącza się na ten nowo utworzony bufor.*scratch-X-mode*
już istnieje, po prostu przełącza się na ten bufor.źródło
Jest tu kilka dobrych odpowiedzi, ale chciałem dodać jeszcze jedną rzecz. Emacs ma mnóstwo funkcji i często istnieje kilka sposobów na zrobienie czegoś. Możesz dodać tagi na górze dowolnego pliku, który mówi emacsowi, jakiego typu, niezależnie od rozszerzenia. Na przykład dodając to:
Na górze pliku poinformuje emacsa, że jest to plik Pythona, nawet bez
.py
rozszerzenia. Zauważ, że#
na początku linii jest komentarz w stylu Pythona. Dla różnych typów plików możesz użyć różnych komentarzy. Na przykład, aby określić plik Lisp, którego używasz;
do uruchomienia wiersza komentarza i ustaw tryb w emacsie w następujący sposób:Zobacz Określanie zmiennych plików i wybieranie trybów plików .
źródło
switch-buffer
) i automatycznego ustawienia trybu na inny niżfundamental-mode
.