it-swarm.asia

إيقاف تشغيل المسافة البادئة التلقائية عند لصق النص إلى vim

أنا أبذل الجهد لتعلم فيم.

عندما ألصق الشفرة في وثيقتي من الحافظة ، أحصل على مسافات إضافية في بداية كل سطر جديد:

line
  line
    line

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

كيف يمكنني إيقاف تشغيل المسافة البادئة التلقائية عندما أقوم بلصق الشفرة ولكن لا يزال لدي مسافة بادئة تلقائية عندما أكتب رمزًا؟ إليك ملف .vimrc الخاص بي:

set expandtab  
set tabstop=2  
set shiftwidth=2  
set autoindent  
set smartindent  
set bg=dark  
set nowrap  
1048
Rimian

التحديث: أفضل إجابة هنا: https://stackoverflow.com/a/38258720/62202

لإيقاف التشغيل التلقائي عند لصق الشفرة ، يوجد وضع "لصق" خاص.

نوع

:set paste

ثم الصق كودك. لاحظ أن النص في تلميح الأدوات يقول الآن -- INSERT (paste) --.

بعد لصق الشفرة الخاصة بك ، قم بإيقاف تشغيل وضع اللصق ، بحيث تعمل المسافة البادئة التلقائية عند الكتابة بشكل صحيح مرة أخرى.

:set nopaste

ومع ذلك ، وجدت دائما أن مرهقة. لهذا السبب قمت بتعيين <F3> بحيث يمكن التبديل بين صيغتي اللصق و nopaste أثناء تحرير النص! أنا أضيف هذا إلى .vimrc

set pastetoggle=<F3>
1851
P Shved

لتجنب الآثار غير المرغوب فيها أثناء اللصق ، هناك خيار يجب ضبطه:

set paste

أمر مفيد في .vimrc الخاص بك هو set pastetoggle=<F10> أو أي زر آخر ، للتبديل بسهولة بين اللصق و nopaste.

253
Jacob R

عادةً ما أستخدم :r! cat ثم الصق ( shift + insert ) المحتوى و CTRL+D.

لا حاجة لتمكين وتعطيل ، الاستخدام المباشر.

123
thegeek

إذا كنت تعمل محليًا ، فيمكنك لصقها من حافظة النظام باستخدام تسلسل المفاتيح:

"+p

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

بالطبع إذا كنت تعمل عن بعد (وحدة التحكم على SSH ، على سبيل المثال) ، فلن ينجح ذلك ويجب عليك استخدام رمز :set noai ، وضع الإدراج ، لصق في وحدة التحكم ، وترك إدخال insertmode ، :set ai route كما هو موضح في مكان آخر.

83
thomasrutter

يمكن لمستخدمي Mac تجنب التنسيق التلقائي من خلال القراءة مباشرةً من لوحة اللصق باستخدام:

:r !pbpaste
37
maniacalrobot

أثناء ضبط وضع اللصق بـ paste/nopaste/pastetoggle جيد جدًا ، لا يزال عليك تمكين وضع اللصق يدويًا قبل اللصق وتعطيل وضع اللصق بعد اللصق. كونك الشخص الكسول الذي أنا عليه ، هو الحل الأفضل الذي وجدته حتى الآن والذي يعمل تلقائيًا على تبديل وضع اللصق عند اللصق.

في ما يلي بعض الحيل التي تستخدم وضع اللصق الموجود بين قوسين للمحطة لتعيين/إلغاء تعيين وضع لصق Vim تلقائيًا عند اللصق. ضع التالي في .vimrc:

let &t_SI .= "\<Esc>[?2004h"
let &t_EI .= "\<Esc>[?2004l"

inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()

