行をまたがって隠す方法はありますか?


8

これが私のユースケースです:

私はたくさんのコードを持っていますが、スタイルの強制により、それぞれの開き括弧と閉じ括弧の前後に改行を書きます。

例:

function func(args) {

    statement 1;
    statement 2;

    if (condition) {

        statement 3; 

    }

}

これは素晴らしくて読みやすいですが、これはスペースの無駄な無駄だと思いますが、私のチームメイトは私に同意しません。基本的に、これはコードをチェックインする方法であり、それがそれです。

Vimの機能を使用して画面の不動産を節約しながら、詳細な方法でコードを書くことができるのではないかと考えていました。私はそれをタイプアウトすることを気にしません、ただスペースをより効率的に使用したいだけです。たぶん、Vimに不要な空行を自動で折りたたむことができると考えました。

構文規則を使用してこれを設定するのは少し難しいことに気づきます。何を書いても既存の構文規則と競合するように思えるためですが、最初の試みとして、衝突しないこれらの規則を書くことを決めました。

syntax match aaaaaaaaa "\vabcd" conceal cchar=A
syntax match bbbbbbbbb "\vef\ngh" conceal cchar=B

ここでの2番目のルールは、私が望むものに近いもので、開き角括弧の場合は次のようなものです/\v\{(\n\s*){2,}:開き角括弧に改行の2以上の任意の数を指定し、その後に空白のみを付けます。

ただし、vimの内部では次のことが起こります。

  1. abcd行を入力すると、A期待どおりに非表示になります。

  2. ef1つの行とgh次の行に入力すると、両方の行がで非表示になりBます。

ef\nghこの方法で垂直バッファスペースを節約できるように、2行が1行に隠されることを本当に望んでいました。

しかし、私は今、それがおそらくVimの実装の詳細な問題であることを理解しています。行の折りたたみは、コードの折りたたみが解決する問題であり、おそらく隠蔽に関する限り、範囲外です。

だから、やりたいことをやる方法がまだあるのかな。多分どういうわけか折りマーカーを使用していますか?問題は、空の空白だけを折りたたむ必要があることです。


3
私はあなたがそれを行うことができないことを思い出します、それができたとしても、あなたはそれを行うことによって多くのトラブルを求めているでしょう。きれいなプリンターを使用して、スタイルと「公式」のプリンターを切り替えてみませんか。使用しているgit場合は、フックを使用して変更を透過的に適用することもできます。
佐藤桂

2
本当に不可能です。そのため折りたたみを悪用することもできますが、その場合は構文の強調表示が失われます。
Christian Brabandt

1
折りたたみ用のマーカーは必要ありません。:h fold-exprそして:h 'fdm'
クリスチャン・ブラバンド

1
@ChristianBrabandt中括弧の周りにこれらの(ほとんどが単一の空または空白のみの)行を自動的に折り畳むための何かをここで書くのに十分な電力があるようです。しかし、私は座って、本当にそれを熟考する必要があるようです。
Steven Lu

2
たぶん、neovimの課題追跡で報告できるので、これを実装するために使用できる機能がそこに表示される可能性があります。
Farid Nouri Neshat

回答:


2

折り目を悪用して余分な空行を隠すことができます。以下にその方法を示します。

function! SkipNewlineFoldExpr()
    let l:curline = getline(v:lnum)
    " fold begins at {$ or one line before }$
    if l:curline[-1:] == '{' || getline(v:lnum + 1)[-1:] == '}'
        return '>1'
    endif
    " fold ends one line after {$ or at }$
    if getline(v:lnum - 1)[-1:] == '{' || l:curline[-1:] == '}'
        return '<1'
    endif
    return 0
endfunction

function! SkipNewlineFoldText()
    " fold text matches non-empty line
    return getline(getline(v:foldstart)[-1:] == '{' ? v:foldstart : v:foldend)
endfunction

" customize how fold is defined
set foldexpr=SkipNewlineFoldExpr()
" customize how fold looks like
set foldtext=SkipNewlineFoldText()
" use 'foldexpr'
set foldmethod=expr

" Optional:
" drop highlighting of folds
" highlight clear Folded
" automatically close folds
" set foldclose=all
" automatically open folds on any actions on folded lines
" set foldopen=all

次のようになります。

折りたたまれた空の行

ご覧のとおり、折りたたまれた行には構文の強調表示がありませんが、多くの不要な空行よりも耐えられます。またzi、邪魔になっている場合に備えて、ショートカットを使用して折り目をオン/オフに切り替えることもできます。

フォールドは小さなトピックではなく、Vimには個別のヘルプファイルがあります。関連オプションもそこでリンクされています。

カーソルと検索の詳細な動作は'foldopen'、を介して制御できます。これ'foldclose'は、折り目が自動的に開閉されるときの定義と組み合わせて使用します。


ご回答有難うございます。結局のところ、同じ行で2つ折りを開始することが可能であるため、これは非常に興味深い手法です。より良い解決策が見つからない場合は、賞金を差し上げます!これを使用して、必要なものを実装できる場合があります(vi.stackexchange.com/questions/5175/…)。
Bart Louwers 2017年

1

まず、それはくだらないスタイルの施行であり、あなたは私の同情を持っています。代わりに隠れて(下に示すように)編集して完了したら、それらを追加する前に、不要な行を削除するためのマッピングまたは関数を作成する方法についてどのように?線に沿って何か:

function! Clean()
    %s/{\n^$/{/
    %s/^$\n\(\s*}\)/\1/
endfunction

function! Pollute()
    %s/{$/{\r/
    %s/\(\s*}\)/\r\1/
endfunction

基本的なアイデアは始まります。読み取り時に空の行を削除し、書き込み時にそれらを置き換えます。試さなかったのですが、次のようにautocmdとして追加できるように感じます。

au BufReadPost *.cpp call Clean()
au BufWritePost *.cpp call Pollute()

あなたの答えは質問に答えないので、私はあなたに賞金を授与することはできません。私の場合、アウトラインのヘッダーに関するメタデータを非表示にすることに興味があります。
Bart Louwers 2017年

@アレックスそれは大丈夫です。賞金については返答しませんでした。自分で質問するためにvim stackexchangeに来たとき、その質問がちょうど私の目を引きました。元の質問を解決する方法として、別のオプションを提供すると思いました。
lonetwin 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.