Chuyển hoạt động M-! vào M- & (a'ka emacs tương đương với bash Ctrl-Z)


14

Thỉnh thoảng tôi tình cờ M-! some_commandthấy rằng lệnh chạy lâu hơn tôi mong đợi và giữ cho emacs của tôi bị đóng băng trong vài giây. Vì vậy, tôi trừng mắt với emacs đông lạnh của mình và tự đá mình vì không sử dụng M-& some_commandvà tự hứa với mình sẽ sử dụng M-&lần sau. Nhưng M-!trong trí nhớ cơ bắp của tôi trong nhiều thập kỷ. Và tất nhiên là có Ctrl-G, nhưng có những trường hợp khi phá lệnh và chạy lại thì không nên dùng (có thể nó sẽ bị hỏng, có thể sẽ rất tốn kém khi chạy lại).

Lỗi tương tự trong shell konsole là không đáng kể để sửa Ctrl-Z, bgvà công việc đang chạy trong nền.

Có tồn tại một số mẹo tương tự trong emacs - một cách để biến lệnh foreground (đồng bộ) hiện đang chạy thành nền tảng (không đồng bộ) không?

Lưu ý: trong trường hợp không thể mặc định M-! , tôi sẵn sàng đề xuất cách sắp xếp lại M-!thành một thứ khác (những gì sẽ tương đương về mặt chức năng ngoài thủ thuật này).


2
Bạn có thể quan tâm để biết rằng chỉ cần thêm một &vào cuối của một shell-command( M-!) thông thường sẽ làm cho nó không đồng bộ. Tất nhiên, bạn phải làm điều này trước khi chạy một lệnh, nhưng ít nhất bạn có thể sử dụng cùng một thao tác gõ phím.
mẫu

4
Bạn có thể luôn luôn chỉ remap M-!để async-shell-command. :-) Có vẻ như điều duy nhất bạn mất là nhận được đầu ra trong vùng echo khi nó đủ ngắn.
glucas 7/07/2015

1
@nanny, trên thực tế, đó là tất cả async-shell-command. Nó thêm một &phần cuối của COMMANDchuỗi và thực thi shell-command.
Matthew Piziak

Câu trả lời:


2

Có tồn tại một số mẹo tương tự trong emacs - một cách để biến lệnh foreground (đồng bộ) hiện đang chạy thành nền tảng (không đồng bộ) không?

Tôi nghi ngờ không có thủ thuật như vậy tồn tại. Vấn đề là lệnh shell đồng bộ (thực sự call-process-region) chặn vòng lặp sự kiện emacs. Cách duy nhất để phá vỡ nó là giết quá trình bằng tín hiệu USR1 hoặc USR2 hoặc làm C-g. (Có thể có những cách khác, nhưng đó là những gì tôi làm).

Điều này có nghĩa là bạn không thể làm gì vì bạn không có cách nào để thực hiện thủ thuật này, vì Emacs không xử lý đầu vào trong khi vòng lặp sự kiện bị đình trệ.


Một điều bạn có thể làm chỉ đơn giản là trao đổi các phím:

(global-set-key (kbd "M-!") #'async-shell-command)
(global-set-key (kbd "M-&") #'shell-command)

Làm lại M-! để async-shell-lệnh có ý nghĩa một phần, nhưng: (1) Tôi không chắc chắn về M-1 M-! hành vi (đầu ra lệnh vào bộ đệm) - trường hợp nhanh đơn giản hoạt động nhưng nếu lệnh chậm hơn và tôi gõ sth thì sao? (2) trong nhiều trường hợp tôi thích đóng băng cho đến khi lệnh kết thúc hành vi vì nó cho dấu hiệu kết thúc rõ ràng (một số lệnh không có đầu ra), do đó, tổ hợp phím rõ ràng đặt vào nền trước sẽ tốt hơn (3) không đồng bộ rời khỏi bộ đệm Async đó. được gặt hái
Mekk

Tôi đang suy nghĩ liệu một số trình bao bọc xung quanh lệnh async-shell có thể viết được không (một chức năng sẽ sinh ra lệnh async-shell, sau đó đợi kết thúc, phản ứng với Ctrl-G bằng cách hủy bỏ lệnh và với một số lần nhấn phím khác bằng cách rời khỏi nó chạy nhưng không chờ đợi nữa và gặt bộ đệm Async sau khi hoàn thành nếu đầu ra trống hoặc ngắn). Tôi không chắc làm thế nào để thực hiện phần chờ đợi đó
Mekk
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.