テキストの幅を変更せずにテキストの周りにボックスを追加する


9

文書属性フェイスのは示唆している追加line-width-nボックス属性の意志に

幅nの線を描画します。この線の上部と下部は、下にあるテキストのスペースを占めているため、文字の高さが増加することはありません。

そのため、isearch候補(lazy-highlight)の個人用テーマファイルに次の行を追加しました。

`(lazy-highlight ((,class (:box (:line-width -1 :color ,search) :background ,bg1 :foreground ,fg1))))

これは高さを考慮して問題なく機能しますが、下のgifに見られるようにテキストの幅が変化します。

ここに画像の説明を入力してください

テキスト幅に変化がないように、ボックスの左と右の部分も下にあるテキストを占めるようにする方法はありますか?


すべてを強調表示しても、列は整列したままですか?
Melioratus

@Melioratus、はい、追加された幅は均一で一定です。
Pouya

回答:


3

このSEの使用例は、region顔の周りにボックスを配置することです。そのためtransient-mark-mode、領域が他のオーバーレイと重なっている場合でも、で強調表示された領域が表示されます。

(set-face-attribute 'region nil
                    :box '(:line-width -1
                           :color "gtk_selection_bg_color"
                           :style nil))

たとえば、次のようにiedit-mode

ieditオーバーレイと重複するボックス領域オーバーレイ

テキストが「ボックス領域」で強調表示されるたびに、説明されているテキストの幅がちらつくのがわかります。

このちらつきを解消するために見つけた汚いハックは、背景色のボックスをdefault顔に追加することです。残念ながら、このようなハッキングは、行間の追加のギャップやボタンウィジェットの不適切なレンダリング(カスタマイズバッファーなど)など、他の場所で多くの問題を引き起こします。

最終的な解決策は、次のバグレポートに記載されています(スレッドの最後にある添付のパッチを参照)。

有効なテキストの周囲のボックスでカーソルが動くカーソルのちらつき

このソリューションはEmacsの内部に影響を及ぼし、パッチを適用した後にEmacsのカスタムビルドが必要です。

私は後の解決策をすぐに試すつもりです。ただし、問題はinit.el、ストックのEmacsビルドと互換性がなくなり、上記のパッチが適用されているかどうかを確認するために追加のロジックを使用する必要があることです。

うまくいけば、いくつかのテストの後、このパッチはEmacsソースに受け入れられるでしょう...

2019-01-21フォローアップ:

上記のパッチは最新のEmacsソースコードと互換性がないようです。現在のEmacs git masterブランチで動作させるために、いくつか変更を加える必要がありました。別のパッチを作成する代わりに、githubにフォークを作成し、フェイスボックスパッチを使用して上流からブランチを作成しました。

フェイスボックスパッチ

このブランチからEmacsをビルドすることは、ストックEmacsビルドと同じです。

以下は、init.elパッチが適用されたバージョンとバニラのEmacsバージョンの両方と互換性のあるコードです。

(unwind-protect
    (condition-case ex
        (set-face-attribute
         'region nil
         :box '(:line-width (-1 . -1)
                            :color "gtk_selection_bg_color"
                            :style nil))
      ('error
       (set-face-attribute
        'region nil
        :box '(:line-width -1
                           :color "gtk_selection_bg_color"
                           :style nil)))))

GTK +を搭載したLinuxでのみテストされています


素敵な発見!パッチは1年前だったようですので、受け入れられるとは思いません。
amitp

私はパッチを適用し、現在、負のボックス幅を喜んで使用しています:-)ありがとうございます!
amitp

@amitp Alexandreのパッチが機能していることを確認していただき、ありがとうございます。Emacsのどのバージョン、OS、およびGUIを使用していますか?
Victor Rybynok

「Macポート」の GUIバージョンを使用しています。Emacs 26.1.91。パッチを適用した後は、Mac固有のファイル(macterm.c)を変更して、残りのコードと同じ変更を加える必要がありました。パッチは私が本当に望んでいるよりもはるかに効果があると思います。私は変更することができるはずだと思います(ただし、テストしていない)eabs (s->face->box_line_width)max (s->face->box_line_width, 0)していないその他の変更。
amitp

1日使用した後、少し不具合が発生しました。これらがパッチによるものなのか、macterm.cへの変更によるものなのかはわかりません。いずれにしても、私は元に戻ってしまいました。
amitp
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.