يتجاهل Emacs المسار الخاص بي عندما يقوم بتشغيل أمر الترجمة
سؤال
أحاول الحصول على أمر ترجمة (خيار rake) لتشغيله باستخدام إصدار معين من روبي على نظام Mac OS X الخاص بي، وأنا أستخدم rvm للقيام بذلك حاليًا في الجهاز.يحتوي ~/.MacOSX/environment.plist الخاص بي على المسار الصحيح فيه، لكن emacs يصر على التعليق المسبق على هذا المسار وبالتالي يجعله عديم الفائدة.لقد حاولت أيضًا:
(when (equal system-type 'darwin)
(setenv "PATH" (concat "/Users/fearoffish/.rvm/bin:/Users/fearoffish/.rvm/rubies/ruby-1.8.7-p249/bin:/Users/fearoffish/.rvm/gems/ruby-1.8.7-p249/bin:/Users/fearoffish/.rvm/gems/ruby-1.8.7-p249%global/bin:/Users/fearoffish/.rvm/bin"))
(push "/Users/fearoffish/.rvm/bin" exec-path)
(push "/Users/fearoffish/.rvm/rubies/ruby-1.8.7-p249/bin" exec-path)
(push "/Users/fearoffish/.rvm/gems/ruby-1.8.7-p249/bin" exec-path)
(push "/Users/fearoffish/.rvm/gems/ruby-1.8.7-p249%global/bin" exec-path)
(push "/Users/fearoffish/.rvm/bin" exec-path))
لقد كانت محاولة يائسة من مبتدئ إيماكس للحصول على ما أردت.هو - هي ما زال يسبقه، لذلك ينتهي طريقي بما يلي:
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/Users/fearoffish/.rvm/bin:/Users/fearoffish/.rvm/rubies/ruby-1.8.7-p249/bin:/Users/fearoffish/.rvm/gems/ruby-1.8.7-p249/bin:/Users/fearoffish/.rvm/gems/ruby-1.8.7-p249%global/bin
لا أريد /usr/bin وآخرين معلقين مسبقًا، أريد ذلك لي المسار أولاً والمسار المسبق لـ emacs سيكون في النهاية، أعتقد أن هذا سيحل مشكلتي.
أقوم باختبار ذلك بمجرد فتح Aquamacs وتشغيله meta-x compile
وثم echo $PATH
.
أيه أفكار؟
المحلول
تعديل صغير للحل بواسطة Sanityinc (لم يستطع إيجاد طريقة لإدخاله في التعليقات أعلاه - هل هذا أنا فقط؟)
- أنا أستعمل
-l
خيار للقذيفة لإجبار قذيفة تسجيل الدخول (التي تقرأ.profile
أو.bash_profile
) ، بدلاً من قذيفة تفاعلية (تقرأ فقط.bashrc
). - أقوم ببعض تقليم السلسلة على المسار الذي تم إرجاعه (حيث يظهر التفتيش خطًا جديدًا يتسلل).
الكود المعدل:
(defun set-exec-path-from-shell-PATH ()
(let ((path-from-shell
(replace-regexp-in-string "[[:space:]\n]*$" ""
(shell-command-to-string "$SHELL -l -c 'echo $PATH'"))))
(setenv "PATH" path-from-shell)
(setq exec-path (split-string path-from-shell path-separator))))
(when (equal system-type 'darwin) (set-exec-path-from-shell-PATH))
نصائح أخرى
يبدو أن الجميع قد أسيء فهم القضية الأصلية: المسار قد تم إعداده بالفعل بشكل صحيح في EMACs ، ويتم تمرير المسار الصحيح بالفعل إلى القشرة التي بدأها الأمر Compile! إذن ما الذي يعطي؟ ها هو الجواب:
في MacOS X ، هناك أداة صغيرة تسمى path_helper(1)
. يطلق عليه افتراضيًا من /etc/profile
, ، والتي يتم تنفيذها بواسطة Bash on Shell Startup. عندما تبدأ مجموعة من EMACs ، فإنها تطلق قذيفة (والتي تكون افتراضيًا على MacOS X) ، وبالتالي تنفيذ هذا path_helper
أداة. وهنا تأتي النقطة الرئيسية: path_helper
إعادة ترتيب طريقك, ، نقل الدلائل القياسية مثل /usr/bin
أمام الدلائل المخصصة المخصصة الخاصة بك ، بغض النظر عن المكان الذي أضفته في الأصل. جرب هذا بنفسك عن طريق فتح قذيفة وإلقاء نظرة أولاً على المسار ، ثم تنفذ /usr/lib/path_helper
ونظر إلى المسار الناتج!
قد يكون حل القوة الغاشمة بالنسبة لك هو ببساطة التعليق على المكالمة path_helper
في /etc/profile
. لاحظ أنه بعد ذلك لن تحصل تلقائيًا على المسارات /etc/paths.d
الإعداد بواسطة path_helper
, ، وهو الغرض الرئيسي للأداة.
ليس لدي جهاز Mac ، لذلك لا يمكنني اختبار هذا مباشرة ، ولكن يمكن العثور على كل هذا في صفحة * المعلومات * قذيفة أدنى تفاعلية.
عندما تبدأ قذيفة في emacs ، فإن العملية التي تفرد هي البرنامج في متغير EMACs explicit-shell-file-name
(وإذا كان ذلك nil
, متغيرات البيئة ESHELL
و SHELL
يستخدم).
ثم يرسل محتويات ~/.emacs_*shellname*
(على سبيل المثال إذا كانت قذيتك csh
, ، من ثم ~/.emacs_csh
سيتم إرسالها. أيضا ، ملفات .rc المناسبة ل csh
يتم الحصول على البرنامج ، حتى تتمكن من تحديث ذلك أيضًا (في حالتي .cshrc
). بالإضافة إلى ذلك ، يمكنك لف التخصيصات في ملف .rc مع التحقق من متغير البيئة INSIDE_EMACS
(الذي يضعه emacs قبل تشغيل قذيفة).
تحتاج إلى تحديث تلك الملفات لتغيير المسار في shell ، وليس متغير EMACs exec-path
. exec-path
- وهي مجرد قائمة من الدلائل emacs يستخدم للعثور على برامج قابلة للتنفيذ. لا يتأثر سلوك التنفيذيين بالتغييرات على exec-path
.
أجد أن مخطط البيئة. على جهاز Macs قبيح للغاية ، لذلك أستخدم المقتطف التالي ، الذي يفترض أنك تريد أن تستخدم Emacs نفس المسار الذي تراه في terminal.app:
(defun set-exec-path-from-shell-PATH () (let ((path-from-shell (shell-command-to-string "$SHELL -i -c 'echo $PATH'"))) (setenv "PATH" path-from-shell) (setq exec-path (split-string path-from-shell path-separator))))
(هذا يعمل بالنسبة لي في Emacs 23 ؛ لم تجربه في إصدارات أخرى ، لكنني أتوقع أن يعمل.)
جرب هذا ربما. استبدال سلسلة المسار مع لك.
(إضافة إلى قائمة "تحميل المسار" ~/opt/swank-clojure/src/emacs ")
بقدر ما لاحظت ، تأخذ Emacs متغير المسار من القشرة التي يتم إطلاقها من ، لذلك أحد الحلول هو تغيير المسار $ في القشرة قبل إطلاق emacs.
أحد الأساليب الأخرى التي استخدمتها ، والتي تكون أكثر مرونة ، هي استخدام Makefile وإلحاق "Source ~/script_that_set_path" أمام كل أوامر صنع لديك.
لقد جربت العديد من الأساليب المختلفة لذلك وانتهى الأمر بعدم استخدام emacs لإعداد بيئة أوامر الترجمة الخاصة بي.
ما أفعله الآن هو إنشاء ملف run_helper.sh الذي يقوم ببساطة بتهيئة بيئة نظيفة ثم استخدامه exec $*
لتنفيذ الأمر الذي تم تمريره كوسيطة إلى run_helper.sh
هذا run_helper.sh
عادةً ما يكون هذا خاصًا بالمشروع، ولكني أحتفظ بالقالب الذي أستخدمه للبدء به عندما أقوم بإنشاء مشروع جديد.
ثم أقوم بتشغيل بسيط compile
من إيماكس مثل bash run_helper.sh rspec path/to/tests
على سبيل المثال.
إذا كنت أستخدم هذا لإجراء اختبارات روبي، فسيقوم مساعدي بتهيئة RVM لاستخدام مجموعة الياقوت والأحجار الكريمة المناسبة.إذا كنت أستخدم لغة أخرى، فقد أقوم فقط بتصدير متغيرات البيئة المطلوبة أو إجراء بعض عمليات التهيئة الأخرى، ولكن بهذه الطريقة يمكنني القيام بذلك في برنامج bash النصي بدلاً من الاضطرار دائمًا إلى العبث بمسارات emacs وelisp في كل مرة أبدأ فيها مشروعًا جديدًا.
وهنا مثال على أ run_helper.sh
ملف
#!/bin/bash
cd /Users/simao/Documents/sp
export DYLD_LIBRARY_PATH="/usr/local/mysql/lib:$DYLD_LIBRARY_PATH"
source "$HOME/.rvm/scripts/rvm" # This loads the proper ruby and gemset from .rvmrc
export RAILS_ENV=test
exec $*
وهذا أيضًا يجعل اختباراتي تعمل بشكل أسرع لأن لدي الكثير من الأشياء في جهازي .zshrc
أنني لا أريد التحميل فقط لإجراء بعض الاختبارات.
لقد عملت بالنسبة لي مع شيئين.
أولاً ، اتبعت نصيحة Sanityinc
يتم الآن نشر نسخة محسنة ومعدلة من Snippet Code كمكتبة ELISP تسمى Exec-Path-From-Shell ؛ تتوفر حزم قابلة للتثبيت في Marmalade و Melpa
لا يزال لدي مشكلة مع أوامر التجميع. Valko Sipuli هي على حق أن هناك مشكلة تتضمن path_helper.
لقد علقت الخط المقابل في /etc /profile ولم يساعد. المشكلة لا تزال هناك. أنا لا أستخدم باش ولكن zsh. حفر قليلا وجدت /إلخ /zshenv. هذا الملف يدعو أيضًا Path_Helper.
بعد التعليق على قسم path_helper في /etc /zshenv ، يكون طريقي صحيحًا أخيرًا