वर्तनी सुझावों के माध्यम से लूप की कमान


12

मैंने मैप zzकिया 1z=, जो कि अधिकांश समय महान है, लेकिन हर बार और फिर पहला सुझाव सही नहीं है।

इसलिए मैं अन्य सुझावों के माध्यम से चक्र को दोहराना zz(या .) रखना चाहूंगा ।

एक zzही शब्द पर दूसरा , फिर, जैसे काम करेगा u2z=, एक तिहाई और इसी zzतरह काम करेगा u3z=

कैसे करना है पर कोई विचार?


संपादित करें:

@ Nobe4 के जबर्दस्त जवाब के आधार पर मैं वह करने में कामयाब रहा जो मैं चाहता हूं, लेकिन मैं इसे थोड़ी देर के लिए छोड़ दूंगा अगर किसी को कोई सुधार या सुझाव है:

let s:spell_position = []
let s:spell_count = 0
let s:spell_word = ""

function! LoopSpell()

    if s:spell_position != getpos('.') ||
            \ (s:spell_count > 0 && s:spell_word !~ expand("<cword>"))
        let s:spell_count = 0
        let s:spell_position = getpos('.')
    endif

    if s:spell_count > 0
        silent execute "normal! u"
    endif

    let s:current_word = expand("<cword>")
    if len(s:current_word) <= 0
        return
    endif

    let s:spell_suggestions = spellsuggest(expand(s:current_word))
    if len(s:spell_suggestions) <= 0
        return
    endif

    if s:spell_count >= len(s:spell_suggestions)
        let s:spell_word = s:current_word
        let s:spell_count = 0
    else
        let s:spell_word = s:spell_suggestions[s:spell_count]
        let s:spell_count += 1
    endif
    silent execute "normal! ciw" . s:spell_word
    let s:spell_position = getpos('.')

endfunction

nnoremap <c-m> :call LoopSpell()<CR>

(मैंने <c-m>@ विटोर की टिप्पणी के कारण मैपिंग बदल दी । इसके अलावा यह मुझे उन कुंजियों को दबाए रखने और सुझावों के माध्यम से स्क्रॉल करने की अनुमति देता है जो वास्तव में बहुत तेज़ हैं। मैं इसके बारे में सोच रहा हूं <c-mistake>।)


2
मैं आपको इस प्लगइन की जांच करने का सुझाव दूंगा जो इस साइट के एक उपयोगकर्ता द्वारा बनाया गया था। को सही आप का उपयोग शुरू करने के लिए: यह वास्तव में वर्तनी जांच के कार्यप्रवाह को बेहतर बनाता है :Correctआप के साथ सही करने के लिए शब्द गर्त नेविगेट करने में सक्षम हो जाएगा: आदेश nऔर N, एक विभाजन खिड़की आप बस उन के माध्यम से नेविगेट के साथ कर सकते हैं सब सुधार के सुझाव के साथ खुलता है jऔर kऔर <CR>होगा सुधार लागू करें।
statox

@statox सुझाव के लिए धन्यवाद। मैं इसकी जांच करूंगा, लेकिन मैं अभी भी चाहता हूं कि मेरी zzकमान विशिष्ट चीजों को जल्दी से ठीक कर ले।
dbmrq

3
आशा है कि आप जानते हैं कि मूल रूप zzसे वर्तमान लाइन के चारों ओर की खिड़की है। यह शायद मेरे द्वारा उपयोग किए जाने वाले शॉर्टकट में से एक है। तुम भी चेकआउट चाहिए zbऔर zt
विटोर

@Vitor दिलचस्प, मुझे नहीं पता था कि! मैं आमतौर पर अपने scrolloffबहुत ऊंचा रखता हूं , लेकिन यह अभी भी उपयोगी लगता है, मैं एक और मानचित्रण पर विचार करूंगा। धन्यवाद!
dbmrq

यह विम स्क्रिप्ट शब्द पूर्णता / वर्तनी सुधार / समानार्थी शब्द (एस्पेल, थिसॉरस, डिक्शनरी का उपयोग करके) stackoverflow.com/a/46645434/476175
mosh

