web-development-kb-asia.site

Sử dụng Emacs như một IDE

Hiện tại quy trình làm việc của tôi với Emacs khi tôi viết mã bằng C hoặc C++ bao gồm ba cửa sổ. Phần lớn nhất bên phải chứa tệp tôi đang làm việc. Bên trái được chia thành hai, phía dưới là Shell mà tôi sử dụng để nhập biên dịch hoặc tạo lệnh và trên cùng thường là một loại tài liệu hoặc tệp README mà tôi muốn tham khảo khi tôi đang làm việc. Bây giờ tôi biết có một số người dùng Emacs khá chuyên nghiệp ngoài kia, và tôi tò mò không biết các chức năng Emacs khác có ích gì nếu ý định sử dụng nó như một IDE hoàn chỉnh. Cụ thể, hầu hết các IDE thường đáp ứng các chức năng này là một số dạng hoặc dạng khác:

  • Trình chỉnh sửa mã nguồn
  • Trình biên dịch
  • Gỡ lỗi
  • Tra cứu tài liệu
  • Kiểm soát phiên bản
  • Các tính năng OO như tra cứu lớp và thanh tra đối tượng 

Đối với một vài trong số này, rõ ràng làm thế nào Emacs có thể phù hợp với các chức năng này, nhưng phần còn lại thì sao? Ngoài ra, nếu một ngôn ngữ cụ thể phải được tập trung vào, tôi muốn nói đó phải là C++. 

Chỉnh sửa: Một người dùng đã chỉ ra rằng tôi nên nói cụ thể hơn khi tôi nói 'những gì còn lại'. Chủ yếu là tôi tò mò về kiểm soát phiên bản hiệu quả, cũng như tra cứu tài liệu. Ví dụ, trong SLIME, khá dễ dàng để thực hiện tra cứu hyperspec nhanh trên chức năng LISP. Có cách nào nhanh chóng để tìm kiếm một cái gì đó trong tài liệu C++ STL (nếu tôi quên cú pháp chính xác của hash_map , chẳng hạn)?

163
user7545

Bạn sẽ phải cụ thể như những gì bạn có nghĩa là "phần còn lại". Ngoại trừ thanh tra đối tượng (mà tôi biết), emacs thực hiện tất cả các điều trên khá dễ dàng:

  • biên tập viên (hiển nhiên)
  • trình biên dịch - chỉ cần chạy M-x compile và nhập lệnh biên dịch của bạn. Từ đó trở đi, bạn có thể chỉ cần M-x compile và sử dụng mặc định. Emacs sẽ ghi lại các lỗi trình biên dịch C/C++ (hoạt động tốt nhất với GCC) và giúp bạn điều hướng đến các dòng có cảnh báo hoặc lỗi.
  • Gỡ lỗi - tương tự, khi bạn muốn gỡ lỗi, hãy nhập M-x gdb và nó sẽ tạo bộ đệm gdb với các ràng buộc đặc biệt
  • Tra cứu tài liệu - emacs có các ràng buộc CScope tuyệt vời để điều hướng mã. Đối với các tài liệu khác: Emacs cũng có một trình đọc manpage và đối với mọi thứ khác, có web và sách.
  • kiểm soát phiên bản - có rất nhiều ràng buộc Emacs cho các phụ trợ VCS khác nhau (CVS, SCCS, RCS, SVN, GIT đều xuất hiện trong tâm trí)

Chỉnh sửa: Tôi nhận ra câu trả lời của tôi về tra cứu tài liệu thực sự liên quan đến điều hướng mã. Dưới đây là một số thông tin quan trọng hơn: 

Google tìm kiếm sẽ không nghi ngờ tiết lộ thêm ví dụ.

Như liên kết thứ hai hiển thị, việc tìm kiếm các chức năng (và bất cứ điều gì) trong tài liệu khác có thể được thực hiện, ngay cả khi không được hỗ trợ ngoài hộp.

73
Ben Collins

Tôi phải đề xuất Trình duyệt mã Emacs như một môi trường kiểu "truyền thống" IDE hơn cho emacs.

CHỈNH SỬA: Bây giờ tôi cũng khuyên dùng Magit đánh giá cao giao diện VCS tiêu chuẩn trong emacs.

