ما هي أوامر (أوامر) VIM يمكن استخدامها لاقتباس الكلمات/عدم احترامها؟
سؤال
كيف يمكنني الاقتباس بسرعة/عدم احترام الكلمات والتغيير اقتباس (على سبيل المثال من '
ل "
) في VIM؟ أنا أعرف عن المحيط البرنامج المساعد ، لكني أود استخدام فقط Vim.
المحلول
اطلاع. إذا كنت قد تم تعيينك حقًا ضد استخدامه ، فإليك بعض الأمثلة لما يمكنك القيام به. ليس بالضرورة الأكثر كفاءة ، ولكن هذا هو السبب في محيط.
- اقتبس كلمة ، باستخدام عروض أسعار واحدة
ciw'Ctrl+r"'
ciw
- احذف كلمة المؤشر ، وينتهي في وضع إدراج.'
- إضافة الاقتباس الأول.Ctrl+r"
- أدخل محتويات"
سجل ، ويعرف أيضا باسم آخر yank/delete.'
- إضافة اقتباس الإغلاق.
- قم بفصل كلمة مغلقة في اقتباسات واحدة
di'hPl2x
di'
- حذف الكلمة المحاطة باقتباسات واحدة.hP
- حرك المؤشر ترك مكانًا واحدًا (أعلى اقتباس الافتتاح) ووضع النص المحذوف فقط قبل الاقتباس.l
- حرك المؤشر اليمين مكان واحد (أعلى اقتباس الافتتاح).2x
- حذف اثنين من الاقتباسات.
- تغيير اقتباسات واحدة إلى عروض الأسعار المزدوجة
va':s/\%V'\%V/"/g
va'
- حدد بصريًا الكلمة المقتبسة والاقتباسات.:s/
- بدء بديل.\%V'\%V
- تطابق فقط اقتباسات واحدة تقع داخل المنطقة التي تم اختيارها بصريًا./"/g
- استبدلهم جميعًا باقتباسات مزدوجة.
نصائح أخرى
اقتبس كلمة ، باستخدام عروض أسعار واحدة
ciw'Ctrl+r"'
كان من الأسهل بالنسبة لي أن أفعل ذلك بهذه الطريقة
ciw '' Esc P
إليك بعض التعيينات التي يمكن أن تساعد:
:nnoremap <Leader>q" ciw""<Esc>P
:nnoremap <Leader>q' ciw''<Esc>P
:nnoremap <Leader>qd daW"=substitute(@@,"'\\\|\"","","g")<CR>P
إذا لم تقم بتغيير متغير mapleader ، فعليك تنشيط التعيين مع \q"
\q'
أو \qd
. يضيفون اقتباس مزدوج حول الكلمة تحت المؤشر ، اقتباس واحد حول الكلمة تحت المؤشر ، حذف أي اقتباسات حول الكلمة تحت المؤشر على التوالي.
بالإضافة إلى الأوامر الأخرى ، سيحيل هذا كل الكلمات في خط في عروض أسعار مزدوجة (وفقًا لتعليقك)
:s/\(\S\+\)/"\1"/
أو إذا كنت ترغب في تقليل عدد عمليات الرضاك الخلفية ، فيمكنك وضع ملف \v
(مسيء للغاية) المعدل في بداية النمط
:s/\v(\S+)/"\1"/
للالتفاف في اقتباسات واحدة (على سبيل المثال) ciw'<C-r>"'<esc>
يعمل ، ولكن كرر لن تعمل. محاولة:
ciw'<C-r><C-o>"'<esc>
هذا يضع محتويات السجل الافتراضي "حرفيًا". الآن يمكنك الضغط .
على أي كلمة لفه في اقتباسات. لمعرفة المزيد انظر :h[elp] i_ctrl-r
والمزيد عن الكائنات النصية في :h text-objects
مصدر: http://vimcasts.org/episodes/pasting-from-insert-mode/
طريقة وحدات الماكرو
صحافة س و س للتسجيل في سجل Q (نستخدم "Q" كاختصار لتذكر "اقتباسات").
صحافة تحول + ب نقل المؤشر إلى أمام الكلمة الحالية
صحافة أنا يكتب ' (اقتباسات واحدة)
صحافة خروج ثم اضغط ه للانتقال إلى نهاية الكلمة
صحافة أ ثم اضغط ' مرة أخرى لتطويق الكلمة مع اقتباسات.
اضغط أخيرا س لتسجيله في
q
تسجيل.
كيفية استخدامها :
- نقل المؤشر إلى كلمة مرغوبة.
- يضعط @س لتطويق كلمة مع اقتباسات.
- يضعط @@ إذا كنت تريد تكرارها إلى كلمة أخرى.
يمكنك تغيير step 4
مع أي شيء تحب {خط ، كلمة حتى وجدت بعض الأحرف ، إلخ}. ضعه في vim variables
و .vimrc
لتكرار سعادتك.
لا أعرف أي أمر مبني على هذا ، ولكن باستخدام r"f'r"
للتغيير من "إلى" و r'f"r'
للتغيير من "إلى" يعمل إذا كنت تقف على الأول "أو". الامر r'
يحل محل أي شخصية تحت المؤشر مع "، و f"
ينقلك إلى الأمام إلى التالي ".
لمستخدمي VScodevim يمكنك القيام به
vwS"
- يمكنك استبدال
"
مع كل ما ترغب في الالتفاف. - يمكنك استبدال
w
مع أي مشغل اختيار آخر
إضافة اقتباسات
بدأت في استخدام هذه الوظيفة السريعة والقذرة في بلدي .vimrc
:
vnoremap q <esc>:call QuickWrap("'")<cr>
vnoremap Q <esc>:call QuickWrap('"')<cr>
function! QuickWrap(wrapper)
let l:w = a:wrapper
let l:inside_or_around = (&selection == 'exclusive') ? ('i') : ('a')
normal `>
execute "normal " . inside_or_around . escape(w, '\')
normal `<
execute "normal i" . escape(w, '\')
normal `<
endfunction
حتى الآن ، أختار بصريًا ما أريد (عادةً عبر viw
- حدد بصريا داخل الكلمة) في اقتباسات واضغط س للحصول على عروض أسعار مزدوجة ، أو اضغط س لاقتباسات واحدة.
إزالة الاقتباسات
vnoremap s <esc>:call StripWrap()<cr>
function! StripWrap()
normal `>x`<x
endfunction
أنا أستعمل Vim-Textobj-Quotes بحيث يعامل VIM اقتباسات ككائنات نصية. هذا يعني أنه يمكنني القيام به vaq
(حدد بصريا حول اقتباسات. هذا يجد أقرب اقتباسات ويختارها بصريًا. (هذا اختياري ، يمكنك فعل شيء مثل f"vww
). ثم أضغط s
ل قطاع اقتباسات من الاختيار.
تغيير الاقتباسات
قبلة. أنا إزالة الاقتباسات من ثم إضافة اقتباسات. على سبيل المثال ، لاستبدال عروض الأسعار المفردة مع علامات اقتباس مزدوجة ، أود إجراء الخطوات: 1. قم بإزالة عروض الأسعار المفردة: vaqs
, ، 2. أضف اقتباسات جديدة: vwQ
.
- http://vim.wikia.com/wiki/wrap_a_visual_selection_in_an_html_tag تم تعديل الكود من هنا واستخدامه كجزء من إجابتي
- https://github.com/beloglazov/vim-textobj-quotes Vim-Text-OBJ-Quotes
فيما يلي بعض التعيينات البسيطة التي يمكن استخدامها لاقتباس كلمة واحدة:
" 'quote' a word
nnoremap qw :silent! normal mpea'<Esc>bi'<Esc>`pl
" double "quote" a word
nnoremap qd :silent! normal mpea"<Esc>bi"<Esc>`pl
" remove quotes from a word
nnoremap wq :silent! normal mpeld bhd `ph<CR>
أنا أستخدم nnoremap في .vimrc
لاقتباس واحد كلمة:
nnoremap sq :silent! normal mpea'<Esc>bi'<Esc>`pl
لإزالة الاقتباسات (تعمل على علامات اقتباس مزدوجة كذلك):
nnoremap qs :silent! normal mpeld bhd `ph<CR>
قاعدة لتذكر: 'sq' = اقتباس واحد.
VIM ل VSCODE هل هو رائع. إنه مقر vim-surround إذا كنت لا تستخدم VSCODE.
بعض الأمثلة:
"اختبار" مع المؤشر داخل اقتباسات النوع CS "" لإنهاء "اختبار"
"اختبار" مع المؤشر داخل اقتباسات النوع DS "لإنهاء الاختبار
"اختبار" مع المؤشر داخل اقتباسات النوع CS "t وأدخل 123> لينتهي به المطاف باختبار <123>
اختبار مع المؤشر على نوع اختبار الكلمة YSAW) لينتهي به الأمر بـ (اختبار)
وماذا عن هذا؟
:%s/\'/"/g
كتبت نصًا يقوم بذلك:
function! WrapSelect (front)
"puts characters around the selected text.
let l:front = a:front
if (a:front == '[')
let l:back = ']'
elseif (a:front == '(')
let l:back = ')'
elseif (a:front == '{')
let l:back = '}'
elseif (a:front == '<')
let l:back = '>'
elseif (a:front =~ " ")
let l:split = split(a:front)
let l:back = l:split[1]
let l:front = l:split[0]
else
let l:back = a:front
endif
"execute: concat all these strings. '.' means "concat without spaces"
"norm means "run in normal mode and also be able to use \<C-x> characters"
"gv means "get the previous visual selection back up"
"c means "cut visual selection and go to insert mode"
"\<C-R> means "insert the contents of a register. in this case, the
"default register"
execute 'norm! gvc' . l:front. "\<C-R>\"" . l:back
endfunction
vnoremap <C-l> :<C-u>call WrapSelect(input('Wrapping? Give both (space separated) or just the first one: '))<cr>
لاستخدام ، فقط تسليط الضوء على شيء ، اضغط على التحكم L ، ثم اكتب حرفًا. إذا كان أحد الأحرف التي تعرفها الوظيفة ، فستوفر الحرف الصحيحة. إذا لم يكن الأمر كذلك ، فسيستخدم نفس الحرف لإدراجه على كلا الجانبين.
اطلاع.
مثال على خريطة الوضع المرئي لإضافة عروض أسعار واحدة حول كتلة محددة من النص:
:vnoremap qq <Esc>`>a'<Esc>`<i'<Esc>