Buffer proses shell Async selalu mengganggu pengaturan jendela

8

Saya sering meluncurkan program eksternal menggunakan emacs M-!, seperti Firefox atau Evince, dll. Setiap kali saya lakukan, buffer muncul penuh hasil untuk proses, yang clobbers apa pun yang saya punya dalam hal pengaturan windows.

Apakah ada cara untuk mengubur buffer seperti itu secara default, sehingga saya tidak perlu melihatnya kecuali saya memutuskan untuk mencari mereka?

Steven Arntson
sumber

Jawaban:

11

Karena menyebutkan bahwa perintah berjalan secara tidak sinkron, saya berasumsi maksud Anda adalah perintah yang async-shell-commandterikat M-&. Anda dapat mengikuti saran dalam dokumentasi async-shell-command(Anda dapat membacanya dengan melakukan C-hfasync-shell-commandRET) menyesuaikan display-buffer-alistsebagai berikut

(add-to-list 'display-buffer-alist (cons "\\*Async Shell Command\\*.*" (cons #'display-buffer-no-window nil)))

Sekarang buffer yang digunakan oleh perintah untuk menampilkan output tidak akan pernah ditampilkan.

Iqbal Ansari
sumber
Ini bekerja dengan baik, terima kasih. Selain itu, saya juga tidak tahu M-&. Saya menggunakan M-!dan kemudian secara manual menambahkan &perintah yang saya berikan ke shell.
Steven Arntson
4

Emacs memiliki fasilitas tujuan umum untuk mencegah perubahan konfigurasi jendela yang tidak disengaja (atau memang disengaja) menyebabkan masalah.

Tambahkan (winner-mode 1)ke file init Anda. Lalu ketika sesuatu mengacaukan jendela Anda, gunakan C-c<left>( winner-undo) untuk mengembalikannya. Anda dapat menggunakannya berulang kali untuk membatalkan perubahan konfigurasi beberapa jendela. C-c<right>( winner-redo) mengembalikan Anda ke konfigurasi terbaru.

phils
sumber
Ya, saya adalah pengguna yang sangat antusias dari Winner Mode!
Steven Arntson
4

Ini konfigurasi saya. Ini seharusnya bekerja dengan baik jika Anda menggunakan Linux.

(require 'dired-aux)

(defvar dired-filelist-cmd
  '(("vlc" "-L")))

(defun dired-start-process (cmd &optional file-list)
  (interactive
   (let ((files (dired-get-marked-files t current-prefix-arg)))
     (list
      (dired-read-shell-command "& on %s: " current-prefix-arg files)
      files)))
  (start-process
   cmd nil shell-file-name
   shell-command-switch
   (format "nohup 1>/dev/null 2>/dev/null %s \"%s\""
           (if (> (length file-list) 1)
               (format "%s %s" cmd
                       (cadr (assoc cmd dired-filelist-cmd)))
             cmd)
           (mapconcat #'expand-file-name file-list "\" \""))))

(define-key dired-mode-map "r" 'dired-start-process)

Tidak hanya itu akan menyembunyikan buffer sial ketika Anda misalnya membuka file pdf dari dired, Evince akan bertahan bahkan jika Anda menutup Emacs. Ada juga kustomisasi kecil untuk mengantri file video yang ditandai untuk daftar putar vlc.

abo-abo
sumber
2

Anda dapat menekan jendela itu untuk satu perintah alih-alih menggunakan secara global let

(let ((display-buffer-alist
       (cons (cons "\\*Async Shell Command\\*.*"
                   (cons #'display-buffer-no-window nil))
             display-buffer-alist))) ;; suppress async shell command window
  (async-shell-command command))
killdash9
sumber
Saya sarankan (cons NEWTHING display-buffer-alist)bukannya (list NEWTHING)agar tidak sepenuhnya menghambat alist asli.
phils
Saran bagus, terapkan itu.
killdash9