it-swarm.asia

جعل Vim تظهر جميع المساحات البيضاء كحرف

لا أستطيع إيجاد طريقة لجعل Vim تظهر كل المساحات البيضاء كحرف. كل ما وجدته كان حول علامات التبويب والمسافات الزائدة وما إلى ذلك.

708
Matt

كما قال آخرون ، يمكنك استخدام

:set list

التي سوف ، في تركيبة مع

:set listchars=...

عرض شخصيات غير مرئية.
الآن ، لا يوجد خيار صريح يمكنك استخدامه ل إظهار مسافة بيضاء ، ولكن في listchars ، يمكنك تعيين حرف لإظهاره لكل شيء ولكن مسافة بيضاء. على سبيل المثال ، يبدو لي مثل هذا

:set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:<

لذلك ، الآن ، بعد استخدام

:set list

كل شيء لا يظهر بوضوح كشيء آخر ، هو في الحقيقة مسافة بيضاء بسيطة.

كالعادة ، لفهم كيفية عمل listchars ، استخدم المساعدة. يوفر معلومات رائعة حول العناصر التي يمكن عرضها (مثل المساحة الزائدة ، على سبيل المثال) وكيفية القيام بذلك:

:help listchars

قد يكون من المفيد إضافة تبديل إلى ذلك حتى تتمكن من رؤية التغييرات أثناء التحرير بسهولة (المصدر: VIM: set list! كـ تبديل في .vimrc ):

noremap <F5> :set list!<CR>
inoremap <F5> <C-o>:set list!<CR>
cnoremap <F5> <C-c>:set list!<CR>
636
Rook

:set list لتمكين.

:set nolist لتعطيل.

237
Marcin

اعتبارًا من patch 7.4.710 يمكنك الآن تعيين حرف لإظهاره بدلاً من المساحة باستخدام listchars!

:set listchars+=space:␣

لذلك ، لإظهارALLأحرف المسافة البيضاء كحرف يمكنك القيام بما يلي:

:set listchars=eol:¬,tab:>·,trail:~,extends:>,precedes:<,space:␣
:set list

مناقشة حول القائمة البريدية: https://groups.google.com/forum/؟fromgroups#!topic/vim_dev/pjmW6wOZW_Q

227
Brett Y

أعتقد أن الإجابات الأخرى هنا أكثر شمولاً ، لكنني اعتقدت أنني أشارك خدعة أستخدمها عادةً للتمييز بين علامات التبويب والمسافات بصريًا:

:syntax on
:set syntax=whitespace

هذه هي قواعد تسليط الضوء على بناء الجملة تظهر لغة برمجة - علامات التبويب باللون الأخضر والمسافات باللون الأحمر. :)

يمكن دمجه مع :set list كما ذكرته العديد من الإجابات الأخرى ، على الرغم من أن علامات التبويب ستظهر بعد ذلك كـ ^ I بدون مصباح أخضر ، لكن المسافات ستظهر باللون الأحمر.

172
Eliot

:set list سيعرض كل المسافات البيضاء كحرف. سيبدو كل شيء لكن مساحة مختلفة عن حالته الطبيعية ، مما يعني أنه إذا كنت لا تزال ترى مساحة قديمة بسيطة ، فهي في الحقيقة مساحة قديمة بسيطة. :)

85
Ether

إذا قمت بتعيين:

:highlight Search cterm=underline gui=underline ctermbg=none guibg=none ctermfg=none guifg=none

ثم قم بإجراء بحث عن مسافة ، سيتم عرض كل حرف مسافة كحرف تسطير.

يمكنك استخدام هذا الأمر في وظيفة مفيدة تقوم بتبديل "التأكيد على" المسافات.

set hls
let g:HLSpace = 1
let g:HLColorScheme = g:colors_name
function ToggleSpaceUnderscoring()
    if g:HLSpace
        highlight Search cterm=underline gui=underline ctermbg=none guibg=none ctermfg=none guifg=none
        let @/ = " "
    else
        highlight clear
        silent colorscheme "".g:HLColorScheme
        let @/ = ""
    endif
    let g:HLSpace = !g:HLSpace
endfunction

قم بتعيين الوظيفة لمفتاح اختصار باستخدام:

nmap <silent> <F3> <Esc>:call ToggleSpaceUnderscoring()<CR>

ملحوظة: حدد الوظيفة في vimrc بعد أن تم ضبط نظام الألوان.

73
mrucci

اعتمادًا على قواعد بناء الجملة للمخزن المؤقت الحالي ، قد يعمل شيء من هذا القبيل:

:syn match WhiteSpace / / containedin=ALL conceal cchar=Æ
:setl conceallevel=2 concealcursor=nv

هذا يحتاج إلى vim 7.3 مع + ميزة إخفاء

تحديث 10/24/2014 لتوسيع قليلا على ذلك. من الممكن بالطبع تحديد بعض التظليل للأحرف المخفية.

  • يمكنك تكوين ، كيف تبدو الأحرف المخفية. للتمييز ، يجب عليك مرة واحدة على الأقل تكوين مجموعة التمييز "إخفاء" (راجع التعليمات في :h hl-Conceal يمكن القيام بذلك في نظام الألوان الخاص بك ، ثم لن تحتاج إلى إعادة تكوينه مرة أخرى. لكن هذا يؤثر على جميع الأحرف المخفية (على سبيل المثال إذا يخفي البرنامج النصي الخاص بك بناء جملة بعض العناصر الأخرى ، سيتم عرضها كحرف فضاء بيضاء).

    :hi Conceal ctermfg=7 ctermbg=NONE guifg=LightGrey guibg=NONE

  • يبدو أن هناك خصوصية لأن Vim لن يقوم بتمييز المسافات ، إذا كان البرنامج النصي الخاص بالجمل يستخدم الكلمة الأساسية skipwhite. لن يكون هناك أي حل (ربما سيتم إصلاح هذا ، لقد نشرت patch )

  • يبدو أن هناك رقعة عائمة حولها ، مما سيتيح تخصيص كيفية ظهور المساحات في وضع list. يبدو أن أحدث إصدار في وقت الكتابة هو { هذا واحد . (هذا يعني أنك تحتاج إلى إنشاء Vim الخاص بك لاستخدام هذا).
  • conceallevel و concealcursor هي خيارات نافذة محلية. هذا يعني أنه يمكن أن يكونوا مختلفين في الإطارات المختلفة (وربما يتم تعيينهم أيضًا بواسطة ملحقات أنواع الملفات أو البرامج النصية الأخرى).
  • تحتاج مجموعات تمييز بناء الجملة إلى تنفيذها عند إعادة تحميل ملف تعريف بناء الجملة. يمكن القيام بذلك باستخدام BufWinEnteror ربما أيضًا Syntax أو حتى FileType autocommand. (أنا لم تختبر أي واحد يعمل فعلا).

يعني العنصران الأخيران أنه يتعين عليك إعداد بعض أوامر autocommands التي تعيد تعيين قواعد بناء الجملة وخيارات correesponding. لأول مرة ، قد يرغب المرء في إعداد التمييز باستخدام autocommand ColorScheme (بحيث تبدو الأحرف المختفية دائمًا كما هي ، بغض النظر عن إعداد نظام الألوان فعليًا). للحصول على حل كامل ، انظر إلى إجابة romainl ، والتي يجب أن تمنحك بداية. إذا قمت بإعداد وظيفة ، فيمكنك بسهولة إعداد أمر تبديل للتبديل بين عرض ميزة التمييز أو إيقاف تشغيلها.

تحديث 10/26/2014 قمت بعمل plugin خارج هذا السؤال.

تحديث 04/22/2015 تم تضمين تصحيح في Vim يجعل هذا ممكنًا باستخدام الخيار list. ببساطة اضبط set list listchars+=space:␣ هذا يعمل اعتبارًا من Vim 7.4.711

45
Christian Brabandt

انا استعمل هذا

/\s
:set hlsearch

لتسليط الضوء على المساحات البيضاء. يبحث عن جميع المسافات البيضاء ، ثم يمكّن التمييز من جعلها تظهر. ومع ذلك ، فإنه لا طباعة شخصية خاصة.

30
Benedikt Köppel

إذا كنت تعني المسافة البيضاء "حرف" ، فإن اقتراحي سيكون مجرد بحث/استبدال. كما ألمح الآخرون ، تتغير set listغير قابلة للطباعة أحرف إلى حرف مرئي تم تكوينه في listchars.

لإظهار المسافات بشكل صريح كحرف آخر ، يجب أن تقوم الحيلة بشيء مماثل لما يلي:

:%s/ /█/g

ثم التراجع عن التغيير للعودة مرة أخرى.

(للحصول على █ ضغطت على تسلسل المفاتيح الدقيق هذا: :%s//CTRL-KFB/g)

22
Randy Morris

لتسليط الضوء على المسافات ، ابحث عنها فقط:

/ <مساحة>

ملاحظات:

  • <المسافة> تعني فقط كتابة حرف المسافة.
    • تمكين تمييز نتائج البحث باستخدام: set hlsearch

      لتسليط الضوء على المسافات وعلامات التبويب:

      /[<مساحة> <التبويب>]

      هناك طريقة سريعة لإزالة النقاط البارزة وهي البحث عن أي شيء آخر:/asdf

      (فقط اكتب أي قائمة قصيرة من الأحرف العشوائية)

  • 16
    vimmer

    يستند الرمز أدناه إلى إجابة كريستيان برابانت ويبدو أنه يفعل ما يريده البروتوكول الاختياري:

    function! Whitespace()
        if !exists('b:ws')
            highlight Conceal ctermbg=NONE ctermfg=240 cterm=NONE guibg=NONE guifg=#585858 gui=NONE
            highlight link Whitespace Conceal
            let b:ws = 1
        endif
    
        syntax clear Whitespace
        syntax match Whitespace / / containedin=ALL conceal cchar=·
        setlocal conceallevel=2 concealcursor=c
    endfunction
    
    augroup Whitespace
        autocmd!
        autocmd BufEnter,WinEnter * call Whitespace()
    augroup END
    

    قم بإلحاق هذه الأسطر بـ ~/.vimrc وابدأ جلسة Vim جديدة لرؤية لا يزال غير كامل يحدث السحر.

    لا تتردد في تحرير الألوان الافتراضية وإخفاء الطابع.


    تحذير: هناك شيء في مجموعة بناء الجملة *FuncBody بعدة لغات يمنع ظهور النقطة الوسطى. لا أعرف (بعد؟) كيفية جعل هذا الحل أكثر موثوقية.

    14
    romainl

    لقد شعرت بالإحباط من جميع الإجابات الأخرى على هذا السؤال ، لأن أيا منها لا يبرز شخصية الفضاء بطريقة مفيدة. إن عرض المسافات كأحرف من شأنه أن يساعد بشكل خاص للغات ذات تنسيق المسافات البيضاء ، حيث يكون خلط علامات التبويب والمسافات ضارًا.

    الحل الخاص بي هو إظهار علامات التبويب وتسطير مسافات متعددة. يستعير من إجابة mrucci و هذا البرنامج التعليمي . لأنه يستخدم تسليط الضوء على بناء الجملة ، فهو ثابت:

    set list listchars=tab:\|\ 
    highlight Whitespace cterm=underline gui=underline ctermbg=NONE guibg=NONE ctermfg=yellow guifg=yellow
    autocmd ColorScheme * highlight Whitespace gui=underline ctermbg=NONE guibg=NONE ctermfg=yellow guifg=yellow
    match Whitespace /  \+/
    

    باستخدام هذا ، يتم عرض علامات التبويب كـ | والمسافات كـ _ ، مما يجعل من السهل للغاية معرفة متى أقوم بخلط أنماط الرموز.

    الجانب السلبي الوحيد الذي وجدته هو أن هذا المقتطف لا يضبط لون الخلفية لمطابقة السياق (كما في التعليق).

    11
    Wylie

    جميع الإجابات الواردة أعلاه تحاول أن تجعل المساحات مرئية من الداخل. إذا كنت تصر حقًا على وجود مسافات مرئية كنقاط ، فهناك طريقة أخرى ...

    إذا كان لا يمكن القيام به في vim ، قم بتغيير الخط بالكامل. قمت بنسخ الخط Ubuntu One Mono وتحريره باستخدام FontForge. تذكر تغيير اسم الخط بالكامل ، والعائلة ، والأسرة المفضلة ، والمتوافقة بالكامل (في FontFoge ، يوجد اسم TTF في معلومات الخط) ، حتى يكون كخط منفصل. ما عليك سوى تحرير حرف المسافة للحصول على نقطة في المنتصف وحفظ الخط على الخطوط ~ /. الآن يمكنك استخدامه لجهاز gvim أو الجهاز بأكمله ... لقد قمت بنسخ "!" حرف ، إزالة الخط ونقل النقطة إلى الوسط. استغرق الأمر أكثر من 5 دقائق بقليل ...

    ملاحظة: يؤدي تغيير حرف المسافة (0x20) إلى إزعاج وجود نقاط على شاشة vim بأكملها ... (لكنه سيفصل المسافات عن علامات التبويب ...)

    8
    chef

    لم أجد بالضبط ما أردت من الإجابات الحالية. سوف الكود أدناه تسليط الضوء على جميع المساحات زائدة أحمر مشرق. ما عليك سوى إضافة ما يلي إلى .vimrc

    highlight ExtraWhitespace ctermbg=red guibg=red
    match ExtraWhitespace /\s\+$/
    autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
    autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
    autocmd InsertLeave * match ExtraWhitespace /\s\+$/
    autocmd BufWinLeave * call clearmatches()
    
    7
    thedanotto

    لتغطية أحرف مسافة بيضاء لـ Unicode:

    set list
    set listchars=tab:│\ ,nbsp:·
    highlight StrangeWhitespace guibg=Red ctermbg=Red
    " The list is from https://stackoverflow.com/a/37903645 (with `\t`, `\n`, ` `, `\xa0` removed):
    call matchadd('StrangeWhitespace', '[\x0b\x0c\r\x1c\x1d\x1e\x1f\x85\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]')
    

    النتيجة:

    • فقط المساحة الترتيبية (U + 0020) تشبه المساحة ("")
    • تبدو علامة التبويب (U + 0009) مثل "│ " (حرفين: توجيه طويل ثم مسافة ترتيبية ؛ تكون رمادية في colorscheme murphy)
    • تبدو المساحة غير القابلة للكسر العادية (U + 00A0) "·" (حرف واحد ؛ إنها رمادية في colorscheme murphy)
    • أي حرف أبيض آخر يشبه اللون الأحمر ""
    5
    Kirill Bulygin
    :match CursorLine /\s\+/
    

    يتجنب "عليك البحث عن مسافات لحملهم على الظهور" ، لكن لا يمكن تكوين afaict للقيام بأشياء غير هجائية على المسافات. يمكن أن يكون CursorLine أي مجموعة hilighting وفي السمة الافتراضية يكون تسطير عادي.

    5
    ldrg

    أنا أحب استخدام أحرف خاصة لإظهار مسافة بيضاء ، هو أكثر وضوحا. حتى الخريطة للتبديل هي ميزة أساسية ، للتحقق السريع.

    يمكنك العثور على هذه الميزات في برنامج نصي vim قديم لم يتم تحديثه منذ عام 2004:

    vim-scripts/cream-showinvisibles@vim.org

    بفضل المشروع vim-scripts و vundle يمكنك العودة إلى هذا البرنامج المساعد في الحياة

    همة-مخطوطات/كريم showinvisibles @ جيثب

    أفضل ، بلدي اثنين سنتا على هذا هو إضافة اختصار شكلي (بدلا من المعرفة مسبقا F4)

    أضف هذا إلى ~/.vimrc

    Plugin 'albfan/cream-invisibles'
    
    let g:creamInvisibleShortCut = "<F5>" "for my F4 goto next error
    

    تثبيت البرنامج المساعد على vim

    :PluginInstall
    

    وهناك تذهب

    5
    albfan

    يمكنك استخدام

    :set list
    

    لنرى حقا هيكل الخط. سترى علامات التبويب والخطوط الجديدة بشكل صريح. عندما ترى فارغة ، إنها فارغة حقًا.

    4
    tangens

    تسليط الضوء على البحث

    :set hlsearch 
    

    في .vimrc هذا هو

    والبحث عن علامات التبويب الفضاء وعودة النقل

    / \|\t\|\r
    

    أو ابحث عن كل حروف مسافة بيضاء

    /\s
    

    البحث عن جميع أحرف المسافة غير البيضاء (لا يتم عرض أحرف مسافة بيضاء ، لذلك ترى أحرف مسافة بيضاء بين الكلمات ، ولكن ليس أحرف مسافة بيضاء زائدة)

    /\S
    

    لإظهار جميع أحرف المسافة البيضاء الزائدة - في نهاية السطر

    /\s$
    
    3
    MichaelMoser

    احتفظ تلك الاختراقات في .vimrc كتعليقات ، لذلك في Shell ، ببساطة:

    echo '
      " how-to see the non-visible while spaces
      " :set listchars=eol:¬,tab:>·,trail:~,extends:>,precedes:<,space:␣
      " set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:<
      " :set list
      " but hei how-to unset the visible tabs ?!
      " :set nolist
      ' >> ~/.vimrc
    
    2
    Yordan Georgiev

    يمكنك أيضًا تمييز المسافات (استبدال المسافات بكتلة):

    :%s/ /█/g
    

    (قبل الكتابة التراجع عن ذلك)

    1
    Federico Bucchi
    :se list
    :se nolist
    

    :se يكفي ، :set غير مطلوب.

    1
    sjas

    إضافة هذا إلى بلدي. vimrc يعمل بالنسبة لي. فقط تأكد من عدم وجود أي شيء آخر متعارض ..

    autocmd VimEnter * :syn match space /\s/
    autocmd VimEnter * :hi space ctermbg=lightgray ctermfg=black guibg=lightgray guifg=black
    
    1
    jroot