سؤال

يتضمن سير العمل حاليًا مع Emacs عندما أقوم بالبرمجة بلغة C أو C++ ثلاث نوافذ.الأكبر على اليمين يحتوي على الملف الذي أعمل معه.يتم تقسيم اليسار إلى قسمين، الجزء السفلي عبارة عن غلاف أستخدمه للكتابة في الترجمة أو إصدار الأوامر، والجزء العلوي غالبًا ما يكون نوعًا من الوثائق أو ملف README الذي أرغب في الرجوع إليه أثناء العمل.أعلم الآن أن هناك بعض مستخدمي Emacs الخبراء جدًا، ولدي فضول لمعرفة ما هي Emacs الأخرى المفيدة وظيفيًا إذا كانت النية هي استخدامها كـ IDE كامل.على وجه التحديد، عادةً ما تؤدي معظم بيئات التطوير المتكاملة هذه الوظائف بشكل أو بآخر:

  • محرر كود المصدر
  • مترجم
  • تصحيح الأخطاء
  • بحث التوثيق
  • التحكم في الإصدار
  • ميزات OO مثل البحث عن الفئة ومفتش الكائنات

بالنسبة لعدد قليل من هذه، من الواضح جدًا كيف يمكن لـ Emacs أن يناسب هذه الوظائف، ولكن ماذا عن الباقي؟أيضًا، إذا كان يجب التركيز على لغة معينة، فسأقول إنها يجب أن تكون C++.

يحرر: أشار أحد المستخدمين إلى أنه كان ينبغي علي أن أكون أكثر تحديدًا عندما قلت "ماذا عن الباقي".في الغالب كان لدي فضول بشأن التحكم الفعال في الإصدار، بالإضافة إلى البحث عن الوثائق.على سبيل المثال، في SLIME، من السهل جدًا إجراء بحث سريع للمواصفات الفائقة على دالة Lisp.هل هناك طريقة سريعة للبحث عن شيء ما في وثائق C++ STL (إذا نسيت بناء الجملة الدقيق لـ خريطة التجزئة, ، على سبيل المثال)؟

هل كانت مفيدة؟

المحلول

يجب أن تكون محددًا فيما يتعلق بما تعنيه بـ "الباقي".باستثناء مفتش الكائن (الذي أعرفه)، يقوم إيماكس بكل ما سبق بسهولة تامة:

  • المحرر (واضح)
  • مترجم - تشغيل فقط M-x compile وأدخل أمر الترجمة الخاص بك.من الآن فصاعدا، يمكنك فقط M-x compile واستخدام الافتراضي.سيقوم Emacs بالتقاط أخطاء مترجم C/C++ (يعمل بشكل أفضل مع دول مجلس التعاون الخليجي) ويساعدك على الانتقال إلى الأسطر التي تحتوي على تحذيرات أو أخطاء.
  • تصحيح الأخطاء - وبالمثل، عندما تريد تصحيح الأخطاء، اكتب M-x gdb وسوف يقوم بإنشاء مخزن مؤقت gdb مع روابط خاصة
  • البحث عن الوثائق - يحتوي emacs على روابط CScope ممتازة للتنقل في التعليمات البرمجية.للحصول على وثائق أخرى:يحتوي Emacs أيضًا على قارئ للصفحات، ولكل شيء آخر، هناك الويب والكتب.
  • التحكم في الإصدار - هناك الكثير من روابط Emacs لمختلف واجهات VCS الخلفية (تتبادر إلى الذهن CVS وSCCS وRCS وSVN وGIT)

يحرر:أدرك أن إجابتي حول البحث عن الوثائق تتعلق حقًا بالتنقل في التعليمات البرمجية.إليك المزيد من المعلومات الدقيقة:

لا شك أن البحث في Google سيكشف عن المزيد من الأمثلة.

كما يظهر الرابط الثاني، يمكن إجراء البحث عن الوظائف (وأي شيء) في وثائق أخرى، حتى لو لم تكن مدعومة خارج الصندوق.

نصائح أخرى

يجب أن أوصي متصفح كود إيماكس باعتبارها بيئة نمط IDE أكثر "تقليدية" لـ emacs.

يحرر:أنا أيضا أوصي الآن ماجيت للغاية عبر واجهة VCS القياسية في emacs.

