Chciałbym stworzyć funkcję, która wykonuje „szybki podgląd” pliku, który jest podważony.
Chciałbym, aby to zadziałało: przytrzymuję klawisz funkcyjny, co powoduje, że plik jest widoczny w buforze, ale kiedy go zwolnię, bufor się zamyka i bufor zwrócony. Nie chcę zamykać bufora tymczasowego za pomocą C-x k
.
Czy istnieje sposób na uczynienie tej funkcji w Emacsie? Wydaje się możliwe, że mogę powiązać funkcje z naciśnięciem / naciśnięciem klawisza.
key-bindings
dired
keymap
Eric Brown
źródło
źródło
Odpowiedzi:
Oto mój super hackerski sposób na symulację powiązania zdarzenia kluczowania / opuszczania za pomocą timerów.
Ogólnie sugerowałbym skorzystanie z odpowiedzi Sigmy, ale poprosiłeś o sposób na zamknięcie podglądu przez zwolnienie, więc muszę spróbować.
Zasadniczo to, co możesz zrobić, to powiązać funkcję, która będzie twoją funkcją „keydown”, z klawiszem i wewnątrz tej akcji, uruchom licznik czasu bezczynności, który wykonuje funkcję, która jest twoją funkcją „keyup”, dopóki przytrzymasz klawisz dane klucze, funkcja „keydown” będzie się uruchamiała w kółko, co uniemożliwi działanie liczników czasu bezczynności. Oczywiście musisz zrekompensować fakt, że polecenie będzie się uruchamiało w kółko, prawdopodobnie przez ponowne przypisanie klawisza do jakiejś funkcji noop w funkcji „keydown”, a następnie ponowne przypisanie funkcji „keydown” w funkcji „keyup”.
Tak więc w twoim przypadku funkcja „keydown” otworzy bufor podglądu z zawartością pliku w punkcie iw tym buforze podglądu wiąże tę samą kombinację klawiszy z jakimś poleceniem noop. Funkcja „keydown” uruchomi również czas bezczynności, który usunie bufor podglądu i przywróci Cię z powrotem tam, gdzie byłeś.
Krótka historia tutaj to kod:
Powiązanie tej funkcji z kombinacją klawiszy (użyłem C-M-v), kiedy naciśniesz ją nad nazwą pliku, otworzy się nowy bufor wyświetlający zawartość pliku w punkcie, kiedy puścisz, nastąpi powrót do pierwotnego bufor.
Również tutaj jest gif w akcji, wszystko co robię to:
Jedną ważną rzeczą, na którą należy zwrócić uwagę, są sekundy bezczynnika, w moim kodzie użyłem,
.7
ale to rodzaj magicznej liczby, chcesz zachować ją naprawdę małą, ale jeśli widzisz, że podgląd miga dwa razy, spróbuj za każdym razem zwiększać go o 1/10 sekundy aż znajdziesz odpowiednie miejsce dla swojej maszyny.* Zauważ też, że w funkcji staram się trochę czcionkizować bufor podglądu, ale nie udało mi się go uruchomić, to będzie następny krok, aby uczynić go bardziej użytecznym. **
źródło
Error running timer: (void-variable buffer)
, wygląda na to, żebuffer
var nie jest dostępny wrun-with-idle-timer
?Jak wskazano w komentarzach, funkcje są powiązane z kluczami, a nie ze zdarzeniami. Ale aby cofnąć się o krok, nie jestem pewien, czy rozumiem, dlaczego ważne jest, aby trzymać wciśnięty klawisz podczas (prawdopodobnie) czytania zawartości pliku. Byłoby to również niezgodne z podstawowymi (i rozsądnymi) działaniami, takimi jak przewijanie, aby uzyskać więcej. Nie wspominając już o tym, że jeśli to potrwa chwilę, może stać się niewygodne :)
Co powiesz na powtórzenie klucza zamiast tego? Coś takiego może być podstawowym szkieletem funkcjonalnego odpowiednika:
W każdym razie bardziej podważam twój przypadek użycia niż odpowiadanie na twoje pytanie, ponieważ nie ma to nic wspólnego z powiązaniami klawiszy / naciśnięć :)
źródło
dired-view-file
! Zmodyfikowałem swój kod, aby go wykorzystać. Tak, myślę, że w tego rodzaju scenariuszu nie jest konieczne przejście do innego klucza.Zamiast pokazywać plik podczas naciskania klawisza, co byłoby bardzo trudne do wdrożenia, sugeruję pokazywanie pliku aż do naciśnięcia następnego klawisza.
Oto wariant, który pokazuje plik w innym oknie, co moim zdaniem jest wygodniejszym interfejsem użytkownika.
Nie będziesz w stanie zrobić tyle, co przewijanie w buforze. Bardziej sensowne może być wdrożenie trybu „szybkiego podglądu”, w którym akceptowane są polecenia przewijania, ale inne zdarzenia wejściowe powodują zakończenie trybu szybkiego podglądu i są interpretowane zgodnie z poprzednim trybem, takim jak Isearch.
Za pomocą
v
(dired-view-file
) otrzymujesz coś pośredniego: bufor jest edytowany w trybie przeglądania , w którym możesz przewijać, wyszukiwać itp., Ale zamknięcie bufora jest prostym naciśnięciem klawiszaq
.źródło
Inną możliwością, jeśli używasz myszy, jest umieszczenie podglądu w podpowiedzi . Następnie, gdy najedziesz myszką na nazwę pliku (z właściwością
help-echo
), pojawi się podgląd.Używam tej techniki w Dired + , na przykład, aby (opcjonalnie) wyświetlać podgląd obrazów związanych z plikami obrazów, gdy najedziesz myszką na nazwy plików.
Możesz zobaczyć efekt tego, robiąc to po załadowaniu
dired+.el
:Upewnić się, że
tooltip-mode
jest włączony:(tooltip-mode 1)
.Upewnij się, że opcja
diredp-image-preview-in-tooltip
ma innąnil
wartość (rozmiar miniatury lubfull
obraz w pełnym rozmiarze).Umieść wskaźnik myszy nad nazwą pliku obrazu w Dired.
Możesz użyć kodu funkcji
diredp-mouseover-help
jako inspiracji do robienia tego, co chcesz (wyświetl swój „szybki podgląd” po najechaniu myszką). Zobacz wywołania tej funkcji, aby dowiedzieć się, jak z niej korzystać. Oto jedno takie połączenie:źródło
image-dired
działa dobrze, ale wszystko, co widzę po najechaniu myszą tomouse-1: visit this file/dir in another window
dired+.el
i nie wykonasz innych instrukcji, które podałem. To nie jest waniliowa funkcja Emacsa. Próbowałem opisać, jak możesz zrobić własny kod, aby zrobić to, co chcesz.dired+.el
Kod jest bardzo blisko, jak sądzę, do tego, co chcesz powiedzieć. Ale tak, podpowiedzi najechania myszką wymagają użycia myszy. Jeśli tego nie zrobisz, sugestia użycia podpowiedzi niewiele pomoże. ;-)Z bufora dired vodwiedzi plik w trybie tylko do przeglądania, qwyjdzie z trybu przeglądania i zabierze Cię z powrotem do bufora dired. Jest to szybki sposób na wyświetlenie podglądu pliku i daje możliwość przewijania, a nawet przeszukiwania bufora.
Nie sądzę, aby emacs mógł przekazywać wiadomości o niskim naciśnięciu klawisza otrzymywane z systemu operacyjnego. Może to częściowo wynikać z przyczyn historycznych. Terminale dostępne dla hakerów (czytaj „programiści”) w czasie, gdy emacs był rozwijany w latach 70. i 80. XX wieku, nie działały ze zdarzeniami kluczowymi w górę / w dół w czasie rzeczywistym, ale raczej prostym wprowadzaniem znaków i sekwencji ucieczki. Do dziś emacs może nadal imponująco dobrze działać w ramach prostej sesji terminalu lub SSH, używając tylko prostych znaków ASCII i sekwencji ucieczki.
Nie oznacza to, że funkcjonalność nie rozwinęła się znacząco na przestrzeni lat, obejmując takie funkcje, jak menu, zarządzanie wieloma ramkami i interakcja myszy. Nie ma powodu (jestem tego świadomy), że emacs nie mógł zostać zmieniony (w jego rdzeniu), aby udostępnić kluczowe wiadomości niskiego poziomu dla rozszerzeń, ale nie wstrzymałbym cię.
( Uwaga: ten post powinien być traktowany jako opinia i spekulacja, a nie fakt).
źródło
Dałem moje rozwiązanie w tym SO pytaniu /programming/26409768/how-to-show-buffer-content-in-real-time-in-other-window-when-focus-is-in- bufor
a moją odpowiedzią jest zmiana zachowania klawiszy nawigacyjnych
n
ip
pokazanie pliku w punkcie w innym oknie. Fokus pozostaje w opróżnionym buforze i zabijamy odwiedzany bufor podczas przeglądania.Utworzyłem tryb pomocniczy, aby łatwo włączyć / wyłączyć tę funkcję. Pamiętaj, że nadal mamy klawisze strzałek do nawigacji „normalnej”. Zadzwoń
M-x dired-show-mode
(lubranger-mode
ponieważ jest to funkcja, którą odkryłem w menedżerze plików ranger ).Kod: (doceniamy każdą recenzję i zgłoszenie błędu!) Https://gitlab.com/emacs-stuff/my-elisp/blob/master/dired-show.el
źródło
Trzeba będzie sondować kolejkę zdarzeń, dopóki inne zdarzenie lub żadne nie zostanie odczytane. Obciążenie procesora jest zauważalne, choć stosunkowo niskie.
źródło