ගොනුවක ඇති සියලුම පේළි වලින් පසුපස අවකාශය ඉවත් කිරීමට ඇති සරලම ක්‍රමය කුමක්ද?


156

රේඛාවක් අවසානයේ සුදු පැහැති අවකාශයක් සහිත ලිපිගොනු හමුවීමට පෙළ ගොනු ගොනු විවෘත කිරීමේදී එය සාමාන්‍ය දෙයකි. trailවිකල්පය තුළ ඇති listcharsවිකල්පය සකසා සක්‍රිය කිරීමෙන් vim හට මෙය පෙන්වීමට ක්‍රමයක් listඇත.

කෙසේ වෙතත්, මුළු ගොනුවක් පුරාම ගෝලීය වශයෙන් එම පසුපස ඇති අවකාශය තුරන් කිරීමට ඇති පහසුම ක්‍රමය කුමක්ද?



මෙන්න මාතෘකාව පිළිබඳ ලේඛ ඇතුළත් කිරීමකි .

ඔබ vim-faq ස්ථාපනය කර ඇත්නම් , ඔබට එහි නොබැඳි පිළිතුරක් ලබා ගත හැකිය: :h vim-faqසහ සෙවීම /trailing. ටැගය කටපාඩම් කිරීම දුෂ්කර ය :h faq-12.1.
හොට්ෂ්කේ

Answers:


78

පසුපස ඇති සියලුම හිස් අවකාශය ඉවත් කිරීමට යතුරු බැඳීමක් භාවිතා කරන්න

මා සංස්කරණය කරන සමහර පිටු වලට සත්‍ය වශයෙන්ම පසුපස හිස් අවකාශයන් (උදා: සලකුණු කිරීම) අවශ්‍ය වන අතර අනෙක් ඒවාට අවශ්‍ය නොවන බැවින්, මම යතුරු බැඳීමක් සකසා ඇති අතර F5එය ස්වයංක්‍රීයව සිදු කිරීම සුළුපටු නොවේ. එසේ කිරීමට, පහත කේතය (vim.wikia වෙතින්) හෝ එහි යම් වෙනසක් ඔබගේ .vimrc:

"Remove all trailing whitespace by pressing F5
nnoremap <F5> :let _s=@/<Bar>:%s/\s\+$//e<Bar>:let @/=_s<Bar><CR>
  • nnoremap <F5>F5සාමාන්‍ය ප්‍රකාරයේදී යතුරට ප්‍රතිචක්‍රීය නොවන සිතියම්ගත කිරීමක් කරයි
  • :let _s=@/අවසාන සෙවුම් පදය (සාර්ව සිට @/) විචල්යයේ ගබඩා කරයි_s
  • <Bar>|විධාන වෙන් කිරීම සඳහා පයිප්ප සංකේතයක් ලෙස ක්‍රියා කිරීම, කෙසේ වෙතත් |මෙම සන්දර්භය තුළ විධානයක් අවසන් වනු ඇත, එබැවින් <Bar>ඒ වෙනුවට භාවිතා කළ යුතුය.
  • :%s/\s\+$//eසුදු අවකාශය පසුපස ලුහුබඳින අතර එය බෆරයේ සෑම තැනකම මකා දමයි ( මෙම ප්‍රකාශනයේ සවිස්තරාත්මක බිඳවැටීමක් සඳහා කාපට්ස්මෝකර්ගේ පිළිතුර බලන්න )
  • let @/=_sඔබගේ අවසාන සෙවුම් පදය සාර්ව වෙත ප්‍රතිස්ථාපනය කරයි @/, එවිට ඔබ ඊළඟ වතාවේ පහර දුන් විට එය ලබා ගත හැක n.
  • <CR> සිතියම්ගත කිරීම අවසන් කරයි

... හෝ වඩාත් තෝරා බේරා කටයුතු කරන්න

ඔබට පසුපස ඇති සියලු හිස් අවකාශය ඉවත් කිරීමට අවශ්‍ය නොවන අවස්ථා තිබේ නම්, ඔබට වඩාත් තෝරා බේරා ගැනීමට රටාවක් භාවිතා කළ හැකිය. නිදසුනක් ලෙස, පහත දැක්වෙන කේතය පෙන්වන්නේ මා සුදු පැහැති අවකාශය පසුපස හඹා යන්නේ කෙසේද යන්නයි. එය අර්ධ සළකුණකට පසුව පැමිණියහොත් පමණි (මෙහි එය බැඳී ඇත F8).