بدلاً من تشغيل أمر make في نافذة الصدفة، هل حاولت ترجمة M-x؟سيقوم بتشغيل أمر make الخاص بك، وعرض الأخطاء، وفي كثير من الحالات يجعل من السهل جدًا الانتقال إلى سطر التعليمات البرمجية الذي تسبب في الخطأ إذا كان الإخراج يتضمن أسماء الملفات وأرقام الأسطر.

إذا كنت من محبي IDEs، فقد ترغب أيضًا في إلقاء نظرة على حزمة شريط السرعة الخاص بـ emacs (M-x speedbar).وإذا لم تكن قد فعلت ذلك بالفعل، فتعرف على كيفية استخدام جداول العلامات للتنقل في التعليمات البرمجية الخاصة بك.

هناك جوانب من emacs تم اكتشافها ذات مرة تجعلك أكثر إنتاجية بطرق لم تفكر بها من قبل.كما ذكر آخرون، يعد استخدام العلامات طريقة رائعة وسريعة لتكبير كود المصدر الخاص بك واستخدام M-/ (dabbrev-expand) غالبًا ما يفعل بالضبط ما تتوقعه عند إكمال اسم متغير.

يعد استخدام "الحدث" مفيدًا للحصول على مخزن مؤقت يحتوي على كافة تكرارات التعبير العادي في المخزن المؤقت.يعد هذا مفيدًا حقًا عند إعادة بناء التعليمات البرمجية والبحث عن أجزاء من التعليمات البرمجية أو استخدامات المتغيرات، أو إذا كنت تستخدم علامات TODO في ملفات المصدر الخاصة بك وترغب في زيارتها جميعًا.

يمكن أن تكون وظائف خطوط التدفق وحقول الفرز الرقمية واستبدال regexp والمستطيل مفيدة حقًا لأخذ تفريغ من بعض الأدوات وتحويلها إلى بيانات مفيدة مثل برنامج elisp أو جدول بيانات محدد بفواصل.

لقد كتبت صفحة حول IDE مثل الأشياء التي يمكنك القيام بها باستخدام emacs

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

يعد تعلم elisp طريقة رائعة أخرى للإجابة بنفسك عما يمكن أن يفعله emacs بما يتجاوز ما يمكن أن يفعله IDE النموذجي.

على سبيل المثال، قمت بالتدوين حول كتابة وظائف مساعد Perforce مثل اللوم (كتابة وظائفك الخاصة تعني أنه يمكنك جعلها تتصرف تمامًا كما تريد)...

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

لقد كتبت أيضًا تعليمات برمجية تنشئ تعليقات ديناميكيًا لوظيفة ما، والتي تتوافق مع معايير الترميز التي أعمل معها.

لا يوجد أي من أكواد elisp الخاصة بي رائعة بشكل خاص، ومعظمها موجود بالفعل في المكتبات، ولكن من المفيد حقًا أن تكون قادرًا على جعل emacs يقوم بأشياء مخصصة تظهر للتو خلال يوم العمل.

يمكنك العثور على وصف تفصيلي لتكامل emacs والتحكم في الإصدار على موقعي.أعمل أيضًا على مقال حول استخدام Emacs كبيئة تطوير للعديد من اللغات - C/C++، Java، Perl، Lisp/Scheme، Erlang، إلخ...

للتحكم في الإصدار، هناك العديد من الأشياء التي يمكنك استخدامها، اعتمادًا على نظام التحكم في الإصدار الذي تستخدمه.لكن بعض الوظائف مشتركة بينهم جميعًا.

vc.el هي الطريقة المضمنة للتعامل مع التحكم في الإصدار على مستوى الملف.يحتوي على واجهات خلفية لمعظم أنظمة التحكم في الإصدار.على سبيل المثال، تأتي الواجهة الخلفية Subversion مع Emacs، وهناك واجهات git الخلفية وأخرى متاحة من مصادر أخرى.

الأمر الأكثر فائدة هو ج-س ضد ضد (vc-next-action) الذي يقوم بالإجراء التالي المناسب للملف الذي تزوره.قد يعني هذا التحديث من المستودع أو تنفيذ التغييرات، كما يتم إعادة ربط vc.el أيضًا ج-س ج-ف لإيداع الملفات وإخراجها إذا كنت تستخدم نظامًا يحتاج إليها (مثل RCS).

