لدي ملف كود Ruby مفتوح في السادس ، وهناك أسطر علقت بها #
:
class Search < ActiveRecord::Migration
def self.up
# create_table :searches do |t|
# t.integer :user_id
# t.string :name
# t.string :all_of
# t.string :any_of
# t.string :none_of
# t.string :exact_phrase
#
# t.timestamps
# end
end
def self.down
# drop_table :searches
end
end
لنقل أنني أرغب في إزالة جميع الأسطر في القسم def ... end
الأول. ما هي الطريقة الفعالة للقيام بذلك في فيم؟
بشكل عام ، أبحث عن طريقة سهلة ومرنة للتعليق وخطوط عدم الارتياح. أنا هنا أتعامل مع كود Ruby ، لكن يمكن أن يكون JavaScript (//
) أو Haml (-#
).
يمكنني استخدام البرنامج النصي NERD Commenter . يتيح لك التعليق بسهولة أو إلغاء التعليق أو تبديل التعليقات في التعليمات البرمجية الخاصة بك.
كما ذكر في تعليقات :
لأي شخص يشعر بالارتباك من الاستخدام ، فإن القائد الافتراضي هو "\" لذلك فإن 10\سم مكعب ستعلق على عشرة أسطر و 10\cu لن تلغي تلك الأسطر العشرة
لتلك المهام التي أستخدمها معظم الوقت اختيار كتلة .
ضع المؤشر على أول حرف #
، اضغط CtrlV (أو CtrlQ ل gVim) ، والنزول حتى آخر سطر علق والصحافة xسيؤدي ذلك إلى حذف جميع الأحرف #
رأسياً.
للتعليق على كتلة النص هو نفسه تقريبا:
VISUAL BLOCK
.INSERT
ثم اضغط #. سيضيف هذا علامة تجزئة إلى السطر الأول.#
في جميع الأسطر المحددة الأخرى.بالنسبة للإصدار الذي تم تجريده من vim التي يتم شحنها مع debian/ubuntu افتراضيًا ، اكتب : s/^/#
في الخطوة الثالثة بدلاً من ذلك.
هنا نوعان من تسجيلات الشاشة الصغيرة للإشارة البصرية.
%
إذا كنت ترغب في تحديد أحرف متعددة ، استخدم واحدًا أو ادمج هذه الطرق:
أحيانًا يتم قصفي في صندوق بعيد حيث لا يمكن أن تساعدني الإضافات و .vimrc ، أو أحيانًا يخطئ NerdCommenter (مثل JavaScript مضمن داخل HTML).
في هذه الحالات ، يكون البديل ذو التقنية المنخفضة هو norm
المدمج ، والذي يعمل فقط على أي أوامر vim تعسفية في كل سطر في النطاق المحدد. فمثلا:
التعليق باستخدام #
:
1. visually select the text rows (using V as usual)
2. :norm i#
هذا يدرج "#" في بداية كل سطر. لاحظ أنه عند الكتابة: سيتم ملء النطاق ، لذلك سيبدو في الحقيقة :'<,'>norm i#
uncommenting #
:
1. visually select the text as before (or type gv to re-select the previous selection)
2. :norm x
هذا يحذف الحرف الأول من كل سطر. إذا كنت قد استخدمت تعليق 2-char مثل // ثم سأفعل ببساطة :norm xx
لحذف كلا char.
إذا كانت التعليقات ذات مسافة بادئة كما في سؤال البروتوكول الاختياري ، فيمكنك تثبيت الحذف كما يلي:
:norm ^x
مما يعني "انتقل إلى أول حرف غير فضائي ، ثم احذف حرفًا واحدًا". لاحظ أنه على عكس تحديد الكتلة ، تعمل هذه التقنية حتى إذا كانت التعليقات ذات مسافة بادئة غير متساوية!
ملاحظة : نظرًا لأن norm
حرفيًا فقط تنفذ أوامر vim منتظمة ، فأنت لا تقتصر على التعليقات ، يمكنك أيضًا إجراء بعض التعديلات المعقدة لكل سطر. إذا كنت بحاجة إلى حرف الهروب كجزء من تسلسل الأوامر الخاص بك ، فاكتب ctrl-v ثم اضغط على مفتاح الهروب (أو حتى أسهل ، ما عليك سوى تسجيل ماكرو سريع ثم استخدام القاعدة لتنفيذ هذا الماكرو في كل سطر).
الملاحظة 2 : بالطبع يمكنك أيضًا إضافة تعيين إذا وجدت نفسك تستخدم norm
كثيرًا. على سبيل المثال ، يتيح لك وضع السطر التالي في ~/.vimrc كتابة ctrl-n
بدلاً من :norm
بعد إجراء التحديد المرئي
vnoremap <C-n> :norm
الملاحظة 3 : في بعض الأحيان ، لا يحتوي الأمر bare-bones vim على الأمر norm
المترجم فيه ، لذا تأكد من استخدام الإصدار المعزز ، أي عادة/usr/bin/vim ، وليس/bin/vi
(شكرًا لـManbroski و @ rkslice على التحسينات المضمنة في هذه الإجابة)
لدي ما يلي في .vimrc
:
" Commenting blocks of code.
autocmd FileType c,cpp,Java,scala let b:comment_leader = '// '
autocmd FileType sh,Ruby,python let b:comment_leader = '# '
autocmd FileType conf,fstab let b:comment_leader = '# '
autocmd FileType tex let b:comment_leader = '% '
autocmd FileType mail let b:comment_leader = '> '
autocmd FileType vim let b:comment_leader = '" '
noremap <silent> ,cc :<C-B>silent <C-E>s/^/<C-R>=escape(b:comment_leader,'\/')<CR>/<CR>:nohlsearch<CR>
noremap <silent> ,cu :<C-B>silent <C-E>s/^\V<C-R>=escape(b:comment_leader,'\/')<CR>//e<CR>:nohlsearch<CR>
يمكنك الآن كتابة ,cc
للتعليق على سطر و ,cu
لإلغاء سطر (يعمل في الوضع العادي والمرئي).
(لقد سرقته من بعض المواقع الإلكترونية منذ سنوات عديدة ، لذلك لا يمكنني شرح كيف يعمل بعد الآن :). هناك تعليق حيث يتم شرح ذلك.)
حدد السطور التي يجب التعليق عليها في vim:
كشف أرقام الأسطر:
:set number
ثم
:5,17s/^/#/ this will comment out line 5-17
أو هذا:
:%s/^/#/ will comment out all lines in file
هنا كيف أفعل ذلك:
انتقل إلى الحرف الأول في السطر الأول الذي تريد التعليق عليه.
نجاح Ctrl+q في GVIM أو Ctrl+v في VIM ، ثم انتقل لأسفل لتحديد الحرف الأول على الخطوط للتعليق عليها.
ثم اضغط c، وإضافة حرف التعليق.
يعمل Uncommenting بنفس الطريقة ، فقط اكتب مسافة بدلاً من حرف التعليق.
لقد توصلت إلى إضافة بسيطة لملف .vimrc الذي يعمل بشكل جيد ويمكن تمديده بسهولة. يمكنك ببساطة إضافة نوع ملف جديد إلى comment_map وزعيم التعليق الخاص به.
لقد أضفت تعيينًا إلى الوضعين العادي والبصري ، ولكن يمكنك إعادة تعيين الخريطة على أي شيء تريده. أفضل فقط الحصول على وظيفة نمط "تبديل". يتحمل المرء تعيينات متعددة وما إلى ذلك.
let s:comment_map = {
\ "c": '\/\/',
\ "cpp": '\/\/',
\ "go": '\/\/',
\ "Java": '\/\/',
\ "javascript": '\/\/',
\ "lua": '--',
\ "scala": '\/\/',
\ "php": '\/\/',
\ "python": '#',
\ "Ruby": '#',
\ "Rust": '\/\/',
\ "sh": '#',
\ "desktop": '#',
\ "fstab": '#',
\ "conf": '#',
\ "profile": '#',
\ "bashrc": '#',
\ "bash_profile": '#',
\ "mail": '>',
\ "eml": '>',
\ "bat": 'REM',
\ "ahk": ';',
\ "vim": '"',
\ "tex": '%',
\ }
function! ToggleComment()
if has_key(s:comment_map, &filetype)
let comment_leader = s:comment_map[&filetype]
if getline('.') =~ "^\\s*" . comment_leader . " "
" Uncomment the line
execute "silent s/^\\(\\s*\\)" . comment_leader . " /\\1/"
else
if getline('.') =~ "^\\s*" . comment_leader
" Uncomment the line
execute "silent s/^\\(\\s*\\)" . comment_leader . "/\\1/"
else
" Comment the line
execute "silent s/^\\(\\s*\\)/\\1" . comment_leader . " /"
end
end
else
echo "No comment leader found for filetype"
end
endfunction
nnoremap <leader><Space> :call ToggleComment()<cr>
vnoremap <leader><Space> :call ToggleComment()<cr>
ملحوظة:
لا أستخدم أي عمليات رد اتصال أو ربطات في أنواع الملفات/التحميل ، لأنني أجد أنها تبطئ بدء تشغيل Vim أكثر من وظيفة/الخريطة الثابتة .vimrc
، لكن هذا مجرد تفضيل. لقد حاولت أيضًا أن أبقيه بسيطًا وفعالًا. إذا كنت تستخدم autocommands ، فأنت بحاجة إلى التأكد من وضعها في مجموعة autocommand وإلا ستتم إضافة عمليات الاسترجاعات إلى نوع الملف عدة مرات لكل ملف يتم تحميله وتتسبب في الكثير من تدهور الأداء.
إذا كان كل ما تحتاجه هو تبديل التعليقات أفضل أن أذهب مع commentary.vim by tpope .
العوامل الممرضة:
cd ~/.vim/bundle
git clone git://github.com/tpope/vim-commentary.git
همة المكونات:
Plug 'tpope/vim-commentary'
Vundle:
Plugin 'tpope/vim-commentary'
أضف هذا إلى ملفك .vimrc: noremap <leader>/ :Commentary<cr>
يمكنك الآن تبديل التعليقات عن طريق الضغط على Leader
+ /
، تمامًا مثل Sublime و Atom.
استخدم Control-V لتحديد مستطيلات النص: انتقل إلى أول حرف #
، اكتب Ctrl+V، تحرك لليمين مرة واحدة ، ثم لأسفل ، حتى نهاية التعليقات. اكتب الآن x
: أنت تحذف جميع الأحرف #
متبوعة بمسافة واحدة.
إليك قسم من .vimrc
الخاص بي:
"insert and remove comments in visual and normal mode
vmap ,ic :s/^/#/g<CR>:let @/ = ""<CR>
map ,ic :s/^/#/g<CR>:let @/ = ""<CR>
vmap ,rc :s/^#//g<CR>:let @/ = ""<CR>
map ,rc :s/^#//g<CR>:let @/ = ""<CR>
في الوضع العادي وفي الوضع المرئي ، هذا يتيح لي الضغط ,ic لإدراج التعليقات و,rc لإزالة التعليقات.
أنا استخدم vim 7.4 وهذا يعمل لي.
على افتراض أننا نقوم بالتعليق/عدم التنفيذ 3 سطور.
للتعليق:
إذا كان السطر لا يحتوي على علامة تبويب/مسافة في البداية:ctrl + V
ثم jjj
ثم shift + I (cappital i)
ثم //
then esc esc
إذا كان السطر يحتوي على علامة تبويب/مساحة في البداية ، فلا يزال بإمكانك القيام بما سبق أو مبادلة لـ c
:ctrl + V
ثم jjj
ثم c
ثم //
then esc esc
إلى عدم الارتياح:
إذا كانت الخطوط لا تحتوي على علامة تبويب/مساحة في البداية:ctrl + V
ثم jjj
ثم ll (lower cap L)
ثم c
إذا كانت السطور تحتوي على علامة تبويب/مسافة في البداية ، فسوف تضع مسافة واحدة فوق و esc
ctrl + V
ثم jjj
ثم ll (lower cap L)
ثم c
ثم space
ثم esc
مع وجود 30 إجابة أمامي ، سأحاول تقديم حل أسهل: أدخل #
في بداية السطر. ثم اسقط خطًا واضغط على النقطة (.
). للتكرار ، قم بـ j
، .
، j
، .
، إلخ ... للتراجع ، قم بإزالة #
(يمكنك الضغط على x
عبر #
) ، وقم بالعكس باستخدام k
، .
، إلخ ...
كيفية إلغاء uncomment الأسطر الثلاثة التالية في السادس:
#code code
#code
#code code code
ضع المؤشر فوق الرمز #
العلوي الأيسر ثم اضغط على CtrlV. هذا يضعك في وضع كتلة مرئية. اضغط على السهم لأسفل أو J ثلاث مرات لتحديد جميع الخطوط الثلاثة. ثم اضغط D. كل التعليقات تختفي. للتراجع ، اضغط U.
كيفية التعليق الأسطر الثلاثة التالية في السادس:
code code
code
code code code
ضع المؤشر فوق الحرف العلوي الأيسر ، اضغط على CtrlV. هذا يضعك في وضع كتلة مرئية. صحافة ↓ أو J ثلاث مرات لتحديد جميع الخطوط الثلاثة. ثم اضغط:
I//Esc
إنها عاصمة I و/و Escape.
عندما تضغط ESC، جميع الخطوط المحددة ستحصل على رمز التعليق الذي حددته.
أحب استخدام المكون الإضافي tcomment: http://www.vim.org/scripts/script.php؟script_id=1173
لقد قمت بتعيين gc و gcc للتعليق على سطر أو كتلة مميزة من التعليمات البرمجية. يكشف نوع الملف ويعمل بشكل جيد حقا.
نعم ، هناك 33 إجابة (متكررة في الغالب) على هذا السؤال بالفعل.
إليك طريقة أخرى لكيفية تعليق السطور في Vim: motions . تتمثل الفكرة الأساسية في التعليق أو إزالة الأسطر خارج الخط باستخدام نفس الطريقة التي يتم بها إلغاء فقرة بكتابة yip
أو حذف سطرين عن طريق كتابة dj
.
سيتيح لك هذا النهج القيام بأشياء مثل:
ccj
للتعليق على سطرين التاليين الخارجيين و cuk
لإلغاء تعليقهما ؛
cci{
للتعليق على الحظر ، و cui{
لإلغاء التعليق ؛
ccip
للتعليق على فقرة بأكملها ، و cuip
لإلغاء التعليق عليها.
ccG
للتعليق على كل شيء وصولاً إلى السطر الأخير ، و cugg
لإلغاء تثبيت كل شيء حتى السطر الأول.
كل ما تحتاجه هو وظيفتان تعملان على حركات ، وتعيينين لكل وظيفة. أولاً ، التعيينات:
nnoremap <silent> cc :set opfunc=CommentOut<cr>[email protected]
vnoremap <silent> cc :<c-u>call CommentOut(visualmode(), 1)<cr>
nnoremap <silent> cu :set opfunc=Uncomment<cr>[email protected]
vnoremap <silent> cu :<c-u>call Uncomment(visualmode(), 1)<cr>
(راجع دليل حول المشغل [email protected]
والمتغير operatorfunc
.)
والآن وظائف:
function! CommentOut(type, ...)
if a:0
silent exe "normal! :'<,'>s/^/#/\<cr>`<"
else
silent exe "normal! :'[,']s/^/#/\<cr>'["
endif
endfunction
function! Uncomment(type, ...)
if a:0
silent exe "normal! :'<,'>s/^\\(\\s*\\)#/\\1/\<cr>`<"
else
silent exe "normal! :'[,']s/^\\(\\s*\\)#/\\1/\<cr>`["
endif
endfunction
تعديل التعبيرات العادية أعلاه لتناسب ذوقك فيما يتعلق بالمكان الذي يجب أن يكون #
فيه:
يمكنني استخدام EnhancedCommentify . إنه يعلق كل ما أحتاجه (لغات البرمجة ، البرامج النصية ، ملفات التكوين). أنا استخدامها مع الارتباطات وضع البصرية. ما عليك سوى اختيار النص الذي تريد التعليق عليه واضغط على co/cc/cd.
vmap co :call EnhancedCommentify('','guess')<CR>
vmap cc :call EnhancedCommentify('','comment')<CR>
vmap cd :call EnhancedCommentify('','decomment')<CR>
أضع علامة على السطور الأول والأخير (ma و mb) ، ثم قم بما يلي: 'a ،' bs/^ # //
إذا كنت تعرف بالفعل أرقام الأسطر ، فستعمل n,ms/# //
.
أستخدم Tim Pope vim-commentary plugin.
لقد جمعت إجابة Phil و jqno وأدلت بتعليقات غير مقيدة بمسافات:
autocmd FileType c,cpp,Java,scala let b:comment_leader = '//'
autocmd FileType sh,Ruby,python let b:comment_leader = '#'
autocmd FileType conf,fstab let b:comment_leader = '#'
autocmd FileType tex let b:comment_leader = '%'
autocmd FileType mail let b:comment_leader = '>'
autocmd FileType vim let b:comment_leader = '"'
function! CommentToggle()
execute ':silent! s/\([^ ]\)/' . b:comment_leader . ' \1/'
execute ':silent! s/^\( *\)' . b:comment_leader . ' \?' . b:comment_leader . ' \?/\1/'
endfunction
map <F7> :call CommentToggle()<CR>
هذه الإجابة موجودة هنا إلى 1) إظهار الكود الصحيح للصقه في .vimrc
للحصول على vim 7.4+
لمنع التعليق/عدم التعليق مع الحفاظ على مستوى المسافة البادئة مع وجود اختصار واحد في الوضع المرئي و 2) لشرح ذلك.
هنا هو الكود:
let b:commentChar='//'
autocmd BufNewFile,BufReadPost *.[ch] let b:commentChar='//'
autocmd BufNewFile,BufReadPost *.cpp let b:commentChar='//'
autocmd BufNewFile,BufReadPost *.py let b:commentChar='#'
autocmd BufNewFile,BufReadPost *.*sh let b:commentChar='#'
function! Docomment ()
"make comments on all the lines we've grabbed
execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e'
endfunction
function! Uncomment ()
"uncomment on all our lines
execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e'
endfunction
function! Comment ()
"does the first line begin with a comment?
let l:line=getpos("'<")[1]
"if there's a match
if match(getline(l:line), '^\s*'.b:commentChar)>-1
call Uncomment()
else
call Docomment()
endif
endfunction
vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>
كيف تعمل:
let b:commentChar='//'
: يؤدي هذا إلى إنشاء متغير في vim. يشير b
هنا إلى النطاق ، وهو في هذه الحالة موجود في المخزن المؤقت ، مما يعني الملف المفتوح حاليًا. أحرف التعليق عبارة عن سلاسل وتحتاج إلى لفها في علامات اقتباس ، والاقتباسات ليست جزءًا مما سيتم استبداله عند تبديل التعليقات.
autocmd BufNewFile,BufReadPost *...
: يتم تشغيل Autocommands في أشياء مختلفة ، وفي هذه الحالة ، يتم تشغيلها عندما ينتهي ملف جديد أو ملف القراءة بامتداد معين. بمجرد تشغيله ، قم بتنفيذ الأمر التالي ، والذي يسمح لنا بتغيير commentChar
وفقًا لنوع الملف. هناك طرق أخرى للقيام بذلك ، لكنها مربكة أكثر بالنسبة للمبتدئين (مثلي).
function! Docomment()
: يتم الإعلان عن الوظائف من خلال البدء بـ function
وتنتهي بـ endfunction
. يجب أن تبدأ الوظائف برأس مال. يضمن !
أن تقوم هذه الوظيفة بالكتابة فوق أي وظائف سابقة تم تعريفها على أنها Docomment()
مع هذا الإصدار من Docomment()
. بدون !
، كنت أواجه أخطاء ، ولكن قد يكون ذلك لأنني كنت أقوم بتعريف وظائف جديدة من خلال سطر الأوامر vim.
execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e'
: تنفيذ المكالمات بأمر. في هذه الحالة ، نقوم بتنفيذ substitute
، والذي يمكن أن يأخذ نطاقًا (بشكل افتراضي هذا هو السطر الحالي) مثل %
لكامل المخزن المؤقت أو '<,'>
للقسم المميز. ^\s*
عبارة عن regex لمطابقة بداية السطر متبوعًا بأي مقدار من المساحة البيضاء ، والتي يتم إلحاقها بعد ذلك (بسبب &
). يتم استخدام .
هنا لسلسلة السلسلة ، حيث لا يمكن لف escape()
في علامات اقتباس. يسمح لك escape()
بالهروب من الحرف في commentChar
الذي يطابق الوسيطات (في هذه الحالة ، \
و /
) عن طريق إدخالها مسبقًا مع \
. بعد ذلك ، نسلسل مرة أخرى بنهاية سلسلة substitute
، التي تحتوي على علامة e
. تسمح لنا هذه العلامة بالفشل بصمت ، مما يعني أنه إذا لم نعثر على تطابق على سطر معين ، فلن نصرخ عليه. ككل ، يتيح لنا هذا السطر وضع حرف تعليق متبوعًا بمسافة قبل النص الأول مباشرةً ، مما يعني أننا نحتفظ بمستوى المسافة البادئة لدينا.
execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e'
: هذا مشابه لأمرنا الطويل الضخم الأخير. فريدة من نوعها لهذا واحد ، لدينا \v
، والذي يتأكد من أنه لا يتعين علينا الهروب من ()
، و 1
، التي تشير إلى المجموعة التي أنشأناها مع ()
. في الأساس ، نحن نطابق خطًا يبدأ بأي مقدار من المساحة البيضاء ثم حرف التعليق الخاص بنا متبوعًا بأي مساحة بيضاء ، ونحن نحتفظ فقط بالمجموعة الأولى من المساحة البيضاء. مرة أخرى ، e
يتيح لنا الفشل بصمت إذا لم يكن لدينا حرف تعليق على هذا السطر.
let l:line=getpos("'<")[1]
: هذا يعين متغيرًا مثلما فعلنا مع حرف التعليق الخاص بنا ، لكن l
يشير إلى النطاق المحلي (محلي إلى هذه الوظيفة). getpos()
تحصل على موضع ، في هذه الحالة ، بداية تسليط الضوء لدينا ، و [1]
يعني أننا نهتم فقط برقم السطر ، وليس بأشياء أخرى مثل رقم العمود.
if match(getline(l:line), '^\s*'.b:commentChar)>-1
: أنت تعرف كيف يعمل if
. match()
تتحقق مما إذا كان أول شيء يحتوي على الشيء الثاني ، لذلك نحن نحصل على السطر الذي بدأنا في تسليط الضوء عليه ، وتحقق مما إذا كان يبدأ بـ whitespace متبوعًا بحرف التعليق الخاص بنا. match()
تُرجع الفهرس حيث يكون هذا صحيحًا ، و -1
في حالة عدم العثور على تطابقات. نظرًا لأن if
يقيم جميع الأرقام غير الصفرية لتكون صحيحة ، فيتعين علينا مقارنة ناتجنا لمعرفة ما إذا كان أكبر من -1. ترجع المقارنة في vim
0 إذا كانت خاطئة و 1 إذا كانت صحيحة ، وهذا ما يريده if
أن يرى التقييم بشكل صحيح.
vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>
: vnoremap
يعني تعيين الأمر التالي في الوضع المرئي ، لكن لا تقم بتعيينه بشكل متكرر (وهذا يعني عدم تغيير أي أوامر أخرى قد تستخدم بطرق أخرى). في الأساس ، إذا كنت مبتدئًا ، استخدم دائمًا noremap
للتأكد من أنك لا تكسر الأشياء. <silent>
تعني "أنا لا أريد كلماتك ، فقط أفعالك" وتخبرها بعدم طباعة أي شيء على سطر الأوامر. <C-r>
هو الشيء الذي نقوم بتعيينه ، وهو ctrl + r في هذه الحالة (لاحظ أنه لا يزال بإمكانك استخدام C-r بشكل طبيعي "لإعادة" في الوضع العادي مع هذا التعيين). C-u
مربكة نوعًا ما ، لكن في الأساس تتأكد من أنك لا تفقد مسار التمييز البصري الخاص بك (وفقًا/ هذه الإجابة يجعل الأمر يبدأ بـ '<,'>
وهو ما نريده). call
هنا يخبر vim بتنفيذ الوظيفة التي حددناها ، ويشير <cr>
إلى ضرب الزر enter
. علينا أن نضربها مرة واحدة لاستدعاء الوظيفة فعليًا (وإلا فقد كتبنا للتو call function()
] في سطر الأوامر ، وعلينا أن نضربها مرة أخرى للحصول على بدائلنا من خلال السير في الطريق (ليس متأكدًا من السبب ، ولكن أيا كان) .
على أي حال ، نأمل أن يساعد هذا. سيأخذ هذا أي شيء مظللًا باستخدام v
أو V
أو C-v
، وتحقق مما إذا كان السطر الأول قد تم التعليق عليه ، وإذا كانت الإجابة بنعم ، حاول إزالة كل الخطوط المميزة ، وإذا لم يكن الأمر كذلك ، أضف طبقة إضافية من أحرف التعليق إلى كل سطر. هذا هو سلوكي المطلوب ؛ لم أرغب فقط في تبديل ما إذا كان قد تم التعليق على كل سطر في الكتلة أم لا ، لذلك فهو يعمل بشكل مثالي بالنسبة لي بعد طرحمتعددة أسئلة حول هذا الموضوع.
هناك هذا البرنامج المساعد لتغيير الحياة بواسطة tpope
يسمى vim-commentary
https://github.com/tpope/vim-commentary
يوفر هذا البرنامج المساعد :
استخدام :
:<,'>
:<,'>Commentary
واضغط Enter.أستخدم comments.vim من Jasmeet Singh Anand (موجود على vim.org) ،
يعمل مع C ، C++ ، Java ، PHP [2345] ، proc ، CSS ، HTML ، htm ، XML ، XHTML ، vim ، vimrc ، SQL ، sh ، ksh ، csh ، Perl ، tex ، fortran ، ml ، caml ، ocaml ، vhdl ، haskel ، والملفات العادية
التعليقات وخطوط التعليقات في ملفات المصدر المختلفة في الوضع العادي والمرئي
الاستعمال:
تتمثل الطريقة الأسرع والأكثر بديهية لكل هذه الأشياء في إعادة تعيين رمز )
للتعليق على الخطوط ، ثم (
للمتابعة السريعة. جربه ولن تعود.
في Ruby أو Bash ، مع مسافات بادئة ذات فراغين:
map ) I# <Esc>j
map ( k^2x
في C/C++ أو PHP ، مع مسافات بادئة ذات فراغ 4:
map ) I// <Esc>j
map ( k^4x
السلبيات هي أنك تخسر (
و )
لحركة الجملة (ولكن das
يمكن أن تملأها) ، وسوف تعود في بعض الأحيان إلى تحديد واستبدال أو CtrlV للتعامل مع المقاطع الطويلة. لكن هذا نادر جدا.
وبالنسبة إلى النمط C ، من الأفضل التعامل مع التعليقات الطويلة مع:
set cindent
set formatoptions=tcqr
... الذي يجمع جيدًا مع استخدام V[move]gq
لإعادة التفاف الكلمات.
في ما يلي سطر أساسي واحد يستند إلى C-v
متبوعًا بطريقة I
الموضحة أعلاه.
يضيف هذا الأمر (:Comment
) سلسلة مختارة إلى بداية أي خطوط محددة.
command! -range -nargs=1 Comment :execute "'<,'>normal! <C-v>0I" . <f-args> . "<Esc><Esc>"
أضف هذا السطر إلى .vimrc
لإنشاء أمر يقبل وسيطة واحدة ويضع الوسيطة في بداية كل سطر في التحديد الحالي.
مثلا إذا تم تحديد النص التالي:
1
2
وتقوم بتشغيل هذا: :Comment //
، ستكون النتيجة:
//1
//2
بدايةً من الأفكار الواردة في الإجابات هنا ، بدأتُ وظيفة التعليق الخاصة بي. تبديل التعليقات وإيقاف تشغيلها. يمكنه التعامل مع أشياء مثل //print('blue'); //this thing is blue
ويقوم فقط بتبديل التعليق الأول. علاوةً على ذلك ، فإنه يضيف تعليقات ومساحة واحدة فقط حيث تكون أول مساحة بيضاء غير موجودة في بداية السطر. إضافة إلى ذلك ، لا يقوم بنسخ المسافات البيضاء دون داع ، ولكنه يستخدم عمليات التكبير/التصغير (: h\zs للمساعدة) لتجنب هذا العمل الإضافي ، عند التعليق وخط المسافة البادئة. آمل أن يساعد بعض الحد الأدنى هناك. اقتراحات هي موضع ترحيب.
" these lines are needed for ToggleComment()
autocmd FileType c,cpp,Java let b:comment_leader = '//'
autocmd FileType arduino let b:comment_leader = '//'
autocmd FileType sh,Ruby,python let b:comment_leader = '#'
autocmd FileType zsh let b:comment_leader = '#'
autocmd FileType conf,fstab let b:comment_leader = '#'
autocmd FileType matlab,tex let b:comment_leader = '%'
autocmd FileType vim let b:comment_leader = '"'
" l:pos --> cursor position
" l:space --> how many spaces we will use b:comment_leader + ' '
function! ToggleComment()
if exists('b:comment_leader')
let l:pos = col('.')
let l:space = ( &ft =~ '\v(c|cpp|Java|arduino)' ? '3' : '2' )
if getline('.') =~ '\v(\s*|\t*)' .b:comment_leader
let l:space -= ( getline('.') =~ '\v.*\zs' . b:comment_leader . '(\s+|\t+)@!' ? 1 : 0 )
execute 'silent s,\v^(\s*|\t*)\zs' .b:comment_leader.'[ ]?,,g'
let l:pos -= l:space
else
exec 'normal! 0i' .b:comment_leader .' '
let l:pos += l:space
endif
call cursor(line("."), l:pos)
else
echo 'no comment leader found for filetype'
end
endfunction
nnoremap <Leader>t :call ToggleComment()<CR>
inoremap <Leader>t <C-o>:call ToggleComment()<CR>
xnoremap <Leader>t :'<,'>call ToggleComment()<CR>
هذا المقتطف البسيط هو من ملفي .vimrc:
function! CommentToggle()
execute ':silent! s/\([^ ]\)/\/\/ \1/'
execute ':silent! s/^\( *\)\/\/ \/\/ /\1/'
endfunction
map <F7> :call CommentToggle()<CR>
إنه من أجل // - تعليقات ، ولكن يمكنك تكييفه بسهولة مع الشخصيات الأخرى. يمكنك استخدام autocmd لتعيين قائد كما اقترح jqno.
هذه طريقة بسيطة للغاية وفعالة للعمل مع النطاقات والوضع المرئي بشكل طبيعي.
يمكنك استخدام التعليق vim بواسطة tpope ( https://github.com/tpope/vim-commentary ) يمكنك استخدامه على النحو التالي:
أدخل الوضع المرئي عن طريق الضغط
'v'
ثم اضغط
'j' repeatedly or e.g 4j to select 4 row
الآن كل ما عليك القيام به مع التحديد هو إدخال مفاتيح:
'gc'
سيؤدي هذا إلى التعليق على كل التحديد ، لإلغاء تثبيت مفاتيح reead:
'gc'
يمكنني استخدام vim-multi-cursors لهذا الغرض.
على الرغم من أن هذا السؤال يحتوي بالفعل على الكثير من الإجابات التي ما زلت أعتقد أنني سأقدمها إلى مكون إضافي صغير كتبت: تعليق .
يستخدم Commentify إعداد commentstring
لتحديد كيفية تعليق كتلة من التعليمات البرمجية ، بحيث لا تضطر إلى الاحتفاظ بتعيين أنواع مختلفة من التعليقات في التكوين الخاص بك ، ويدعم كلا التعليقات المستندة إلى السطر (على سبيل المثال ، //
) وحظر التعليقات (على سبيل المثال ، /* */
).
كما أنه يعين نفس الاختصار (الإعدادات الافتراضية إلى ctrl+c) لكل من التعليق وإلغاء التثبيت ، لذلك لا يتعين عليك تذكر تعيينين أو مجموعة معقدة من الأوامر.
تعجبني /* ... */
(تعليقات C ansi) ، لذا فهذه خدعة لك. يمكنك تكييفه للاستخدام في حالات مختلفة ، بالطبع.
تعليق مع/* ... */
حدد النص (انتقل إلى البداية ، ابدأ تشغيل كتلة مرئية ، وقم بالقفز باستخدام }
):
<c-V>}
اكتب الأمر الذي سيتم تطبيقه في التحديد
:norm i/* <c-v><esc>$a */
ستبدو القيادة مثل: :'<,'>norm i /* ^[$a */
انظر (i *) للحصول على التفاصيل.
uncomment the/* ... */
حدد النص (كما كان من قبل ، أو بالطريقة التي تريدها):
<c-V>}
اكتب الأمر الذي سيتم تطبيقه في التحديد
:norm :s-\s*/\*\s*-<c-v><enter>$bbld$
ستبدو القيادة مثل: :'<,'>norm :s-\s*/\*\s*-^M$bbld$
انظر (ii *) للحصول على التفاصيل.
نتيجة
التأثير هو التعليقات سطراً سطراً:
Comment block
Comment block
Comment block
يصبح (والعكس بالعكس):
/* Comment block */
/* Comment block */
/* Comment block */
من الأفضل حفظه كـ بعض map
أو @reg
في .vimrc
، لأنه كثير للكتابة. إذا كنت تفضل /*
و */
المفردة على الكتلة بأكملها ، فاستخدم:
تعليق مع واحد/* */الكتلة بأكملها
احفظه في سجل بالتسجيل باستخدام ، على سبيل المثال ، qc
، ثم ، في بداية فقرة للتعليق:
v}di/* */<esc>hhhp
ولا تنسَ q
مرة أخرى ، لإنهاء السجل.
انظر (iii *) للحصول على التفاصيل.
uncomment واحد/* */من كتلة
احفظه في السجل ، على سبيل المثال ، @u
. ضع المؤشر في أي مكان داخل الكتلة ، و:
?/\*<enter>xx/\*/<enter>xx
احفظ السجل من خلال إنهاء الأمر q
.
انظر (iv *) للحصول على التفاصيل.
نتيجة
التأثير هو تعليق واحد لخطوط متعددة:
Comment block
Comment block
Comment block
يصبح (والعكس بالعكس):
/* Comment block
Comment block
Comment block */
التفسير
(i *) يعمل باستخدام norm
الذي يطبق نفس الأمر بشكل متكرر في كل سطر محدد. يقوم الأمر ببساطة بإدراج /*
، ويجد نهاية هذا السطر وينتهي عن طريق إدخال */
:norm i/* <c-v><esc>$a */
(ii *) كما يستخدم norm
لتكرار البحث/الاستبدال في كل سطر. ابحث عن spaces /* spaces
واستبدله بأي شيء. بعد ذلك ، يجد نهاية السطر ، ويعيد كلمتين ، يمين الخطاب ، يحذف إلى النهاية.
:norm :s-\s*/\*\s*-<c-v><enter>$bbld$
(iii *) تحديد الفقرة بواسطة v}
، وحذفها ، وإدراج تعليق مفتوح وإغلاق ، والانتقال إلى منتصفه ولصق الكتلة المحذوفة.
v}di/* */<esc>hhhp
(iv *) في أي مكان في الوسط ، يعثر على /*
للخلف ، يحذفه ؛ يجد للأمام */
، يحذفه.
?/\*<enter>xx/\*/<enter>xx
سؤال جيد جدا ، ولكن ليس الكثير من الإجابات الجيدة إيمهو. أولاً ، أود أن أقول أن استخدام وضع إدراج الكتلة هو ليس سهلاً الحل هنا ، فقط عدد كبير جدًا من ضغطات المفاتيح ، لذلك من الواضح أنه يجب أن يعمل على سطور محددة لتحسين أداء تحرير الشفرة. نقطة أخرى لا يذكرها أحد: أين يجب وضع علامة التعليق - في بداية السطر أو قبل النص الفعلي؟ من المحتمل أن يكون الأمر طعمًا ، ولكن رأيي ، يجب وضعه قبل النص لإبقاء الكود قابلاً للقراءة: عندما يتم وضع علامة التعليق في السطر الذي يبدأ في البداية ، فإنه يكسر التماسك المرئي للكود ذي المسافات البادئة ، لذلك يبدو قائمة نقطية. مع وضع ذلك في الاعتبار ، انتهى بي الأمر مع الحل التالي (أقدم مثال للتعليق #). في vimrc
:
vnoremap 1 :s:^\(\s*\)\([^#\t ]\):\1#\2:e<CR>
vnoremap 2 :s:^\(\s*\)#\(\s*\):\1\2:e<CR>
يدرج المفتاح 1
#
قبل النص (بعد المسافة البيضاء) في كل سطر محدد. إنه يتحقق مما إذا كان هناك بالفعل #
، وليس لإدراج #
مرتين. ويتجاهل أيضا الخطوط الفارغة.
المفتاح 2
يحذف #
واحد. كما أنه يبقي التعليقات على الجانب الأيمن من الخط آمنة.
تحديث : هنا مثال ، كيفية جعل أمر نوع التبعية toggle comment أمر. لمعرفة المزيد حول هذه الأشياء ، اقرأ: http://learnvimscriptthehardway.stevelosh.com/chapters/14.html
فقط لجعلها تعمل ، ضع الأسطر التالية في ملف .vimrc
الخاص بك.
" build the whole regex search/replace command
function! Build()
let b:Comment_ON='''<,''>s:^\(\s*\)\([^\t ]\):\1' . b:cs . '\2:e'
let b:Comment_OFF='''<,''>s:^\(\s*\)' . b:cs . '\(\s*\):\1\2:e'
endfunction
" run this group on Filetype event
augroup SetCS
autocmd!
"default comment sign
autocmd FileType * let b:cs='--'
"detect file type and assign comment sign
autocmd FileType python,Ruby let b:cs='#'
autocmd FileType c,cpp,Java,javascript,php let b:cs = '\/\/'
autocmd FileType vim let b:cs='"'
autocmd FileType * call Build()
augroup END
vnoremap 1 :<C-u>execute b:Comment_ON<CR>
vnoremap 2 :<C-u>execute b:Comment_OFF<CR>
أنا شخصياً لا أحب وظيفة "تبديل" للتعليق ، حيث إنها ستدمر التعليقات التي تم تضمينها بالفعل في الكود. وأريد أيضًا أن تظهر علامة char في أقصى اليسار ، دائمًا ، حتى أتمكن من رؤية كتل التعليقات بسهولة. أريد أيضًا أن يعمل هذا بشكل متداخل (إذا قمت أولاً بتعليق كتلة ثم كتلة مرفقة). لذلك ، لقد غيرت قليلا واحدة من الحلول. يمكنني استخدام F5 للتعليق و التحول - F5 إلى عدم الارتياح. أيضًا ، أضفت a/g في نهاية s/command:
autocmd FileType c,cpp,Java,scala let b:comment_leader = '//'
autocmd FileType sh,Ruby,python let b:comment_leader = '#'
autocmd FileType conf,fstab let b:comment_leader = '#'
autocmd FileType tex let b:comment_leader = '%'
autocmd FileType mail let b:comment_leader = '>'
autocmd FileType vim let b:comment_leader = '"'
autocmd FileType nasm let b:comment_leader = ';'
function! CommentLine()
execute ':silent! s/^\(.*\)/' . b:comment_leader . ' \1/g'
endfunction
function! UncommentLine()
execute ':silent! s/^' . b:comment_leader . ' //g'
endfunction
map <F5> :call CommentLine()<CR>
map <S-F5> :call UncommentLine()<CR>
للتعليق على سطر (لجميع اللغات):
noremap <silent> ,// :call CommentLine() <CR>
يمكننا أن نسميها مع عدد الخطوط وفي الوضع المرئي أيضا ، فإنه يعمل. مثل: للتعليق على أربعة أسطر استخدم 4 ، // ولعدم استخدام 4 ،/.
إلى Uncomment A Line (لجميع اللغات):
noremap <silent> ,/ :call UnCommentLine() <CR>
إذا كنت ترغب في إضافة رمز جديد [تعليق] ثم إضافة قائمة وإضافة بعض الخطوط في وظيفة. إذا كنت ترغب في إضافة لغة تحتوي على رمز التعليق الذي تم تعريفه بالفعل في إحدى القوائم ، فقم فقط بإضافة اسم لغتك في القائمة المقابلة (للحصول على الاسم الصحيح: افتح ملفك في vim واستخدم: set ft للحصول على الاسم الصحيح للغتك ).
تعريف CommentLine ()
function! CommentLine() let slash_ft_list = ['c' , 'cpp', 'Java', 'scala' , 'systemverilog' , 'verilog' , 'verilog_systemverilog'] let hash_ft_list = ['sh' , 'Ruby' , 'python' , 'csh' , 'conf' , 'fstab' , 'Perl'] let perct_ft_list = ['tex'] let mail_ft_list = ['mail'] let quote_ft_list = ['vim'] if (index(slash_ft_list, &ft) != -1) :norm I// elseif (index(hash_ft_list, &ft) != -1) :norm I# elseif (index(perct_ft_list, &ft) != -1) :norm I% elseif (index(mail_ft_list, &ft) != -1) :norm I> elseif (index(quote_ft_list, &ft) != -1) :norm I" endif endfunction
تعريف UnCommentLine ()
function! UnCommentLine() let slash_ft_list = ['c' , 'cpp', 'Java', 'scala' , 'systemverilog' , 'verilog' , 'verilog_systemverilog'] let hash_ft_list = ['sh' , 'Ruby' , 'python' , 'csh' , 'conf' , 'fstab' , 'Perl'] let perct_ft_list = ['tex'] let mail_ft_list = ['mail'] let quote_ft_list = ['vim'] if (index(slash_ft_list, &ft) != -1) :norm ^2x elseif (index(hash_ft_list, &ft) != -1) :norm ^x elseif (index(perct_ft_list, &ft) != -1) :norm ^x elseif (index(mail_ft_list, &ft) != -1) :norm ^x elseif (index(quote_ft_list, &ft) != -1) :norm ^x endif endfunction
:٪ s/^/\/\// g
إزالة المسافات بين الأحرف واستخدام هذا الأمر للتعليق .C أو ملفات CPP
يعد حل @ CMS هو الطريقة "الأكثر أهمية" للتعليق داخل/خارج الخطوط. في الخطوة الثانية @ CMS ، بعد CtrlV، يمكنك أيضا استخدام r# لإضافة تعليقات أو x لحذفها. درو نيل فيم العملي ، الصفحة 46 ، يشرح هذه التقنية بشكل جيد.
خيار جيد آخر هو استخدام الأمر ex mode. :[نطاق]normali##⌴. من الواضح ، لحفظ ضغطات المفاتيح مع هذا ، ستحتاج إلى تعليق 15 سطرًا.
"comment (cc) and uncomment (cu) code
noremap <silent> cc :s,^\(\s*\)[^# \t]\@=,\1# ,e<CR>:nohls<CR>zvj
noremap <silent> cu :s,^\(\s*\)# \s\@!,\1,e<CR>:nohls<CR>zvj
يمكنك التعليق/uncomment الأسطر المفردة أو المتعددة مع #. للقيام بسطور متعددة ، حدد الأسطر ثم اكتب اختصار cc/cu ، أو اكتب رقمًا ثم cc/cu ، على سبيل المثال سوف 7cc التعليق 7 خطوط من المؤشر.
حصلت على الكود الأصلي من الشخص الذي يعمل على ما هي الطريقة الأكثر أناقة للتعليق/إلغاء تثبيت كتل روبي كود في فيم؟ وأجرت بعض التغييرات الصغيرة (تم تغيير مفاتيح الاختصار ، وأضفت مسافة بعد #).
أنا شخصياً أردت التعليق على Visual Studio. لقد اعتدت عليه في العمل لدرجة أنه استحوذ على ذاكرتي العضلية (باستخدام vsvim). استعمال shift+v حدد الخطوط التي تريدها ثم اضغط ctrl+k، ctrl+c للتعليق أو Ctrl+k، Ctrl+u إلى عدم الارتياح.
:vnoremap <C-k><C-c> :norm i//<Cr>
:vnoremap <C-k><C-u> :s/\/\///g<Cr>:noh<Cr>
لإلغاء ملف كامل:
:g/.spare[1-9].*/,+2s/^/\/\//
سيعلّق الرمز أعلاه على جميع الأسطر التي تحتوي على "spare" ورقم بعد ذلك بالإضافة إلى أنه سيعلق سطرين أكثر من السطر الذي تم العثور عليه. لمزيد من هذه الاستخدامات ، تفضل بزيارة: http://vim.wikia.com/wiki/Search_and_replace#Details
هناك العديد من الإضافات الحيوية مثل Tcomment و nerdcommenter المتاحة.
يمكنني استخدام tcomment لأغراض التعليق.
gcc: سيتم تبديل التعليق على السطر الحالي. v {motion} gc: سيتم تبديل تعليق مجموعة من الخطوط المحددة بصريًا
مثال: سوف v3jgc تبديل المنطقة من 3 خطوط.
يمكن أن تعمل هذه الأوامر للعمل مع التعليقات بأي لغة.
هذا الحل خرائط/للتعليق و؟ إلى uncommenting (تعليق التبديل باستخدام التعيين الفردي معقد جدًا بحيث لا يمكن تنفيذه بشكل صحيح). يتطلب الأمر سلاسل تعليق من خيار commentstring
المدمج في VIM والذي يتم ملؤه من ملفات مثل /usr/share/vim/vim*/ftplugin/*.vim
إذا تم الإعلان عن filetype plugin on
.
filetype plugin on
autocmd FileType * let b:comment = split(&commentstring, '%s', 1)
autocmd FileType * execute "map <silent> <Leader>/ :normal 0i" . b:comment[0] . "<C-O>$" . b:comment[1] . "<C-O>0<CR>"
autocmd FileType * execute "map <silent> <Leader>? :normal $" . repeat('x', strlen(b:comment[1])) . "0" . strlen(b:comment[0]) . "x<CR>"