function! XTermPasteBegin()
  set pastetoggle=<Esc>[201~
  set paste
  return ""
endfunction

الآن يمكنك لصق دون تشغيل وضع لصق/إيقاف تشغيله بشكل صريح - يتم التعامل معه تلقائيًا من أجلك.

المصدر: Coderwall

ملاحظة: هذا الحل لا يعمل في WSL (نظام Windows 10 الفرعي لنظام Linux). إذا كان لدى أي شخص حل لـ WSL ، فيرجى تحديث هذه الإجابة أو إضافتها في التعليقات.

Tmux إذا كنت تستخدم tmux ، فيجب أن تكون البيانات مزدوجة. رمز لهذا هو أيضا في Coderwall

31
thdoan

فيما يلي منشور من قِبل شخص اكتشف كيفية إعادة رسم خريطة حدث اللصق لتشغيل وضع اللصق تلقائيًا ثم إيقافه. يعمل بالنسبة لي في tmux/iTerm على MacOSX.

19
Von

أضف هذا إلى ~/.vimrc الخاص بك وسيكون عليك فقط الضغط على F2 قبل وبعد اللصق:

set pastetoggle=<F2>
12
anh_ng8

عند العمل داخل الجهاز ، سيقوم vim-bracketed-paste vim plugin بمعالجة المعاجين تلقائيًا دون الحاجة إلى أي ضغطات المفاتيح قبل أو بعد لصقها.

إنه يعمل من خلال الكشف عن وضع لصق بين قوسين وهو تسلسل هروب يتم إرساله بواسطة أجهزة طرفية متوافقة مع مصطلح x-term مثل iTerm2 و gnome-terminal ومحطات أخرى تستخدم libvte. كمكافأة إضافية تعمل أيضًا على جلسات tmux. أنا أستخدمه بنجاح مع iTerm2 على جهاز Mac يتصل بخادم linux ويستخدم tmux.

9
studgeek

أنا فقط وضعت set clipboard=unnamed في بلدي .vimrc. هذا يجعل مخطط لصق المخزن المؤقت الافتراضي إلى حافظة X.

لذلك ، إذا قمت بتمييز جزء من النص في محطة ، فيمكنني ببساطة الضغط على p للصقه في vim. وبالمثل ، يمكنني إلغاء العناصر في vim (على سبيل المثال ، YY لنزع السطر الحالي في المخزن المؤقت) والنقر الأوسط في أي نافذة للصقه.

دونو. أجد أنه مناسب للغاية.

9
Soren

عصا هذا في الخاص بك ~/.vimrc وتكون سعيدا:

" enables :Paste to just do what you want
command Paste execute 'set noai | insert | set ai'

تحرير: عند التفكير ، :r !cat هو أسلوب أفضل بكثير لأنه قصير ودلالي ولا يحتاج إلى vimrc مخصص. استخدم ذلك بدلاً من ذلك!

7
Dergachev

على الرغم من أن :pastetoggle أو :paste و :nopaste يجب أن يكونا على ما يرام (إذا تم تنفيذهما - فلن يكونان دائمًا كما نرى من المناقشة). أنا أوصي بشدة بلصق باستخدام النهج المباشر "+p أو "*p والقراءة باستخدام "+r أو "*r:

يحتوي Vim على عشرة أنواع من السجلات (:help registers) والسائل مهتم بـ quotestar و quoteplus من القسم

  1. التحديد وإسقاط السجلات "* و "+ و "~

استخدم هذه السجلات لتخزين واسترجاع النص المحدد لواجهة المستخدم الرسومية. انظر quotestar و quoteplus. عندما لا تكون الحافظة متوفرة أو لا تعمل ، يتم استخدام السجل غير المعروف بدلاً من ذلك. بالنسبة لأنظمة Unix ، تكون الحافظة متاحة فقط عند وجود ميزة + xterm_clipboard. {ليس في السادس}

لاحظ أنه لا يوجد سوى تمييز بين "* و" + لأنظمة X11.

يوضح :help x11-selection كذلك الفرق بين * و +:

                                                  quoteplus quote+

هناك ثلاثة اختيارات X موثقة: PRIMARY (والتي من المتوقع أن تمثل التحديد المرئي الحالي - كما هو الحال في الوضع المرئي لـ Vim) ، والثاني (وهو غير معرف بشكل دقيق) و CLIPBOARD (من المتوقع أن يتم استخدامه لعمليات القص والنسخ واللصق ).

من بين هؤلاء الثلاثة ، يستخدم Vim PRIMARY عند قراءة وكتابة "* التسجيل (وبالتالي عندما تكون اختيارات X11 متاحة ، يقوم Vim بتعيين قيمة افتراضية لـ" الحافظة "من" autoselect ") ، و CLIPBOARD عند قراءة وكتابة" + التسجيل. Vim لا يصل إلى التحديد الثانوي.

أمثلة: (بافتراض قيم الخيار الافتراضية)

  • حدد عنوان URL في الوضع المرئي في Vim. انتقل إلى المستعرض الخاص بك وانقر فوق زر الماوس الأوسط في حقل نص URL. سيتم إدراج النص المحدد (نأمل!). ملاحظة: في Firefox يمكنك ضبط تفضيل midmouse.contentLoadURL على true في حوالي: config ، ثم سيتم استخدام عنوان URL المحدد عند الضغط على زر الماوس الأوسط في معظم الأماكن في النافذة.

  • حدد بعض النصوص في المستعرض الخاص بك عن طريق السحب باستخدام الماوس. انتقل إلى Vim واضغط على زر الماوس الأوسط: يتم إدراج النص المحدد.

  • حدد بعض النص في Vim وقم "+ ذ. انتقل إلى المستعرض الخاص بك ، وحدد بعض النصوص في حقل نص بالسحب باستخدام الماوس. والآن استخدم زر الماوس الأيمن وحدد" لصق "من القائمة المنبثقة. يتم الكتابة فوق النص المحدد بواسطة النص من Vim. لاحظ أن النص الموجود في "+ السجل يظل متاحًا عند إجراء تحديد مرئي ، مما يجعل النص الآخر متاحًا في" * التسجيل. والذي يسمح بالكتابة فوق النص المحدد.
3
codingdave

هذا يعمل لي (حالة + تسجيل ، ما يمكنني استخدامه مثل تبادل عازلة بين وكالة الأنباء الجزائرية):

imap <silent> <S-Insert> <C-O>:set noai<CR><C-R>+<C-O>:set ai<CR>
3
Sergey Vakulenko

إذا كنت تستخدم نظام التشغيل mac ، فيبدو أن macvim يتعامل معه جيدًا دون الحاجة إلى تبديل اللصق.

الشراب تثبيت macvim - فوق نظام

2
Marcus Ericsson

من vim: ]p

