วิธีที่รวดเร็วในการแสดงความคิดเห็น / ยกเลิกการใส่เครื่องหมายบรรทัดใน Vim คืออะไร?


1168

ฉันมีไฟล์รหัสทับทิมเปิดใน vi มีบรรทัดความเห็นด้วย#:

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หมายเหตุทุกบรรทัดในส่วนแรก เป็นวิธีที่มีประสิทธิภาพในการทำสิ่งที่เป็นกลุ่ม?

โดยทั่วไปฉันกำลังมองหาวิธีที่ง่ายและคล่องแคล่วในการแสดงความคิดเห็นและไม่แสดงความคิดเห็นบรรทัด ที่นี่ฉันกำลังจัดการกับรหัสทับทิม แต่อาจเป็น JavaScript ( //) หรือ Haml ( -#)


20
คำตอบที่ยอมรับควรเปลี่ยนเป็นหนึ่งในคำตอบที่มีคำแนะนำโดยละเอียดเกี่ยวกับวิธีการแสดงความคิดเห็นบล็อก / uncommenting โดยไม่ต้องใช้ปลั๊กอิน คำตอบที่ได้รับการยอมรับในปัจจุบันเป็นเพียงการเชื่อมโยงไปปลั๊กอินของบุคคลที่สาม
faintsignal

คำตอบที่ดีที่สุดไม่ได้กล่าวถึงปลั๊กอินใด ๆ @rationalis ความคิดเห็นของคุณทำให้เข้าใจผิดคุณสามารถแก้ไขหรือลบมันได้ขอบคุณ
bonobo

คำตอบ:


180

ผมใช้NERD สคริปต์ มันช่วยให้คุณแสดงความคิดเห็นได้อย่างง่ายดายแสดงความคิดเห็นหรือสลับความคิดเห็นในรหัสของคุณ

ตามที่ระบุไว้ในความคิดเห็น :

สำหรับทุกคนที่สับสนโดยการใช้งานผู้นำเริ่มต้นคือ "\" ดังนั้น 10 \ cc จะแสดงความคิดเห็นสิบบรรทัดและ 10 \ cu จะไม่ใส่เครื่องหมายข้อคิดเห็นสิบบรรทัด


! ที่น่าสนใจ ฉันอ่านเอกสารและพบว่ามี "ความคิดเห็นเซ็กซี่" - เพียงแค่ใช้ "\ cs" สำหรับ Ruby มันจะใช้=beginและ=endแสดงความคิดเห็นหลายบรรทัดแทนแท็กแฮช
Hegwin

ฉันคิดว่ามันไม่ใช่วิธีที่เร็วที่สุดในการใช้ vim เนื่องจากต้องติดตั้งปลั๊กอิน นอกจากนี้คำตอบที่ดีที่สุดยังได้รับการโหวตมากกว่า แต่มันไม่ได้ถูกทำเครื่องหมายเป็นวิธีแก้ปัญหา
whirmill

136
อย่าหยุดที่นี่ คำตอบที่โหวตส่วนใหญ่อยู่ด้านล่างโดยไม่ต้องใช้ปลั๊กอินใด ๆ stackoverflow.com/a/15588798/2117868และstackoverflow.com/a/1676690/2117868
kuttumiah

@ ฉันจะคิดว่า "ดีที่สุด" จริงๆขึ้นอยู่กับกรณีการใช้งาน โหมดบล็อกภาพเร็วขึ้นหากฉันต้องการสลับความคิดเห็นหนึ่งครั้งในชีวิต แต่ถ้าฉันไม่รังเกียจที่จะติดตั้งปลั๊กอินและต้องการทำการกดแป้นเพียงไม่กี่ครั้งที่เป็นไปได้ในการสลับความคิดเห็นและไม่จำเป็นต้องแยกความแตกต่างระหว่างการเพิ่มหรือลบความคิดเห็นนี่คือคำตอบที่ดีที่สุด
Carolus

@Carolus ฉันจะเห็นด้วยกับคุณหากคำถามเริ่มต้นด้วย "สิ่งที่เป็นวิธีที่ดีที่สุด" แทน "สิ่งที่เป็นวิธีที่รวดเร็ว"
whirmill

2541

สำหรับงานเหล่านั้นผมใช้เวลาส่วนใหญ่ของการเลือกบล็อก

วางเคอร์เซอร์ของคุณบน#ตัวอักษรตัวแรกกดCtrlV(หรือCtrlQสำหรับ gVim) แล้วลงไปจนถึงบรรทัดที่คอมเม้นต์สุดท้ายแล้วกดxซึ่งจะลบ#อักขระทั้งหมดในแนวตั้ง

สำหรับการแสดงความคิดเห็นบล็อกข้อความเกือบจะเหมือนกัน:

  1. CtrlVแรกไปที่บรรทัดแรกที่คุณต้องการที่จะแสดงความคิดเห็นกด สิ่งนี้จะทำให้ตัวแก้ไขอยู่ในVISUAL BLOCKโหมด
  2. จากนั้นใช้ปุ่มลูกศรและเลือกจนถึงบรรทัดสุดท้าย
  3. ตอนนี้กดShiftIซึ่งจะทำให้การแก้ไขในโหมดและกดINSERT #นี่จะเพิ่มแฮชไปที่บรรทัดแรก
  4. จากนั้นกดEsc(ให้เวลาหนึ่งวินาที) แล้วมันจะแทรก#อักขระบนบรรทัดที่เลือกอื่น ๆ ทั้งหมด

สำหรับเวอร์ชัน vim-down ที่มาพร้อมกับ debian / ubuntu ตามค่าเริ่มต้นให้พิมพ์: s/^/#ในขั้นตอนที่สามแทน (การไฮไลต์ที่เหลืออยู่ของอักขระตัวแรกของแต่ละบรรทัดสามารถลบออกได้:nohl)

นี่คือการบันทึกหน้าจอขนาดเล็กสองรายการสำหรับการอ้างอิงด้วยภาพ

หมายเหตุ: คิดเห็น

uncomment: uncomment


87
โดยค่าเริ่มต้นคือ CTRL + V รุ่น windows ของ gvim ใช้ Ctrl + Q เพราะ Ctrl + V ใช้สำหรับวางแล้ว
R. Martinho Fernandes

8
@amindfv Ctrl + V, n(โดยที่ n คือจำนวนบรรทัด - 1), j, n(โดยที่จำนวน num ของความยาวของลำดับอักขระความคิดเห็น - 1), l, x
michael.bartnett

27
คุณจะทำเช่นนี้กับ '//' อย่างไร
AustinT

74
คุณสามารถคลิก Esc สองครั้งเพื่อไม่รอวินาทีนั้น)
Ahmed Hegazy