nnoremap <F8> :let _s=@/<Bar>:%s/;\s\+$/;/e<Bar>:let @/=_s<Bar><CR>

මා වැනි, අර්ධ සළකුණෙන් අවසන් කරන ලද ක්‍රමලේඛන ප්‍රකාශ අතරට මාක් ඩවුන් වැනි හෙරෙඩොක්ස් සහිත ලිපිගොනු තිබේ නම් මෙය ප්‍රයෝජනවත් වේ .


6
:keeppatternsඉක්මවා යාම වැළැක්වීමට උත්සාහ කරන්න @/. ඒ වගේම බලන්න :keepjumps.
බෝර්

OBohr ඔබ භාවිතා කරන්නේ කුමන vim අනුවාදයද? මම උත්සාහ :help keeppatternකළ නමුත් කිසිවක් නොලැබුණි.
ක්‍රිස්ටෝපර් බොටම්ස්

H ක්‍රිස්ටෝපර් බොටම්ස් අවම වශයෙන් 7.4.155 අනුවාදය .
බෝර්

@ බෝර්. ස්තූතියි! මම තවමත් 7.4.0 භාවිතා කරන බව දැන ගැනීමට එන්න. මම නවතම අනුවාදය ස්ථාපනය කර ඇති අතර එය ලබා ගත හැකිය.
ක්‍රිස්ටෝපර් බොටම්ස්

2
ශ්‍රිතයක් තුළ මෙම විධානය එතීමෙන් ඔබට එකම ප්‍රති effect ල ලබා ගත හැකිය, එතැන් සිට අවසාන සෙවුම් පදය ස්වයංක්‍රීයව ප්‍රතිෂ් ored ාපනය වේ :-) මේ ආකාරයෙන් ඔබට :nohlදෙකටම සම්බන්ධ වීමට අවශ්‍ය නැත, ඔබ යමක් ඉස්මතු කරන්නේ නම්, එය දිගටම ඉස්මතු කරයි එය (මගේ යාවත්කාලීන කළ පිළිතුර බලන්න).
මාටින් ටුවර්නොයිජ්

207

"සරලම" ක්‍රමය වන්නේ භාවිතා කිරීම පමණි :substitute:

:%s/\s\+$//e
  • :%sමුළු බෆරය වන :substituteපරාසය ඉක්මවා යාමට %.
  • \s සියලු හිස් අවකාශ අක්ෂර සමඟ නොගැලපේ.
  • \+ ඒවා 1 හෝ වැඩි වාරයක් පුනරාවර්තනය කිරීමට.
  • $ රේඛාවේ අවසානයේ නැංගුරම් දැමීමට.
  • මෙම eකිසිදු තරගය තිබේ නම් දෝෂයක් ලබා නොදෙන ලෙස ධජය (එනම්, ගොනු whitespace අවර තොරව දැනටමත්).

කෙසේ වෙතත්, මෙය අතුරු ආබාධ දෙකකට හේතු වන බැවින් මෙය "හොඳම" ක්‍රමය නොවේ:

  1. එය කර්සරය අවසාන තරගය දක්වා ගෙන යයි;
  2. එය ඉතිහාසයට සහ සෙවුම් ඉතිහාසයට විධානය එක් කරයි;
  3. එය අවසාන සෙවුම් පදය නැවත සකසයි.

මෙය ශ්‍රිතයක් බවට පත් කිරීමෙන් ඔබට අයිතම දෙකම නිවැරදි කළ හැකිය:

fun! TrimWhitespace()
    let l:save = winsaveview()
    keeppatterns %s/\s\+$//e
    call winrestview(l:save)
endfun

ඉන්පසු එය භාවිතා කරන්න:

