Apakah mungkin menjalankan perintah shell secara diam-diam (di latar belakang)? Saat saya gunakan async-shell-command
, emacs membagi windows. Saya ingin agar perintah shell tertentu benar-benar di latar belakang (tanpa efek visual).
Sebagai contoh eksplisit, saya memiliki kode berikut (dipinjam dari https://emacs.stackexchange.com/a/7932 ). Ini membuka versi pdf dari file tex yang saya kerjakan. Ketika menjalankannya, ia membelah jendela, saya ingin mencegahnya dari perilaku ini dalam situasi khusus ini.
(defun my-view-pdf ()
(interactive)
(async-shell-command
(concat "SumatraPDF " (file-name-base (buffer-file-name)) ".pdf")))
TeX-view
(C-c C-v
)?C-c C-v
tidak melakukan apa - apa terjadi. Saya tidak mengerti mengapa. Jika Anda tahu kustomisasi sederhana untuk.emacs
membuatC-c C-v
karya, saya akan senang menggunakannya. OS saya adalah Windows dan penampil PDF saya terletak diC:\Program Files\SumatraPDF\sumatrapdf.exe
. Dalam tautan itu daftar hukum telah menyediakan tautan yang komprehensif. Saya hanya tertarik untuk membuat karya TeX-viewer.TeX-view-program-list
.Jawaban:
save-window-excursion
adalah makro untuk menjalankan sepotong kode tanpa mengubah konfigurasi jendela. Sesuatu seperti ini seharusnya bekerja:sumber
save-window-excursion
, yang hampir identik dengan implementasi Anda.save-window-excursion
dansave-window-configuration
. Tampaknya keduanya berfungsi dalam situasi ini.save-window-excursion
menggunakan beberapa praktik terbaik makro untuk menghindari memasukkan variabel ke lingkungan tubuh. Juga,save-window-excursion
built-in untuk Emacs. Saya mencari makro itu, tetapi tidak menemukannya, jadi saya menulis versi saya sendiri. Untungnya bmag tahu yang asli.Jika Anda hanya ingin menelurkan proses di latar belakang Anda tidak perlu semua lonceng peluit yang menyediakan fungsi perintah shell.
Sebagai gantinya, Anda dapat menggunakan fungsi ini
call-process
. Sebagai contoh:Konkretnya, ini berarti bahwa Anda dapat mengimplementasikan perintah Anda sebagai:
sumber
(defun my-pdf-viewer () (interactive) (call-process (async-shell-command (concat "SumatraPDF " (file-name-base (buffer-file-name)) ".pdf")) nil 0 ; <- Discard and don't wait nil "arg1" "arg2") )
saya mendapatkan kesalahan `Argumen tipe salah: stringp, comint-output-filter`. Saya tidak yakin apakah sintaks yang saya gunakan sudah benar.async-shell-command
semuanya. Seharusnya seperti itu(defun my-pdf-viewer () (interactive) (call-process "SumatraPDF" nil 0 nil (concat (file-name-base (buffer-file-name)) ".pdf"))
.(defun my-view-pdf () (interactive) (call-process "SumatraPDF" nil 0 nil (concat (file-name-base (buffer-file-name)) ".pdf")))
.Gunakan
display-buffer-alist
dengandisplay-buffer-no-window
jika Anda menggunakan Emacs 24.4 atau lebih baru.Atau, gunakan belenggu :
sumber
(setq display-buffer-alist '(("\`\\*Async Shell Command\\*\\'" display-buffer-no-window)))
saya mendapatkan kesalahanapply: Wrong type argument: sequencep, display-buffer-no-window
.display-buffer-no-window
diperkenalkan di Emacs 24.4, jadi itu tidak akan berhasil. Paket saya di sisi lain harus bekerja pada 24.3.display-buffer-no-window
adalah opsi ketiga, cukup masukkan(defun display-buffer-no-window (_buffer alist) (when (cdr (assq 'allow-no-window alist)) 'fail))
dalam konfigurasi Emacs Anda.(defun display-buffer-no-window (_buffer alist) (when (cdr (assq 'allow-no-window alist)) 'fail)) (setq display-buffer-alist '(("\`\\*Async Shell Command\\*\\'" display-buffer-no-window))) (defun my-view-pdf () (interactive) (progn (async-shell-command (concat "SumatraPDF " (file-name-base (buffer-file-name)) ".pdf"))))
. Tetapi setelah dieksekusimy-view-pdf
, emacs membagi jendela dan*Async Shell Command*
ditampilkan.