কিভাবে একটি শব্দ দ্বিতীয় অক্ষর স্বয়ংক্রিয়ভাবে ছোট?


13

যখন আমাকে প্রচুর পাঠ্য টাইপ করতে হয় তখন আমি প্রায়শই আমার আঙ্গুলটি টিপতে shiftথাকি যখন আমি প্রায়শই একটি বাক্যটির প্রথম অক্ষরটি লিখি:

[...]end of sentence. NEw sentence[...]

এখানে Eএর NEwছোট হাতের হওয়া উচিত। আমি তখন একটি ফাংশন তৈরির চেষ্টা করছি যা সনাক্ত করতে পারে যে আমি যে বাক্যটি টাইপ করছি তার প্রথম শব্দের দ্বিতীয় অক্ষরটি যদি বড় হাতের অক্ষর হয় এবং এটির ক্ষেত্রে এটি কম হয়। গুরুত্বপূর্ণ অংশটি হ'ল সংশোধনটি স্বয়ংক্রিয়ভাবে করা উচিত যখন আমি আমার বাক্যের সমাপ্তি টাইপ করব।

InsertCharPreএই ইভেন্টটি দ্বারা চালিত কোনও ক্রিয়াকলাপের মাধ্যমে পাঠ্যটি সংশোধন করা যায় না তা বুঝতে পেরে আমি এখনও পর্যন্ত অটোকম্যান্ড ইভেন্টের সাথে খেলার চেষ্টা করেছি ।

একটি ভাল সমাধান কি হবে?

দ্রষ্টব্য যে এখনও পর্যন্ত আমার প্রান্তের ক্ষেত্রে যেমন সংক্ষিপ্ত শব্দগুলি উপরের ক্ষেত্রে বা এই ধরণের জিনিসগুলিতে হওয়া উচিত সেদিকে মনোযোগ দেওয়ার দরকার নেই।

সম্পাদনা আমি করেছি তৈরি, যা একটি না নিখুঁত কার্যসংক্রান্ত নেই:

autocmd CursorMovedI * call RemoveUnwantedUpper()