:call TrimWhitespace()
  1. මෙම winsaveview()මෙම ආදිය, කර්සරය තත්ත්වය ද ඇතුළත් වන වත්මන් "දැක්ම", ඉතිරි වනු ඇත ගුණයකින්, පනී, winrestview()අවසානයේ දී ගැලවීම විචල්ය මෙම නැවත කරනු ඇත.
  2. මෙම :keeppatternsවළකා \s\+$සෙවුම් ඉතිහාසය එකතු කිරීම රටාව.
  3. අවසන් වරට භාවිතා කළ සෙවුම් පදය ශ්‍රිතයක් හැර ගිය පසු ස්වයංක්‍රීයව ප්‍රතිෂ් ored ාපනය වේ, එබැවින් මේ සඳහා අපට වෙනත් කිසිවක් කිරීමට අවශ්‍ය නැත.

:callසෑම විටම ටයිප් කිරීම තරමක් කරදරකාරී බැවින් ඔබට විධානයක් අර්ථ දැක්විය හැකිය:

command! TrimWhitespace call TrimWhitespace()

ඒවා නොමැතිව භාවිතා කළ හැකි :call:

:TrimWitespace

ඔබට එය යතුරකට බැඳ තැබිය හැකිය:

:noremap <Leader>w :call TrimWhitespace()<CR>

සමහර අය තැටියට ගොනුවක් ලිවීමට පෙර ස්වයංක්‍රීයව මෙය කිරීමට කැමතියි, වැනි:

autocmd BufWritePre * :call TrimWhitespace()

මම සමහර ආකෘති අවර whitespace (වැනි අවශ්ය ලෙස, එය කැමති නැහැ Markdown ), සහ ෙවනත් ඇතැම් අවස්ථාවල ඔබ පවා (එවැනි ඊ-මේල් හැඩතල, සහ භාවිතා ඔබේ කේතය දී whitespace අවර අවශ්ය --<Space>අත්සනක් ආරම්භයේ සඳහන් කිරීම මාකර් ).


ලැජ්ජා විරහිත ප්ලග් මාදිලිය: මඳ වේලාවකට පෙර මම සම්පූර්ණ ව්‍යාපෘතියක් සඳහා සුදු අවකාශය පිරිසිදු කිරීම සඳහා කුඩා පයිතන් පිටපතක් ලිවීය .


2
පෙර ස්ථානයට යාමට ඔබට ශ්‍රිතයක් සෑදීමට අවශ්‍ය නැතිනම් ​`​ප්‍රතිස්ථාපනය අවසන් වූ පසු දෙවරක් ඔබන්න . මේ වගේ ඔනලයිනර් යන්ත්‍රයක් නිර්මාණය කිරීමේ හැකියාව මෙය විවෘත කරයි:%s/\s\+$//e | exe "normal ``"
Neaţu Ovidiu Gabriel

1
@ NeaţuOvidiuGabriel, ඇත්ත වශයෙන්ම ඔනෙලයිනර් ක්‍රියාත්මක කිරීමෙන් පසු ද්විත්ව බැක්ටික් එක ක්‍රියා නොකරනු ඇත. ;)
වයිල්ඩ්කාඩ්

සමාන: stackoverflow.com/a/1618401 . නමුත් මම මාටින්ගේ කේතයට වැඩියෙන් කැමතියි.
john cj

13

පසුපස ඇති සියලුම හිස් අවකාශය මකා දැමීමට (එක් එක් පේළියේ අවසානයේ), ඔබට විධානය භාවිතා කළ හැකිය:

:%s/ \+$//

ටැබ් ඇතුළත් කිරීමට, \sඅවකාශය වෙනුවට භාවිතා කරන්න.


විධාන රේඛාවෙන්:

$ ex +'%s/\s\+$//e' -cwq file.c

වත්මන් නාමාවලියෙහි ඇති සියලුම ගොනු (පුනරාවර්තන ලෙස භාවිතා කරන්න **/*.*):

$ ex +'bufdo!%s/\s\+$//e' -cxa *.*

පයිතන් මාර්ගය:

:py import vim
:pydo vim.current.buffer[linenr - 1] = vim.current.buffer[linenr - 1].strip()

හෝ:

:py import vim
:py for i, l in enumerate(vim.current.buffer): vim.current.buffer[i] = l.rstrip()

භාවිතය lstrip()වම් බිම් සඳහා (අගින් ඇද), rstrip()නිවැරදි බිම් සඳහා (ප්රධාන) හෝ strip()දෙපසම ඉවත් කිරීමට.


මෙන්න ඔබට ප්‍රයෝජනවත් ශ්‍රිතයක් වන අතර එය ඔබට එකතු කළ හැකි රේඛාවක කෙළවරේ සිට අතිරික්ත සුදු අවකාශය ඉවත් කරයි .vimrc:

" Removes superfluous white space from the end of a line
function! RemoveWhiteSpace()
   :%s/\s*$//g
    :'^
    "`.
