Napisałem funkcję Emacs Lisp, która wywołuje polecenie powłoki do przetwarza dany ciąg znaków i zwraca wynikowy ciąg znaków. Oto uproszczony przykład, który po prostu wywołuje tr
do konwersji tekstu na wielkie litery:Jak zapobiec ustawianiu granicy cofania przez Emacs?
(defun test-shell-command (str)
"Apply tr to STR to convert lowercase letters to uppercase."
(let ((buffer (generate-new-buffer "*temp*")))
(with-current-buffer buffer
(insert str)
(call-process-region (point-min) (point-max) "tr" t t nil "'a-z'" "'A-Z'")
(buffer-string))))
Funkcja ta tworzy tymczasowy bufor, wstawia tekst wzywa tr
, zastępuje tekst z wyniku, i zwraca wynik.
Powyższa funkcja działa zgodnie z oczekiwaniami, jednak po napisaniu wrappera wokół tej funkcji, aby zastosować polecenie do regionu, do historii cofania dodawane są dwa kroki: . Oto kolejny przykład:
(defun test-shell-command-region (begin end)
"Apply tr to region from BEGIN to END."
(interactive "*r")
(insert (test-shell-command (delete-and-extract-region begin end))))
Kiedy zadzwonić M-x test-shell-command-on-region
region otrzymuje z tekstu wielkimi literami, ale po naciśnięciu C-_
(undo
), pierwszy krok w historii cofania jest stan z tekstem został usunięty . Przechodząc o kolejne dwa kroki, oryginalny tekst zostanie przywrócony.
Moje pytanie brzmi: w jaki sposób można zapobiec dodaniu kroku pośredniego z numeru do historii cofania? Czytałem Emacs documentation on undo, , ale nie wydaje się, aby rozwiązać ten problem, o ile wiem.
Oto funkcja, która realizuje to samo przez wywołanie wbudowanej funkcji Emacs upcase
, podobnie jak poprzednio: na skutek delete-and-extract-region
z wynikiem są przekazywane do insert
:
(defun test-upcase-region (begin end)
"Apply upcase to region from BEGIN to END."
(interactive "*r")
(insert (upcase (delete-and-extract-region begin end))))
Podczas wywoływania M-x test-upcase-region
jest tylko jeden krok w historii cofania , zgodnie z oczekiwaniami. Wydaje się więc, że wywołanie test-shell-command
tworzy granicę cofania. Czy można tego w jakiś sposób uniknąć ?
Zwykłym sposobem, aby zapobiec poleceń od zaśmiecania '(aś)' jest znaleźć inną drogę , który tego nie robi. Przykładem tutaj jest to, że prawie nigdy nie należy tworzyć tymczasowego bufora, lecz pracować z obiektami. – PascalVKooten
Oprócz ręcznego czytania i zapisywania w plikach tymczasowych, nie jestem pewien inny sposób przechwytywania danych wyjściowych procesu. Nawet asynchroniczne polecenia procesowe, takie jak 'start-process', wydają się chcieć wysłać dane wyjściowe do bufora. –
@JasonBlevins Piąty parametr polecenia 'shell-command-on-region' to REPLACE, dlaczego więc chcesz go zawinąć? –