44
สิ่งนี้ไม่ได้ผลสำหรับฉัน Shift-I เข้าสู่โหมดการแทรกแบบง่าย
Geremia

826

หากต้องการคอมเม้นต์บล็อกเป็นกลุ่ม:

  • กดEsc(เพื่อออกจากการแก้ไขหรือโหมดอื่น ๆ )
  • hit ctrl+ v(โหมดบล็อกภาพ)
  • ใช้ปุ่ม/ ลูกศรเพื่อเลือกบรรทัดที่คุณต้องการ (มันจะไม่เน้นทุกอย่าง - มันก็โอเค!)
  • Shift+ i(เมืองหลวงฉัน)
  • แทรกข้อความที่คุณต้องการเช่น %
  • กด EscEsc

หากต้องการยกเลิกการใส่เครื่องหมายในบล็อกเป็นกลุ่ม:

  • กดEsc(เพื่อออกจากการแก้ไขหรือโหมดอื่น ๆ )
  • hit ctrl+ v(โหมดบล็อกภาพ)
  • ใช้ปุ่ม/ ลูกศรเพื่อเลือกบรรทัดที่ไม่แสดงข้อคิดเห็น

    หากคุณต้องการเลือกหลายตัวอักษรใช้หนึ่งหรือรวมวิธีการเหล่านี้:

    • ใช้ปุ่มลูกศรซ้าย / ขวาเพื่อเลือกข้อความเพิ่มเติม
    • เพื่อเลือกกลุ่มข้อความใช้ปุ่มshift+ / ลูกศร
    • คุณสามารถกดปุ่มลบด้านล่างซ้ำ ๆ เช่นปุ่มลบปกติ

  • กดdหรือxเพื่อลบตัวอักษรซ้ำ ๆ หากจำเป็น

34
@amelia: ทางลัดการแสดงความคิดเห็นใช้ไม่ได้สำหรับฉัน Shift + i พาฉันไปที่โหมดแทรก มันขึ้นอยู่กับรุ่นที่เป็นกลุ่ม?
3527975

7
ทำไมใช้เวลาวินาที
Conor Patrick

24
เพียงออกที่ฉันมีกับคำตอบนี้ก็คือว่ามันจะบอกให้คุณใช้ปุ่มลูกศร
cozyconemotel

6
กดปุ่ม Esc สองครั้งแทน :)
Aaron Alphonsus

21
ในตอนแรกความคิดเห็นที่เปิดใช้งานไม่ได้ผลสำหรับฉัน แต่หลังจากอ่านแล้วก็ใช้งานได้ดีอีกครั้ง: 1. ให้แน่ใจว่าคุณใช้ Ctrl-V ไม่ใช่ V สำหรับการเลือก 2. เมื่อแทรกมันจะปรากฏขึ้นเมื่อคุณกำลังแก้ไขเพียงบรรทัดเดียว 3 ส่วนแทรกทั้งหมดจะเกิดขึ้นเมื่อคุณกด Esc ในที่สุด
เวลา

333

บางครั้งฉันถูกเปลือกลงในกล่องระยะไกลที่ปลั๊กอินและ. vimrc ของฉันไม่สามารถช่วยฉันได้หรือบางครั้ง NerdCommenter ทำให้มันผิด (เช่น JavaScript ฝังอยู่ใน HTML)

ในกรณีเหล่านี้ทางเลือกที่ใช้เทคโนโลยีขั้นต่ำคือnormคำสั่งในตัวซึ่งเพิ่งรันคำสั่ง vim ใด ๆ ที่แต่ละบรรทัดในช่วงที่คุณระบุ ตัวอย่างเช่น:

แสดงความคิดเห็นกับ # :

1. visually select the text rows (using V as usual)
2. :norm i#

ส่วนแทรกนี้ "#" ที่จุดเริ่มต้นของแต่ละบรรทัด โปรดทราบว่าเมื่อคุณพิมพ์: ช่วงจะถูกกรอกดังนั้นมันจะมีลักษณะเหมือนจริง:'<,'>norm i#

ไม่แสดงความคิดเห็น # :

1. visually select the text as before (or type gv to re-select the previous selection)
2. :norm x

นี่จะเป็นการลบอักขระตัวแรกของแต่ละบรรทัด หากฉันใช้ความคิดเห็นแบบ 2 อักขระเช่น // แล้วฉันก็แค่:norm xxลบตัวอักษรทั้งสองออกไป

หากความคิดเห็นมีการเยื้องในคำถามของ OP คุณสามารถยึดการลบดังนี้:

:norm ^x

ซึ่งหมายถึง "ไปที่อักขระที่ไม่ใช่ช่องว่างแรกแล้วลบอักขระหนึ่งตัว" โปรดทราบว่าไม่เหมือนกับการเลือกบล็อกเทคนิคนี้ใช้ได้แม้ว่าความคิดเห็นจะมีการเยื้องไม่เท่ากัน!

หมายเหตุ : เนื่องจากnormเป็นเพียงการเรียกใช้คำสั่ง vim ปกติคุณไม่ จำกัด เฉพาะความคิดเห็นคุณสามารถทำการแก้ไขที่ซับซ้อนในแต่ละบรรทัดได้ หากคุณต้องการอักขระ escape เป็นส่วนหนึ่งของลำดับคำสั่งของคุณให้พิมพ์ ctrl-v จากนั้นกดแป้น Escape (หรือง่ายกว่าเพียงแค่บันทึกแมโครอย่างรวดเร็วแล้วใช้ norm เพื่อเรียกใช้แมโครนั้นในแต่ละบรรทัด)

