সাধারণ কমান্ড কার্যকর করার পরে কার্সারের অবস্থান পুনরুদ্ধার করবেন কীভাবে?


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কমান্ডটি সম্পর্কে কিছুটা ভুল বুঝাবুঝি করছি ... অথবা সম্ভবত আমার যে কমান্ডটি কার্যকর করতে চান তাতে একটি স্ট্রিং তৈরি করা উচিত?

উত্তর:


19

আপনার ব্যবহার করা উচিত 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|। এক্সিকিউটটি এই কমান্ডটি কার্যকর করার চেষ্টা করবে তবে এটি কার্যকর হবে না কারণ 12|একটি উইমস্ক্রিপ্ট ফাংশন নয় তবে একটি সাধারণ মোড কমান্ড।

এটি একটি উইমস্ক্রিপ্ট থেকে চালানোর জন্য আপনাকে বলতে হবে "এটিকে এক্সিকিউট করুন যেন আমি এটি সাধারণ মোডে টাইপ করে ফেলেছি`, এটিই সাধারণ জন্য ব্যবহৃত হয়।

সুতরাং মৃত্যুদণ্ড কার্যকর না করে আপনি লিখেছেন:

normal 12|

আপনার executeকলকে কাজ করতে এখন normalআপনার প্রসারিত স্ট্রিংয়ে কীওয়ার্ডটি যুক্ত করতে হবে:

execute "normal " . col_number . "|"

এই সমাধানটির জন্য ধন্যবাদ (এটি আমিই ব্যবহার করব), তবে আমার "কোল_নম্বার" ভেরিয়েবলটি ব্যবহার করে অন্য কোনও উপায় আছে কি? এটি আমাকে কীভাবে সাধারণ কাজ সম্পাদন করে তা আরও ভালভাবে বুঝতে দেয় would
Fefee

1
@ ফিফি: আমার আপডেটটি এটি স্পষ্ট করে :-)
স্ট্যাটক্স

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/preserv-a-vim-function-that-keeps-your-state/


1
আমাদের সাইটে আপনাকে স্বাগতম! উত্তর দেওয়ার সময় উত্তরের মধ্যে কিছু ব্যাখ্যা দেওয়ার চেষ্টা করুন এবং কেবল অন্য পৃষ্ঠাগুলির লিঙ্ক নয়। লিঙ্কগুলি মারা যেতে পারে এবং এর মধ্যে অনেকগুলি অপ্রাসঙ্গিক তথ্য বাছাই করতে পারে।
টাম্বল 41

1
আমি যেমন এসও-সদৃশ বলেছিলাম, পুনরুদ্ধারটি কোনও finallyব্লকের মধ্যে ঘটানো উচিত । অন্যথায়, a:commandব্যর্থ হলে, কিছুই পুনরুদ্ধার করা হবে।
লুক হার্মিটে


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