जवाबों:


6

यहाँ मैं क्या लेकर आया हूँ:

घूमने लगा

जादू घूमना

विशेषताएं

  • '[और ']निशान पाठ पर काम किया जा नज़र रखने के लिए किया जाता है। सुझाए गए परिवर्तन को प्रभावी रूप से "स्वीकार" करने के लिए कहीं और परिवर्तन करना।
  • एक गिनती स्वीकार करता है।
  • का उपयोग करके पीछे की ओर जाता है zp
  • विम-रिपीट का उपयोग करके बार-बार
  • मूल सुझावों को पुनर्स्थापित करने के लिए एक बार पूर्ववत करें कि कितने सुझावों को साइकिल से हटा दिया गया है।
  • विभाजित शब्दों के लिए सुझाव प्राप्त करने के लिए दृश्य मोड में काम करता है (उदाहरण के लिए "हेड लाइन" -> "शीर्षक")
    • पाठ का ट्रैक रखने के लिए उपयोग '<और '>निशान।
    • नोट : विम-रिपीट के साथ पुनरावृत्ति प्रतीत नहीं होती है ।
  • परिवर्तित किया जा रहा मूल शब्द अनाम रजिस्टर में रखा गया है।
  • मूल, पिछले, वर्तमान और अगले सुझावों को कमांड लाइन में प्रदर्शित किया जाता है।
  • :SpellRotateSubAllवर्तमान सुझाव के साथ मूल मिलान वाले सभी पाठ को बदलने के लिए Naive कमांड ।

प्लगइन: वर्तनी

function! s:spell_rotate(dir, visual) abort
  if a:visual
    " Restore selection.  This line is seen throughout the function if the
    " selection is cleared right before a potential return.
    normal! gv
    if getline("'<") != getline("'>")
      echo 'Spell Rotate: can''t give suggestions for multiple lines'
      return
    endif
  endif

  if !&spell
    echo 'Spell Rotate: spell not enabled.'
    return
  endif

  " Keep the view to restore after a possible jump using the change marks.
  let view = winsaveview()
  let on_spell_word = 0

  if exists('b:_spell') && getline("'[") == getline("']")
    let bounds = b:_spell.bounds
    " Confirm that the cursor is between the bounds being tracked.
    let on_spell_word = bounds[0][0] == bounds[1][0]
          \ && view.lnum == bounds[0][0]
          \ && view.col >= bounds[0][1]
          \ && view.col <= bounds[1][1]
  endif

  " Make sure the correct register is used
  let register = &clipboard == 'unnamed'
        \ ? '*' : &clipboard == 'unnamedplus'
        \ ? '+' : '"'

  " Store the text in the unnamed register.  Note that yanking will clear
  " the visual selection.
  if on_spell_word
    if a:visual
      keepjumps normal! y
    else
      keepjumps normal! `[v`]y
    endif
    call winrestview(view)
  elseif a:visual
    keepjumps normal! y
  else
    keepjumps normal! viwy
  endif

  let cword = getreg(register)

  if !on_spell_word || b:_spell.alts[b:_spell.index] != cword
    " Start a new list of suggestions.  The word being replaced will
    " always be at index 0.
    let spell_list = [cword] + spellsuggest(cword)
    let b:_spell = {
          \ 'index': 0,
          \ 'bounds': [[0, 0], [0, 0]],
          \ 'cword': cword,
          \ 'alts': spell_list,
          \ 'n_alts': len(spell_list),
          \ }

    if len(b:_spell.alts) > 1
      " Do something to change the buffer and force a new undo point to be
      " created.  This is because `undojoin` is used below and it won't
      " work if we're not at the last point of the undo history.
      if a:visual
        normal! xP
      else
        normal! ix
        normal! x
      endif
    endif
  endif

  if a:visual
    normal! gv
  endif

  if len(b:_spell.alts) < 2
    echo 'Spell Rotate: No suggestions'
    return
  endif

  " Force the next changes to be part of the last undo point
  undojoin

  " Setup vim-repeat if it exists.
  silent! call repeat#set(printf("\<Plug>(SpellRotate%s%s)",
        \ a:dir < 0 ? 'Backward' : 'Forward', a:visual ? 'V' : ''))

  " Get the suggested, previous, and next text
  let i = (b:_spell.index + (a:dir * v:count1)) % b:_spell.n_alts
  if i < 0
    let i += b:_spell.n_alts
  endif

  let next = (i + 1) % b:_spell.n_alts
  let prev = (i - 1) % b:_spell.n_alts
  if prev < 0
    let prev += b:_spell.n_alts
  endif

  let next_word = b:_spell.alts[next]
  let prev_word = b:_spell.alts[prev]

  let b:_spell.index = i
  call setreg(register, b:_spell.alts[i])

  if a:visual
    normal! p`[v`]
  else
    keepjumps normal! gvp
  endif

  " Keep the original word in the unnamed register
  call setreg(register, b:_spell.cword)

  let b:_spell.bounds = [
        \ getpos(a:visual ? "'<" : "'[")[1:2],
        \ getpos(a:visual ? "'>" : "']")[1:2],
        \ ]

  echon printf('Suggestion %*s of %s for "', strlen(b:_spell.n_alts - 1), b:_spell.index, b:_spell.n_alts - 1)
  echohl Title
  echon b:_spell.cword
  echohl None
  echon '":  '

  if a:dir < 0
    echohl String
  else
    echohl Comment
  endif
  echon prev_word
  echohl None

  echon ' < '

  echohl Keyword
  echon b:_spell.alts[i]
  echohl None

  echon ' > '

  if a:dir > 0
    echohl String
  else
    echohl Comment
  endif
  echon next_word
  echohl None

  redraw
