เป็นกลุ่ม: ความคิดเห็นอัตโนมัติในบรรทัดใหม่


9

formatoptions=tcroqlเป็นกลุ่มโดยอัตโนมัติแทรกความคิดเห็นเมื่อฉันเริ่มต้นบรรทัดใหม่จากสายออกความเห็นเพราะฉันมีชุด ตัวอย่างเช่น (เคอร์เซอร์คือ*):

// this is a comment*

และหลังจากกดปุ่ม<Enter>(โหมดแทรก) หรือo(โหมดปกติ) ฉันเหลือด้วย:

// this is a comment
// *

คุณลักษณะนี้มีประโยชน์มากเมื่อเขียนความคิดเห็นแบบหลายบรรทัดที่ยาว แต่บ่อยครั้งที่ฉันต้องการเพียงความคิดเห็นบรรทัดเดียว ตอนนี้ถ้าฉันต้องการที่จะจบชุดความคิดเห็นฉันมีหลายตัวเลือก:

  • ตี <Esc>S
  • ตี<BS>สามครั้ง

ทั้งสองสิ่งนี้สามารถกดแป้นได้สามครั้งนำมาพร้อมกับสิ่ง<Enter>นี้หมายถึงการกดแป้นสี่ครั้งสำหรับบรรทัดใหม่ซึ่งฉันคิดว่ามากเกินไป เป็นการดีที่ฉันต้องการเพียงแค่กด<Enter>ครั้งที่สองที่เหลือ:

// this is a comment
*

เป็นสิ่งสำคัญที่โซลูชันจะทำงานร่วมกับการเยื้องระดับที่แตกต่างกันเช่น

int main(void) {
    // this is a comment*
}

ตี <Enter>

int main(void) {
    // this is a comment
    // *
}

ตี <Enter>

int main(void) {
    // this is a comment
    *
}

ฉันคิดว่าฉันเคยเห็นคุณสมบัตินี้ในโปรแกรมแก้ไขข้อความเมื่อไม่กี่ปีที่ผ่านมา แต่ฉันจำไม่ได้ว่าเป็นรุ่นไหน มีใครรู้วิธีแก้ปัญหาที่จะทำสิ่งนี้ให้ฉันใน Vim หรือไม่? ตัวชี้ไปในทิศทางที่ถูกต้องเกี่ยวกับวิธีการม้วนโซลูชันของฉันเองก็ยินดีต้อนรับเช่นกัน


3
คุณสามารถใช้ ctrl-u ในโหมดแทรกเพื่อลบเครื่องหมายความคิดเห็นที่แทรกโดยอัตโนมัติในหนึ่งคีย์คอร์ด
Etan Reisner

1
@EtanReisner ที่จริงดี แต่ยังคงมากกดแป้นพิมพ์หนึ่งเกินไปสำหรับฉันเพราะมันเป็นเช่นกรณีการใช้งานทั่วไป :)
แพทริค Oscity

คุณแนะนำว่าคุณต้องการกด Enter อีกครั้งเพื่อให้ได้พฤติกรรมที่คุณต้องการ แต่ ctrl-u มากเกินไป? คุณสามารถลองแมป <enter> <enter> ในโหมดแทรกเพื่อทำ ctrl-u ให้คุณโดยอัตโนมัติ แต่นั่นจะทำให้เกิดความล่าช้าหากคุณกด <enter> เพียงครั้งเดียว (โดยไม่ต้องกดปุ่มใด ๆ )
Etan Reisner

ยิ่งไปกว่านั้นมันควรจะทำงานเฉพาะเมื่อบรรทัดที่มีความคิดเห็นว่างเปล่า ความล่าช้าที่สังเกตได้เมื่อกด <Enter> นั้นไม่สามารถยอมรับได้
Patrick Oscity

มันจะล่าช้าถ้าคุณไม่กดปุ่มอื่นที่ฉันเชื่อว่าเป็นกลุ่มเพราะต้องรอเพื่อให้แน่ใจว่าคุณยังไม่ได้วางแผนที่จะกดปุ่มอื่น คุณสามารถใช้ฟังก์ชั่นเพื่อทำการตรวจสอบนั้นเช่นกันฉันคิดว่ามันอาจจะไม่ง่ายเลยที่จะทำ
Etan Reisner

คำตอบ:


4