หมายเหตุ 2 : คุณสามารถเพิ่มการแมปได้แน่นอนถ้าคุณพบว่าตัวเองใช้normมาก เช่นใส่บรรทัดต่อไปนี้ใน ~ / .vimrc ให้คุณพิมพ์ctrl-nแทน:normหลังจากทำการเลือกภาพ

vnoremap <C-n> :norm

หมายเหตุ 3 : บางครั้ง BIM-BIM-VIM ไม่มีnormคำสั่งที่คอมไพล์แล้วดังนั้นให้แน่ใจว่าใช้เวอร์ชันที่ทำให้เป็น beefed up เช่นปกติแล้ว / usr / bin / vim ไม่ใช่ / bin / vi

(ขอบคุณ @Manbroski และ @rakslice สำหรับการปรับปรุงที่รวมอยู่ในคำตอบนี้)


ฉันคิดว่านี่เป็นวิธีที่จะไปจนกว่าฉันจะเลื่อนเพื่ออ่านคำตอบนี้ stackoverflow.com/a/1676690/850996การเลือกบล็อกโดยใช้ CTRL + V (ตรงข้ามกับการเลือกบรรทัดด้วย SHIFT + V) ให้การควบคุมที่ดีกว่า การแทรกตัวละครเกิดขึ้น
Shyam Habarakada

2
@Shyam เทคนิค ctrl-v ที่รวมเข้ากับคำสั่ง block-selection-only พิเศษคือสิ่งที่คำตอบอื่น ๆ ส่วนใหญ่แนะนำ; อย่างไรก็ตามโดยส่วนตัวแล้วฉันพบว่าเทคนิค "norm" ที่ฉันอธิบายไว้ง่ายกว่าเพราะมันไม่ได้แนะนำไวยากรณ์ใหม่นอกเหนือจากคำสั่ง norm ดังนั้นฉันสามารถนำสิ่งที่ฉันรู้เกี่ยวกับ vim มาใช้ซ้ำได้
แมกนัส

2
สำหรับ uncommenting :norm ^xบล็อกเยื้องจะเป็นประโยชน์ที่จะพูด วิธีการนี้โดยทั่วไปมีข้อได้เปรียบในการทำงานกับการเลือกภูมิภาค (เช่นvi{จะเลือกภายในวงเล็บปีกกา) เช่นข้อความเตอร์วัตถุVisual Blockไม่ได้ทำงานกับ
ivan-k

1
อ่าฉันเพิ่งคิดออก - บน Centos 6 ที่/bin/viเป็นกลุ่ม 7.2 แต่มันเป็นโครงสร้างที่แตกต่างกว่า/usr/bin/vimและมีคุณสมบัติเช่นนี้ปิด
rakslice

3
นี่คือคำตอบที่ดีที่สุด โดยเฉพาะอย่างยิ่งเมื่อรวมกับvipเพื่อเลือกทั้งย่อหน้า
เม.ย.

121

ฉันมีดังต่อไปนี้ในของฉัน.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 เอง!
gideon

ในโหมดปกติหรือโหมดวิชวลให้ใช้ ", cc" (ลำดับอักขระ 3 ตัว) เพื่อคอมเม้นต์บรรทัดปัจจุบันและ ", cu" เพื่อยกเลิกการใส่เครื่องหมายบรรทัดปัจจุบัน
ด่าน

8
ฉันชอบมัน :)! ขอบคุณ! ในหมายเหตุด้านข้างฉันไม่สามารถอธิบายได้ยาก ) มัน remaps คำสั่ง (ไม่ซ้ำ [ดูนี้] ( stackoverflow.com/questions/3776117/ … ) ดังนั้นตอนนี้เมื่อคุณกดซีซี: สิ่งที่ได้รับการดำเนินการข) ตอนนี้นี่คือ sed (s) / what / towhat / where) การเปลี่ยนแปลงคำสั่ง ^ (จุดเริ่มต้นของบรรทัด) เป็นอักขระความคิดเห็นที่ตั้งค่าอย่างถูกต้องตามประเภทของไฟล์ที่คุณเปิด c) สำหรับสิ่งเงียบ ๆ ที่พวกเขาเพียงแค่ระงับเอาต์พุตจากคำสั่ง d): nohlsearch หยุดการเน้นการค้นหาที่ไม่ดี
ramrunner

14
หมายเหตุนี่ไม่ใช่วิธีที่ถูกต้องในการโหลดคำสั่งอัตโนมัติ พวกเขาควรจะอยู่ในกลุ่มหรือมิฉะนั้นพวกเขาจะถูกเพิ่มเป็นกลุ่มหลายครั้งและทำให้ช้าลงมาก ดู: learnvimscriptthehardway.stevelosh.com/chapters/14.html ฉันได้เพิ่มคำตอบของคำถามนี้

ดี นี่เป็นคำตอบที่แท้จริงสำหรับคำถามที่ฉันมีเกี่ยวกับวิธีการ (ไม่) แสดงความคิดเห็นในขณะที่คุณเลือกบล็อก
Erwin Rooijakkers

119

ระบุบรรทัดที่จะแสดงความคิดเห็นเป็นกลุ่ม:

เปิดเผยหมายเลขบรรทัด:

:set number

แล้วก็

:5,17s/^/#/     this will comment out line 5-17

หรือสิ่งนี้:

:%s/^/#/        will comment out all lines in file

11
เนื่องจากคุณเพิ่งจะเปลี่ยนถ่านตัวที่ 1 ของแต่ละบรรทัดคุณไม่จำเป็นต้องมี "g" ในตอนท้าย
Magnus

1
บาง vims ในกล่องฝังตัว (เช่น openwrt) ไม่มีโหมดการแสดงผล .. ดังนั้นนี่จึงเป็นเรื่องที่น่ากลัว :)
kim0

