2008-10-15 9 views

Odpowiedz

100

można wybierz region i wpisz `C-u M- | command RET ', i zastępuje region wyjściowym poleceniem w tym samym buforze z powodu interaktywnego argumentu prefiksowego polecenia powłoki-na-obszarze.

+2

Jurta za zwycięstwo. Awansuj. Przysięgam, że za każdym razem, kiedy myślę, że zaczynam znać ten program, ktoś przychodzi i pokazuje mi, że jestem początkującym rangą. – dmckee

+0

Zwykle, gdy potrzebna jest funkcja w Emacs, istnieje duże prawdopodobieństwo, że została już wdrożona dawno temu. Najlepiej więc najpierw przeczytać dokumentację, zamiast zacząć odkrywać nowe koło;) – link0ff

+1

Dzięki jurta. Niestety nie mogłem znaleźć żadnej dokumentacji dla tej funkcji. – Rohit

7

Późna edycja: Tak jak doceniam upvotes, odpowiedź Jurty jest drogą do zrobienia. A hak Grega jest lepszy niż mój.

zostawię resztę tego tutaj, bo to może być coś warte, ale ...


M-x shell-command-on-region, który wydaje się być związany z domyślnie.


Widzę, że nie robi dokładnie tego, o co poprosił Rohit. Korzystanie z C-h f shell-command-on-region ujawnia, że ​​pożądane zachowanie jest dostępne w nieinteraktywnej wersji polecenia (ustawiając wartość argumentu replace na wartość niezerową). Powinniśmy być w stanie napisać wrapper, aby to zrobić.

Spróbuj tego (załadować je do *scratch* i uruchomić M-x eval-buffer, czy to działa, skopiuj go do swojego pliku .emacs):

(defun shell-command-on-region-replace (start end command) 
    "Run shell-command-on-region interactivly replacing the region in place" 
    (interactive (let (string) 
     (unless (mark) 
      (error "The mark is not set now, so there is no region")) 
     ;; Do this before calling region-beginning 
     ;; and region-end, in case subprocess output 
     ;; relocates them while we are in the minibuffer. 
     ;; call-interactively recognizes region-beginning and 
     ;; region-end specially, leaving them in the history. 
     (setq string (read-from-minibuffer "Shell command on region: " 
          nil nil nil 
          'shell-command-history)) 
     (list (region-beginning) (region-end) 
       string))) 
    (shell-command-on-region start end command t t) 
) 

I pamiętać, jak mówię w komentarzach, że nie jest to bardzo emacsy rzecz do zrobienia. Ale myślę, że to działa.


przypadku jakichkolwiek czytelników, którzy nie wiedzą jak wybrać region:

  1. przesunąć „punkt” (aktualna pozycja kursora) na jednym końcu regionie i używać C-space aby uaktywnić „znak”
  2. Przeniesienie punktu do drugiego końca regionu
  3. skończysz, wywołać polecenie
+0

Dziękuję, wiem o tym, ale to daje mi przefiltrowaną tekst w osobnym buforze; nie zastępuje oryginału. – Rohit

+0

Znam zachowanie vi, które chcesz. Nadal poszukuje. – dmckee

+0

Interesujące, że nie jest to po prostu FAQ. Używam tej funkcji w vi (lub vim) przez cały czas; edytor bez niego staje się ... mniej interesujący. –

15

Napisałem to kilka lat wstecz, to może pomóc:

(defun generalized-shell-command (command arg) 
    "Unifies `shell-command' and `shell-command-on-region'. If no region is 
selected, run a shell command just like M-x shell-command (M-!). If 
no region is selected and an argument is a passed, run a shell command 
and place its output after the mark as in C-u M-x `shell-command' (C-u 
M-!). If a region is selected pass the text of that region to the 
shell and replace the text in that region with the output of the shell 
command as in C-u M-x `shell-command-on-region' (C-u M-|). If a region 
is selected AND an argument is passed (via C-u) send output to another 
buffer instead of replacing the text in region." 
    (interactive (list (read-from-minibuffer "Shell command: " nil nil nil 'shell-command-history) 
        current-prefix-arg)) 
    (let ((p (if mark-active (region-beginning) 0)) 
     (m (if mark-active (region-end) 0))) 
    (if (= p m) 
     ;; No active region 
     (if (eq arg nil) 
      (shell-command command) 
      (shell-command command t)) 
     ;; Active region 
     (if (eq arg nil) 
      (shell-command-on-region p m command t t) 
     (shell-command-on-region p m command))))) 

Znalazłem tę funkcję, aby być bardzo pomocne. Jeśli okaże się ona przydatna również, proponuję wiążący go do jakiegoś klawisza funkcyjnego dla wygody, osobiście używam F3:

(global-set-key [f3] 'generalized-shell-command) 
+0

Doskonały. Działa to tak jak rura "C-k /" joe'a za pośrednictwem polecenia powłoki. –

Powiązane problemy