29
baudtack

Thay vì chạy lệnh make trong cửa sổ Shell, bạn đã thử biên dịch M-x chưa? Nó sẽ chạy lệnh make của bạn, hiển thị lỗi và trong nhiều trường hợp giúp bạn dễ dàng chuyển sang dòng mã gây ra lỗi nếu đầu ra bao gồm tên tệp và số dòng.

Nếu bạn là người hâm mộ của IDE, bạn cũng có thể muốn xem gói thanh tốc độ của emacs (thanh tốc độ M-x). Và, nếu bạn chưa có, hãy tìm hiểu về cách sử dụng bảng thẻ để điều hướng mã của bạn.

19
Bryan Oakley

Có những góc của emacs mà một khi được phát hiện ra làm cho bạn hiệu quả hơn theo những cách bạn không bao giờ nghĩ tới. Như những người khác đã đề cập, sử dụng thẻ là một cách tuyệt vời và nhanh chóng để phóng to xung quanh mã nguồn của bạn và sử dụng M-/(dabenamev-bung) thường thực hiện chính xác những gì bạn mong đợi khi hoàn thành một tên biến. 

Sử dụng xảy ra là hữu ích để có được một bộ đệm với tất cả các lần xuất hiện của một biểu thức chính quy trong một bộ đệm. Điều đó thực sự tiện lợi khi tái cấu trúc mã và tìm kiếm các đoạn mã hoặc sử dụng biến hoặc nếu bạn sử dụng các dấu TODO trong các tệp nguồn của mình và bạn muốn truy cập tất cả chúng.

các hàm tuôn dòng, sắp xếp số, trường thay thế và hàm hình chữ nhật có thể thực sự hữu ích để lấy kết xuất từ ​​một số công cụ và chuyển đổi nó thành dữ liệu hữu ích như chương trình elisp hoặc bảng tính được phân cách bằng dấu phẩy. 

Tôi đã viết một trang về IDE giống như những điều bạn có thể làm với emacs 

http://justinsboringpage.blogspot.com/2007/09/11-visual-studio-tricks-in-emacs.html

Học elisp là một cách tuyệt vời khác để trả lời cho chính bạn những gì emacs khác có thể làm ngoài những gì một IDE thông thường có thể làm. 

Ví dụ: tôi đã viết blog về việc viết các chức năng của trình trợ giúp Perforce như đổ lỗi (tự viết nghĩa là bạn có thể khiến nó hoạt động chính xác như bạn muốn) ...

http://justinsboringpage.blogspot.com/2009/01/who-changed-line-your-usiness-on-last.html

Tôi cũng đã viết mã tự động tạo bình luận cho một chức năng, phù hợp với các tiêu chuẩn mã hóa mà tôi đang làm việc. 

Không có mã elisp nào của tôi đặc biệt tuyệt vời và hầu hết mã này đã tồn tại trong các thư viện, nhưng nó thực sự hữu ích để có thể làm cho các emacs thực hiện các công cụ tùy chỉnh xuất hiện trong một ngày làm việc. 

15
justinhj

Bạn có thể tìm thấy mô tả chi tiết về tích hợp kiểm soát phiên bản và emacs trên trang web của tôi . Tôi cũng đang nghiên cứu bài viết về việc sử dụng Emacs làm Môi trường phát triển cho nhiều ngôn ngữ - C/C++, Java, Perl, LISP/Scheme, Erlang, v.v ...

10
Alex Ott

Được rồi, mọi người ở đây đang đưa ra gợi ý hoàn hảo để biến emacs thành một IDE tuyệt vời. 

Nhưng bất cứ ai cũng nên nhớ rằng, khi bạn tùy chỉnh các emacs của mình với rất nhiều phần mở rộng (đặc biệt là các phần mở rộng để kiểm tra kiểu, tìm kiếm định nghĩa chức năng, v.v.) emacs của bạn sẽ tải rất chậm cho trình soạn thảo. 

Để khắc phục điều này, tôi thực sự khuyên bạn nên sử dụng emacs trong server mode