أوامر أخرى مفيدة للغاية هي ج-س ضد ل و ج-س ت = التي تظهر لك السجل والفرق الحالي للملف الذي تستخدمه.

ولكن لتحقيق إنتاجية حقيقية، يجب عليك تجنب استخدام أوامر vc.el ذات الملف الواحد بخلاف الأشياء البسيطة.هناك العديد من الحزم التي يمكن أن تمنحك نظرة عامة على حالة الشجرة بأكملها، وتمنحك المزيد من القوة، ناهيك عن القدرة على إنشاء التزامات متماسكة تغطي عدة ملفات.

معظمها متأثر بشدة أو يعتمد على الأصل pcl-CV/com.pcvs ل CVS.هناك حتى اثنان منهم يأتي مع التخريب، psvn.el و dsvn.el.هناك حزم لـ git وما إلى ذلك.

حسنًا، الجميع هنا يقدمون تلميحات مثالية لجعل emacs بيئة تطوير متكاملة رائعة.

ولكن يجب على أي شخص أن يضع في اعتباره أنه عندما تقوم بتخصيص ملفات emacs الخاصة بك مع الكثير من الامتدادات (خاصة تلك الخاصة بفحص النوع بسرعة، وعمليات البحث عن تعريفات الوظائف، وما إلى ذلك) فإن ملفات emacs الخاصة بك سيتم تحميلها ببطء شديد جدًا بالنسبة للمحرر.

للتغلب على هذه المشكلة، أوصي بشدة باستخدام emacs في server mode.

إنه سهل الاستخدام جدًا، ولا حاجة لتخصيص ملف init الخاص بك.كل ما عليك فعله هو تشغيل emacs في الوضع الخفي؛

emacs --daemon

سيؤدي هذا إلى إنشاء خادم emacs، ثم يمكنك توصيله إما من المحطة الطرفية أو من واجهة المستخدم الرسومية.أوصي أيضًا بإنشاء بعض الأسماء المستعارة لتسهيل الاتصال.

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

بهذه الطريقة، سيتم تشغيل emacs بشكل أسرع من gedit وprogramme.

المشكلة الوحيدة المحتملة هنا، إذا كنت تقوم بتشغيل البرنامج الخفي emacs من مستخدمك العادي، فمن المحتمل أنك لا تستطيع الاتصال بخادم emacs كـ root.

لذلك، إذا كنت بحاجة إلى فتح ملف له حق الوصول إلى الجذر؛يستخدم tramp بدلاً من.ما عليك سوى تشغيل عميل emacs الخاص بك مع المستخدم العادي لديك وفتح ملفات مثل هذا؛

C-x C-f
/sudo:root@localhost/some/file/that/has/root/access/permissions
# on some linux distro it might be `/su:root@...` 

هذا جعل حياتي أسهل، يمكنني فتح بيئة تطوير Python IDE الثقيلة والمخصصة في أجزاء من الثانية بهذه الطريقة.قد ترغب أيضًا في إضافة emacs --daemon إلى بدء تشغيل النظام لديك، أو إنشاء ملف سطح مكتب لـ emacsclient.الأمر متروك لك.

يمكن العثور على المزيد عن برنامج emacs daemon وعميل emacs على موقع wiki؛

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

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

أوافق على أنه يجب عليك التعرف على ترجمة M-x (اربط ذلك والخطأ التالي M-x بتسلسل مفاتيح قصير).

تعرف على الارتباطات الخاصة بالتحكم في الإصدار (على سبيل المثال.VC-diff، VC-الإجراء التالي، وما إلى ذلك)

ابحث في السجلات.لا يمكنك فقط تذكر المواقع الموجودة في المخازن المؤقتة ولكن تكوينات النافذة بأكملها (C-x r w - تكوين النافذة للتسجيل).

نقطة البداية (والتي قد تكون غير واضحة) لاستكشاف ميزات VC الخاصة بـ Emacs هي M-x vc-الإجراء التالي.

فهو يقوم "بعملية التحكم في الإصدار المنطقي التالية" على الملف الحالي، اعتمادًا على حالة الملف والواجهة الخلفية لـ VC.لذلك إذا لم يكن الملف تحت التحكم في الإصدار، فإنه يسجله، وإذا تم تغيير الملف، يتم إرسال التغييرات وما إلى ذلك.