endfunction

ඒ සඳහා DeleteTrailingWhitespace ප්ලගිනය ද ඇත.


සුදු අවකාශයන් ඉස්මතු කිරීම

පසුපස ඇති සියලුම අවකාශයන් නැති වී ඇත්දැයි දෙවරක් පරීක්ෂා කිරීමට, භාවිතා කරන්න:

  1. / $ඒවා සොයා ගැනීමට ටයිප් කරන්න. සමහරක් තිබේ නම්, ඔබ වෙනුවෙන් ඒවා ඉස්මතු කරයි.

  2. ඒවා ඉස්මතු කිරීමට වර්ණ භාවිතා කරන්න:

    :highlight ws ctermbg=red guibg=red
    :match ws /\s\+$/
    
  3. දෘශ්‍ය අක්ෂර භාවිතා කරන්න ( මූලාශ්‍රය ):

    :set encoding=utf-8
    :set listchars=trail:·
    :set list
    

මෙයද බලන්න: අනවශ්‍ය අවකාශයන් ඉස්මතු කරන්න

පෙරනිමියෙන් පසුපස අවකාශය ඉස්මතු කිරීමට, ඔබට පහත පරිදි වින්‍යාසගත කළ හැකිය .vimrc:

highlight ws ctermbg=red guibg=red
match ws /\s\+$/
autocmd BufWinEnter * match ws /\s\+$/

පෙරනිමියෙන් සුදු අවකාශයන් ඉවත් කිරීම

ගොනුවක ඇති සියලුම හිස් අවකාශය ස්වයංක්‍රීයව සුරකින විට ඉවත් කිරීමට වග බලා ගැනීමට ඔබ කැමති නම්, ඔබට පහත දැක්වෙන විධානය ඔබගේ තුළට එක් කළ හැකිය .vimrc:

autocmd BufWritePre *.c,*.php :%s/\s\+$//ge

එය නිර්දේශ නොකරනු ඇත, මන්ද එය පරිශීලකයෙකු විසින් සුරකින ලද සෑම වර්ගයකම ගොනුවකින් කොන්දේසි විරහිතව හිස් අවකාශය ඉවත් කරන අතර සුදු පැහැති අවකාශය ලුහුබැඳීම වැළැක්වීමට හොඳ ක්‍රමයක් නොමැත (එය දුර්ලභ විය යුතුය, නමුත් තවමත්.)


මෙයද බලන්න:


5

ක්‍රිස්ටෝපර් බොටම්ස්ගේ පිළිතුර ටිකක් විස්තාරණය කරමින් : ජොනතන් පලර්ඩි මේ පිළිබඳව හොඳ ලිපියක් ලිවීය . එහි ඔහු Preserve(command)අත්තනෝමතික විධානයක් ක්‍රියාත්මක කරන අතර සංස්කාරකයේ තත්වය (ප්‍රධාන වශයෙන් කර්සරයේ පිහිටීම සහ අවසාන සෙවුම් රටාව) ආරක්ෂා කරන ශ්‍රිතයක් ලියයි :

function! Preserve(command)
  " Preparation: save window state
  let l:saved_winview = winsaveview()
  " Run the command:
  execute a:command
  " Clean up: restore previous window position
  call winrestview(l:saved_winview)
endfunction

මෙය බහුකාර්ය වීමේ වාසියක් ඇත, නිදසුනක් ලෙස ඔබට මෙය සිතියම් ගත කිරීමෙන් පසුපස ඇති සියලු හිස් අවකාශය (ජොනතන් මෙන්) ආදේශ කිරීමට භාවිතා කළ හැකිය:

nnoremap <F5> :call Preserve("%s/\\s\\+$//e")<CR>

දෘශ්‍යමය වශයෙන් තෝරාගත් රේඛාවල පසුපස ඇති අවකාශ ඉවත් කිරීමට ඔබට එය දෘශ්‍ය මාදිලියේ සිතියම් ගත කිරීම සඳහා භාවිතා කළ හැකිය:

