2012-12-10 18 views
7

Próbuję zmienić kolor mojego kursora wewnątrz Emacsa na inny kolor dynamicznie.Emacs wewnątrz terminala zmienia kolor kursora dynamicznie

Używam emacs -nw dla terminala Emacs. Terminal, którego używam, to Rxvt-Unicode (Urxvt).

Ponieważ Emacs nie może (jak sądzę) wprowadzić zmian w terminalu, (set-cursor-color "red") nie będzie działać. W celu zmiany koloru kursora na terminalu mogę uruchomić echo -ne '\033]12;red\007'. Zmienia kolor kursora na czerwony.

W programie Emacs próbowałem uruchomić to polecenie. M-x shell-command RET echo -ne '\033]12;red\007' RET

Jednak Emacs ucieknie przed powtarzającym się ciągiem i wydrukuje go w dolnej części okna, a nie wprowadzi żadnych zmian kursora.

Naprawdę nie wiem, co jeszcze mogę zrobić, nie chcę używać GUI Emacsa. Czy ktoś wie, jak to obejść? Chcę być w stanie zmienić kolor mojego kursora w zależności od mojego bieżącego trybu, dlatego musi być dynamiczny. Jeśli ktoś ma jakieś inne sugestie, byłbym szczęśliwy, gdyby je usłyszał!

+0

'shell-command' uruchamia polecenie w gorszej powłoce, więc nie będzie działać w zawierających Emacs. Nie wiem, jak zmusić Emacsa do powtarzania sekwencji ucieczki bezpośrednio ... Próbowałem użyć (wiadomość ...) z sekwencją ucieczki, ale bez powodzenia. – scottfrazer

Odpowiedz

5

Myślę, że chcesz użyć send-string-to-terminal.

E.g. (send-string-to-terminal "\033]12;red\007").

+0

Wygląda na to, że jest to najlepsze rozwiązanie! Wielkie dzięki. Boli mnie, że muszę nie akceptować odpowiedzi Francesco, ale ta działa najlepiej. Wciąż dziękuję wam za pomoc! – Attic

+0

Ok teraz czuję się głupio :(chociaż myślałem, że zadziałało (i robi), jednak za każdym razem, gdy uruchomię tę funkcję, drukuje tekst w edytorze, więc to się nie sprawdzi, boję się. zostaw to pytanie bez odpowiedzi na dłużej, bo inaczej będę musiał ponownie przyjąć odpowiedź Francesca Moje przeprosiny .. – Attic

+0

To zdecydowanie wydaje się być właściwą drogą, ale nie rozumiem, dlaczego to nie działa spodziewany...(W mojej konfiguracji nie zmienia koloru kursora i drukuje sekwencję ANSI w terminalu, muszę uruchomić 'M-x redraw-display', aby się go pozbyć) – Francesco

2

To bardzo hackish rozwiązanie - Mam nadzieję, że ktoś znajdzie lepszy:

(suspend-emacs "echo -ne '\\033]12;red\\007'; fg\n") 

Działa poprzez tymczasowe zawieszenie procesu Emacs i farsz polecenia do terminala bazowego, aby powłoka zmienić kursor kolor i wznów emacs po tym. Jednak powoduje to migotanie ekranu, gdy ramka emacs tymczasowo znika.


Tutaj kolejnym bardzo hackish system zależne rozwiązanie:

(shell-command (format "echo -ne '\\033]12;red\\007' > /proc/%d/fd/1" (emacs-pid))) 

Działa (przynajmniej Linux) poprzez bezpośrednie przesyłanie sekwencji wyjściowej ANSI do terminala (który jest dostępny przez /proc/PID pseudo-system plików). Nie uważam tego rozwiązania za bardziej eleganckie niż poprzednie, ale przynajmniej nie powoduje migotania ekranu.

+0

To wydaje się działać, migotanie ekranu jest trochę denerwujące, ale może nie być lepszego sposobu. Jeśli ktoś mógłby wymyślić lepszy sposób, który byłby świetny. – Attic

+0

Nawet jeśli nie jest "elegancki", działa! Wielkie dzięki za to rozwiązanie! – Attic

Powiązane problemy