2009-06-03 21 views
5

Làm thế nào tôi có thể nhận được emacs 23 làm việc độc đáo trong chế độ nhiều tty trên OS X?Emacs 23, OS X, multi-tty và emacsclient

Tôi đã thêm (server-start) vào .emacs của mình và đã phát hiện ra rằng chạy /Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n ~/myfile.txt sẽ mở nó trong emacs.app của tôi, nhưng nó không mang các emacs đến phía trước.

Vì vậy, làm thế nào tôi có thể nhận được emacs.app để đi đến phía trước khi tôi chạy emacsclient? (Tôi đã xem xét viết một hàm đặt khung hiện tại lên trước mỗi khi một tệp được mở hoặc có thể viết một bản ghi chép để thực hiện một công việc tương tự có thể được gọi cùng lúc với emacsclient)

emacsclient trong emacs.app tốt nhất để sử dụng? Tôi cho rằng tôi sẽ viết một bí danh cho nó nếu có, nhưng có vẻ lạ khi sử dụng nó thay vì cái gì đó trong/usr/local/bin

Có ai có bất kỳ mẹo hay ví dụ nào khác về việc này không?

Trả lời

2

Các AppleScript sẽ là đơn giản:

tell app "Emacs" to activate 
+0

Cảm ơn, công trình này tuyệt vời. Chỉ cần mở rộng. Tôi đã bí danh emacs để: 'osascript -e' \ '' cho ứng dụng "Emacs" kích hoạt '\' ';/Applications/Emacs.app/Nội dung/MacOS/bin/emacsclient -n' – Singletoned

5

Có lẽ điều này sẽ làm việc, chỉ cần gọi tăng-frame khi khách hàng gắn:

(add-hook 'server-visit-hook 'call-raise-frame) 
(defun call-raise-frame() 
    (raise-frame)) 

(Nó sẽ xảy ra là không cần thiết trên máy tính Linux của tôi.)

+0

Điều này không làm việc cho tôi. Tôi đặt nó vào .emacs và đánh giá nó nhưng nó dường như không có tác dụng. – Singletoned

+1

Nếu bạn muốn, bạn có thể thử gỡ lỗi này. Bước một, trong Emacs, di chuyển điểm bên trong 'defun-call-frame defun và làm M-x edebug-defun. Sau đó, kết nối bằng cách sử dụng emacsclient. Emacs nên nhập trình gỡ rối - sẽ hiển thị các .emac của bạn (hoặc bất kỳ bộ đệm nào chứa 'khung gọi nâng cao) với một mũi tên nhỏ bên cạnh dòng (khung nâng cao). Và dòng chế độ sẽ có [] xung quanh nó (cho biết bạn đang gỡ lỗi). Tại thời điểm đó bạn sẽ có thể làm M-x nâng cao-frame. Tất nhiên, trong Linux, mọi hành động trong trình gỡ rối đều làm tăng khung, giảm tính hữu dụng của việc gỡ lỗi. –

+0

Tôi có thể xác nhận rằng điều này không hoạt động với 23.0.92 trên OS X –

6

tôi có một bí danh từ emacs để

open -a /Applications/Emacs.app "[email protected]" 

Nếu bạn đang khó chịu bởi thực tế là nó sẽ mở ra một khung mới (cửa sổ) cho mỗi tập tin - thêm

(setq ns-pop-up-frames nil) 

để emacs và cố định của bạn.

0

tôi xác định chức năng này trong emacs tôi

(defun ns-raise-emacs() 
    (ns-do-applescript "tell application \"Emacs\" to activate")) 

Sau đó sử dụng để nâng cao khung:

emacsclient -e '(ns-raise-emacs)' 

tôi khuyên bạn nên làm theo cách này thay vì gọi osascript. Dường như phản ứng nhanh hơn (đôi khi nhanh hơn đáng kể) so với sử dụng osascript.

1

Để mở rộng trên các câu trả lời được đưa ra bởi Trey Jackson và những nhận xét của Singletoned: Tôi đã điều sau đây trong emacs tôi nộp

;;; 
;;; Run in server-mode so other sessions can connet 
;;; 
(defun call-raise-frame() 
    (raise-frame)) 
(defun end-server-edit() 
    (shell-command "osascript -e \"tell application \\\"System Events\\\" to keystroke tab using command down\"")) 
