Vsvim: لا يضع cc المؤشر عند مسافة بادئة إذا كان على سطر فارغ

تم إنشاؤها على ٨ مايو ٢٠١٢  ·  10تعليقات  ·  مصدر: VsVim/VsVim

يحذف cc السطر الحالي ويضع المؤشر في وضع الإدراج (يحدد خيار "Autoindent" موضعه).

لا تضع VsVim المؤشر دائمًا في الموضع الصحيح. الحالة الوحيدة التي تمكنت من إعادة إنتاجها باستمرار هي إذا قمت بنسخها في سطر فارغ ، فستضع المؤشر في العمود الأول بدلاً من المسافة البادئة.
ضع في اعتبارك كود البدء C # التالي ([] هو المؤشر ، | رمز الإيكورس):

class Foo {
    public void Bar()
    [{]
    }
}

اضغط على o لفتح السطر أدناه:

class Foo {
    public void Bar()
    {
        |
    }
}

الآن اضغط على Esc :

class Foo {
    public void Bar()
    {
[ ]
    }
}

الآن اضغط على cc . هذا هو المكان الذي يختلف فيه Vim و VsVim: سيضع Vim المؤشر بمسافة بادئة داخل الشريط:

class Foo {
    public void Bar()
    {
        |
    }
}

بينما سيضعه VsVim في السطر 0:

class Foo {
    public void Bar()
    {
|
    }
}

بدلاً من ذلك ، استخدم هذا الرمز:

class Foo {
    public void Bar()
    {
        throw new NotImplementedException()[;]
    }
}

في كل من Vim و VsVim ، سيضع cc المؤشر في الموضع ذي المسافة البادئة ، لكن cc<Esc>cc سيضع المؤشر في العمود 0 في VsVim (بينما يضعه Vim عند المسافة البادئة اليمنى).

bug

التعليق الأكثر فائدة

يعطيني هذا الحل البسيط السلوك الذي أتوقعه من vim:

nmap S ddO
nmap cc S

ال 10 كومينتر

يعكس السلوك الذي أراه في VsVim ما أراه في gVim.