Nó khá đơn giản để sử dụng, không cần tùy chỉnh tệp init của bạn . Bạn chỉ cần bắt đầu emacs trong chế độ daemon;

emacs --daemon

Điều này sẽ tạo một máy chủ emacs, sau đó bạn có thể kết nối nó từ thiết bị đầu cuối hoặc từ gui. Tôi cũng khuyên bạn nên tạo một số bí danh để dễ gọi. 

alias ec="emacsclient -t"
alias ecc="emacsclient -c &"
# some people also prefer this but no need to fight here;
alias vi="emacsclient -t"

Bằng cách này, emacs sẽ kích hoạt nhanh hơn cả gedit, hứa.

Một vấn đề có thể xảy ra ở đây, nếu bạn đang chạy emacs daemon từ người dùng thông thường của mình, có lẽ bạn không thể kết nối máy chủ emacs dưới dạng root

Vì vậy, nếu bạn cần mở một tệp có quyền truy cập root; sử dụng tramp thay thế. Chỉ cần chạy ứng dụng khách emacs của bạn với người dùng bình thường của bạn và mở các tệp như thế này;

C-x C-f
/Sudo:[email protected]/some/file/that/has/root/access/permissions
# on some linux distro it might be `/su:[email protected]` 

Điều này làm cho cuộc sống của tôi dễ dàng hơn, tôi có thể mở con trăn tùy chỉnh nặng IDE của mình trong vài giây theo cách này. Bạn cũng có thể muốn thêm emacs --daemon vào hệ thống khởi động hoặc tạo tệp máy tính để bàn cho emacsclient. Tùy ban. 

Thông tin thêm về emacs daemon và emacs client có thể được tìm thấy tại wiki;

http://www.emacswiki.org/emacs/EmacsAsDaemon

http://www.emacswiki.org/emacs/EmacsClient

8
Muhammet Can

Đối với kiểm soát phiên bản, có một số điều bạn có thể sử dụng, tùy thuộc vào hệ thống kiểm soát phiên bản bạn sử dụng. Nhưng một số chức năng là phổ biến cho tất cả chúng.

vc.el là cách tích hợp để xử lý kiểm soát phiên bản ở cấp độ tệp. Nó có phụ trợ cho hầu hết các hệ thống kiểm soát phiên bản. Ví dụ, phụ trợ Subversion đi kèm với Emacs và có các phụ trợ git và các phần phụ khác có sẵn từ các nguồn khác.

Lệnh hữu ích nhất là C-x v v (vc-next-action) thực hiện hành động tiếp theo phù hợp cho tệp bạn đang truy cập. Điều này có thể có nghĩa là cập nhật từ kho lưu trữ hoặc cam kết các thay đổi của bạn, vc.el cũng phản hồi C-x C-q để kiểm tra và ra các tập tin nếu bạn đang sử dụng một hệ thống cần nó (như RCS).

Các lệnh rất hữu ích khác là C-x v l và C-x v = hiển thị cho bạn nhật ký và khác biệt hiện tại cho tệp bạn đang sử dụng.

Nhưng để có năng suất thực sự, bạn nên tránh sử dụng các lệnh vc.el một tệp khác với những điều đơn giản. Có một số gói có thể cung cấp cho bạn tổng quan về trạng thái của toàn bộ cây của bạn và cung cấp cho bạn nhiều sức mạnh hơn, và chưa kể đến khả năng tạo các cam kết mạch lạc bao trùm một số tệp.

Hầu hết trong số này bị ảnh hưởng nặng nề hoặc dựa trên bản gốc pcl-cvs/pcvs cho CVS. Thậm chí có hai trong số chúng đi kèm với Subversion, psvn.el và dSvn.el. Có gói cho git, vv.

8
dkagedal

Tôi đồng ý rằng bạn nên tìm hiểu về biên dịch M-x (liên kết lỗi đó và lỗi tiếp theo của M-x với một chuỗi khóa ngắn).

Tìm hiểu về các ràng buộc để kiểm soát phiên bản (ví dụ: vc-diff, vc-next-action, v.v.)

Nhìn vào sổ đăng ký. Bạn không chỉ có thể nhớ các vị trí trong bộ đệm mà cả cấu hình cửa sổ (C-x r w - window-configure-to-register).