endfunction


function! s:spell_rotate_suball() abort
  if !exists('b:_spell') || len(b:_spell.alts) < 2
    return
  endif
  execute '%s/'.b:_spell.cword.'/'.b:_spell.alts[b:_spell.index].'/g'
endfunction


command! SpellRotateSubAll call s:spell_rotate_suball()

nnoremap <silent> <Plug>(SpellRotateForward) :<c-u>call <sid>spell_rotate(v:count1, 0)<cr>
nnoremap <silent> <Plug>(SpellRotateBackward) :<c-u>call <sid>spell_rotate(-v:count1, 0)<cr>
vnoremap <silent> <Plug>(SpellRotateForwardV) :<c-u>call <sid>spell_rotate(v:count1, 1)<cr>
vnoremap <silent> <Plug>(SpellRotateBackwardV) :<c-u>call <sid>spell_rotate(-v:count1, 1)<cr>

nmap <silent> zz <Plug>(SpellRotateForward)
nmap <silent> zp <Plug>(SpellRotateBackward)
vmap <silent> zz <Plug>(SpellRotateForwardV)
vmap <silent> zp <Plug>(SpellRotateBackwardV)

1
वाह, अब हम बात कर रहे हैं! आपको इसे एक स्टैंडअलोन प्लगइन में बदलना चाहिए ताकि हम भविष्य के बदलावों और सुधारों को एक ही जगह पर रख सकें। या यदि आप रुचि नहीं ले रहे हैं तो मैं इसे करने की कोशिश कर सकता हूं।
dbmrq

@danielbmarques काफी आसान है, यहाँ आप जाते हैं: github.com/tweekmonster/spellrotate.vim
टॉमी ए

शानदार, धन्यवाद! मैं आपके उत्तर को सही के रूप में स्वीकार करूंगा क्योंकि यह वही है जो मैं चाहता था और अधिक, और मैं उसके सारे प्रयास और मदद के लिए @ nobe4 को इनाम दूंगा।
dbmrq

@danielbmarques कोई समस्या नहीं है। मैं इसमें दिलचस्प सवालों और समाधानों के लिए हूँ it
टॉमी ए

5

जैसा कि @statox ने सुझाव दिया, आप मेरे द्वारा लिखे गए प्लगइन का उपयोग कर सकते हैं: vimcorrect

