特定の線を完全に非表示にする(折り畳みではない)


9

バッファ内の特定の行を非表示にして、表示を切り替えることができるようにしたいと考えています。同様の質問が見つかりましたが、問題は解決しません。これには折り目を使いたくありません。

正確に何が欲しいですか?

ドキュメントを開いたとき、Vimにコメント行が読み込まれないようにしたい。これらの行がドキュメントにまったく存在しないかのように動作する必要がありますが、例外が1つあります。表示されていないコメントであることを示す視覚的なインジケーター(たとえば、横の追加の列)が必要です。

特定のキーの組み合わせを押すと、すべてのコメントが表示されます(つまり、通常のVimの動作)。

コメントが表示されない状態でドキュメントを変更できるようにしたい。保存すると、ドキュメント全体コメント付きで保存さます(コメントは常に最初の行の下にあったテキストの1行上に保存されます)。

なぜこれが欲しいのですか?

見た目がよくなり、見た目がより楽しくなります。.vimrc例を挙げましょう。すべての設定を互いにうまく組み合わせることができます。何かを変更したい場合、またはこのように設定する理由がわからない場合は、コメントを切り替えてください。


あなたが私の質問を気にしないことを願っています...なぜあなたは特に折り目を除外しているのですか?
ロフロ2015年

1
もちろん、私はしません:)折りたたみを除外したので、折りたたみでコメントを折りたたむ方法がわかります。
cbaumhardt

私もたくさんのことを望みますが、私は通常、自分が必要とするものに固執する/順応する方が良いことを知りました;)
VanLaser

@cbaumhardtあなたはそれを折りたたみ、すべてを隠すためにカスタムの 'foldtext'設定/関数を使用することができます
Christian Brabandt

回答:


8

私はあなたが望むものを正確に達成する方法を知りません、一部だけです。

内部のテキストを非表示にしたい~/.vimrc(たとえば)。

まず、どのハイライトグループが非表示にするテキストを処理するかを知る必要があります。このマッピングをあなたに追加してください~/.vimrc

map <F10> :echo "hi<" . synIDattr(synID(line("."),col("."),1),"name") . '> trans<'
\ . synIDattr(synID(line("."),col("."),0),"name") . "> lo<"
\ . synIDattr(synIDtrans(synID(line("."),col("."),1)),"name") . ">"<CR>

ここから撮りまし

次に、コメントなど、非表示にするテキストにカーソルを置きます。次にを押しF10ます。
ハイライトグループの名前がコマンドラインに表示されます。
私のシステムでは、出力は次のとおりです。

hi<vimLineComment> trans<vimLineComment> lo<Comment>

vimコメントのハイライトグループがでvimLineCommentあり、にリンクされていることを意味しCommentます。したがって、ハイライトグループvimLineComment(またはComment)によって処理されるテキストを非表示にする必要があります。

これを実現するには、vim 7.3で追加された隠蔽機能を使用できます(:help conceal)。

:syntax match vimLineComment "^\".*" conceal containedin=ALL cchar=>

この行は、そのハイライトグループでテキスト検索するVimを告げるvimLineCommentと、正規表現に一致するが^\".*(行の先頭には(^)二重引用符(続く\")任意のテキスト(続く.*())、および非表示にするには、それが見つかったどこにでもそれを置き換えますcontainedin=ALL)文字>cchar=>)を使用します。カーソルが上にある場合を除き、構文属性は、私たちが望むテキストを非表示になります。
conceal

次に、カスタム置換文字が定義されていない限り、テキストを完全に非表示にするようにvimに指示します。

:set conceallevel=2

このオプションには4つの異なる効果を持つ4つの可能な値があります(を参照:help conceallevel)。

毎回これらのコマンドを入力したくないので、次のようにオートコマンドを追加します~/.vimrc

augroup hide_text
    autocmd!
    autocmd FileType vim :set conceallevel=2 | :syntax match vimLineComment "^\".*" conceal containedin=ALL cchar=>
augroup END

最後に、conceallevelオプションの値を切り替えるマッピングを追加します(2と0の間、2 =非表示、0 =表示):

nnoremap <leader>h :<c-u>if (&conceallevel==2) \| set conceallevel=0 \| else \| set conceallevel=2 \| endif<cr>