ลองสิ่งนี้:

function! EnterEnter()
  if getline(".") =~ '^\s*\(//\|#\|"\)\s*$'
    return "\<C-u>"
  else
    return "\<CR>"
  endif
endfunction

imap <expr> <CR> EnterEnter()

ขอบคุณที่ดูดี! จะลองเมื่อฉันกลับถึงบ้าน คุณรู้วิธีที่จะขยาย regex ให้ตรงกับภาษาเครื่องหมายความคิดเห็นได้อย่างอิสระ? ข้อมูลควรมีในไฟล์ไวยากรณ์หรือบางอย่าง บางทีฉันอาจจะสามารถใช้ประโยชน์จากคุณลักษณะไวยากรณ์สำหรับการนี้ ...
แพทริค Oscity

ฉันหมายถึงใน C มันควรจับคู่ // และ / * และ * (ความคิดเห็นหลาย
บรรทัด

เห็นได้ชัดว่าฟังก์ชั่นนี้ไม่ได้ทั่วไปเลย ดูและ:h 'comment' :h format-comment'
romainl

ฟังก์ชั่นการแก้ไขเพื่อให้ทำงานร่วมกับ#ทับทิมและ"ของ vimscript //นอกเหนือไปจากคลาสสิก มันไม่ได้ทำให้รู้สึกจริงๆที่จะทำอะไรสำหรับ*ความคิดเห็นของหลายแบบ C เพราะมันจะต้องจบลงด้วยการ*/อยู่แล้ว
romainl

อืมอาจจะ<CR><CR>สามารถนำมาใช้เพื่อเสร็จสิ้นการแสดงความคิดเห็นหลาย ...
romainl

3

ฉันขยายคำตอบของ @ romainl เพื่อทำงานกับภาษาที่กำหนดเองโดยการสร้าง regex จาก Vim's &commentstring:

function! s:IsOnlyComment(getlineArg)
  let commentRegex='^\s*'.substitute(&commentstring,'%s','\\s*','').'$'
  return strlen(matchstr(getline(a:getlineArg), commentRegex)) > 0
endfunction

function! SmartEnter()
  if s:IsOnlyComment('.')
    return "\<Esc>S"
  else
    return "\<CR>"
  endif
endfunction

inoremap <expr> <CR> SmartEnter()

อย่างไรก็ตามดูเหมือนว่าฉันจะไม่ทำการแมปใหม่<CR>เลยนี่แค่ใช้งานไม่ได้ สำหรับตอนนี้ฉันใช้<CR><CR>จนกว่าปัญหานี้จะได้รับการแก้ไข


1
ทำไม<Esc>S? <C-u>ทำเช่นเดียวกันโดยไม่ต้องออกจากโหมดแทรก อย่างไรก็ตามฉันมีฟังก์ชั่นที่กำหนดเองซึ่งทำสิ่งต่าง ๆ มากมาย<CR>และเปลี่ยนชื่อเป็นSmartEnter()เมื่อวานนี้หลังจากฉันโพสต์คำตอบของฉัน ;-) นอกจากนี้ฉันไม่แน่ใจว่า&commentstringเป็นตัวเลือกที่ถูกต้องเพราะโดยทั่วไปจะมีเพียงรูปแบบเดียวและอาจเป็น "linewise" หรือ "blockwise" ( /*%s*/ใน C, //%sใน Javascript, ฯลฯ )
romainl

2

ลบ r จาก 'formatoptions นั่นคือสิ่งที่ตัวเลือกทำ การปิดใช้งานจะหมายความว่าคุณจะไม่ได้รับเสียงดังกล่าวสำหรับคุณซึ่งหมายความว่าคุณจะต้องเพิ่มเครื่องหมายแสดงความคิดเห็นชั้นนำเมื่อคุณต้องการพวกเขาจริงๆ แต่นั่นคือการแลกเปลี่ยน


2
ฉันต้องการให้ Vim เพิ่มเครื่องหมายความคิดเห็นสำหรับฉันฉันชอบสิ่งนี้ แต่ฉันยังต้องการวิธีที่รวดเร็วในการออกความคิดเห็น ขอบคุณสำหรับคำตอบของคุณ
Patrick Oscity

สำหรับคำสั่งโหมดปกติ 'o' คุณต้องลบ 'r' จากformatoptions
elig
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.