मैं मूल रूप से समझाता हूं कि यह कैसे काम करता है, इसलिए यदि आप इसके कुछ हिस्से का पुन: उपयोग करना चाहते हैं, तो आप कर सकते हैं।

अगले गलत वर्तनी वाले शब्द पर ध्यान केंद्रित करने के लिए मैं सीधे उपयोग करता हूं ]sऔर [sजैसे ही वे अगले / पिछले मैच में कूदते हैं। मैंने वर्तमान शब्द पर प्रकाश डालने के लिए एक कस्टम मैच फ़ंक्शन को परिभाषित किया:

यहाँ छवि विवरण दर्ज करें

matchadd('error', '\%'.line('.').'l'.'\%'.col('.').'c'.s:current_word)

जो मैच errorलाइन को वर्तमान लाइन / कॉलम के मौजूदा शब्द से जोड़ते हैं (एक ही लाइन पर कई मिलान को रोकने के लिए)।


spellbadword()समारोह कर्सर के तहत शब्द के लिए संभव सुधार की एक सूची प्रदान।

मैं बस इस सूची को एक बफर में प्रदर्शित करता हूं, और मैं <CR>वर्तमान लाइन (यानी एक संभव सही शब्द) द्वारा गलत वर्तनी वाले शब्द को बदलने के लिए मैप करता हूं ।


मैं भी नक्शा nऔर Nकरने के लिए ]sऔर [s, जैसा कि मैंने खोज करने के लिए उन्हें प्रेस करने के लिए इस्तेमाल कर रहा हूँ।

q प्लगइन को छोड़ने के लिए मैप किया गया है, विभाजन को बंद करें और हाइलाइट को हटा दें।

नोट : यह अभी भी बहुत अस्थिर है, लेकिन मैं जल्द ही कुछ बदलाव करने की योजना बना रहा हूं। यदि आप ऐसा महसूस करते हैं कि आप इस प्लगइन को सुधारना चाहते हैं, तो फोर्क / फोर्क खोलने के लिए स्वतंत्र महसूस करें।


स्पष्टीकरण के लिए धन्यवाद। आपका प्लगइन बहुत अच्छा लग रहा है, मैं निश्चित रूप से इसका उपयोग करूँगा। मैं अब भी अपनी zzआज्ञा चाहता हूं , हालांकि, मैं एक विशेष मोड में प्रवेश किए बिना चीजों को जल्दी से ठीक कर सकता हूं। हो सकता है कि हम इसे जोड़ सकें, vimcorrectअगर मैं कभी इसका पता लगाऊं। :)
dbmrq

खैर, मुझे निश्चित रूप से अधिक अनुकूलन जोड़ने की आवश्यकता है। तो कस्टम मैपिंग को परिभाषित करना एक सुधार हो सकता है जिसे आप चाहें तो जोड़ सकते हैं :) (यदि आप vimscript में विकसित करना शुरू करते हैं तो यह सीखने का एक अच्छा तरीका हो सकता है)
nobe4

2

यहाँ एक कार्य है जो काम करना चाहिए:

let s:last_spell_changedtick = {}

function! LoopSpell()
  " Save current line and column
  let l:line = line('.')
  let l:col = col('.')

  " check if the current line/column is already in the last_spell_changedtick
  if has_key(s:last_spell_changedtick, l:line) == 0
    let s:last_spell_changedtick[l:line] = {}
  endif

  if has_key(s:last_spell_changedtick[l:line], l:col) == 0
    let s:last_spell_changedtick[l:line][l:col] = 0
  endif

  " If the value already exists, undo the change
  if s:last_spell_changedtick[l:line][l:col] != 0
    normal u
  endif

  " Get the current word
  let l:current_word = spellbadword()
  if len(l:current_word) == 0
    call <SID>Quit()
  endif

  " Get suggestions for the current word
  let s:current_word = l:current_word[0]
  let l:suggestions = spellsuggest(expand(s:current_word))

  " If the current word present no spelling suggestions, pass
  if len(suggestions) <= 0
    return
  endif

  " Replace the word with suggestion
  silent execute "normal! ce" . l:suggestions[s:last_spell_changedtick[l:line][l:col]]
  normal! b

  " Increment the count
  let s:last_spell_changedtick[l:line][l:col] = s:last_spell_changedtick[l:line][l:col] + 1

