পাইথন ফাইল টাইপ ব্যবহার করার সময় আমি কীভাবে ভিএম-তে একটি মাল্টি-লাইন স্ট্রিং পুনরায় ফর্ম্যাট করতে পারি?


23

ধরে নেওয়া যাক আমি কিছু পাইথন কোডটি ভিএম-তে সম্পাদনা করছি যা দেখতে কিছুটা দেখতে:

myobj.myfunc("Some string parameter that goes on and on and on and on and sometimes doesn't"
             "split very"
             "neatly over different lines so that"
             "it is formatted attractively")

আমি এটি পুনরায় ফর্ম্যাট করতে পছন্দ করব যাতে এটি textwidthআমার সেট করা পর্যন্ত প্রত্যাবর্তিত হয় :

myobj.myfunc("Some string parameter that goes on and on and "
             "on and on and sometimes doesn't split very "
             "neatly over different lines so that it is "
             "formatted attractively")

এটি করার কোনও সহজ উপায় আছে? যদি এটি একটি প্রচলিত পাঠ্য অনুচ্ছেদ ছিল gqipবা অনুরূপ কার্যকর হতে পারে তবে এটি স্ট্রিংটি বিচ্ছিন্ন করার জন্য ব্যবহৃত উদ্ধৃতিগুলি পরিচালনা করবে না।

দ্রষ্টব্য : আমি এখানে পাইথন সম্পর্কে বিশেষভাবে জিজ্ঞাসা করছি, তবে আদর্শভাবে, এই উত্তরটি অনেক ধরণের প্রোগ্রামিং ভাষার জন্য প্রাসঙ্গিক হবে যা স্ট্রিং ধারাবাহিকতা মঞ্জুর করে।


1
অনুরূপ প্রশ্ন এখানে: vim.1045645.n5.nabble.com/…
অ্যান্ড্রু ফেরিয়ার

3
আপনি কি কোডটিকে পুনরায় লেখার বিষয়টি বিবেচনা করেছেন """multi-line string"""?
200_সাক্সেস

1
@ 200_সাক্সেস, এটি দুর্দান্ত টিপস, ধন্যবাদ পাইথনের সেই বৈশিষ্ট্য সম্পর্কে আমি মোটেও জানতাম না। এটি বেশিরভাগ ক্ষেত্রে কাজ করে বলে মনে হচ্ছে - যদিও ফাংশনের সমস্ত প্যারামিটারগুলি রিফ্লুভড রয়েছে, যা আদর্শ নয়। আমি মনে করি যে আমার প্রশ্নটি এখনও আমার কাছে থাকা স্ট্রিংয়ের জন্য বৈধ এবং অবশ্যই অন্যান্য ল্যাংগুলির জন্য।
অ্যান্ড্রু ফেরিয়ার

2
নোট করুন যে কোনও মাল্টি-লাইনের স্ট্রিং সাদা বর্ণের অক্ষর যুক্ত করবে, যদি স্ট্রিংয়ের ক্ষেত্রে সাদা জায়গার বিষয়টি বিবেচনা করে তবে এটি সমস্যা হতে পারে।
ম্যাট বোহেম

খুব সম্পর্কিত প্রশ্ন: vi.stackexchange.com/questions/2135/… ...
মার্টিন টর্নয়েজ

উত্তর:


6

ওহ, এটা খুব শক্ত। আমি মনে করি সেরা পন্থাটি সম্ভবত ম্যাক্রো তবে সম্ভবত একটি প্লাগইন। আমি বেত্রাঘাতের একটি উদাহরণ এখানে দেওয়া হয়েছে (আমার আরও ভাল শখের প্রয়োজন)। এটি আমার পক্ষে কাজ করেছে বলে মনে হয়েছিল তবে সঠিকভাবে ইনডেন্ট করার জন্য পাইথন ইনডেন্টিং প্লাগইন লাগবে। চেষ্টা কর.

