2

強調表示を行に出力するために使用するマッピングがあります。ここの他のポスターからアイデアを得たので、ありがとうございます。これが私がすることです:

function! PrintSyntaxItem()
    let l:colorsyntax = synIDattr(synID(line("."), col("."), 0), "name")
    execute "highlight" l:colorsyntax
endfunction

そして、私はそれを次のようにマッピングします:

nnoremap <A-s> :call PrintSyntaxItem()<CR>

ただし、実行すると、コマンドラインがエコーされ、必要な出力が表示され、「Enterキーを押してください」というプロンプトが表示されます。つまり、出力に次のように表示されます。

:execute "highlight" synIDattr(synID(line("."), col("."), 0), "name")
vimBracket     xxx links to Delimiter
Press ENTER or type command to continue

行をなくしたいのですが、:executeEnter キーを押す行も消えてしまいます。これを行う方法はありますか?silentの前に置くと、executeその行は印刷されますが、出力は失われhighlightますが(Enterキーを押すプロンプトも)、目的の出力を取り戻すには、プレフィックスを付けてunsilent取得しますが...

基本的に、行のエコーを抑制するか、:execute事後にクリアしたいのですが、その方法がわかりません。メッセージの操作に関する情報についてドキュメントをトロールしても、実を結びませんでした。

ありがとう。

4

3 に答える 3

6

沈黙させるべきコマンドではありませんが、質問のタイトルに書いたように、マッピング自体は次のとおりです。

nnoremap <silent> <A-s> :call PrintSyntaxItem()<CR>

とは言っても、実行コマンドは簡単には黙らせられないようです。私はそれを調べます。

編集

:redir =>を含め、見つけられるすべてのトリックを試しましたが[<]silent[>]、目的の結果を得ることができませんでした。プロンプトが表示されるか、何も表示されません。大変申し訳ありません!

于 2013-01-22T19:40:01.757 に答える
4

highlightの出力が複数行になるため、press enter プロンプトが表示されます。\n出力をリダイレクトし、 を削除してからエコーすることで、余分な行を取り除くことができます。

function! PrintSyntaxItem()
    let l:output = ''
    redir => l:output
    silent exec "hi" synIDattr(synID(line("."), col("."), 0), "name")
    redir END
    echo substitute(l:output, '\n', '', '')
endfunction

ただし、xxxサンプルは適切に強調表示されなくなりました。代わりに、次のように一時的に変更することで、プレス エンター プロンプトをハックすることができますcmdheight

nnoremap <silent> <A-s> :set ch=2 \| exec "hi"
    \ synIDattr(synID(line("."), col("."), 0), "name") \| set ch=1<CR>

これにより、最初にコマンド ラインの高さを 2 に変更し、その後、空の行を切り取るために高さを 1 に戻すことで、最初にプロンプ​​トが出力されるのを防ぎます。私は関数を完全に廃止しましたが、もちろん、必要に応じて の間に呼び出すこともできset chます。

于 2013-01-22T21:23:10.370 に答える
1

コマンド ラインの高さをごまかすのではなく、xxx の部分だけでなく、行全体を強調表示してみてはどうでしょうか。

function! ShowSyntaxItem()
    redir => l:output
    silent exec "hi" synIDattr(synID(line("."), col("."), 0), "name")
    redir END
    let l:parts = matchlist(output, '\v\n@<=(\S+)(.*$)')
    if (len(l:parts) >= 3)
      redraw | exec "echohl ".l:parts[1] | exec "echo '".l:parts[0]."'" | echohl None
    endif
endfunction

nnoremap <silent> <Leader>as :call PrintSyntaxItem()<CR>

l:outputに記載されているように、redir の前に存在する場合は、宣言または再初期化する必要はありません:he redir。これは非常に便利で、古い vimrc に入れられます。

于 2013-01-30T04:25:39.810 に答える