endfunction

function! LoopConfirm()
  let s:last_spell_changedtick = {}
endfunction

nnoremap zz :call LoopSpell()<CR>
nnoremap z= :call LoopConfirm()<CR>

मूल विचार यह है कि हर परिवर्तित शब्द को एक पंक्ति / स्तंभ युग्म में मैप करें (ताकि यह केवल एक तत्व के लिए काम न करे) और जांचें कि क्या तत्व पहले से ही संशोधित हो चुका है।

प्रतिस्थापित करने के लिए, यह मेरा प्लगइन क्या करता है:

  • वर्तमान गलत वर्तनी वाला शब्द प्राप्त करें
  • यदि सुधार मौजूद है तो जाँच करें
  • सही सुझाव के साथ शब्द बदलें

इसका उपयोग करते समय, यदि आप गलत वर्तनी वाले शब्द पर वापस जाना चाहते हैं, तो आप बस दबा सकते हैं u

LoopConfirmसमारोह शब्दकोश रीसेट, इसलिए यदि आप अपने पाठ बदलने के लिए, आप इसे टकराव को रोकने के लिए कह सकते हैं।

मुझे बताएं कि क्या आप किसी भी मुद्दे में भाग लेते हैं / यदि आपके कोई प्रश्न हैं।


उह, यह अच्छा लग रहा है। यह अभी भी कई समस्याएं हैं, हालांकि। "तेह क्विक बोरवैन फोज जैम्स ऑफेर तेह लाज़ी डोर" जैसा वाक्यांश लें और उस तरह से प्रत्येक शब्द को सही करने का प्रयास करें। मैं कभी भी "ते" को "" नहीं प्राप्त कर सकता, हालांकि यह सूची में नंबर 4 पर है। "क्विक" काम करता है, लेकिन "बॉर्न" कुछ और में बदल जाता है, भले ही "ब्राउन" पहले सूची में हो, और फिर यह सीधे "फ़ोज़" पर छोड़ देता है। मुझे वह अतीत कभी नहीं मिला। इसके अलावा मुझे अतिरिक्त z=भाग पसंद नहीं है , लेकिन मैं शायद अपने आप को चारों ओर पाने के लिए एक रास्ता ढूंढ सकता हूं यदि बाकी काम किया हो। हालांकि मैं जो चाहता हूं, उसके बहुत करीब पहुंच रहा हूं। मैं इसे ठीक करने की कोशिश करता रहूंगा। धन्यवाद!
dbmrq

मेरा अद्यतन देखें, मैं जल्द ही एक वेतन वृद्धि भी जोड़ देता हूँ :) हाँ मैं z=दोनों से खुश नहीं हूँ । लेकिन इस पद्धति के साथ आपको एक संदर्भ रखने की आवश्यकता है कि आप कहां हैं। लेकिन अगर आपको एक ही समय में सभी संदर्भों को रखने की आवश्यकता नहीं है तो मैं इसे सरल बना सकता हूं :)
nobe4

मुझे यकीन नहीं है कि आप "एक ही समय में सभी संदर्भ रखें" से क्या मतलब है ... लेकिन जब भी कर्सर चलता है तो क्या हम केवल शब्दकोश को रीसेट नहीं कर सकते हैं? फ़ंक्शन यह जांच करेगा कि क्या कर्सर उसी स्थान पर है जैसा कि पिछली बार इसे बुलाया गया था, और यदि यह रीसेट नहीं है।
dbmrq

जब यह कर्सर शब्द के शुरू में नहीं होता है तो भी यह ठीक से काम नहीं करता है। प्रत्येक वाक्य के मध्य में कर्सर रखने वाले उस वाक्य में प्रत्येक गलती को ठीक करने का प्रयास करें। मैं अगले ही पल रुक जाता हूं।
dbmrq