يستغرق الأمر بعض الوقت للتعود عليه، لكني أجده مفيدًا جدًا.

ربط المفاتيح الافتراضي هو ج-س ضد ضد

هناك TFS.el لتكامل emacs في Microsoft TFS.وهو يعمل مع أي TFS، بما في ذلك TFS الذي يقوم بتشغيل Codeplex.com.

الخطوات الأساسية للإعداد:

  1. ضع tfs.el في مسار التحميل الخاص بك.

  2. في ملف .emacs الخاص بك:

    (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. أيضًا في ملف .emacs الخاص بك، قم بتعيين روابط المفاتيح المحلية أو العامة لأوامر tfs.مثل ذلك:

    (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)
    

تعد أوامر الترجمة والخطأ التالي والخطأ السابق كلها أوامر مهمة جدًا لتطوير C++ في Emacs (تعمل بشكل رائع على إخراج grep أيضًا).تعد العلامات الإلكترونية وجدول علامات الزيارة وعلامة البحث مهمة أيضًا.يعدComplete.el واحدًا من أعظم الاختراقات المجهولة في القرن العشرين، ويمكنه تسريع اختراق C++ الخاص بك بدرجة كبيرة.أوه ودعونا لا ننسى إديف.

لم أتعلم بعد كيفية استخدام التحكم في الإصدار دون زيارة الصدفة، ولكن الآن بعد أن قمت بتشغيل الالتزامات بشكل متكرر أكثر (مع git)، ربما سأضطر إلى ذلك.

قد تجد أيضا شريط التبويب مفيد.إنه يحاكي السلوك الوحيد الذي فاتني عند الانتقال من Eclipse إلى Emacs.ملزم بـ "،" و "." للانتقال إلى شريط علامة التبويب السابق والحصل ، فإنه يسترجعك من تبديل المخزن المؤقت بواسطة Ctrl-X B طوال الوقت.

لسوء الحظ، لا توفر صفحة الويب المذكورة الإصدار الصحيح للتنزيل.ومع ذلك، فإن معظم إصدارات Ubuntu تقدمه في حزم emacs-goodies الخاصة بها.

أستخدم إيماكس على نظام التشغيل Windows.وحدة الترجمة جميلة، لكنني أردت أن تكون الترجمة أكثر ذكاءً فيما يتعلق بسطر أوامر الترجمة الذي تقترحه. من الممكن استخدام "متغيرات الملفات" للتحديد compile-command, لكنني أردت شيئًا أكثر ذكاءً من ذلك.لذلك كتبت وظيفة صغيرة للمساعدة.إنه يخمن أمر الترجمة الذي سيتم استخدامه لمطالبة المستخدم عند التشغيل compile.

تبحث وظيفة التخمين عن ملف vbproj أو csproj أو sln، وإذا وجدت، فإنها تقترح msbuild.ثم ينظر إلى اسم ملف المخزن المؤقت، وبناءً على ذلك، يقترح أشياء مختلفة.يعني الملف ‎.wxs أنه مشروع WIX، ومن المحتمل أنك تريد إنشاء MSI، لذا يقترح منطق التخمين أمر nmake لـ MSI.إذا كانت وحدة Javascript، فالاقتراح هو تشغيل jslint-for-wsh.js لفحص ملف .js.كبديل، يقترح nmake.

يبدو الرمز الذي أستخدمه كما يلي:

(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)

لقد حاولت القيام بذلك "قبل النصيحة" لوظيفة الترجمة ولكن لم أتمكن من تشغيلها بشكل مرض.لذلك قمت بتعريف وظيفة جديدة وربطتها بنفس مجموعة ضغطات المفاتيح التي كنت أستخدمها من أجلها compile.


يحرر هنالك الان "أكثر ذكاءً-compile.el"وهو ما يأخذ هذه الفكرة خطوة أخرى إلى الأمام.

في البحث عن الوثائق:يعتمد ذلك على لغة (لغات) البرمجة الخاصة بك.

عادةً ما يتم توثيق مكتبات C واستدعاءات النظام في صفحات الدليل.لذلك يمكنك استخدام M-x man.قد يتم توثيق بعض الأشياء بشكل أفضل في صفحات المعلومات؛يستخدم M-x info.

بالنسبة إلى elisp نفسها، استخدم C-h f.بالنسبة لبيثون، استخدم >>> help(<function, class, module>) في المترجم.

أجد أن معظم اللغات الأخرى تقدم الوثائق في شكل HTML.لذلك، جرب متصفحًا مضمنًا (أستخدم w3m).وضع الخاص بك BROWSER متغير البيئة إلى البرنامج النصي المجمع حولها emacsclient -e "(w3m-goto-url-new-session \"$@\")" (on *nix)، في حالة احتمال فتح متصفح ما وتريد فتحه داخل emacs.

أعلم أن هذا مقال قديم جدًا.ولكن هذا السؤال صالح للمبتدئين إيماكس.

IMO أفضل طريقة لاستخدام emacs كـ ide هي استخدام ملف بروتوكول خادم اللغة مع إيماكس.يمكنك العثور على جميع المعلومات حول خوادم اللغة في الموقع المرتبط.

لإعداد سريع، أود أن أحثك ​​على الذهاب إلى هذه الصفحة ثرثار .يقوم IMO بعمله بشكل جيد.إنه يتكامل بشكل جيد مع حزم الإكمال التلقائي مثل الشركة.يوفر مرجع البحث، وأكثر من ذلك.

بالنسبة لمصحح الأخطاء أيضًا، قد تحتاج إلى مصححات أخطاء محددة للغات معينة.يمكنك استخدام gdb من داخل emacs.فقط اكتب M-x gdb .

لتجميع التعليمات البرمجية الخاصة بك، من الأفضل استخدام أوامر shell.أنا أعمل على هذا المشروع eproj.سيستغرق الأمر بعض الوقت لإكماله.ولكن كل ما يفعله هو تعيين أمر Shell لنوع المشروع.ويبني مشروعك عبر شركة شل.يفعل نفس الشيء لتنفيذ الأمر.ربما أحتاج إلى مساعدة لإكمال هذا المشروع.إنه ليس جاهزًا للاستخدام، ولكن إذا كنت تعرف القليل من elisp، فيمكنك الاطلاع على الكود.

وبغض النظر عن ذلك، فمن الأفضل دائمًا استخدام أمر الترجمة emacs.

للتحكم في الإصدار، لم أر حتى الآن أي حزمة أخرى يمكن أن تضاهي قوة ماجيت.إنها خاصة بـ git.يوجد أيضًا بالنسبة لـ git حزمة أخرى git-timemachine، والتي أجدها مفيدة جدًا.

يتم توفير البحث عن الكائنات والبحث عن الفئة من خلال بروتوكول خادم اللغة.

يمكن استخدام شجرة المشروع لواجهة مثل ide com.treemacs.

هناك أيضًا مكتبة تفاعلية للمشروع تسمى قذيفة.

للإكمال التلقائي، أجد وضع الشركة مفيد جدا.

حقا يمكن صنع emacs لفعل أي شيء.

في السنوات الأخيرة، أصبح Clang جزءًا مهمًا من دعم Emacs C++.تحدث أتيلا نيفيس في CppCon 2015:"Emacs باعتباره C++ IDE"

وهي عبارة عن محادثة مدتها 16 دقيقة، حيث يعرض حلولاً للمواضيع التالية:

  • انتقل إلى التعريف
  • الإكمال التلقائي
  • تسليط الضوء على بناء الجملة على الطاير
  • البحث عن الملف في المشروع

يمكن العثور على الشرائح هنا.

في نمط Windows Unix أو X، لا أعلم أن هناك بيئة تطوير متكاملة (IDE) متكاملة تناسب كل شيء.

للتفاعل مع مصححات الأخطاء، خذ بعين الاعتبار مكونًا واحدًا فقط من IDE com.realgud.الشيء الآخر الذي أجده مفيدًا هو المحللون اللغويون لرسائل الموقع، بحيث إذا كان لديك تتبع مكدس الاستدعاءات وتريد التحرير في مكان معين في مكدس الاستدعاءات، فإن واجهة الواجهة الأمامية هذه يمكنها القيام بذلك.

إلى حد بعيد يمكن لهذا البرنامج استخدام التحسين.ولكن يمكنها أيضًا الاستعانة بالأشخاص الذين يعملون عليها لتحسينها.

تنصل:أنا أعمل على Realgud

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top