किसी शब्द के दूसरे अक्षर को स्वचालित रूप से कैसे कम करें?


13

जब मुझे बहुत अधिक पाठ लिखना होता है तो मैं अक्सर अपनी उंगली दबाकर रखता हूं shiftजब मैं एक वाक्य का पहला अक्षर लिखता हूं जो अक्सर होता है:

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

यहाँ Eके NEwछोटे अक्षर में होना चाहिए। मैं तब एक फंक्शन बनाने की कोशिश कर रहा हूं, जो यह पता लगाएगा कि अगर मैं जो वाक्य लिख रहा हूं उसके पहले अक्षर का दूसरा अक्षर ऊपरी मामला है और जो इसे कम करेगा। महत्वपूर्ण हिस्सा यह होगा कि मेरी सजा समाप्त होने के बाद सुधार स्वचालित रूप से किया जाना चाहिए।

अब तक मैंने यह InsertCharPreमहसूस करने से पहले ऑटोकॉमंड इवेंट के साथ खेलने की कोशिश की है कि इस इवेंट द्वारा ट्रिगर किए गए फ़ंक्शन द्वारा टेक्स्ट को संशोधित नहीं किया जा सकता है।

इससे अच्छा उपाय और क्या होगा?

ध्यान दें कि अब तक मुझे समकाल जैसे किनारों के मामलों पर ध्यान केंद्रित करने की आवश्यकता नहीं है जो ऊपरी मामले या इस तरह की चीजों में होना चाहिए।

EDIT मैंने इसे बनाया है, जो एक परफेक्ट वर्कअराउंड है:

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

यह एक समस्या है क्योंकि मैं पहले मोड में प्रवेश करता हूं लाइन के अंत में प्रवेश किया जाता है, लेकिन मुझे लगता है कि इसे ठीक किया जा सकता है।

मुझे लगता है कि अब मेरा प्रश्न एक कोड समीक्षा प्रश्न बन गया है :

  • मैं साइड इफेक्ट से छुटकारा कैसे पा सकता हूं जो पहले वर्ण को सम्मिलित करता है?
  • क्या यह सर्वोत्तम विधि संभव है?
  • यह विधि विम को धीमा करने के लिए लगता है: इसे कैसे सुधार किया जा सकता है?

जवाबों:


6

यहाँ एक छोटे से वास्तव में तेजी से एक पकाया कुछ है। मुझे लगता है कि यह कम मजबूत है, लेकिन यह बहुत हल्का है। हो सकता है कि आप इसे तेजी से बनाने के लिए इसमें शामिल कर सकते हैं? जब मेरे पास समय होगा तो मैं इसे थोड़ा संशोधित करूंगा।

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>बहुत दिलचस्प लगता है क्योंकि यह कार्यों के चालान की संख्या को कम करता है। मैं इस तरह से भी काम करने की कोशिश करूँगा!
statox

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

यह एक ऑटोकैड स्थापित करता है जो एक वर्ण सम्मिलित करने से पहले निम्नलिखित कमांड निष्पादित करता है:

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

मैंने एक बार पढ़ा कि जब आप अपने कोड को ऑप्टिमाइज़ करना चाहते हैं, तो आपको कम से कम पूर्व कमांड का उपयोग करना होगा। तो हो सकता है 2 वाक्य रचना (जो 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
अब यह एक सुंदर समाधान है! मेरे पहले परीक्षणों के अनुसार यह अच्छी तरह से काम करता है। मुझे यह सुनिश्चित करने के लिए कुछ समय के लिए इसका उपयोग करना होगा कि यह मजबूत है। मुझे पसंद है कि आपने कैसे संशोधित किया v:charकि मैं अपने पहले प्रयास में गायब था।
statox

1

इसे करने का एक और तरीका (इतना स्वचालित नहीं है, और इतना सार्वभौमिक नहीं; बस छोटा):

  • चूँकि आप वाक्य / गद्य लिख रहे हैं, कोड नहीं, अपने पाठ बफ़र्स में वर्तनी जाँच सक्रिय करें
  • एक तेज़ इन्सर्ट मोड कॉम्बो कुंजी बनाएं जो पिछली वर्तनी की गलतियों पर वापस जाती है, इसे ठीक करती है, फिर स्थिति / स्थिति को फिर से शुरू करती है; उदाहरण के लिए:

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

तो अब, आप लिखना शुरू करें

"THis is a mistake|"

... और आपको बस गलती का एहसास है - क्या करना है? - बस मारो <C-s>और अपने वाक्य लिखना जारी रखें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.