من الخارج: "*]p أو "+]p

1
Bruno

الطريقة الأسرع التي أعلم بها للانتقال سريعًا إلى وضع لصق اللصق لعجينة واحدة هي tpope's بلا عيب ، والذي يتميزyoوyO، يُذكر أنه ل "أنت تفتح". تم توثيقهم فقط في vimdoc ، مثل:

لم يتم توفير تبديل لـ "معجون" لأن حالة الاستخدام النموذجي لفائف إدخال انفرادي تكون مضيعة للغاية: يمكنك التبديل مرتين ، ولكن يمكنك لصقها مرة واحدة فقط (YOPO). بدلاً من ذلك ، اضغط على yo أو yO لاستدعاء o أو O مع تعيين "لصق" بالفعل. يؤدي ترك وضع الإدراج إلى تعيين "nopaste" تلقائيًا.

1
Micah Elliott

يرجى قراءة هذه المقالة: تبديل المسافة البادئة التلقائية للصق الكود

يعجب بعض الأشخاص بالتعليقات المرئية الموضحة في سطر الحالة بواسطة البديل التالي لـ vimrc:

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode
1
d.danailov

هناك طريقة أخرى للصق عبر <CR> وإسقاط محتويات السجل (هنا السجل العالمي). راجع: :h i_ctrl-r و h i_CTRL-R_CTRL-O.

من وثائق مساعدة vim:
Insert the contents of a register literally and don't auto-indent. Does the same as pasting with the mouse<MiddleMouse>. Does not replace characters! The '.' register (last inserted text) is still inserted as typed.{not in Vi}

لذلك للصق المحتويات في vim دون المسافة البادئة التلقائية ، استخدم <CR><CO>* في معظم أنظمة يونيكس.

ملاحظة: هذا يعمل فقط إذا تم تجميع vim بـ clipboard.

0
TheChetan

للأسف لقد وجدت البرنامج المساعد vim المذكور لا يعمل مع iTerm2 3.0.15 (لكي نكون منصفين لا أعرف إذا كان هذا قد حدث في الإصدارات القديمة) - لكنني وجدت هذا الاختراق بدلاً من ذلك.

قم بتعيين الأمر p للقيام بالصق واستخدام مفاتيح iTerm2 vim. من الواضح أن هذا يعمل فقط مع iTerm2.

كيف تعمل. يمكنني استخدام "jk" للدخول في وضع الهروب ، لذلك ستحتاج أيضًا إلى:

: inoremap كيه

في .vimrc الخاص بك.

ثم تقوم باستدعاء P لإدخال وضع اللصق ، "+ p للصقه من الحافظة ثم P لتعطيل وضع اللصق. hth.

 enter image description here

0
Neil McGill

إجابة أخرى لم أرها حتى الآن:

:se paste noai
0
sjas