7
HD.

Điểm bắt đầu (có thể không rõ ràng) để khám phá các tính năng VC của Emacs là M-x vc-next-action

Nó thực hiện "hoạt động kiểm soát phiên bản logic tiếp theo" trên tệp hiện tại, tùy thuộc vào trạng thái của tệp và phụ trợ VC. Vì vậy, nếu tệp không thuộc kiểm soát phiên bản, nó sẽ đăng ký nó, nếu tệp đã được thay đổi, các thay đổi sẽ được gửi, v.v. 

Phải mất một chút để làm quen, nhưng tôi thấy nó rất hữu ích. 

Liên kết khóa mặc định là C-x v v

6
Chopmo

TFS.el để tích hợp emacs vào Microsoft TFS . Nó hoạt động với bất kỳ TFS nào, kể cả TFS chạy Codeplex.com. 

Các bước cơ bản để thiết lập:

  1. Đặt tfs.el trong đường dẫn tải của bạn.

  2. Trong tệp .emacs của bạn: 

    (require 'tfs)
    (setq tfs/tf-exe  "c:\\vs2008\\common7\\ide\\tf.exe")
    (setq tfs/login "/login:domain\\userid,password")
          -or-
    (setq tfs/login (getenv "TFSLOGIN"))  ;; if you have this set
    
  3. cũng trong tệp .emacs của bạn, đặt các ràng buộc khóa cục bộ hoặc toàn cục cho các lệnh tfs. như vậy

    (global-set-key  "\C-xvo" 'tfs/checkout)
    (global-set-key  "\C-xvi" 'tfs/checkin)
    (global-set-key  "\C-xvp" 'tfs/properties)
    (global-set-key  "\C-xvr" 'tfs/rename)
    (global-set-key  "\C-xvg" 'tfs/get)
    (global-set-key  "\C-xvh" 'tfs/history)
    (global-set-key  "\C-xvu" 'tfs/undo)
    (global-set-key  "\C-xvd" 'tfs/diff)
    (global-set-key  "\C-xv-" 'tfs/delete)
    (global-set-key  "\C-xv+" 'tfs/add)
    (global-set-key  "\C-xvs" 'tfs/status)
    (global-set-key  "\C-xva" 'tfs/annotate)
    (global-set-key  "\C-xvw" 'tfs/workitem)
    
4
Cheeso

biên dịch, lỗi tiếp theo và lỗi trước đó là tất cả các lệnh khá quan trọng để phát triển C++ trong Emacs (cũng hoạt động tốt trên đầu ra grep). Etags, visit-tags-table và find-tag cũng rất quan trọng. xong.el là một trong những vụ hack lớn chưa từng thấy trong thế kỷ 20 và có thể tăng tốc độ hack C++ của bạn bằng một mức độ lớn. Oh và chúng ta đừng quên ediff.

Tôi vẫn chưa học cách sử dụng kiểm soát phiên bản mà không truy cập Shell, nhưng bây giờ tôi đang chạy cam kết thường xuyên hơn (với git) tôi có thể sẽ phải làm.

3
jfm3

Tôi sử dụng emacs trên Windows. mô-đun biên dịch là Nice, nhưng tôi muốn biên dịch thông minh hơn về dòng lệnh biên dịch mà nó gợi ý. Có thể sử dụng "Biến tệp" để chỉ định compile-command , nhưng tôi muốn thứ gì đó thông minh hơn một chút. Vì vậy, tôi đã viết một chức năng nhỏ để giúp đỡ. Nó đoán lệnh biên dịch sẽ sử dụng, để Nhắc người dùng khi chạy compile

Hàm đoán tìm tệp vbproj hoặc csproj hoặc sln và nếu tìm thấy, nó gợi ý msbuild. Sau đó, nó nhìn vào tên tệp bộ đệm, và tùy theo đó, gợi ý những điều khác nhau. Tệp .wxs có nghĩa là đó là một dự án WIX và bạn có thể muốn xây dựng một MSI, do đó logic đoán gợi ý một lệnh nmake cho MSI. Nếu đó là một mô-đun Javascript, thì đề xuất là chạy jslint-for-wsh.js để lint tệp .js. Như một dự phòng, nó gợi ý bước sóng. 

Mã tôi sử dụng trông như thế này:

(defun cheeso-guess-compile-command ()
  "set `compile-command' intelligently depending on the
current buffer, or the contents of the current directory."
  (interactive)
  (set (make-local-variable 'compile-command)
       (cond
        ((or (file-expand-wildcards "*.csproj" t)
             (file-expand-wildcards "*.vcproj" t)
             (file-expand-wildcards "*.vbproj" t)
             (file-expand-wildcards "*.shfbproj" t)
             (file-expand-wildcards "*.sln" t))
         "msbuild ")

        ;; sometimes, not sure why, the buffer-file-name is
        ;; not set.  Can use it only if set.
        (buffer-file-name
         (let ((filename (file-name-nondirectory buffer-file-name)))
           (cond

            ;; editing a .wxs (WIX Soluition) file
            ((string-equal (substring buffer-file-name -4) ".wxs")
             (concat "nmake "
                     ;; (substring buffer-file-name 0 -4) ;; includes full path
                     (file-name-sans-extension filename)
                     ".msi" ))

            ;; a javascript file - run jslint
            ((string-equal (substring buffer-file-name -3) ".js")
             (concat (getenv "windir")
                     "\\system32\\cscript.exe c:\\users\\cheeso\\bin\\jslint-for-wsh.js "
                     filename))

            ;; something else - do a typical .exe build
            (t
             (concat "nmake "
                     (file-name-sans-extension filename)
                     ".exe")))))
        (t
         "nmake "))))


(defun cheeso-invoke-compile-interactively ()
  "fn to wrap the `compile' function.  This simply
checks to see if `compile-command' has been previously set, and
if not, invokes `cheeso-guess-compile-command' to set the value.
Then it invokes the `compile' function, interactively."
  (interactive)
  (cond
   ((not (boundp 'cheeso-local-compile-command-has-been-set))
    (cheeso-guess-compile-command)
    (set (make-local-variable 'cheeso-local-compile-command-has-been-set) t)))
  ;; local compile command has now been set
  (call-interactively 'compile))

;; in lieu of binding to `compile', bind to my monkeypatched function
(global-set-key "\C-x\C-e"  'cheeso-invoke-compile-interactively)

Tôi đã thử làm điều này như "trước lời khuyên" cho hàm biên dịch nhưng không thể làm cho nó hoạt động tốt. Vì vậy, tôi đã xác định một chức năng mới và ràng buộc nó với cùng tổ hợp tổ hợp phím mà tôi đã sử dụng cho compile


CHỈNH SỬA hiện đã có " smarter-compile.el " đưa ý tưởng này tiến thêm một bước.

3
Cheeso

Bạn cũng có thể tìm thấy tabbar hữu ích. Nó mô phỏng hành vi duy nhất tôi đã bỏ lỡ khi chuyển từ Eclipse sang Emacs. Giới hạn cho "," và "." để di chuyển đến thanh tab trước và thanh tiếp theo, nó sẽ giúp bạn chuyển đổi bộ đệm bằng Ctrl-x b mọi lúc.

Thật không may, trang web được đề cập không cung cấp phiên bản chính xác để tải xuống. Tuy nhiên, hầu hết các phiên bản Ubuntu đều cung cấp nó trong các gói emacs-goodies của chúng.

3
wr.

Tôi biết đây là một bài viết rất cũ. Nhưng câu hỏi này là hợp lệ cho người mới bắt đầu emacs.

IMO cách tốt nhất để sử dụng emacs làm ide là sử dụng giao thức ngôn ngữ máy chủ với emacs. Bạn có thể tìm thấy tất cả các thông tin về các máy chủ ngôn ngữ trong trang web được liên kết. 

Để thiết lập nhanh, tôi khuyên bạn nên vào trang này eglot . IMO eglot làm việc đó khá tốt. Nó tích hợp tốt với các gói hoàn thành tự động như công ty. Cung cấp tìm tài liệu tham khảo, và nhiều hơn nữa. 

Ngoài ra đối với trình gỡ lỗi, bạn có thể cần trình gỡ lỗi cụ thể cho các ngôn ngữ cụ thể. Bạn có thể sử dụng gdb từ bên trong emacs. Chỉ cần gõ M-x gdb

Để biên dịch mã của bạn, tốt nhất là sử dụng các lệnh Shell. Tôi đang làm việc trong dự án này eproj . Sẽ mất một thời gian để hoàn thành nó. Nhưng tất cả những gì nó làm là ánh xạ lệnh Shell đến loại dự án. Và xây dựng dự án của bạn thông qua Shell. Nó thực hiện tương tự để thực hiện lệnh. Tôi có thể cần giúp đỡ để hoàn thành dự án này. Nó chưa sẵn sàng để sử dụng, nhưng nếu bạn biết một chút linh hoạt, bạn có thể xem qua mã. 

Ngoài ra, tốt nhất là sử dụng lệnh biên dịch emacs.

Để kiểm soát phiên bản, tôi chưa thấy bất kỳ gói nào khác có thể phù hợp với sức mạnh của magit . Nó đặc trưng cho git. Ngoài ra đối với git còn có một gói git-timemachine khác, mà tôi thấy rất hữu ích.

Tra cứu đối tượng và tra cứu lớp được cung cấp bởi giao thức máy chủ ngôn ngữ. 

Một cây dự án có thể được sử dụng cho giao diện giống như ide với treemacs .

Ngoài ra còn có một Thư viện tương tác dự án được gọi là projectile .

Để tự động hoàn thành, tôi thấy chế độ công ty rất hữu ích. 

Emacs thực sự có thể được thực hiện để làm bất cứ điều gì.

2
sidharth arya

Về tra cứu tài liệu: điều đó phụ thuộc vào (các) ngôn ngữ lập trình của bạn.

Thư viện C và các cuộc gọi hệ thống thường được ghi lại trong các trang man. Cho rằng bạn có thể sử dụng M-x man. Một số điều có thể được ghi lại tốt hơn trong các trang thông tin; sử dụng M-x info.

Đối với bản thân elisp, sử dụng C-h f. Đối với python, sử dụng >>> help(<function, class, module>) trong trình thông dịch.

Tôi thấy rằng hầu hết các ngôn ngữ khác cung cấp tài liệu ở dạng html. Đối với điều đó, hãy thử một trình duyệt nhúng (tôi sử dụng w3m). Đặt biến môi trường BROWSER của bạn thành tập lệnh bao quanh emacsclient -e "(w3m-goto-url-new-session \"[email protected]\")" (trên * nix), trong trường hợp có thể mở trình duyệt và bạn muốn mở trình duyệt bên trong emacs.

2
Jonas Kölker

Trong những năm gần đây, Clang trở thành một phần quan trọng trong hỗ trợ Emacs C++. Atila Neves đã có buổi nói chuyện trên CppCon 2015: "Emacs as C++ IDE"

Đó là một cuộc nói chuyện dài 16 phút, nơi anh ấy đưa ra giải pháp cho các chủ đề sau:

  • Chuyển đến định nghĩa
  • Tự động hoàn thành
  • Làm nổi bật cú pháp nhanh
  • Tìm tập tin trong dự án

Các slide có thể được tìm thấy ở đây .

1
Philipp Claßen

Trong kiểu cửa sổ Unix hoặc X, tôi không biết rằng có một IDE tích hợp hoạt động cho mọi thứ. 

Để tương tác với trình gỡ lỗi, chỉ cần một thành phần của IDE, hãy xem xét realgud . Một điều khác mà tôi thấy hữu ích là các trình phân tích cú pháp cho các thông báo vị trí, để nếu bạn có dấu vết ngăn xếp cuộc gọi và muốn chỉnh sửa tại một vị trí cụ thể trong cửa hàng, giao diện mặt trước này sẽ làm được điều đó. 

Cho đến nay chương trình này có thể sử dụng cải tiến. Nhưng sau đó nó cũng có thể sử dụng những người làm việc trên nó để cải thiện nó. 

Tuyên bố miễn trừ trách nhiệm: Tôi làm việc trên realgud

0
rocky