xnoremap <F5> :call Preserve("'<,'>s/\\s\\+$//e")<CR>

=ඔබේ ස්ථානය රඳවා තබා ගනිමින් මුළු ලේඛනයම සංයුති කිරීම වැනි වෙනත් ඇමතුම් සඳහා ඔබට එය භාවිතා කළ හැකිය (ගැටුම් ඇති නොවන පරිදි මේ වතාවේ වෙනත් යතුරක් භාවිතා කරන්න):

nnoremap <F6> :call Preserve("normal gg=G")<CR>

සියල්ලට ම, Preserve(command)ශ්‍රිතය තිබීම හොඳ මෙවලමක් බව මට පෙනී ගියේය.


2
ඔබ ශ්‍රිතයක් හැර ගිය විට අවසන් වරට භාවිතා කළ සෙවුම් පදය ස්වයංක්‍රීයව ආරක්ෂා විය යුතුය; ඒ නිසා ඔවුන් සමඟ සම්බන්ධ @/වීම අවශ්‍ය නොවිය යුතුය (මේ අවස්ථාවේ දී, කෙසේ වෙතත්).
මාටින් ටුවර්නොයිජ්

3
winsaveview()හා winrestview()වඩා බොහෝ සෙයින් උසස් වේ.
dash-tom-bang

හරි! ඔබගේ ප්‍රතිපෝෂණය මත පදනම්ව යාවත්කාලීන කරන ලදි.
ඇලෙක්ස්

0

StripTrailingSpaces ශ්‍රිතයේ තවත් අනුවාදයක්:

if !exists('*StripTrailingWhitespace')
    function! StripTrailingWhitespace() range
        if !&binary && &filetype != 'diff'
            call Preserve(":" . a:firstline . "," . a:lastline . "s/\\s\\+$//e")
        endif
    endfunction
endif

" http://technotales.wordpress.com/2010/03/31/preserve-a-vim-function-that-keeps-your-state/
if !exists('*Preserve')
    function! Preserve(command)
        try
            let l:win_view = winsaveview()
             "silent! keepjumps keeppatterns execute a:command
            silent! execute 'keeppatterns keepjumps ' . a:command
        finally
            call winrestview(l:win_view)
        endtry
    endfunction
endif

ඇත්ත වශයෙන්ම මෙම ශ්‍රිතයේ දෝෂයක් ඇත (මෙය):

"පරාසය" විකල්පය නිසා ස්ථානය තබා නොගනී. එය ඉවත් කර ඇති අතර එය ඉතා හොඳින් ක්රියා කරයි. කෙසේ වෙතත්, මම යම් උපකාරයක් ලබා ගැනීම සඳහා කේතය බෙදා ගන්නෙමි.

ඔබට පෙනෙන පරිදි, එය ඉහත දැක ඇති කල් තබා ගැනීමේ ශ්‍රිතය ද භාවිතා කරයි , නමුත් තරමක් වෙනස් ආකාරයකින්.

මෙහි ඇති වෙනස නම් මට පේළි පරාසයක් හෝ ඡේදයක් තෝරා ගත හැකි vipඅතර පසුව පරාසය :'<,'>ස්වයංක්‍රීයව විධාන විමසුමේදී දිස්වනු ඇත.

මෙම අදහස පැමිණියේ බෙස් ​​හර්මසෝ පෝස්ට් එකකිනි .


නැවත "මම යම් උපකාරයක් ලබා ගැනීම සඳහා කේතය බෙදා ගන්නෙමි" : ඔබ ප්‍රශ්නයක් අසනවාද?
පීටර් මෝර්ටෙන්සන්

ඔබට ප්‍රතිපෝෂණය ලබා දීමට මෙතරම් කාලයක් ගතවීම ගැන කණගාටුයි. අවශ්‍ය “සංරක්ෂණය” ශ්‍රිතය අවසානයේ එකතු කරන ලදි. දැන් මගේ පිළිතුර යම් තේරුමක් ඇත. එය පසුපස අවකාශයන් ඉවත් කිරීම පහසු කිරීමේ උත්සාහයකි.
සර්ජියෝ අරාජෝ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.