function ReformatMultiLines()
  let brx = '^\s*"'
  let erx = '"\s*$'
  let fullrx = brx . '\(.\+\)' . erx
  let startLine = line(".")
  let endLine   = line(".")
  while getline(startLine) =~ fullrx
    let startLine -= 1
  endwhile
  if getline(endLine) =~ erx
    let endLine += 1
  endif
  while getline(endLine) =~ fullrx
    let endLine += 1
  endwhile
  if startLine != endLine
    exec endLine . ' s/' . brx . '//'
    exec startLine . ' s/' . erx . '//'
    exec startLine . ',' . endLine . ' s/' . fullrx . '/\1/'
    exec startLine . ',' . endLine . ' join'
  endif
  exec startLine
  let orig_tw = &tw
  if &tw == 0
    let &tw = &columns
    if &tw > 79
      let &tw = 79
    endif
  endif
  let &tw -= 3 " Adjust for missing quotes and space characters
  exec "normal A%-%\<Esc>gqq"
  let &tw = orig_tw
  let endLine = search("%-%$")
  exec endLine . ' s/%-%$//'
  if startLine == endLine
    return
  endif
  exec endLine
  exec 'normal I"'
  exec startLine
  exec 'normal A "'
  if endLine - startLine == 1
    return
  endif
  let startLine += 1
  while startLine != endLine
    exec startLine
    exec 'normal I"'
    exec 'normal A "'
    let startLine += 1
  endwhile
endfunction

তারপরে আপনি এটিকে :call ReformatMultiLines()এবং / অথবা ম্যাপিংয়ে ব্যবহার করতে পারেন।


6

এটি যদি নিয়মিত ঘটনা হয় তবে আপনি কোনও প্লাগইন সন্ধান করতে বা @ সুকিমার ফাংশনটি ব্যবহার করে সেরা হন। আমি তবে ফ্লাইতে যদি এটি করতাম তবে আমি সম্ভবত এটিই করতাম:

  1. খোলার পেরেনের পরে এবং বন্ধ প্যারেনের আগে একটি নতুন লাইন যুক্ত করুন যাতে স্ট্রিংগুলি পৃথক লাইনে থাকে।

    myobj.myfunc(
                 "Some string parameter that goes on and on and on and on and sometimes doesn't"
                 "split very"
                 "neatly over different lines so that"
                 "it is formatted attractively"
    )
    
  2. স্ট্রিং সহ লাইনগুলি নির্বাচন করুন এবং আশেপাশের উদ্ধৃতিগুলি মুছুন: :norm ^x$x

  3. পাঠ্য প্রস্থকে হ্রাস করুন (নিখোঁজ উদ্ধৃতিগুলির জন্য অ্যাকাউন্টে) :set tw-=2
  4. পুনরায় নির্বাচন করুন এবং ফর্ম্যাট করুন: gvgq
  5. পাঠ্য প্রস্থকে ঠিক করুন: :set tw+=2
  6. রি-অ্যাড কোট: gv:norm I"<Esc>A"। পরিবর্তে <Esc>আপনি সিটিআরএল-ভি লিখে এস্কেপ কী দ্বারা টাইপ করে একটি আক্ষরিক অবকাশ সন্নিবেশ করতে চান। যেহেতু আমি পালাতে জেজে মানচিত্র করি, আমি সাধারণত এখানে জেজে টাইপ করি।
  7. প্রথম দুটি / শেষ দুটি লাইনে পুনরায় যোগদান করতে ptionচ্ছিকভাবে জ ব্যবহার করুন। আমার যখন পাইথনটির মতো দীর্ঘ দীর্ঘ স্ট্রিং থাকে তখন আমি সাধারণত পরের লাইনে এটি শুরু করতে পছন্দ করি এবং কেবল এটি পূর্ববর্তী লাইনের চেয়ে এক স্তর আরও বেশি ইনডেন্ট করি। এটি স্ট্রিংয়ের জন্য আরও অনুভূমিক স্থান দেয় এবং কেবল আমার কাছে আরও প্রাকৃতিক বোধ করে। বিকল্পভাবে, আপনি স্ট্রিং উপরের কোথাও একটি ভেরিয়েবলে সংরক্ষণ করতে পারেন। এটি একটি স্ট্যাটিক স্ট্রিং ধরে নিলে, আপনি এমনকি এটি একটি বিশ্বব্যাপী ভেরিয়েবলে সংরক্ষণ করতে পারেন যাতে এটি অনেক কম ইনডেন্টেশন স্তরে থাকে এবং কম লাইনে ফিট করতে পারে। নোট করুন যে আপনি একই লাইনে ক্লোজিং পেরেনকে আবার যোগ দিতে চলেছেন, আপনি সম্ভবত 2 এর পরিবর্তে 3 দ্বারা বৃদ্ধি / বর্ধিত পাঠ্যপরিধিটি চান।

