Фильтрация текста с помощью командной строки в Emacs

StackOverflow https://stackoverflow.com/questions/206806

  •  03-07-2019
  •  | 
  •  

Вопрос

В vi[m] есть ! команда, которая позволяет мне передавать текст с помощью команды командной строки - например, sort или indent - и верните отфильтрованный текст обратно в буфер.Есть ли эквивалент в emacs?

Это было полезно?

Решение

Вы можете выбрать регион и ввести `C-u M-| command RET', и он заменит регион выводом команды в том же буфере из-за интерактивного префиксного аргумента shell-command-on-region.

Другие советы

Я написал это несколько лет назад, возможно, это поможет вам:

(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)))))

Я нашел эту функцию очень полезной.Если вы также находите это полезным, я предлагаю привязать его к какой-нибудь функциональной клавише для удобства, которую лично я использую F3:

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

Поздняя правка:Как бы сильно я ни ценил положительные отзывы, ответ Юрты - это правильный путь.И взлом Грега аккуратнее моего.

Я оставлю все это здесь, потому что это может чего-то стоить, но...


M-x shell-command-on-region, который , по - видимому , связан с M-| по умолчанию.


Я вижу, что это не совсем то, о чем просил Рохит.Используя C-h f shell-command-on-region показывает, что желаемое поведение доступно в неинтерактивной версии команды (путем установки аргумента replace до ненулевого значения).Мы должны быть в состоянии написать оболочку для этого.

Попробуйте это (загрузите его в *scratch* и бежать M-x eval-buffer, если это сработает, скопируйте его в свой файл .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)
  )

И обратите внимание, как я уже сказал в комментариях, что это не очень скудный поступок.Но я думаю, что это работает.


Для всех читателей, которые не знают, как выбрать регион:

  1. Переместите "точку" (текущее положение курсора) в один конец области и используйте C-space чтобы активировать "отметку"
  2. Переместите точку на другой конец области
  3. Вы закончили, вызовите команду
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top