その結果、ヒットしたときにテキストが表示/非表示になり<leader>hます。

置換文字の色を変更することもできます:

highlight Conceal ctermfg=<code color> guifg=#<code color>

また、コメントを表示するモードを選択できます。たとえば、挿入モードでその行にいるときにのみ表示されるようにするには、次のようにします。

setlocal concealcursor=ncv

ただし、折りたたみ機能のようにこれらの隠線をすべて折りたたむ方法がわかりません。


編集:別の可能な解決策。

折りたたみ設定を維持して、表示したくない行を折りたたみ、折り目のタイトルを非表示にして、邪魔にならないようにします。

function! FoldingTitle()
    if (v:foldlevel>1)
        let line = repeat(' ', &sw * (v:foldlevel-1)).'>'
    else
        let line = '|'
    endif
    return line
endfunction

set foldtext=FoldingTitle()
set fillchars+=fold:\ 
set foldcolumn=3 " optional

highlight FoldColumn ctermfg=<code color> guifg=#<code color> ctermbg=<code color> guibg=#<code color> "optional
highlight Folded ctermfg=<code color> guifg=#<code color> ctermbg=<code color> guibg=#<code color> "optional

このコードではFoldingTitle()foldtextオプションに値を指定して、折り目のタイトルをカスタマイズします。これは、この関数を通して折り目がどのように見えるかを変更できることを意味します。 FoldingTitle()単に折り返しがあることを確認できるようにシンボルを返します(>いくつかの繰り返しスペースが前にあるか|、折り返しレベルによって異なります)。

次に、行の空白を埋めるために使用する文字としてスペース文字を定義します。

set fillchars+=fold:\ 

バックスラッシュの後のスペースを忘れないでください。

最後に、ウィンドウの横に表示され、折り畳みの開閉を示す列(幅が3)を定義します。また、フォールドカラムの色やフォールドのタイトルの色もカスタマイズします。これらの3行はそれぞれオプションです。

set foldcolumn=3 " optional
highlight FoldColumn ctermfg=<code color> guifg=#<code color> ctermbg=<code color> guibg=#<code color>
highlight Folded ctermfg=<code color> guifg=#<code color> ctermbg=<code color> guibg=#<code color>

1
これは本当に素晴らしいです、私は隠蔽機能について知りませんでした。あなたの解決策では、行はまだそこにありますが、完全に空であるか、1つの文字しかありません-したがって、コードを見て気を散らすことが少なくなります。特定の線をまったく表示しない方法があることをまだ望んでいますが、この解決策も適切です(折りたたむよりも優れています)。
cbaumhardt 2015年

うわー、隠蔽は本当に素晴らしいです。行の一部だけを隠蔽することもできます(垂直折りたたみ):vim.wikia.com/wiki/Patch_to_conceal_parts_of_lines
cbaumhardt

@cbaumhardt私はあなたの興味を引くかもしれない別の命題を含むように私の回答を編集しました。
saginaw 2015年

あなたの編集の提案は実際にはオプションではありません、私は私の通常の折りたたみをまだ使用できるようにしたいので。ただし、そのFolded場合、通常の折り目の要素には色が必要なので、非表示にする行の折りテキストをスペースで埋めるだけです。ただし、下線が引かれた部分とFoldedオブジェクトのさまざまな背景は引き続き表示されます。通常の折りたたみを機能させるために必要なため、変更することはできません。
cbaumhardt 2015年

-1

可能な解決策は、同じ解決策が見つからないために使用した最小限の折りたたみバーを使用することです。以下に、非表示のコメントに使用できる最小限の折りたたみバーを作成するためのコマンドのリストを置き、各コマンドにそれを実行します:

フォールドのテキスト参照に+を表示するには、foldtext = '+' "を設定します

hi折りたたみctermbg = NONE "色の折りたたみバーを何も変更しない

:set fillchars = vert:\ |、fold:\ "(スペースを入れる)折りたたみバーに-----を入れない

コメントを非表示にするためのオプションの使用

:こんにちは!リンクコメント無視

返品使用

:こんにちは!リンクコメントコメント


申し訳ありませんが、あなたの投稿を理解できません。その中にもっと丸い文章を書くことをお勧めします。
peterh-モニカを
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.