function! RemoveUnwantedUpper()
    " Get the current sentence
    " Based on http://stackoverflow.com/a/23315227/4194289
    let l:save_clipboard = &clipboard
    set clipboard= " Avoid clobbering the selection and clipboard registers.
    let l:save_reg = getreg('"')
    let l:save_regmode = getregtype('"')

    normal! y(
    normal! ``

    let l:sentence =getreg('"') 

    call setreg('"', l:save_reg, l:save_regmode)
    let &clipboard = l:save_clipboard

    " Check that we entered a new word (space inserted)
    if l:sentence[len(l:sentence)-1] != " "
       return
    endif 

    " Check if the word is the first one of the sentence
    let l:size = len(split(l:sentence, " "))
    if l:size > 1 
        return
    endif

    " If the last char entered is a space (new word) remove the unwanted Upper case
   normal! bl
   normal! vu
   normal! ``

endfunction

সন্নিবেশ মোডে প্রবেশ করা প্রথম চরিত্রটি লাইনের শেষ প্রান্তে স্থানান্তরিত হওয়ার পরে এটির একটি সমস্যা রয়েছে তবে আমি মনে করি এটি সংশোধন করা যেতে পারে।

আমার ধারণা এখন আমার প্রশ্ন একটি কোড পর্যালোচনা প্রশ্নে পরিণত হয়েছে :

  • প্রথম চরিত্রটি inোকানো পার্শ্ব প্রতিক্রিয়া থেকে আমি কীভাবে মুক্তি পাব?
  • এটা কি সবচেয়ে ভাল পদ্ধতি সম্ভব?
  • এই পদ্ধতিটি ভিমকে কমিয়ে দিচ্ছে বলে মনে হচ্ছে: কীভাবে এটি উন্নতি করা যায়?

উত্তর:


6

এখানে রান্না করা সত্যিই দ্রুত কিছু একটা's আমি মনে করি এটি কম শক্তিশালী তবে এটি আরও হালকা। এটি দ্রুত করার জন্য আপনি এটি নিজের মধ্যে অন্তর্ভুক্ত করতে পারেন? আমি সময় পেলে সম্ভবত এটি কিছুটা সংশোধন করব।

inoremap <Space> <C-o>:call CheckCase()<CR><Space>

function! CheckCase()
   normal! may2b
   let l:words = getreg('"')
   if l:words[0] == '.'
      normal! wlvu
   endif
   normal! `a
endfunction

আমি মনে করি এমন একটি সম্পূর্ণ সমাধান নয়, তবে আমি ভেবেছিলাম যে আমি একটি ভিন্ন পদ্ধতির চেষ্টা করব এবং দেখুন এটি আপনার জন্য কিছু স্পার করেছে কিনা। :)


4
রিম্যাপিংয়ের ধারণাটি <Space>বেশ আকর্ষণীয় বলে মনে হচ্ছে যেহেতু এটি কার্যগুলির আমন্ত্রণের সংখ্যা হ্রাস করে। আমিও এভাবে কাজ করার চেষ্টা করব!
স্টাটক্স

4

আমি জানি না এটি কতটা নির্ভরযোগ্য, তবে আপনি এটি চেষ্টা করতে পারেন:

augroup FixDoubleUppercase
    autocmd!
    autocmd InsertCharPre * if v:char =~ '\u' && getline('.') =~ '\v(\.\s+|^\s*)\u%' . col('.') . 'c' | let v:char = tolower(v:char) | endif
augroup END

এটি একটি অটোকিমডি ইনস্টল করে যা একটি অক্ষর sertোকানোর আগে নিম্নলিখিত কমান্ডটি কার্যকর করে:

if v:char =~ '\u' && getline('.') =~ '\v(\.\s+|^\s*)\u%' . col('.') . 'c' | let v:char = tolower(v:char) | endif

আপনি যে চরিত্রটি সন্নিবেশ করতে চলেছেন তা অভ্যন্তরীণ ভেরিয়েবলে সংরক্ষণ করা হয় v:charএবং যদি পরীক্ষায়:

v:char =~ '\u' && getline('.') =~ '\v(\.\s+|^\s*)\u%' . col('.') . 'c'

... সাফল্য পেয়েছে, তারপরে স্বতঃসিএমডি একটি নতুন মান নির্ধারণ করে v:charযা এটি tolower(v:char)

পরীক্ষাটি পরীক্ষা করে দেখায় যে আপনি বড় হাতের অক্ষর ( v:char =~ '\u') লিখতে চলেছেন এবং আপনার কার্সারটি একটি বাক্যের প্রথম শব্দের প্রথম অক্ষরের পরে রয়েছে:

getline('.') =~ '\v(\.\s+|^\s*)\u%' . col('.') . 'c'

সম্পাদনা: এই 2 টি সিনট্যাক্সের মধ্যে পার্থক্য (পারফরম্যান্স-ভিত্তিক) আছে কিনা তা আমি জানি না: :let myvar = test ? new_value : old_valueএবং :if test | let myvar = new_value | endif

আমি একবার পড়েছি যে আপনি যখন নিজের কোডটি অপ্টিমাইজ করতে চান তখন আপনাকে যতটা সম্ভব কম কয়েকটি এক্স কমান্ড ব্যবহার করতে হবে। তাই হয়তো 2nd সিনট্যাক্স (যা 3 প্রাক্তন কমান্ড হিসাবে গণনা করা যেতে পারে: :if, :let, :endif) 1 ম এক তুলনায় ধীর, আমি জানি না।

তবে এটি যদি হয় তবে আপনি অটোমডিটি এর সাথে প্রতিস্থাপন করতে পারেন:

autocmd InsertCharPre * let v:char = (v:char =~ '\u' && getline('.') =~ '\v(\.\s+|^\s*)\u%' . col('.') . 'c') ? tolower(v:char) : v:char

1
এখন এটি একটি মার্জিত সমাধান! আমার প্রথম পরীক্ষা অনুযায়ী এটি ভাল কাজ করে well এটি শক্তিশালী কিনা তা নিশ্চিত হওয়ার জন্য আমাকে কিছু সময়ের জন্য এটি ব্যবহার করতে হবে। আমি পছন্দ করি আপনি কীভাবে পরিবর্তন করেছিলেন v:charযে আমার প্রথম চেষ্টাতে আমি যে ধারণাটি অনুপস্থিত ছিল তা।
স্ট্যাটক্স

1

এটি করার আরেকটি উপায় (এত স্বয়ংক্রিয় নয় এবং সর্বজনীন নয়; কেবল ছোট):

  • আপনি যেহেতু বাক্য / গদ্য লিখছেন, কোড নয়, আপনার পাঠ্য বাফারগুলিতে ভিম সক্রিয় বানান পরীক্ষা করতে হবে
  • একটি দ্রুত সন্নিবেশ মোড কম্বো কী তৈরি করুন যা শেষ বানানের ভুলগুলিতে ফিরে যায়, এটি ঠিক করে দেয়, তারপরে অবস্থান / অবস্থা পুনরায় শুরু করে; উদাহরণ:

    inoremap <C-s> <Esc>[s1z=gi
    

সুতরাং এখন, আপনি লিখতে শুরু করুন

"THis is a mistake|"

... এবং আপনি কেবল ভুলটি বুঝতে পেরেছেন - কী করব? - খালি আঘাত করুন <C-s>এবং আপনার বাক্যটি লিখতে থাকুন।

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