क्या मैं अंतिम UI कमांड दोहरा सकता हूं?


17

मुझे पता है कि मैं .अंतिम संपादन कमांड को दोहराने के लिए उपयोग कर सकता हूं ।

क्या अंतिम UI हेरफेर कमांड को दोहराने का कोई तरीका है? उदाहरण के लिए, मैं 10<C-W>-एक खिड़की को दस पंक्तियों द्वारा सिकोड़ने के लिए लिख सकता हूं । यदि मैं इसे और अधिक सिकोड़ना चाहता हूं तो इस कमांड को आसानी से दोहराने के लिए⟩ कुछ कुंजी be को दबाने में सक्षम होना अच्छा होगा ।


संबंधित: stackoverflow.com/q/6952636/2072269 (आपके द्वारा पहले से ही रिसॉट करने के बाद दिया गया कोई जवाब नहीं दिया जा सकता है )।
मुरु

@ मरमू: अच्छा, लेकिन यह इस विशिष्ट मामले के लिए है। अगर मैंने कुछ ऐसा किया है fzतो 10;क्या होगा? किस बारे में :tabm +1? इन सभी को विशेष-आवरण होना चाहिए?
वॉचर्जिन

मुझे लगता है आपने मुझे गलत समझ लिया। मैं कह रहा हूं कि लिंक की गई पोस्ट के बेकार उत्तर हैं (इससे पहले कि कोई और आए और इसका सुझाव दे)।
मूरू

ओह! ठीक है, फिर हम एक ही पेज @muru पर हैं
wchargin

जवाबों:


12

डॉट कमांड .काम करता है क्योंकि विम "कमांड" का ट्रैक रखता है जो बफ़र्स की सामग्री को बदलता है। यदि आप चलते हैं :echo b:changedtick, तो आप इसे वर्तमान बफ़र में प्रत्येक परिवर्तन के साथ बढ़ाते देखेंगे।

लेकिन विम नॉन-एडिटिंग कमांड्स का "ट्रैक" नहीं रखता है। इस प्रकार, नहीं, जो आप पूछ रहे हैं वह नहीं किया जा सकता है।


8

विम में डिफ़ॉल्ट रूप से ऐसा करने का कोई तरीका नहीं है क्योंकि विम पहले निष्पादित wincmd का ट्रैक नहीं रखता है। हालांकि, कुछ चालाक मैपिंग के माध्यम से ऐसा करना संभव है:

function! s:Wincmd(count, key)
    " If count is not zero, use the original count.  If otherwise, don't
    " include a count.
    let if_count = a:count ? a:count : ""
    " This builds a wincmd from the given key, and saves it so
    " it can be repeated.
    let g:last_wincmd = "wincmd " . nr2char(a:key)
    " Execute the built wincmd
    execute if_count . g:last_wincmd
endfunction

function! s:WincmdRepeat(count)
    " If no wincmd has been executed yet, don't do anything
    if !exists('g:last_wincmd') | return | endif
    " If a count is given, repeat the last wincmd that amount of times.
    " If otherwise, just repeat once.
    let if_count = a:count ? a:count : ""
    execute if_count . g:last_wincmd
endfunction

" Overwrite the default <C-w> mapping so that the last wincmd can be kept
" track of.  The getchar function is what captures the key pressed
" directly afterwards.  The <C-u> is to remove any cmdline range that vim
" automatically inserted.
nnoremap <silent> <C-w> :<C-u>call <SID>Wincmd(v:count, getchar())<CR>

" This just calls the function which repeats the previous wincmd.  It
" does accept a count, which is the number of times it should repeat the
" previous wincmd.  You can also replace Q with whatever key you want. 
nnoremap <silent> Q :<C-u> call <SID>WincmdRepeat(v:count)<CR>

