سؤال

أنا أستخدم gvim على نظام التشغيل Windows.

لقد أضفت في _vimrc الخاص بي:

set shell=powershell.exe
set shellcmdflag=-c
set shellpipe=>
set shellredir=>

function! Test()
  echo system("dir -name")
endfunction

command! -nargs=0 Test :call Test()

إذا قمت بتنفيذ هذه الوظيفة (:Test) أرى أحرفًا لا معنى لها (أحرف ASCII غير رقمية/حرفية).

إذا استخدمت cmd كصدفة، فإنها تعمل (بدون -name)، لذا يبدو أن المشكلة تكمن في الحصول على الإخراج من powershell إلى vim.

ومن المثير للاهتمام أن هذا يعمل بشكل رائع:

:!dir -name

كما يفعل هذا:

:r !dir -name

تحديث: تأكيد السلوك الذي ذكره ديفيد

إذا قمت بتنفيذ أوامر المجموعة المذكورة أعلاه في _vimrc، فإن :Test يُخرج هراء.ومع ذلك، إذا قمت بتنفيذها مباشرة في vim بدلاً من _vimrc، فإن :Test يعمل كما هو متوقع.

لقد حاولت أيضًا استخدام Iconv في حالة وجود مشكلة في التشفير:

:echo iconv( system("dir -name"), "unicode", &enc )

لكن هذا لم يحدث أي فرق.ربما أستخدم أنواع الترميز الخاطئة بالرغم من ذلك.

هل يعرف أحد كيفية جعل هذا العمل؟

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

المحلول

إنه اختراق إلى حد ما، لكن ما يلي يعمل في Vim 7.2.لاحظ أنني أقوم بتشغيل Powershell خلال جلسة CMD.

if has("win32")
    set shell=cmd.exe
    set shellcmdflag=/c\ powershell.exe\ -NoLogo\ -NoProfile\ -NonInteractive\ -ExecutionPolicy\ RemoteSigned
    set shellpipe=|
    set shellredir=>
endif

function! Test()
  echo system("dir -name")
endfunction

تم اختباره مع ما يلي ...

  • :!dir -name
  • :call Test()

نصائح أخرى

لقد واجهت مشكلة مماثلة وصفها الكثيرون هنا.

على وجه التحديد، الدعوة

:set shell=powershell

يدويًا من داخل vim قد يتسبب في عمل powershell بشكل جيد، ولكن بمجرد أن أضفت:

set shell=powershell

إلى ملف vimrc الخاص بي، سأحصل على الخطأ "غير قادر على فتح الملف المؤقت ...."

تكمن المشكلة في أنه عند تعديل الصدفة، يقوم vim تلقائيًا بتعيين shellxquote على "" مما يعني أن أوامر الصدفة ستبدو كما يلي:

 powershell -c "cmd > tmpfile"

حيث يجب أن يبدو هذا الأمر هكذا، حتى يتمكن vim من قراءة الملف المؤقت:

 powershell -c "cmd" > tmpfile

تعيين shellquote على "في ملف vimrc الخاص بي وإلغاء ضبط shellxquote (أي.تعيينه على مساحة فارغة) يبدو أنه يعمل على حل جميع مشكلاتي:

set shell=powershell
set shellcmdflag=-c
set shellquote=\"
set shellxquote=

لقد حاولت أيضًا المضي قدمًا في هذا الأمر وبرمجة vim قليلاً باستخدام استدعاء النظام ():نظام () مع بوويرشيل في vim

أظن أن المشكلة تكمن في أن Powershell يستخدم ترميز السلسلة الأصلي لـ .NET، وهو UTF-16 بالإضافة إلى علامة ترتيب البايت.

عندما يتم توصيل الكائنات بين الأوامر، فهذه ليست مشكلة.إنه بيتا إجمالي للبرامج الخارجية بالرغم من ذلك.

يمكنك توجيه الإخراج من خلال ملف خارجي، وهو ما يدعم تغيير التشفير، ولكنه لا يزال يقوم بتنسيق الإخراج للمحطة الموجودة فيه افتراضيًا (arrgh!)، لذلك سيتم اقتطاع أشياء مثل "Get-Process" باستخدام علامات الحذف، وما إلى ذلك.يمكنك تحديد عرض الجهاز الظاهري الذي يستخدمه Out-File.