أعتقد أن لدينا وضع تبديل مختلف. أرى بالفعل اختلافًا في السلوك بعد الخطوة "o" في الأعلى. سيظهر مؤشري في نفس العمود مثل { ولن يكون به مسافة بادئة كما كان.

هل يمكنك تشغيل :set ولصق الناتج؟

يبدو أن autoindent هو أحد تلك الخيارات التي قمت بتعيينها في vimrc الخاص بي ، والذي أستخدمه بعد ذلك source في vsvimrc.

hlsearch
ignorecase
incsearch
scrolloff=5
smartcase
vimrc="C:\Users\pmateescu\_vsvimrc"
vimrcpaths="C:\Users\pmateescu;C:\Users\pmateescu"
autoindent
number
tabstop=4

هل تحسب VsVim إعدادات المسافة البادئة في VS؟ إذا كان الأمر كذلك ، فإليك لي (ضمن خيارات -> محرر النصوص -> C # -> تنسيق):

  1. المسافة البادئة (محتويات كتلة المسافة البادئة ، الحالة ، الملصقات ، عدم وضع مسافة بادئة بين الأقواس المفتوحة / المغلقة)
class MyClass
{
    public void Method()
    {
        goto MyLabel;
MyLabel:
        return;
    }
}
  1. ضمن خطوط جديدة ، تم فحص كل شيء
  2. التباعد: كل شيء لم يتم تحديده باستثناء "تعيين خيارات التباعد الأخرى" - أدخل مسافة بعد الكلمات الرئيسية في بيانات تدفق التحكم ؛ "ضبط المسافات للمحددات" -: بعد النقطتين للقاعدة ، بعد الفاصلة ، بعد الفاصلة المنقوطة في for ، قبل النقطتين للقاعدة ؛ "ضبط التباعد لعوامل التشغيل": قبل وبعد.

لا أعرف ما إذا كان هذا مهمًا أيضًا ، لكنني قمت بتعيين المسافة البادئة على Smart ، الحجم 4 ، Keep علامات التبويب.

HTH

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

ألقوا نظرة سريعة على الكود ويبدو أنه مشكلة في الأسطر الفارغة. الرمز لا يحترم autoindent عندما كان السطر المحذوف فارغًا وهو ما يجب أن يكون كذلك

بشكل عام ، تفضل VsVim المسافة البادئة لـ Visual Studio على المسافة البادئة لـ Vim. يمكن تجاوز ذلك عن طريق تعطيل الخيار vsvim_useeditorindent .

هذا ينجح في الغالب. لسوء الحظ في عام 2010 على الرغم من أن جميع اللغات لا توفر واجهات برمجة تطبيقات جيدة لخدمات الطعن. C # لديها الأفضل ، و VB ليس لديها أي شيء عمليًا و C ++ هي لفة النرد. أعتقد أنه يتحسن في VS11 ولكن لم يتم اللعب بما يكفي حتى الآن لمعرفة المقدار.

سنحاول الضغط على هذا الإصلاح في 1.3

تم اللعب أكثر قليلاً وهذا السلوك تم إيقافه بالفعل من cindent وليس autoindent . هذا هو أحد الأسباب التي جعلتني استغرقت وقتًا طويلاً في معالجة المشكلة. كنت أجرب الملفات النصية حيث تم تمكين autoindent . هذا فقط في ملفات C مع cindent .

أنت على حق ، لقد تمكنت من إعادة إنتاجه أيضًا بعد أن ذكرته بـ vim -U NONE -u NONE -cmd 'set cindent' index.cs

في الإعدادات العادية ، يبدو أن Vim يقوم تلقائيًا بتعيين cindent عندما يكون في ملفات تشبه C (تظهر في :setl في كل من C # و JS).
ومع ذلك ، يبدو أن السلوك نفسه - إزالة المسافة البادئة على <Esc> ، وإعادة المسافة البادئة على cc - يحدث في ملفات بخلاف cindent : ظهر لي في كل من CSS و HTML ، ولكن في هذه الحالات ، قد يكون هذا هو تأثير indentexpr .

تضمين التغريدة
تضمين التغريدة

مرحبًا يا شباب ، لقد قابلت نفس المشكلة.
هل تم إصلاحه في الإصدار الأخير؟
الناتج بعد :set

backspace="indent,eol,start"
hlsearch
ignorecase
incsearch
autoindent

lookforit في الوقت الحالي لا. هذا السلوك هو في الواقع جزء من cindent وهو غير مدعوم من قبل VsVim في هذا الوقت.

يعطيني هذا الحل البسيط السلوك الذي أتوقعه من vim:

nmap S ddO
nmap cc S

هذا لا يزال لطيفًا. إحساسي البديهي هو أن "cc" لمسح السطر والبدء في التحرير يجب أن يبدأ في نفس مستوى المسافة البادئة مثل إنشاء سطر جديد. هل هناك منطق Vim / VS داخلي مفاده أن هذا لا ينبغي أن يكون كذلك؟ قد أتعامل معه باعتباره تقدمًا في العمل مع المشروع.

لم يكن حل هذه المشكلة ظاهريًا أكثر من "القيام مقابل cc مهما كان o كان يفعله بالفعل" (وهذا هو سبب نجاح حل رائعًا عمل أكثر قليلا.

كان VsVim يقوم بالفعل بالشيء الصحيح لما يسمى بـ "vim indent" ، وهو نوع المسافة البادئة التي يستخدمها VsVim عندما لا تتوفر خدمة لغة. من أجل إضافة اختبارات لهذه المشكلة ، كان علي إضافة بنية أساسية للاختبارات لمحاكاة خدمة اللغة. لذلك كان قطع الاتصال هو أن جميع الاختبارات الحالية تستخدم "مسافة بادئة vim" ولكن 99٪ من المستخدمين يستخدمون "مسافة بادئة للمضيف" ، أي أنهم يحررون الملفات حيث يوفر Visual Studio خدمة المسافة البادئة.

لمزيد من تعقيد المشكلة ، كان هناك خطأ لم يبلغ عنه أحد من قبل باستخدام "vim indent" حيث لم يعمل بشكل صحيح عندما لم يتم توسيع علامات التبويب (راجع العدد رقم 2302). مرة أخرى ، من وجهة نظر عملية ، لا أحد يستخدم "vim indent" لذلك عند التفكير ، هذا ليس مفاجئًا.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

jaredpar picture jaredpar  ·  5تعليقات

kalebpederson picture kalebpederson  ·  6تعليقات

LariscusObscurus picture LariscusObscurus  ·  4تعليقات

iamkarlson picture iamkarlson  ·  7تعليقات

myopicmage picture myopicmage  ·  5تعليقات