Nie pamiętam już, kiedy ostatnio kliknąłem w scrollbar. Kręcę kółkiem albo używam klawiatury (a czasy myszy bez kółka kojarzą mi się traumatycznie). Niemniej jednak zwracam trochę uwagi na tą znienawidzoną kontrolkę - pokazuje jak duży jest dokument i w jakiej jego części się znajduję.
Ostatnio znalazłem dwie interesujące rzeczy zamiast. Zrobiły na mnie wrażenie - miło trafić na świeży, ciekawy pomysł w interfejsie, w którym na pozór wszystko dawno wymyślono.
Mapa pliku
Mapkę pliku pierwszy raz zobaczyłem w SublimeText
Bardzo sympatyczny pomysł, daje informację gdzie jestem, lepiej niż scrollbar pomaga w nawigacji, wreszcie - daje wizualny obraz pliku (przypominają się techniki czytania kodu, w których zmniejsza się do minimum font by zobaczyć kształt i rozmiar, tu mamy to za darmo i stale). I ładne wykorzystanie bieżącej technologii - parę lat temu byłaby to strata zbyt dużej ilości miejsca, na szerokim monitorze LCD tego problemu nie ma.
Samego SublimeText nie poużywam (choć notuję go sobie na wypadek, gdybym kiedyś znów trafił na Windows) - co prawda działa pod Wine ale wroga klawiaturze windowsowa kontrolka otwierania pliku wystarcza, by mnie zniechęcić. Poszukałem jednak i ... znalazłem podobne rozwiązanie dla Emacsa.
Rzecz nazywa się MiniMap i po krótkiej konfiguracji wygląda tak:
Nie jest to rozwiązanie tak udane, jak w SublimeText - w
szczególności, nie otwiera się automatycznie (trzeba explicite zażądać
wyświetlenia minimapki), nie zmienia zawartości po przełączeniu się
na inny bufor i nie współdziała w pełni z zarządzaniem oknami
(np. C-x 1
chowa także mapkę) - ale nawet w tej formie jest
przydatne. Zwłaszcza przy czytaniu lub edycji dużego pliku.
Instalacja
Instalacja sprowadza się do pobrania pliku minimap.el,
wrzucenia go do któregoś z katalogów lispowych i wpisania
do .emacs
:
(require 'minimap)
Minimapkę następnie można otworzyć przez M-x minimap-create
(a
zamknąć M-x minimap-kill
) Jest to mało poręczne, dlatego
zdefiniowałem sobie skrót klawiszowy. Przy czym zamiast mapować te
dwie funkcje osobno, wolałem zrobić jeden przełącznik. Win-m
wyświetli minimap jeśli go nie ma, a schowa, jeśli jest:
(defun minimap-toggle () "Show minimap if hidden, hide if present." (interactive) (if (and minimap-bufname (get-buffer minimap-bufname) (get-buffer-window (get-buffer minimap-bufname))) (minimap-kill) (minimap-create)) ) ; Win-m (define-key global-map [8388717] 'minimap-toggle)
Skąd się wziąły magiczne cyferki (
8388717
)? Opisywałem to w artykule o używaniu klawisza Win pod Emacsem.
Po wczytaniu powyższej konfiguracji (restart emacsa albo zaznaczenie
dodanego do .emacs
fragmentu i M-x eval-region
) można otworzyć
dowolny spory plik, wcisnąć Win-M
i cieszyć się mapką.
Konfiguracja
Do komfortu używania warto jeszcze skorygować kilka ustawień.
Wszystkie są dostępne po M-x customize-group minimap
.
Na moim monitorze minimapowe okienko było trochę zbyt szerokie,
przestawiłem Minimap Width Fraction
na 0.17
(domyślnie jest 0.20
czyli 1/5 szerokości okna).
Ustawiłem też Minimap Dedicated Window
na On
(ustawienie to zabezpiecza
przed przypadkowym pojawieniem się w okienku minimapy wyników kompilacji
czy podpowiedzi przy dopełnianiu komendy).
Wreszcie, zmieniłem Minimap update delay
na 0.1
(jest to opóźnienie
po którym bufor minimapki synchronizuje się ze zmianami pozycji w edytorze,
domyślne 0.2
było dla mnie zbyt wolne).
Ostatnią sprawą była zmiana fontu - domyślnie używane przeze mnie
DejaVu w malutkim rozmiarze zrobiło się zbyt tłuste. Wypróbowałem
kilka czcionek, aktualnie najbardziej pasuje mi chyba
Inconsolata. By jej używać, w ramach Minimap Font Face
wpisałem
Font Family: Inconsolata
. Eksperymentowałem też z Height in 1/10 pt: 40
ale jednak wolę domyślne 30.
Dygresja o czcionkach
Inconsolata to interesujący font o stałej szerokości, dobrze wyglądający na dużych ekranach LCD (przy stosowaniu antyaliasingu), moim zdaniem obok DejaVu Sans Mono bodaj najlepszy wybór do edytora programisty. Na Debianie i Ubuntu można ją zainstalować przez
sudo apt-get install ttf-inconsolata
A na poniższym obrazku w górnym okienku jest DejaVu Sans Mono 10, a w dolnym Inconsolata Medium 12 (jak widać, mimo różnego deklarowanego rozmiaru, są bardzo zbliżonej wielkości).
A przy okazji wybierania fontu dla MiniMap po raz kolejny stwierdziłem, że żaden z programów do wyszukiwania/wybierania czcionek nie jest naprawdę poręczny.
Chyba najbliżej jest fontmatrix
(instalacja: apt-get install
fontmatrix
), który potrafi filtrować po fragmentach nazwy, pokazywać
ten sam tekst w wielu fontach równocześnie i daje możliwości tagowania,
ale i tu paru ważnych funkcji brakuje (np. ograniczania się do
czcionek skalowalnych, czcionek posiadających ustalony rozmiar
czy - najbardziej uciążliwe - do tych, które zawierają polskie znaki).
Coś ciekawego w sobie ma też font-manager (można zainstalować pakiet), tu ładna jest opcja dodawania wybranych czcionek do porównania.
Położenie
A na koniec o dużo drobniejszym sposobie wizualizowania rozmiaru edytowanego pliku i położenia widocznego tekstu w ramach całości. Niewielki prostokąt na pasku intuicyjnie prezentuje jaką część tekstu widzę i jak ma się ona do całości.
Szary prostokąt odpowiada widocznej części - jego położenie i rozmiar zmieniają się zależnie od tego, jaką część pliku widać.
Aby włączyć mechanizm należy pobrać plik
sml-modeline.el i umieścić go w site-lisp
, a następnie
dodać do .emacs
:
(if (require 'sml-modeline nil 'noerror) ;; use sml-modeline if available (progn (sml-modeline-mode 1) ;; show buffer pos in the mode line (scroll-bar-mode -1)) ;; turn off the scrollbar (scroll-bar-mode 1) ;; otherwise, show a scrollbar... (set-scroll-bar-mode 'right)) ;; ... on the right
Wyłączanie scrollbara oczywiście nie jest obowiązkowe.