لست متأكدًا من مدى فائدة هذه المعلومات، ولكنها تسلط الضوء على المشكلة أكثر قليلاً.

حاول استبدال

"dir \*vim\*"

مع

 " -command { dir \*vim\* }"

يحرر: حاول استخدام cmd.exe كـ Shell ووضع "powershell.exe" قبل "-command"

سؤال مثير للاهتمام - هنا شيء آخر يضاف إلى الارتباك.بدون إجراء أي تغييرات على ملف .vimrc الخاص بي، إذا قمت بعد ذلك بتشغيل الأوامر التالية في gvim:

:set shell=powershell.exe
:set shellcmdflag=-noprofile
:echo system("dir -name")

يتصرف كما هو متوقع!

إذا قمت بإجراء نفس التغييرات على ملف .vimrc الخاص بي، على الرغم من (خيارات Shell وshellcmdflag)، فإن تشغيل :echo system("dir -name") يُرجع الأحرف غير المنطقية!

يعمل رمز المثال الأولي بشكل جيد بالنسبة لي عندما أقوم بوضعه في vimrc.

والآن أحاول معرفة ما الذي يجعله يعمل في vimrc الخاص بي.ربما:

set encoding=utf8

يحرر:نعم، يبدو أن هذا يفعل ذلك.ربما تريد أن يكون VIM افتراضيًا على unicode على أي حال، هذه الأيام...

لم تكن أي من الإجابات الموجودة في هذه الصفحة مناسبة لي حتى وجدت هذا التلميح https://github.com/dougireton/mirror_pond/blob/master/vimrc - تعيين shellxquote= [حرف المسافة] كان القطعة المفقودة.

if has("win32") || has("gui_win32") 
     if executable("PowerShell") 
        " Set PowerShell as the shell for running external ! commands 
        " http://stackoverflow.com/questions/7605917/system-with-powershell-in-vim      
        set shell=PowerShell 
        set shellcmdflag=-ExecutionPolicy\ RemoteSigned\ -Command 
        set shellquote=\" 
        " shellxquote must be a literal space character. 
        set shellxquote=  
   endif 
endif 

أقترح حلا اختراقا.إنه لا يحل المشكلة حقًا، لكنه ينجز المهمة بطريقة أو بأخرى.

هذا البرنامج المساعد فيم أتمتة إنشاء ملف نصي مؤقت، واستدعاء بوويرشيل من خلال cmd.exe ولصق النتيجة.إنها ليست لطيفة مثل التعامل مع بوويرشيل المناسب بواسطة vim، ولكنها تعمل.

حاول بدلا من ذلك set shellcmdflag=\ -c


توضيح:

يستخدم Vim tempname() لإنشاء مسار ملف مؤقت يقرأه النظام().

If & shell يحتوي على "sh" و & shellcmdflag يبدأ بـ '-' ثم TempName () يقوم بإنشاء مسار ملف temp مع مائلة للأمام.

وهكذا إذا set shell=powershell set shellcmdflag=-c بعد ذلك ، سيحاول VIM قراءة ملف Temp مع مائلات للأمام لا يمكن العثور عليها.

العلاج هو تعيين بدلا من ذلك set shellcmdflag=\ -c وهذا يعني ، إضافة مساحة بيضاء إلى & shellcmdflag بحيث لم يعد الحرف الأول "-" و tempname () ينتجون مسار ملف مؤقت مع مائل متخلف يمكن العثور عليه بواسطة System ().


لقد قمت بالتعليق على القائمة البريدية vim_dev ( https://groups.google.com/forum/#!topic/vim_dev/vTR05EZyfE0 ) أن هذا يستحق توثيقًا أفضل.

actf الإجابة تناسبني، ولكن نظرًا لوجود Powershell المدمج في DIFF (والذي يختلف عن Linux) يجب عليك إضافة هذا السطر إلى ملف تعريف Powershell الخاص بك حتى تتمكن من العمل مرة أخرى في VIM:

Remove-Item Alias:diff -force

لا أستخدم VIM ولكن الإخراج الافتراضي لـ Powershell هو Unicode.يمكن لبرنامج "المفكرة" قراءة الكود الموحد، ويمكنك استخدامه لمعرفة ما إذا كنت تحصل على المخرجات التي تتوقعها.

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