(add-hook 'server-visit-hook 'call-raise-frame) 
(add-hook 'server-done-hook 'end-server-edit) 
(server-start) 

Và trong tập tin vỏ init của tôi, tôi có bí danh sau:

alias e='emacsclient'  # edit 
alias enw='emacsclient -n' #edit (no wait) 

Bây giờ tôi có thể mở vỏ bên cạnh với cá thể CocoaEmacs và sử dụng hai mẫu liền mạch với nhau. Tôi có thể gọi trình chỉnh sửa "nội tuyến" với luồng thiết bị đầu cuối hiện tại của mình bằng cách sử dụng bí danh e và sau khi tôi hoàn tất chỉnh sửa trong tiêu điểm emacs sẽ được trả về thiết bị đầu cuối gọi.

2

Tôi sử dụng nội dung như thế này trong số của mình.emacs để chỉ cuộc gọi máy chủ khởi động nếu máy chủ không phải là đã chạy:

(if (file-exists-p 
(concat (getenv "TMPDIR") "emacs" 
     (number-to-string 
      (user-real-uid)) "/server")) 
nil (server-start)) 

Sau đó, một vài thay đổi để tôi zshrc vì vậy mà tôi có thể chạy mindlessly ec như lệnh biên tập của tôi từ vỏ:

# I use the Emacs package from emacsformacosx.com 
alias emacs='open -a emacs' 
alias emacsclient='/Applications/Emacs.app/Contents/MacOS/bin/emacsclient' 
alias ec='emacsclient -a /Applications/Emacs.app/Contents/MacOS/Emacs' 
export EDITOR='ec' 
4

Một số giải pháp được đề xuất đề xuất sử dụng 'khung nâng cao'. Điều đó sẽ nâng cao khung emacs, nhưng nó sẽ không tập trung vào nó. Khi bạn bắt đầu emacs từ một cửa sổ thiết bị đầu cuối, emacs vẫn sẽ được bên dưới cửa sổ thiết bị đầu cuối vì cửa sổ thiết bị đầu cuối giữ lại tiêu điểm. Tôi sử dụng 'select-frame-set-input-focus' để tăng để lấy nét.

Ví dụ:

/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n ~/myfile.txt \ 
    --eval '(select-frame-set-input-focus (nth 0 (frame-list)))' 

tôi thích để chạy trường hợp riêng biệt của emacs, vì vậy khi tôi thoát với "^ X^C" Tôi không mất tất cả các cửa sổ. Để thực hiện điều này, tôi có một kịch bản shell:

#!/bin/bash 
/Applications/Emacs.app/Contents/MacOS/Emacs \ 
    --eval '(select-frame-set-input-focus (nth 0 (frame-list)))' \ 
    "[email protected]" 
0

fwiw, đây là giải pháp của tôi:
bước 1: tạo ra một kịch bản tại/usr/local/bin/emacs với nội dung sau:

#!/usr/bin/bash 
emacsclient -c --alternate-editor='/Applications/Emacs.app/Contents/MacOS/Emacs' "[email protected]" 2>/dev/null 

bước 2. làm cho nó thực thi thông qua: chmod + x/usr/local/bin/emacs

bước 3. trong ~/emacs nộp thêm như sau:

(server-start) 

(defun ns-raise-emacs() 
(ns-do-applescript "tell application \"Emacs\" to activate")) 

(ns-raise-emacs) 

(add-hook 'server-visit-hook 'raise-frame) 
;;(add-hook 'server-visit-hook 'ns-raise-emacs) 

giải thích:

Nếu kịch bản emacs tại/usr/local/bin/emacs được gọi và không có emacs máy chủ đang chạy, các emacsclient sẽ gọi trình biên tập thay thế, mà trong trường hợp này là biên tập viên Emacs (/Applications/Emacs.app/Contents/MacOS/Emacs).

Ở bước 3, cuộc gọi ban đầu đến (ns-raise-emacs) có vẻ là cần thiết cho cửa sổ Emacs ban đầu để hiển thị trước mọi thứ khác.

(add-hook 'server-visit-hook 'raise-frame) để khung tiếp theo hiển thị trước mọi thứ khác.

Ngoài ra, nếu bạn muốn tất cả các khung Emacs hiển thị trước mọi thứ khác mỗi khi bạn gọi các emac từ dòng lệnh, bạn có thể bỏ ghi chú dòng (add-hook 'server-visit-hook 'ns-raise-emacs).