2008-09-22 36 views
18

Tôi thích sử dụng chế độ trình bao của Emacs, nhưng nó có một số thiếu sót. Một trong số đó là nó không đủ thông minh để mở một bộ đệm mới khi một lệnh shell cố gọi một trình soạn thảo. Ví dụ với môi trường biến VISUAL thiết lập để vim tôi nhận được những điều sau đây từ svn propedit:Mở bộ đệm Emacs khi lệnh cố mở trình chỉnh sửa trong chế độ shell

 
$ svn propedit svn:externals . 
"svn-prop.tmp" 2L, 149C[1;1H 
~                    [4;1H~                    [5;1H~                    [6;1H~                    [7;1H~    
... 

(Nó có thể là khó có thể nói từ các đại diện, nhưng đó là một khủng khiếp, lộn xộn xấu xí.)

Với VISUAL thiết lập để "emacs -nw", tôi nhận được

 
$ svn propedit svn:externals . 
emacs: Terminal type "dumb" is not powerful enough to run Emacs. 
It lacks the ability to position the cursor. 
If that is not the actual type of terminal you have, 
use the Bourne shell command `TERM=... export TERM' (C-shell: 
`setenv TERM ...') to specify the correct type. It may be necessary 
to do `unset TERMINFO' (C-shell: `unsetenv TERMINFO') as well.svn: system('emacs -nw svn-prop.tmp') returned 256 

(Nó hoạt động với VISUAL thiết lập để chỉ emacs, nhưng chỉ từ bên trong một cửa sổ Emacs X, không phải bên trong phiên giao dịch đầu cuối.)

Có cách nào để có chế độ trình bao làm điều đúng ở đây và mở bộ đệm mới thay mặt cho quy trình dòng lệnh không?

Trả lời

19

Bạn có thể đính kèm vào phiên Emacs qua emacsclient. Đầu tiên, khởi động server emacs với

M-x server-start 

hoặc thêm (server-start)-.emacs của bạn. Sau đó,

export VISUAL=emacsclient 

Chỉnh sửa.

Lưu ý:

  • Các phiên bản của emacsemacsclient phải đồng ý. Nếu bạn đã cài đặt nhiều phiên bản Emac, hãy đảm bảo bạn gọi phiên bản emacsclient tương ứng với phiên bản Emac đang chạy trên máy chủ.
  • Nếu bạn khởi động máy chủ trong nhiều quy trình/khung hình Emacs (ví dụ: vì (server-start) nằm trong số .emacs) của bạn, bộ đệm sẽ được tạo trong khung cuối cùng để khởi động máy chủ.
+0

$ svn propedit svn: ignore. Đang chờ Emacs ... -Không rõ & _command: & _ TỪ/TÊN/REPO/svn & -prop.tmp Không có thay đổi đối với thuộc tính 'svn: ignore' on '.' –

+0

Rất tiếc. Tôi có/etc/alternatives trỏ đến các phiên bản khác nhau cho emacs và emacsclient. Cập nhật các thay thế cho emacsclient cố định ở trên. –

+0

'xuất EDITOR =" emacsclient - bên ngoài-editor = emacs --no-chờ đợi +% l% f "' là đáng nói đến. – jfs

3

Có emacsclient, gnuserv và trong Emacs 23, đa tty đều hữu ích cho việc này. Thực ra tôi nghĩ trong Emacs 23, emacsclient có tất cả các chức năng thú vị của gnuserv.

0

Không hoàn toàn đúng. ansi-term có thể chạy một emacs tốt (mặc dù tôi thường chạy mg cho các bản ghi cam kết, trong trường hợp hiếm hoi tôi không cam kết từ emacs trực tiếp). eshell cũng có thể chạy một emacs nếu bạn bắt đầu screen trước và chạy nó từ bên trong đó.

0

Cùng với việc sử dụng trình khách/máy chủ emacs, tôi đang sử dụng tập lệnh này để gọi các emac.

Điều này sẽ bắt đầu emacs nếu nó chưa chạy, hoặc chỉ cần mở một bộ đệm emacs mới trong các emacs đang chạy (sử dụng gnuclient). Nó chạy trong nền theo mặc định, nhưng có thể chạy ở nền trước cho các quá trình mong đợi một số đầu vào. Ví dụ, tôi đang sử dụng điều này như là trình soạn thảo điều khiển nguồn của tôi, khi nhập mô tả danh sách thay đổi. Tôi có "SVN_EDITOR = emacs đồng bộ", vì vậy tôi có thể làm "svn cam kết" trong một vỏ emacs, và nó sẽ mở trình soạn thảo svn trong một bộ đệm emacs mới trong cùng một emacs. Khi tôi đóng bộ đệm, "svn commit" tiếp tục. Khá hữu ích.

 
#!/bin/sh 

if [ -z $EMACS_CMD ]; then 
    EMACS_CMD="/usr/bin/emacs" 
fi 

if [ -z $GNUCLIENT_CMD ]; then 
    GNUCLIENT_CMD="/usr/bin/gnuclient" 
fi 

if [ "$1" = "sync" ]; then 
    shift 1 
    sync=true 
else 
    sync=false 
fi 

cmd="${EMACS_CMD} $*" 
lsof $EMACS_CMD | grep $USER >/dev/null 2>&1 
if [ "$?" -ne "1" ]; then 
    cmd="${GNUCLIENT_CMD} $*" 
fi 

if [ $sync = "true" ]; then 
    $cmd 
else 
    $cmd & 
fi 

0

Tôi muốn thực hiện điều gì đó tương tự để hợp nhất trong vỏ emacs thông qua mercurial. Nhờ áp phích ở đây, tôi đã tìm được đường. hai bước sau:

  1. add: (bắt đầu-server) trong emacs của bạn tập tin (nhớ để tải file sau khi thay đổi của bạn)

  2. trong HGRC của bạn:

     
    [merge-tools] 
    emacs.executable = emacsclient 
    emacs.premerge = False 
    emacs.args = --eval "(ediff-merge-with-ancestor \"$local\" \"$other\" \"$base\" nil \"$output\")" 
    

0

Khi Tôi có (bắt đầu-máy chủ) trong .emacs của tôi Tôi nhận được lỗi này ....

Debugger entered--Lisp error: (void-function start-server) 
    (start-server) 
    eval-buffer(#<buffer *load*> nil "/Users/jarrold/.emacs" nil t) ; Reading at buffer position 22768 
    load-with-code-conversion("/Users/jarrold/.emacs" "/Users/jarrold/.emacs" t t) 
    load("~/.emacs" t t) 
    #[nil "^H\205\276^@ \306=\203^Q^@\307^H\310Q\202A^@ \311=\2033^@\312\307\313\314#\203#^@\315\202A^@\312\307\$ 
    command-line() 
    normal-top-level() 

.... Tôi đang sử dụng GNU Emacs 22.1.1

Và đây là phiên bản của Mac OS-X Tôi đang sử dụng:

shandemo 511 $ uname -a Darwin Facilitys-MacBook-Pro.local 10.8.0

Darwin Kernel Version 10.8. 0: Thứ Ba ngày 7 tháng 6 16:33:36 PDT 2011;

root: xnu-1504.15.3 ~ 1/RELEASE_I386 i386

Lưu ý rằng m-x ansi hạn dường như cho phép tôi thành công hg cam kết bên trong của vỏ của nó. Tuy nhiên, trình bao đó không cho phép tôi cuộn qua bộ đệm, ví dụ: c-p hoặc c-n vì vậy tôi muốn chúng tôi m-x shell.

Các vấn đề liên quan