सामान्य कमांड निष्पादित करने के बाद कर्सर की स्थिति को कैसे पुनर्स्थापित किया जाए?


13

मैं एक फ़ंक्शन को कोड करने की कोशिश कर रहा हूं जो मेरे मौजूदा लाइन के छठे कॉलम में डॉलर प्रतीक ( $) के साथ चरित्र को बदलता है , लेकिन मैं चाहूंगा कि मेरे कर्सर को उस स्थिति में रहना चाहिए जो फ़ंक्शन को कॉल करने से पहले था।

इसलिए मैंने वर्तमान कॉलम को संग्रहीत करने, अपने परिवर्तनों को निष्पादित करने और फिर निम्न फ़ंक्शन के साथ वापस आने की कोशिश की:

function! DollarSplit()
   let col_number=col(".")     "stores the current column number of the cursor
   normal! 6|r$                " replaces the 6th caracter in line with a $
   execute col_number."|" 
endfunction

मुझे शायद executeकमांड के बारे में कुछ गलतफहमी हो रही है ... या शायद मुझे एक स्ट्रिंग बनानी चाहिए जिसमें कमांड मैं निष्पादित करना चाहता हूं?

जवाबों:


20

आपको उपयोग करना चाहिए getpos():

आपको एक चर में स्थिति बचाने के लिए:

let save_pos = getpos(".")

getpos()तर्क को एक निशान के रूप में लेता है, यहाँ "."आपके कर्सर की वर्तमान स्थिति का प्रतिनिधित्व करता है।

और इसे बहाल करने के लिए:

call setpos('.', save_pos)

यहां पहला तर्क बताता है कि आप अपने कर्सर की वर्तमान स्थिति का चिह्न स्थानांतरित कर देंगे (इसलिए आपकी वर्तमान स्थिति) और दूसरा वह स्थान है जहां चिह्न (वह स्थिति जिसे आपने पहले सहेजा था) रखनी है।

आपका कार्य इस तरह दिखेगा:

function! DollarSplit()
   let save_pos = getpos(".")
   normal! 6|r$                " replaces the 6th caracter in line with a $
   call setpos(".", save_pos)
endfunction

अधिक जानकारी के लिए देखें: :h getpos()और:h setpos()


आपके उपयोग के बारे में अधिक जानकारी के लिए execute: यह फ़ंक्शन एक स्ट्रिंग लेगा और इसे निष्पादित करेगा। आपका स्ट्रिंग केवल दोहरे उद्धरण या चर की सामग्री के बीच हार्डकोड वर्ण हो सकता है।

जब आप लिखते हैं

execute col_number."|"

यदि आप 12 वें कॉलम पर हैं, तो विस्तारित स्ट्रिंग होगी 12|। Execute इस कमांड को निष्पादित करने की कोशिश करेगा लेकिन यह काम नहीं करेगा क्योंकि 12|विम्सस्क्रिप्ट फ़ंक्शन नहीं है बल्कि एक सामान्य मोड कमांड है।

इसे एक वैंपस्क्रिप्ट से निष्पादित करने के लिए आपको कहना होगा "इसे निष्पादित करें जैसे कि मैंने इसे सामान्य मोड में टाइप किया था", यही सामान्य के लिए उपयोग किया जाता है।

इसलिए बिना निष्पादित किए आपने लिखा होगा:

normal 12|

अब अपने executeकॉल कार्य को करने के लिए आपको normalकीवर्ड को अपनी विस्तारित स्ट्रिंग में जोड़ना होगा , जैसे:

execute "normal " . col_number . "|"

इस समाधान के लिए धन्यवाद (यह वह है जिसका मैं उपयोग करूंगा), लेकिन क्या मेरे "col_number" वैरिएबल का उपयोग करते हुए कोई अन्य तरीका है? इससे मुझे बेहतर तरीके से समझने में मदद मिलेगी कि कैसे / सामान्य कार्य निष्पादित करें।
फाफ

1
@Feffe: मेरे अद्यतन इस :-) स्पष्ट करना चाहिए
statox

3

यह फ़ंक्शन आपके खोज रजिस्टर को भी रखता है। तो आप अपने आदेश को उस पर तर्क के रूप में पारित कर सकते हैं।

if !exists('*Preserve')
    function! Preserve(command)
        try
            " Preparation: save last search, and cursor position.
            let l:win_view = winsaveview()
            let l:old_query = getreg('/')
            silent! execute 'keepjumps' . a:command
        finally
            " try restore / reg and cursor position
            call winrestview(l:win_view)
            call setreg('/', l:old_query)
        endtry
    endfunction
endif

कुछ स्पष्टीकरण

let .......... used to set a variable
l:somevar .... local variable
winsaveview()  get information about window view
winrestview(lwinview) restores window view to its last status
getreg('/')    used to store the last search in a variable
keepjumps      used to performe any change without change jumplis
. a:command    concatenates any given command with keepjumps

उदाहरण के लिए:

"Reident file without moving cursor position
:call Preserve('normal! gg=G')

"Reindent command using 'Preserve()'
command! -nargs=0 Reindent :call Preserve('exec "normal! gg=G"')

"If you have any change log at your file header
:call Preserve('1,5s/Last Change: \zs.*/\=strftime("%c")/e')

"Close all buffers but current one
" https://bitbucket.org/snippets/sergio/9nbyGy
command! BufOnly silent! call Preserve("exec '%bd|e#|bd#'")

स्रोत: https://technotales.wordpress.com/2010/03/31/preserve-a-vim-function-that-keeps-your-state/


1
हमारी साइट पर आपका स्वागत है! जब जवाब देने के लिए उत्तर के भीतर कुछ स्पष्टीकरण देने की कोशिश करते हैं और न केवल अन्य पृष्ठों के लिए लिंक। लिंक मर सकते हैं, और बहुत सारी अप्रासंगिक जानकारी हो सकती है।
Tumbler41

1
जैसा कि मैंने एसओ-डुप्लिकेट में कहा था, बहाली एक finallyब्लॉक में होनी चाहिए । अन्यथा, यदि a:commandविफल रहता है, तो कुछ भी बहाल नहीं किया जाएगा।
ल्यूक हरमिट

जैसा कि आपने @Luc Hermitte
SergioAraujo

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