ভিম: নতুন লাইনে স্বয়ংক্রিয় মন্তব্য


9

আমি সেট করা আছে বলে একটি মন্তব্য করা লাইন থেকে একটি নতুন লাইন শুরু করার পরে Vim স্বয়ংক্রিয়ভাবে একটি মন্তব্য সন্নিবেশ করায় 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
    *
}

আমি মনে করি আমি কয়েক বছর আগে কিছু পাঠ্য সম্পাদক এ এই বৈশিষ্ট্যটি দেখেছি তবে এটি কোনটি মনে করতে পারছি না। কেউ কি এমন কোনও সমাধান সম্পর্কে অবগত আছেন যা আমার জন্য এই ভিমে করবে? কীভাবে আমার নিজের সমাধানটি রোল করবেন সে সম্পর্কে সঠিক দিক নির্দেশকও খুব স্বাগত।


3
আপনি একটি কী-জলের মধ্যে থাকা স্বয়ংক্রিয়ভাবে commentোকানো মন্তব্য চিহ্নিতকারীকে মুছতে আপনি সন্নিবেশ মোডে ctrl-u ব্যবহার করতে পারেন।
এটান রিজনার

1
@ ইটানরেইজনার এটি আসলে আরও ভাল, তবে একটি সাধারণ কীস্ট্রোক আমার জন্য খুব সাধারণ কারণ এটি এত সাধারণ ব্যবহারের বিষয় :)
প্যাট্রিক অসিটি

আপনি পরামর্শ দিয়েছিলেন যে আপনি যে আচরণটি চান তা পেতে আবার প্রবেশ করতে সক্ষম হবেন তবে সিটিটিএল-ইউ খুব বেশি? আপনি নিজের জন্য সিআরটিএল-ইউ সম্পাদন করতে performোকানো মোডে <enter> <enter> ম্যাপিংয়ের চেষ্টা করতে পারেন তবে আপনি যদি কখনও কখনও <enter> চাপিয়ে দেন তবে (অন্য কিছু না বলে) দেরী করে।
এটান রিজনার

পাশাপাশি অতিরিক্তভাবে, যদি মন্তব্য করা লাইনটি খালি থাকে তবে এটি কেবল ট্রিগার করা উচিত। <প্রবেশ> টিপে আঘাত করার সময় একটি লক্ষণীয় বিলম্বও অগ্রহণযোগ্য।
প্যাট্রিক অসিটি

আপনি যদি অন্য কোনও কী না মারেন তবেই কেবল বিলম্ব হবে কারণ আমি বিশ্বাস করি যে আপনি এখনও অন্য কোনও কী চাপানোর পরিকল্পনা করছেন না তা নিশ্চিত করার জন্য ভিআইমের অপেক্ষা করতে হবে। আপনি এই চেকটি সম্পাদন করতে কোনও ফাংশন ব্যবহার করতে পারেন আমার মনে হয় যদিও এটি করা বিশেষত সহজ নয়।
এটান রেইজনার

উত্তর:


4

এটা চেষ্টা কর:

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

imap <expr> <CR> EnterEnter()

ধন্যবাদ দুর্দান্ত দেখাচ্ছে! বাসায় এলে চেষ্টা করব। মন্তব্য মার্কার্স ভাষা স্বাধীনভাবে মিলিয়ে দেওয়ার জন্য আপনি কি রেজেক্সকে প্রসারিত করার কোনও উপায় জানেন? তথ্যটি সিনট্যাক্স ফাইল বা কোনও কিছুর মধ্যে থাকা উচিত। সম্ভবত আমি এর জন্য সিনট্যাক্স বৈশিষ্ট্যটি
উপকার

আমার অর্থ সি এর সাথে এটি // এবং / * এবং * (
মাল্টলাইন

স্পষ্টতই, এই ফাংশনটি মোটেই সাধারণ নয়। দেখুন :h 'comment'এবং :h format-comment'
রোমেনেল

ক্লাসিক ছাড়াও #রুবি এবং "ভিমস্ক্রিপ্টের সাথে কাজ করার জন্য ফাংশনটি সংশোধন করা হয়েছে //*সি-স্টাইলের মাল্টলাইন মন্তব্যগুলির জন্য কিছু করার জন্য এটি আসলেই বোধগম্য নয় কারণ এটি অবশ্যই*/ যাইহোক শেষ হতে হবে
রোমেনেল

হুম, সম্ভবত <CR><CR>
মাল্টলাইন

3

আমি @ রোমেনেলের উত্তরকে ভিমের কাছ থেকে রেজেক্স উত্পন্ন করে স্বেচ্ছাসেবী ভাষার সাথে কাজ করার উত্তর প্রসারিত করেছি &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সঠিক পছন্দটি হ'ল এটিতে কেবল একটি ফর্ম থাকে এবং এটি "লাইনওয়াইজ" বা "ব্লকওয়াইজ" ( /*%s*/সি তে, //%sজাভাস্ক্রিপ্টে ইত্যাদি) হতে পারে।
রোমেনেল

2

'ফর্ম্যাটপশন থেকে আর সরিয়ে ফেলুন। এই বিকল্পটি কি করে। এটি বন্ধ করার অর্থ হ'ল আপনি কখনই আপনার পক্ষে এটি করছেন না যার অর্থ আপনি যখন প্রথমে চাইবেন তখন আপনাকে অগ্রণী মন্তব্য মার্কার যুক্ত করতে হবে তবে এটি ট্রেড অফ।


2
আমি প্রকৃতপক্ষে আমার কাছে ভিম মন্তব্য মন্তব্যকারীদের যুক্ত করতে চাই , আমি এটি পছন্দ করি। তবে আমি মন্তব্যটি থেকে বেরিয়ে আসার দ্রুত উপায়ও চাই। যদিও আপনার উত্তরের জন্য ধন্যবাদ।
প্যাট্রিক অসিটি

সাধারণ মোড 'ও' কমান্ডের জন্য, কাউকে অবশ্যই 'আর' অপসারণ করতে হবেformatoptions
এলিজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.