Есть ли удобный общий способ “захватить” отраженный результат команды в Emacs (M-: или M-!)?

Kivio, поскольку имя отчасти подразумевает, является конкурентом KDE Visio. Это - часть комплекта KOffice.

Примечание: KOffice, а также некоторые его приложения были недавно переименованы. KOffice теперь называют Calligra Suite, и Kivio называют Потоком Calligra. Однако еще не было выпуска начиная с переименовывания.

5
13.04.2017, 15:36
3 ответа

Ввести C-u прежде также M-: или M-! вставить результат вместо отправленного в площадь рассеяния.

Для получения вещей непосредственно в кольцо уничтожения необходимо баловаться Elisp. Что-то вроде этого (непротестированное):

;;; kill ring version of M-!
(defun shell-command-to-kill-ring (command)
    (interactive
      (list
        (read-shell-command "Shell command: " nil nil
                (let ((filename
                       (cond
                    (buffer-file-name)
                    ((eq major-mode 'dired-mode)
                     (dired-get-filename nil t)))))
                  (and filename (file-relative-name filename))))
        current-prefix-arg
        shell-command-default-error-buffer))
    (kill-new (shell-command-to-string command)))

;;; kill-ring version of M-:
(defun eval-expression-to-kill-ring ()
    (interactive)
    (call-interactively 'eval-expression)
    (kill-new (car values)))
7
27.01.2020, 20:34
  • 1
    Мой пример для M-: был конкретно составлен так, чтобы команда elisp зависела от текущего буфера (путь файла, который посещают), и я мог бы хотеть вставить его в другой буфер. Мой другой пример был похож M-!, но в сушеном режиме (!), где вставка результата в буфер не имела бы смысла. –  imz -- Ivan Zakharyaschev 20.03.2011, 19:47
  • 2
    я был немного удивлен обнаружить, что нет никакого общего интерактивного механизма для сохранения вывода в регистре; это кажется довольно очевидным. –  geekosaur 20.03.2011, 20:36

Небольшое улучшение на решении geekosaur. Это делает правильную вещь, даже если выражение оценивает к чему-то другому, чем строка.

(defun c5-eval-to-kill-ring ()
  (interactive)
  (kill-new (with-output-to-string (princ (call-interactively 'eval-expression)))))

(global-set-key (kbd "C-;") 'c5-eval-to-kill-ring)
2
27.01.2020, 20:34

Все сообщения, отраженные в области сообщений, сохраняются в *Messages* буфер, поэтому просто переключитесь на него (C-h e, view-echo-area-messages) и выберите то, что Вы хотите.

Если Вы хотите получить значение выражение, которое не зависит от текущего буфера, можно также переключиться на *scratch* буфер. Введите свое выражение и нажатие C-j (eval-print-last-sexp).

2
27.01.2020, 20:34
  • 1
    Спасибо за Ваш ответ! На самом деле существует неудобство с *Messages*: если я в конце *, обменивается сообщениями* (после того, как C-h e) и хочу выбрать последнюю строку, я пытаюсь сделать очевидное: установите метку, переместите одну строку вверх. Но C-SPC (установка метки), самой печатает сообщение к *сообщения*, таким образом, мой новый регион "испорчен" с новым сообщением. Я должен сделать дополнительные перемещения для предотвращения этого плохого эффекта. Этот комментарий должен здесь только назвать один недостаток этого решения, чтобы смочь сравнить его с другими решениями, если им предложат; не, что я отбрасываю это решение. –  imz -- Ivan Zakharyaschev 20.03.2011, 19:16
  • 2
    @imz: Положительные стороны. Я добавил привязку клавиш (она не существовала, когда я изучил Emacs). Я создал Emacs, таким образом, я редко получаю a Mark set сообщение, но решение geekosaur более удобно так или иначе. –  Gilles 'SO- stop being evil' 20.03.2011, 19:45

Теги

Похожие вопросы