ध्यान दें कि यदि आपके पास कोई मैपिंग है जिसका उपयोग <C-w>वे केवल तभी दोहरा सकते हैं यदि वे noreविविधता के नहीं हैं । उपयोग किए गए किसी भी wincmds को :wincmdदोहराया नहीं जाएगा। इसके अलावा, किसी भी wincmds जिसमें एक से अधिक वर्ण हैं (जैसे <C-w>gf) नहीं किया जा सकता है ।

प्रासंगिक सहायता विषय

  • :help v:count
  • :help getchar()
  • :help nr2char()
  • :help expr1
  • :help :wincmd
  • :help :execute
  • :help :for
  • :help :map-<silent>
  • :help c_CTRL-U
  • :help <SID>

1
यह बहुत अच्छा है, और अच्छी तरह से लिखा VimScript का एक उत्कृष्ट उदाहरण है! कुछ नाबालिग (शायद पिकी) प्रतिक्रिया: यह दोहराए जाने वाले आदेश .एक गिनती के साथ निर्मित व्यवहार के तरीके से अलग व्यवहार करेंगे । जब किसी गणना को आपूर्ति की जाती है ., तो पिछली गणना को अनदेखा कर दिया जाता है। तो 2ddइसके बाद 3.2 लाइनों और फिर 3 लाइनों को हटा दिया जाएगा; इसके विपरीत, आपकी मैपिंग के 2<C-w>-बाद , 3Qविंडो को 2 लाइनों और फिर 6 (= 2x3) लाइनों द्वारा सिकोड़ देगा। यह व्यवहार ठीक है, लेकिन जब एक कस्टम कमांड को व्यवहार करना चाहिए, तो यह चुनना अच्छा है कि अंतर्निर्मित विंब कमांड से ड्रा किया जाए।
तोमकोंडो

धन्यवाद! इसके अलावा, मैं देखता हूं कि गिनती के काम करने के तरीके से आपका क्या मतलब है। मैं इसे बदल सकता हूं इसलिए यह उस तरह से काम करता है।
एवरग्रीनट्री

4

Submode प्लगइन इस के साथ कर सकते हैं। आप एक "सबमॉड" परिभाषित कर सकते हैं जिसे आप टाइप करके दर्ज करते हैं <C-W>-, जिसमें आपने विंडो को आकार देना जारी रखने के लिए -(और शायद +) परिभाषित किया है ।


2

एक और प्लगइन है जिसे repmo.vim ("दोहराने गति") कहा जाता है जो आप चाहते हैं कि कर सकते हैं।

लेकिन आपको यह निर्दिष्ट करने की आवश्यकता होगी कि आप किस गति (या सामान्य रूप से क्रिया) को दोहराना चाहते हैं। मेरा वर्तमान में इस तरह कॉन्फ़िगर किया गया है:

let g:repmo_mapmotions = "j|k h|l zh|zl g;|g, <C-w>w|<C-w>W"
let g:repmo_mapmotions .= " <C-w>+|<C-w>- <C-w>>|<C-w><"
let g:repmo_key = ";" 
let g:repmo_revkey = "," 

इसलिए ऐसा करने के बाद 5 CTRL-W +मैं ;इसे एक बार की तरह दोहरा सकता हूं ।

प्लगइन निर्दिष्ट की गई प्रत्येक कुंजी के लिए मैपिंग बनाकर काम करता है।

जब fया tउपयोग किया जाता है, ;और ,मैपिंग को उनके डिफ़ॉल्ट व्यवहार पर वापस साफ़ किया जाता है।

मैं g;विशेष रूप से उपयोगी के लिए मानचित्रण पाता हूं , पहले के संपादन बिंदु पर वापस जाने के लिए। g; ; ; ;


@albfan मुझे यकीन नहीं है कि मैं आपके सवाल को समझ सकता हूं, लेकिन मेरे लिए ,तुरंत कृत्यों को दबा देना , और 5,उम्मीद के मुताबिक काम करना भी है। क्या यह संभव है कि आपने अपना सेट mapleaderकर लिया है ,?
joeytwiddle
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.