1
ठीक है, मुझे लगता है कि मैं समझ गया! मेरा अंतिम संपादन जांचें। यह बहुत अधिक पूरी तरह से काम करने लगता है। मैं इस सवाल को थोड़ी देर के लिए खुला छोड़ दूंगा कि क्या किसी और को जोड़ने के लिए कुछ है, लेकिन आपका जवाब बहुत अच्छा है, धन्यवाद। :)
dbmrq

2

अन्य उत्तरों के अलावा, वास्तव में विम के लिए एक सही तरीके से बनाया गया तरीका है <C-x>s:। यह विम के इन्सर्ट मोड पूर्णता मेनू का उपयोग करेगा।

<C-x>sइन्सर्ट मोड से दबाने पर कर्सर को पहले सुझाव के तहत सही करना चाहिए और आगे के सुझावों (यदि कोई हो) के साथ पूरा मेनू दिखाना चाहिए। 'completeopt'पूर्ण मेनू के लिए कुछ सेटिंग्स को अनुकूलित करने के लिए आप सेटिंग का उपयोग कर सकते हैं ।

यह थोड़ा कष्टप्रद है कि यह केवल इन्सर्ट मोड से काम करता है और उपयोग करने <C-x><C-s>से समस्याग्रस्त हो सकता है (नीचे नोट देखें), इसलिए आप इसके लिए अपनी स्वयं की मैपिंग को परिभाषित कर सकते हैं:

inoremap <expr> <C-@>  pumvisible() ?  "\<C-n>" : "\<C-x>s"
nnoremap <expr> <C-@> pumvisible() ?  "i\<C-n>" : "i\<C-x>s"

<C-@> कंट्रोल + स्पेस है।

और देखें :help ins-completion :help i_CTRL-X_s


मैं व्यक्तिगत रूप से एक अधिक उन्नत संस्करण का उपयोग करता हूं जो "अनुमान" करेगा यदि हम या तो वर्तनी की जांच करना चाहते हैं, या कोड के लिए नियमित रूप से स्वत: पूर्णता का उपयोग करते हैं:

fun! GuessType()
    " Use omnicomplete for Go
    if &filetype == 'go'
        let l:def = "\<C-x>\<C-o>"
    " Keyword complete for anything else
    else
        let l:def = "\<C-x>\<C-n>"
    endif

    " If we have spell suggestions for the current word, use that. Otherwise use
    " whatever we figured out above.
    try
        if spellbadword()[1] != ''
            return "\<C-x>s"
        else
            return l:def
        endif
    catch
        return l:def
    endtry
endfun

inoremap <expr> <C-@>  pumvisible() ?  "\<C-n>" : GuessType()
inoremap <expr> <Down> pumvisible() ? "\<C-n>" : "\<Down>"
inoremap <expr> <Up> pumvisible() ? "\<C-p>" : "\<Up>"
nnoremap <expr> <C-@> pumvisible() ?  "i\<C-n>" : 'i' . GuessType()

मेरा मानना ​​है कि कुछ प्लगइन्स भी हैं जो लगभग इसी तरह की चीजें करते हैं (जैसे कि सुपरटैब, जो काफी लोकप्रिय है), लेकिन मैं उन्हें कभी भी व्यवहार करने के लिए नहीं मिला जैसा मैं चाहता हूं।


कैविएट : यदि आप एक टर्मिनल से विम का उपयोग कर रहे हैं, तो <C-s>इसका मतलब "आउटपुट रोकें" होगा। यही कारण है कि दोनों <C-x><C-s> और <C-x>s डिफ़ॉल्ट रूप से उल्लेख किया जाता है। <C-q>यदि आप <C-s>दुर्घटना से दबाते हैं तो आउटपुट जारी रखने के लिए उपयोग करें । <C-s>यदि आप इसका उपयोग नहीं करते हैं, तो आप इसे अक्षम भी कर सकते हैं ( यह प्रश्न देखें )। यदि आप GVim का उपयोग कर रहे हैं तो आप इसे अनदेखा कर सकते हैं।

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