คุณอธิบายได้ไหมว่าทำไม:%s/^/#/gจะแสดงความคิดเห็นทุกบรรทัด ฉันสงสัยว่าเครื่องหมายเปอร์เซ็นต์%
Bin

18
และเพื่อยกเลิกข้อคิดเห็นบรรทัดเหล่านี้คุณสามารถเขียน: 5,17s / ^ # /
Iraklis Moutidis

ที่ดี! มันทำงานได้ดีมากกับการเลือกบล็อกเช่น: va{หรือvarสำหรับทับทิม
Artur Małecki

58

นี่คือวิธีที่ฉันทำ:

  1. ไปที่อักขระตัวแรกในบรรทัดแรกที่คุณต้องการแสดงความคิดเห็น

  2. กดCtrl+ qใน GVIM หรือCtrl+ vใน VIM จากนั้นกดลงเพื่อเลือกตัวอักษรตัวแรกในบรรทัดที่แสดงความคิดเห็น

  3. จากนั้นกดcและเพิ่มตัวอักษรความคิดเห็น

การไม่แสดงความคิดเห็นทำงานในลักษณะเดียวกันเพียงพิมพ์ช่องว่างแทนอักขระความคิดเห็น


44
cลบอักขระตัวแรกเช่นกัน คำตอบของ CMS นั้นถูกต้องเช่นกดIจากนั้นพิมพ์อักขระแสดงความคิดเห็นแล้วEsc(นี่เป็น windows vim)
Samaursa

6
ใช้งานได้ยกเว้นต้องกด 'r' ในขั้นตอนที่สามไม่ใช่ 'c'
David Baucum

หรือคุณสามารถกดESCสองครั้งหลังจากกดcและควรทำเคล็ดลับ
nihiser

ตัวเลือกเหล่านี้ทั้งหมดเป็นตัวทำลายของอักขระตัวแรกในบรรทัด
Josiah

36

ฉันมาด้วยการเพิ่มไฟล์. vimrc ของฉันซึ่งทำงานได้ดีและสามารถขยายได้อย่างง่ายดาย คุณเพียงแค่เพิ่มประเภทไฟล์ใหม่ลงใน comment_map และผู้นำความคิดเห็น

ฉันเพิ่มการแมปลงในโหมดปกติและโหมดภาพ แต่คุณสามารถแมปกับสิ่งที่คุณต้องการ ฉันชอบที่จะมีฟังก์ชั่นสไตล์ 'toggle' เท่านั้น หมีตัวหนึ่งที่มีการแมปหลายครั้งเป็นต้น

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>

บันทึก:

ฉันไม่ได้ใช้ callback หรือ hooks ในประเภท / โหลดของไฟล์เพราะฉันพบว่ามันทำให้การเริ่มต้นของ Vim ช้ากว่า.vimrcฟังก์ชั่น / แผนที่แบบคงที่ แต่นั่นเป็นเพียงการตั้งค่าของฉัน ฉันพยายามทำให้มันเรียบง่ายและมีประสิทธิภาพ ถ้าคุณใช้การเติมข้อความอัตโนมัติคุณต้องแน่ใจว่าใส่มันไว้ในกลุ่มการเติมข้อความอัตโนมัติมิฉะนั้นการโทรกลับจะถูกเพิ่มในประเภทไฟล์หลาย ๆ ครั้งต่อไฟล์ที่โหลดและทำให้ประสิทธิภาพลดลงอย่างมาก


1
ฉันใหม่อย่างสมบูรณ์เพื่อเป็นกลุ่มฉันควรกดปุ่มใดเพื่อสลับการทำงานของแมป การ<leader><Space>ประกาศที่ด้านล่างคืออะไร?
Jens Kohl

2
คุณสามารถแทนที่ <leader> ด้วยคีย์เช่น <,> จากนั้นคุณกด SPACE และมันจะสลับสถานะความคิดเห็นของบรรทัด Leader คือสิ่งที่ผู้นำของคุณคือ <leader> ค่าเริ่มต้นของ Vim คือ \ แต่คุณสามารถตั้งค่าของคุณเองเช่น "let mapleader = ','"

คำตอบที่ยอดเยี่ยมหนึ่งความรำคาญ แต่การแสดงความคิดเห็นบล็อกที่มีความคิดเห็นบางส่วนแล้วจะแลกเปลี่ยนความคิดเห็นสำหรับบรรทัดที่ไม่แสดงความคิดเห็น QtCreator สำหรับเช่นลบเฉพาะความคิดเห็นหากบรรทัดที่ไม่ว่างทั้งหมดมีความคิดเห็นชั้นนำอื่นเพิ่มความคิดเห็นชั้นนำ
ideasman42

1
ฉันได้ทำรุ่นที่แตกต่างกันเล็กน้อยโดยใช้\zsและ\zeเคล็ดลับ regex รหัสก็เล็กลงเล็กน้อย คุณสามารถดูได้ที่นี่
SergioAraujo

33

สลับความคิดเห็น

หากสิ่งที่คุณต้องการคือสลับการแสดงความคิดเห็นฉันอยากจะไปกับcommentary.vimโดยtpope

ป้อนคำอธิบายรูปภาพที่นี่

การติดตั้ง

เชื้อโรค:

cd ~/.vim/bundle
git clone git://github.com/tpope/vim-commentary.git

VIM ปลั๊ก:

Plug 'tpope/vim-commentary'

Vundle:

Plugin 'tpope/vim-commentary'

การปรับแต่งเพิ่มเติม

เพิ่มลงในไฟล์. vimrc ของคุณ: noremap <leader>/ :Commentary<cr>

ตอนนี้คุณสามารถสลับความคิดเห็นโดยกดLeader+ /เช่น Sublime และ Atom


ขอบคุณ! มันจะสนับสนุนความคิดเห็น css ใน html บางครั้งในอนาคต?
Dan Oak

25

ใช้ Control-V เพื่อเลือกสี่เหลี่ยมของข้อความ: ไปที่#ตัวอักษรตัวแรกพิมพ์Ctrl+ Vเลื่อนไปทางขวาหนึ่งครั้งจากนั้นลงไปจนถึงจุดสิ้นสุดของความคิดเห็น ตอนนี้พิมพ์x: คุณกำลังลบ#อักขระทั้งหมดตามด้วยช่องว่างหนึ่งช่อง


18

นี่คือส่วนหนึ่งของฉัน.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เพื่อลบความคิดเห็น


.vimrcนี้จะเป็นประโยชน์สำหรับการเริ่มต้นที่จะเรียนรู้วิธีการเขียนของตัวเอง
สุดยอด

3
mapครอบคลุมโหมดปกติและโหมดภาพดังนั้นคุณไม่จำเป็นต้องใช้vmapเส้น
doubleDown

สถานที่ที่ดีกว่าอยู่after/ftplugin/ruby.vimค่ะ
Santosh Kumar

ใช้<leader>icและ<leader>rc
ฮันส์ Kristian

15

ฉันใช้กลุ่ม 7.4 และมันใช้งานได้สำหรับฉัน
สมมติว่าเรากำลังแสดงความคิดเห็น / ไม่แสดงข้อคิดเห็น 3 บรรทัด

เพื่อแสดงความคิดเห็น:

ถ้าโฆษณาไม่มีแท็บ / พื้นที่ที่จุดเริ่มต้น:
ctrl + Vแล้วjjjแล้วshift + I (cappital i)แล้ว//แล้วesc esc
ถ้าสายมีแท็บ / พื้นที่ที่จุดเริ่มต้นที่คุณยังคงสามารถทำข้างต้นหรือแลกเปลี่ยนสำหรับc:
ctrl + Vแล้วjjjแล้วcแล้ว//แล้วesc esc

การ uncomment:

ถ้าเส้นที่ไม่มีแท็บ / พื้นที่ที่จุดเริ่มต้น:
ctrl + Vแล้วjjjจากนั้นll (lower cap L)แล้วc

ถ้าเส้นที่มีแท็บ / พื้นที่ที่จุดเริ่มต้นแล้วคุณเป็นหนึ่งในพื้นที่มากกว่าและesc
ctrl + Vแล้วjjjแล้วll (lower cap L)แล้วcแล้วspaceแล้วesc


9

ฉันต้องการใช้ปลั๊กอิน tcomment: http://www.vim.org/scripts/script.php?script_id=1173

ฉันได้ทำแผนที่ gc และ gcc เพื่อแสดงความคิดเห็นบรรทัดหรือบล็อกไฮไลต์ของรหัส ตรวจพบประเภทไฟล์และทำงานได้ดีจริงๆ


9

ด้วย 30 คำตอบข้างหน้าของฉันฉันจะพยายามให้ทางออกที่ง่ายยิ่งขึ้น: ใส่ a #ที่จุดเริ่มต้นของบรรทัด จากนั้นลงบรรทัดแล้วกดจุด ( .) การทำซ้ำj, ., j, .ฯลฯ ... เพื่อ uncomment, ลบ#(คุณสามารถตีxมากกว่า#) และทำกลับใช้k, .ฯลฯ ...


1
มันเป็นคำตอบที่ง่ายมากแม้แต่มือใหม่ก็สามารถเข้าใจและใช้งานได้ อย่างไรก็ตามมันใช้งานได้ค่อนข้างช้าบนบรรทัดจำนวนมากเพื่อแสดงความคิดเห็น ในการหลีกเลี่ยงสิ่งที่คุณสามารถเขียนI#<Esc>jลงในบัฟเฟอร์ - พูดc- จากนั้นทำ10@cหรือจำนวนบรรทัดที่เหมาะสมกับคุณ
Daerdemandt

9

วิธียกเลิกหมายเหตุสามบรรทัดต่อไปนี้ใน vi:

#code code
#code
#code code code

วางเคอร์เซอร์ไปที่ด้านบนซ้ายสัญลักษณ์และกด# CtrlVสิ่งนี้ทำให้คุณอยู่ในโหมดบล็อกภาพ กดลูกศรลงหรือJสามครั้งเพื่อเลือกทั้งสามบรรทัด Dจากนั้นกด ความคิดเห็นทั้งหมดหายไป Uหากต้องการยกเลิกกด

วิธีการคอมเม้นท์สามบรรทัดต่อไปนี้ใน vi:

code code
code
code code code

CtrlVวางเคอร์เซอร์ไปที่ตัวอักษรบนซ้ายกด สิ่งนี้ทำให้คุณอยู่ในโหมดบล็อกภาพ กดหรือJสามครั้งเพื่อเลือกทั้งสามบรรทัด จากนั้นกด:

I//Esc

นั่นคือทุนฉัน, //, และ Escape

เมื่อคุณกดESCทุกบรรทัดที่เลือกจะได้รับสัญลักษณ์ความคิดเห็นที่คุณระบุ


1
หากคุณพลาดแฮช "ซ้ายบน" คุณสามารถกดo เพื่อเลื่อนเคอร์เซอร์ไปที่ "อีกด้านหนึ่ง" ในโหมดภาพ
dylnmc

ฉันคิดว่านี่เป็นการใช้งานที่ดีที่สุด ไม่จำเป็นต้องมีบุคคลที่สามเพียงใช้เสียงเรียกเข้าแบบดั้งเดิม
Ardi Nusawan

คำตอบที่ดีที่สุดเรียบง่ายและไม่มีบุคคลที่สาม
aze

8

ใช่มี 33 คำตอบ (ส่วนใหญ่ซ้ำ ๆ ) สำหรับคำถามนี้แล้ว

นี่คืออีกวิธีหนึ่งวิธีการที่จะแสดงความคิดเห็นออกมาในเส้นที่เป็นกลุ่ม: การเคลื่อนไหว ความคิดพื้นฐานคือการแสดงความคิดเห็นหรือ uncomment สายออกโดยใช้วิธีการเดียวกับลากวรรคโดยการพิมพ์yipหรือลบ 2 djสายโดยการพิมพ์

วิธีการนี้จะช่วยให้คุณทำสิ่งต่าง ๆ เช่น:

  • ccjเพื่อแสดงความคิดเห็นใน 2 บรรทัดถัดไปและcukเพื่อยกเลิกการแสดงความคิดเห็นพวกเขา;

  • cci{เพื่อแสดงความคิดเห็นบล็อกและเพื่อแสดงความคิดเห็นcui{มัน;

  • ccipเพื่อแสดงความคิดเห็นทั้งย่อหน้าและcuipเพื่อยกเลิกการแสดงความคิดเห็น

  • ccGเพื่อแสดงความคิดเห็นทุกอย่างลงไปที่บรรทัดสุดท้ายและcuggเพื่อยกเลิกการแสดงความคิดเห็นทุกอย่างถึงบรรทัดแรก

สิ่งที่คุณต้องมีคือ 2 ฟังก์ชั่นที่ทำงานเหนือการเคลื่อนไหวและการแมป 2 ครั้งสำหรับแต่ละฟังก์ชั่น ก่อนการแมป:

nnoremap <silent> cc  :set opfunc=CommentOut<cr>g@
vnoremap <silent> cc  :<c-u>call  CommentOut(visualmode(), 1)<cr>
nnoremap <silent> cu  :set opfunc=Uncomment<cr>g@
vnoremap <silent> cu  :<c-u>call  Uncomment(visualmode(), 1)<cr>

(ดูคู่มือเกี่ยวกับตัวg@ดำเนินการและ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

แก้ไขการแสดงออกปกติด้านบนเพื่อให้เหมาะกับรสนิยมของคุณว่า#ควรจะอยู่ที่ไหน:


"การเคลื่อนไหวใหม่ทั้งหมด [... ]" ดูเหมือนจะเหนือกว่า: ปลั๊กอิน t_comment และ vim-commentary ซึ่งทั้งสองอย่างนี้ลงวันที่ก่อนคำตอบนี้ช่วยให้คุณสามารถแสดงความคิดเห็นโดยใช้การเคลื่อนไหว
Rich

สิ่งที่ดี! upvoted (ฉันคิดว่าฉันอาจเริ่มใช้วิธีนี้แทนปลั๊กอินที่ฉันใช้ก่อนหน้านี้ดังนั้นขอขอบคุณที่เขียนมัน!)
Rich

7

หากคุณรู้หมายเลขบรรทัดอยู่แล้วก็n,ms/# //จะได้ผล


จริง ๆ น่าจะเป็น: n, ms / ^ \ s. # // เนื่องจากคุณอาจมีช่องว่างสีขาวและอาจไม่ตามแฮชด้วย
Skip Huffman

7

ฉันทำเครื่องหมายบรรทัดแรกและบรรทัดสุดท้าย (ma และ mb) แล้วทำ: 'a,' bs / ^ # //


6

ผมใช้EnhancedCommentify มันแสดงความคิดเห็นทุกอย่างที่ฉันต้องการ (ภาษาการเขียนโปรแกรมสคริปต์ไฟล์กำหนดค่า) ฉันใช้กับการเชื่อมโหมดวิชวล เพียงเลือกข้อความที่คุณต้องการแสดงความคิดเห็นและกด co / cc / cd

vmap co :call EnhancedCommentify('','guess')<CR>
vmap cc :call EnhancedCommentify('','comment')<CR>
vmap cd :call EnhancedCommentify('','decomment')<CR> 

5

ฉันรวมคำตอบของ 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>

5

มีชีวิตนี้เปลี่ยนปลั๊กอินโดยtpopeเรียกว่าvim-commentary

https://github.com/tpope/vim-commentary

ปลั๊กอินนี้ให้ :

  • ความปกติทางจิตใจ
  • เยื้องความคิดเห็นอย่างเหมาะสม
  • ห้ามคอมเม้นต์บรรทัดว่าง / ไม่จำเป็น

การใช้งาน :

  • ติดตั้งผ่าน Vundle (หรือเชื้อโรคฉันเดา)
  • เน้นข้อความของคุณและกด:ซึ่งจะแสดงเป็น:<,'>
  • ประเภทความเห็นที่นี่และกด:<,'>CommentaryEnter
  • ความเจริญ คุณทำเสร็จแล้ว

vim-commentary(เช่นปลั๊กอินของ tpope ทั้งหมด) มีโบนัสของการเป็นกลุ่มที่เป็นสำนวน gc= "ไปแสดงความคิดเห็น", gcap= "ไปแสดงความคิดเห็นในย่อหน้า" ฯลฯ
goldenratio

นี่เป็นเพียงการแก้ไขคำตอบของ Tim Pope โดย Jim Stewart ใช่ไหม
jdk1.0

5

คำตอบนี้มีประโยชน์มากที่สุดหากคุณไม่สามารถติดตั้งปลั๊กอินได้ แต่คุณยังต้องการให้ตัวละครของคุณแสดงความคิดเห็นตามระดับการเยื้องที่มีอยู่

คำตอบนี้อยู่ที่นี่เพื่อ 1) แสดงรหัสที่ถูกต้องเพื่อวางลงใน a .vimrcเพื่อvim 7.4+ทำการบล็อคความคิดเห็น / ไม่แสดงความคิดเห็นในขณะที่รักษาระดับการเยื้องด้วย 1 ทางลัดในโหมดภาพและ 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='//': นี่จะสร้างตัวแปรเป็นกลุ่ม bที่นี่หมายถึงขอบเขตซึ่งในกรณีนี้มีการบัฟเฟอร์หมายถึงไฟล์ที่เปิดอยู่ในปัจจุบัน อักขระความคิดเห็นของคุณเป็นสตริงและจำเป็นต้องใส่ในเครื่องหมายคำพูดเครื่องหมายคำพูดไม่ได้เป็นส่วนหนึ่งของสิ่งที่จะถูกแทนที่เมื่อสลับความคิดเห็น

  • autocmd BufNewFile,BufReadPost *...: ทริกเกอร์คำสั่งอัตโนมัติในสิ่งต่าง ๆ ในกรณีนี้สิ่งเหล่านี้จะทริกเกอร์เมื่อไฟล์ใหม่หรือไฟล์อ่านจบลงด้วยนามสกุลที่แน่นอน เมื่อมีการเรียกใช้คำสั่ง execute ต่อไปนี้ซึ่งทำให้เราสามารถเปลี่ยนcommentCharชนิดไฟล์ที่ขึ้นอยู่กับ มีวิธีอื่นในการทำเช่นนี้ แต่พวกเขาสับสนกับมือใหม่ (เช่นฉัน) มากกว่า

  • function! Docomment(): ฟังก์ชั่นมีการประกาศโดยเริ่มต้นด้วยและลงท้ายด้วยfunction endfunctionฟังก์ชั่นจะต้องเริ่มต้นด้วยทุน !เพื่อให้แน่ใจว่าฟังก์ชั่นนี้จะเขียนทับฟังก์ชั่นใด ๆ ก่อนกำหนดเป็นกับรุ่นนี้Docomment() Docomment()ถ้าไม่มี!ฉันก็มีข้อผิดพลาด แต่นั่นอาจเป็นเพราะฉันกำหนดฟังก์ชั่นใหม่ผ่านทางบรรทัดคำสั่ง vim

  • execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e': เรียกใช้คำสั่ง ในกรณีนี้เรากำลังดำเนินการsubstituteซึ่งสามารถใช้ช่วง (โดยค่าเริ่มต้นนี่คือบรรทัดปัจจุบัน) เช่น%สำหรับบัฟเฟอร์ทั้งหมดหรือ'<,'>สำหรับส่วนที่ไฮไลต์ ^\s*คือ regex เพื่อให้ตรงกับจุดเริ่มต้นของบรรทัดแล้วตามด้วยช่องว่างจำนวนใด ๆ ซึ่งต่อท้ายไปแล้ว (เนื่องจาก&) .ที่นี่จะใช้สำหรับสตริงเนื่องจากescape()ไม่สามารถห่อในเครื่องหมายคำพูด escape()ช่วยให้คุณสามารถที่จะหลบหนีตัวละครในcommentCharที่ตรงกับข้อโต้แย้ง (ในกรณีนี้\และ/) โดย prepending \พวกเขาด้วย หลังจากนี้เราต่อกันอีกครั้งเมื่อสิ้นสุด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()ตรวจสอบว่าสิ่งแรกมีสิ่งที่สองดังนั้นเราจึงคว้าเส้นที่เราเริ่มเน้นของเราและตรวจสอบว่ามันเริ่มต้นด้วยช่องว่างตามด้วยตัวละครความคิดเห็นของเรา 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 ในกรณีนี้ (โปรดทราบว่าคุณยังคงสามารถใช้ Cr ตามปกติสำหรับ "ทำซ้ำ" ในโหมดปกติด้วยการทำแผนที่นี้) C-uค่อนข้างจะสับสน แต่โดยพื้นฐานแล้วมันทำให้แน่ใจว่าคุณไม่หลงลืมการเน้นภาพของคุณ (ตามคำตอบนี้มันทำให้คำสั่งของคุณเริ่มต้นด้วย'<,'>สิ่งที่เราต้องการ)callที่นี่เพียงแค่บอก vim ให้รันฟังก์ชั่นที่เราตั้งชื่อและ<cr>หมายถึงการกดenterปุ่มcall function() บนบรรทัดคำสั่งและเราต้องกดอีกครั้งเพื่อให้ผู้เล่นสำรองของเราผ่านไปตลอดทาง (ไม่แน่ใจจริงๆว่าทำไม แต่เป็นอะไรก็ตาม)

อย่างไรก็ตามหวังว่านี่จะช่วยได้ นี้จะเอาอะไรกับไฮไลต์v, VหรือC-vตรวจสอบว่าสายแรกคือการให้ความเห็นว่าถ้าใช่ลอง uncomment เส้นไฮไลต์ทั้งหมดและหากไม่ได้เพิ่มชั้นพิเศษของตัวละครความคิดเห็นที่แต่ละบรรทัด นี่คือพฤติกรรมที่ฉันต้องการ ฉันไม่ต้องการเพียงแค่สลับเพื่อให้แต่ละบรรทัดในบล็อกถูกคอมเม้นต์หรือไม่ดังนั้นมันจึงทำงานได้อย่างสมบูรณ์แบบสำหรับฉันหลังจากถาม คำถามหลายข้อเกี่ยวกับเรื่องนี้



3

คุณสามารถใช้ vim-commentary โดย tpope ( https://github.com/tpope/vim-commentary ) คุณสามารถใช้มันได้ดังต่อไปนี้:

เข้าสู่โหมดภาพด้วยการกด

'v'

จากนั้นกด

'j' repeatedly or e.g 4j to select 4 row

ตอนนี้สิ่งที่คุณต้องทำคือเลือกปุ่ม Enter:

'gc'

การทำเช่นนี้จะให้ความเห็นเกี่ยวกับการเลือกทั้งหมดเพื่อยกเลิกการยกเลิกหมายเหตุคีย์:

'gc'

3

นี่คือหนึ่งซับพื้นฐานC-vตามIวิธีการที่อธิบายไว้ข้างต้น

คำสั่งนี้ ( :Comment) เพิ่มสตริงที่เลือกไว้ที่จุดเริ่มต้นของบรรทัดที่เลือก

command! -range -nargs=1 Comment :execute "'<,'>normal! <C-v>0I" . <f-args> . "<Esc><Esc>"

เพิ่มบรรทัดนี้ในของคุณ.vimrcเพื่อสร้างคำสั่งที่ยอมรับอาร์กิวเมนต์เดี่ยวและวางอาร์กิวเมนต์ที่จุดเริ่มต้นของทุกบรรทัดในการเลือกปัจจุบัน

เช่นถ้าเลือกข้อความต่อไปนี้:

1
2

และคุณเรียกใช้สิ่งนี้: :Comment //ผลลัพธ์จะเป็น:

//1
//2

3

เริ่มจากแนวคิดในคำตอบที่นี่ฉันเริ่มฟังก์ชั่นความคิดเห็นของตัวเอง มันสลับความคิดเห็นในและนอก มันสามารถจัดการสิ่งต่าง ๆ เช่น//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>

1
ฉันได้สร้างเวอร์ชันโซลูชันที่แตกต่างออกไปเล็กน้อยซึ่งจะคืนค่าตำแหน่งเคอร์เซอร์ฉันต้องการความเห็นของคุณในเรื่องนั้น ใน github
SergioAraujo

เย็น. คุณสามารถแก้ไขโพสต์ของฉันและเพิ่มโซลูชันของคุณ (เพราะความคล้ายคลึงกัน)!
ไมค์

มีการเปลี่ยนแปลงเพื่อหลีกเลี่ยงการแบ็กสแลช c, cpp, java และใช้ตัวคั่นอื่นในการแทนที่เพื่อหลีกเลี่ยง E488 นอกจากนี้การเปลี่ยนแปลงระยะห่างสำหรับ java, cpp เนื่องจากความคิดเห็นมีสามตัวอักษร // บวกช่องว่างสิ่งนี้ทำโดย l: space
SergioAraujo

3

ฉันใช้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, และไฟล์ปกติ

มันแสดงความคิดเห็นและยกเลิกการแสดงความคิดเห็นบรรทัดในไฟล์ต้นฉบับที่แตกต่างกันทั้งในโหมดปกติและภาพ

การใช้งาน:

  • CtrlCเพื่อแสดงความคิดเห็นบรรทัดเดียว
  • CtrlXเพื่อยกเลิกการแสดงความคิดเห็นบรรทัดเดียว
  • ShiftVและเลือกหลายบรรทัดจากนั้นCtrlCแสดงความคิดเห็นหลายบรรทัดที่เลือก
  • ShiftVและเลือกหลายบรรทัดจากนั้นCtrlXเพื่อยกเลิกการใส่หมายเหตุหลายบรรทัดที่เลือก

3

วิธีที่รวดเร็วและใช้งานง่ายที่สุดของพวกเขาทั้งหมดคือทำการแมป)สำหรับการแสดงความคิดเห็นแบบเดินลงและจากนั้น(สำหรับการเดินแบบไม่ลองแล้วคุณจะไม่กลับไป

ในRubyหรือBashมีการเว้นวรรค 2 ช่อง:

map ) I# <Esc>j
map ( k^2x

ในC / C ++หรือPHPโดยมีการเว้นวรรค 4 ช่อง:

map ) I//  <Esc>j
map ( k^4x

ข้อเสียคือการที่คุณสูญเสีย(และ)สำหรับการเคลื่อนไหวประโยค (แต่dasสามารถกรอกได้) และคุณจะถอยกลับในบางครั้งเลือกและแทนที่หรือCtrlVสำหรับการจัดการส่วนยาว แต่มันก็ค่อนข้างหายาก

และสำหรับ C-style ความคิดเห็นที่ยาวนานได้รับการจัดการอย่างดีที่สุดด้วย:

set cindent
set formatoptions=tcqr

... ซึ่งผสมผสานได้ดีกับการใช้V[move]gqเพื่อทำซ้ำการตัดคำ


2

ตัวอย่างง่ายๆนี้มาจาก. vimrc ของฉัน:

function! CommentToggle()
    execute ':silent! s/\([^ ]\)/\/\/ \1/'
    execute ':silent! s/^\( *\)\/\/ \/\/ /\1/'
endfunction

map <F7> :call CommentToggle()<CR>

มันมีไว้สำหรับ // - ความคิดเห็น แต่คุณสามารถปรับได้อย่างง่ายดายสำหรับตัวละครอื่น ๆ คุณสามารถใช้ autocmd เพื่อตั้งค่าผู้นำตามที่ jqno แนะนำ

นี่เป็นวิธีที่ง่ายและมีประสิทธิภาพในการทำงานกับช่วงและโหมดภาพตามธรรมชาติ


2

ฉันชอบ/* ... */(C ansi ข้อคิดเห็น) ดังนั้นนี่คือเคล็ดลับของฉันสำหรับคุณ คุณสามารถปรับมันเพื่อใช้ในกรณีที่แตกต่างกันแน่นอน


แสดงความคิดเห็นด้วย / * ... * /

เลือกข้อความ (ไปที่จุดเริ่มต้นเริ่มบล็อกภาพข้ามด้วย}):

<c-V>}

พิมพ์คำสั่งที่จะใช้ในการเลือก

:norm i/* <c-v><esc>$a */

คำสั่งจะมีลักษณะดังนี้: :'<,'>norm i /* ^[$a */

ดู (i *) สำหรับรายละเอียด


ยกเลิกการใส่เครื่องหมายข้อคิดเห็น / * ... * /

เลือกข้อความ (เหมือนก่อนหน้าหรือวิธีอื่นที่คุณชอบ):

<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 *) สำหรับรายละเอียด


ยกเลิกหมายเหตุเดียว / * * / จากบล็อก

@uบันทึกไว้ในทะเบียนกล่าวว่า วางเคอร์เซอร์ไว้ที่ใดก็ได้ในบล็อกและ:

?/\*<enter>xx/\*/<enter>xx

บันทึกการลงทะเบียนด้วยqคำสั่งเสร็จสิ้น

ดู (iv *) สำหรับรายละเอียด


ผลลัพธ์

Effect เป็นความคิดเห็นเดียวสำหรับหลายบรรทัด:

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 *)ทุกที่ตรงกลางค้นหาย้อนหลัง/*ลบ ไปข้างหน้า a */, ลบมัน

?/\*<enter>xx/\*/<enter>xx
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.