1
ধন্যবাদ। আমি কেবল এটি চেষ্টা করেছিলাম কিন্তু :set tw-=2ফলাফল পেয়েছি E487: Argument must be positive: tw-=2। সিনট্যাক্সটি কি ভুল?
অ্যান্ড্রু ফেরিয়ার

1
এর সাথে পাঠ্য প্রস্থের বর্তমান মানটি পরীক্ষা করুন :set tw?। আমার অনুমান যে আপনার পাঠ্য প্রস্থটি 0 এ সেট আছে। এই পদক্ষেপগুলি ধরে নিচ্ছে যে প্রতি লাইনে আপনি চান অক্ষরের সংখ্যা হিসাবে পাঠ্যপথটি শুরু হবে।
ম্যাট বোহেম

উদাহরণস্বরূপ আপনি সম্ভবত s/2/3/ক্লোজিং কোটারের আগে একটি স্থান যুক্ত করতে চান এবং আপনার দীর্ঘ স্ট্রিংয়ের শব্দের মধ্যে যথাযথ ব্যবধান থাকবে না।
সিডোসোর্ন

1

পার্সিং এবং ফরম্যাটিং কোডটি বিশেষত পাইথনের মতো গতিশীল ভাষার জন্য hard

পাইথনকে ভিমস্ক্রিপ্টে পার্স করার চেষ্টা করার পরিবর্তে, আমি আপনাকে yapf এর মতো একটি বাহ্যিক ফর্ম্যাটর ব্যবহার করতে পরামর্শ দিইআমার উত্তর সহ আপনি এখানে লেখার সাথে এটি স্বয়ংক্রিয়ভাবে লিখতে পারেন:

augroup write_cmd
    autocmd BufWritePre *.py call s:write_cmd('yapf')
augroup end

s:write_cmd()ফাংশন অন্যান্য উত্তরে - আমি তা এখানে যুক্ত করবে না তাই আমি দুটি স্থান এটা আপডেট করার জন্য যদি আমি একটি বাগ খুঁজে পাবে না :-)

আপনি এটিকে সেট formatprgকরতে yapfএবং ম্যানুয়ালি এর সাথে এটি ফর্ম্যাট করতে পারেন gq


হাই। সহায়ক জবাব, তবে আমি এই প্রশ্নের উত্তর দিচ্ছি বলে আমি মনে করি না: এই প্রশ্নটি খুব স্পষ্টভাবে মাল্টলাইন স্ট্রিংগুলির পুনরায় ফর্ম্যাটিং সম্পর্কে জিজ্ঞাসা করছে, যা করা হয়নি yapfবলে মনে হয়। তবুও আমি একমত যে এটি একটি দরকারী সরঞ্জামের মতো দেখাচ্ছে।
অ্যান্ড্রু ফেরিয়ার 14

@ অ্যান্ড্রুফেরিয়ার মেলা যথেষ্ট; আমি শপথ করে বলতে পারি যে আমি অন্য দিন যদিও এটি পরীক্ষা করেছিলাম তখন এটি পুনরায় ফর্ম্যাট করতে দেখেছি তবে এখন এটি আর কাজ করতে পারছি না: - / ধারণা করুন আমি বিভ্রান্ত হয়ে পড়েছিলাম।
মার্টিন টর্নয়েজ

0

নিম্নলিখিত ফাংশন এবং সম্পর্কিত ম্যাপিংগুলি আমার জন্য এই সমস্যাটি সমাধান করেছে:

function! BreakMultlineString(quote)
let c = 100
while c == 100
    normal 100|
    let c = virtcol('.')
    if c == 100
        execute "normal ," . a:quote
    endif
endwhile
endfunction

function! JoinMultilineString()
    let c = "'"
    while c == "'" || c == '"'
        normal gj^
        let c = matchstr(getline('.'), '\%' . col('.') . 'c.')
        normal k
        if c == "'" || c == '"'
            normal ,j
        endif
    endwhile
endfunction

" break lines
nnoremap <Leader>" 100\|Bi"<CR>"<Esc>
nnoremap <Leader><Leader>" :call BreakMultlineString('"')<CR>
nnoremap <Leader>' 100\|Bi'<CR>'<Esc>
nnoremap <Leader><Leader>' :call BreakMultlineString("'")<CR>

" join lines
nmap <Leader>j Jds'ds"x
nnoremap <Leader>J :call JoinMultilineString()<CR>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.