問題

我用過:

 set listchars=tab:→\ ,trail:·,precedes:←,extends:→,nbsp:·,space:·
 

呈現空格和標籤字元。

但我只想顯示> = 2個空格,我不想顯示它是否在其他字元之間有一個空格.

(它在vscode中是相同的"editor.renderWhitespace": "boundary") enter image description here

我可以在Vim中做嗎? (configplugin)

謝謝。

編輯:我使用:

 if exists('space_match')
  call matchdelete(space_match)
endif
let space_match = matchadd('Conceal', '( @<= )|(  @=)', -1, -1, {'conceal': '·'})
 
  • 我使用優先順序-1indentLine相容
  • ( @<= )匹配另一個空間後的空間
  • ( @=)在另一個空間之前匹配空間

並刪除listchars中的空格:

 set listchars=tab:→\ ,trail:·,precedes:←,extends:→,nbsp:·
 

謝謝本·克諾布林這麼多幫助我找到那個!!!

  最佳答案

使用隱藏,這可以有幾種方法,取決於您想要實現的目標.由於我們正在使用隱藏,您將想從'listchars'中刪除space.

我將在下面使用matchadd(),但理論上可以使用syn-conceal做類似的事情.區別是匹配是視窗的本地.語法可以在定義的地方使用 – 您可以使用任何檔案型別或其他機制透過語法設定它.

我假設正則表示式\s(匹配空格)與您需要的匹配.如果您只需要空格,則在regexp中將\s更改為(單個空格字元).

我假設您可以閱讀vim regexp.幫助頁面廣泛,但下面注意到我使用顯式設定魔術型別(matchadd對regex-action選項敏感,如'magic'),我酌情使用\zs來啟動匹配.

我將使用下面的測試文字.

測試檔案

 word word  word   word
word word  word   word
 

set conceallevel=1

在1級,我們可以在比賽中使用替換字元。

所以,我們可以用例如.替換所有額外的空格,以使它們顯示出來:

 let space_match = matchadd('Conceal', '\s\@<=\s+', 10, -1, {'conceal': '.'})
 

(10是預設的優先順序,-1為匹配請求一個新的ID.)

清理

為了擺脫匹配/隱藏,你可以簡單地

 call matchdelete(space_match)
 

《任擇議定書》指出,以下工作最有效地解決了這個問題:

 let space_match = matchadd('Conceal', '( @<= )|(  @=)', -1, -1, {'conceal': '·'})
 
  • 優先順序-1indentLine相容
  • ( @<= )匹配另一個空間後的空間
  • ( @=)在另一個空間之前匹配空間

  相同標籤的其他問題

vimvim-plugin