モードラインでのVCモードの外観のカスタマイズ


7

次のようvc-modeに、現在のVC状態に関する情報をモードラインに表示するために使用します。

(setq mode-line-format '(… (vc-mode vc-mode) …))

しかし、私はvc-modeかなり冗長なデフォルトのフォーマットを見つけました。特に、現在のVCバックエンドの名前が含まれていますが、これは特に興味深いものではありません。通常、現在のバッファーがどのVCSであるかを知っており、Git以外のVCSは実際には使用していません。

の外観をカスタマイズするにはどうすればよいvc-modeですか?理想的には、バックエンドの名前を非表示にして、現在のブランチの名前(またはおそらくに似たものgit describe)のみを表示します。

または、vc-modeカスタマイズできない場合、カスタム(:eval …)構成で使用するために、VCから現在のブランチ名を何らかの方法で取得できますか?

mode-line  git  vc 

回答:


5

の外観をカスタマイズするにはどうすればよいvc-modeですか?理想的には、バックエンドの名前を非表示にして、現在のブランチの名前のみを表示します。

これは、smart-mode-lineが行うこととほぼ同じ です。あなたはそれを試してみることができます、またはあなたはそれが使うアドバイスを単にコピーすることができます:

(defadvice vc-mode-line (after strip-backend () activate)
  (when (stringp vc-mode)
    (let ((noback (replace-regexp-in-string 
                   (format "^ %s" (vc-backend buffer-file-name))
                   " " vc-mode)))
      (setq vc-mode noback))))

これは合理化されたバージョンであることに注意してください。ここでアドバイスの完全なコードを見つけることができます 。これは、ブランチの状態に応じてさまざまな顔にも適用されます。


別の方法として、アドバイスを使用しない、さらに効率化されたバージョンを次に示します。

(setcdr (assq 'vc-mode mode-line-format)
        '((:eval (replace-regexp-in-string "^ Git" " " vc-mode))))

これは機能します。ただし:eval、アドバイスの代わりに構成体を使用したいのですが、それは、私が "カスタマイズ"と呼ぶものとは異なります。汚いハックですね。私はもっ​​とすっきりした方法を好むと思います…

1
@lunaryornはい、それはハックです。vc-mode(私が知ることができる)この面で高度にカスタマイズ可能ではありません。私ももっとすっきりしたほうがいいです。:-)
マラバルバ2015

2
@lunaryorn :eval構成を使用するように回答を編集しました。
マラバルバ2015

3

デフォルトの動作にも満足できませんでした。私はvc情報文字をまっすぐに保つことはできませんでした。 ":"は編集済み、 "@"は追加済みなどです。私の方法を自由に使用できます。

ステータスをさまざまな色で表示するために、いくつかのカスタム面を定義しました。次に、デフォルトのvc情報を文字列に変換してモード行に挿入する関数を作成しました。次に、それを:eval表示するために、モード行定義に行を追加しました。

;; 面を定義します。

(defface my / mode:vc-added
  `(
     (((クラスカラー))
        (:background "#FFAA55":foreground "black"))
     (t
        (:太字、太字:下線t))
   )
  「追加されたばかりのファイルのVCステータスタグフェイス
バージョン管理。"
  :グループ 'MY /モード)

(defface my / mode:vc-edited
  `(
     (((クラスカラー))
        (:background "#F05B80":foreground "black")); 「#F04040」多分?
     (t
        (:太字、太字:下線t))
   )
  「バージョン管理下にあるファイルのVCステータスタグフェイス
しかし、それらは編集されました。」
  :グループ 'MY /モード)

(defface my / mode:vc-in-sync
  `(
     (((クラスカラー))
        (:background "#60CC60":foreground "black"))
     (t
        (:太字、太字:下線t))
   )
  「バージョン管理下にあるファイルのVCステータスタグフェイス
リポジトリと同期しています。」
  :グループ 'MY /モード)

(defface my / mode:vc-none
  `(
     (((クラスカラー))
        (:background "#70A0D0":foreground "black"))
     (t
        (:太字、太字:下線t))
   )
  「バージョン下にないファイルのVCステータスタグフェイス
コントロール"
  :グループ 'MY /モード)

(defface my / mode:vc-unknown
  `(
     (((クラスカラー))
        (:background "#FF0000":foreground "white"))
     (t
        (:太字、太字:下線t))
   )
  「バージョン管理ステータスのファイルのVCステータスタグフェイス
決定できません。」
  :グループ 'MY /モード)

(defvar my-vc-mode-attrs
  '(( ""。( "NoVC" my / mode:vc-none))
    ( "-"。( "VC =" my / mode:vc-in-sync))
    ( ":"。( "VC>" my / mode:vc-edited))
    ( "@"。( "VC +" my / mode:vc-added))
    ( "?"。( "?VC?" my / mode:vc-unknown))
    )
  「vcモード文字を別の文字列/面に変換するための参照テーブル。」
)


;; この機能は、バージョン管理ステータスを理解するのに役立ちます。
(defun my-mode-line-vc-info()
  「ファイルに関するバージョン管理ステータス情報を
フォント化された文字列としての現在のバッファ。

モードライン変数 `vc-mode 'は、ファイルが存在しない場合はnilです。
バージョン管理。ハイフンまたはコロンを表示します。
ファイルはチェックイン以降に変更されています。私はそれらを保つことはできません
まっすぐ。

この関数は、ファイルにバージョンがない場合、「NoVC」を返します 
コントロール。ファイルが同期している場合、=記号付きの文字列を表示します
バージョンコントロールと、ファイルに>記号が付いた文字列
前回のチェックイン以降に変更されました。」
  (レット*((クラス
          (条件
           ;; バージョン管理されていない場合
           ((vcモードではない)
            「」)

           ;; バージョン管理下にある場合、-:@文字をデコードします。
           ((string-match "\\`?\\(?: CVS \\ | Git \\)\\([-:@] \\)\\([^^:〜\ x00- \ x1F \\\ \ /] + \\)? "vc-mode)
            (match-string-no-properties 1 vc-mode))

           ;; それ以外の場合は、混乱を示します
           (t
            「?」)
           ))

         (ブランチ
          (if(任意のクラス '( "-" ":" "@"))
              (concat ""(match-string-no-properties 2 vc-mode))
            「」))

         ;; 上記のクラス文字のプロパティリストを取得する
         (小道具(cdr(assocクラスmy-vc-mode-attrs)))
         )

    (concat(propertize(car props) 'face(cadr props))
            ブランチ)))

(set-default 'mode-line-format
   '(
     ...
        (:eval(my-mode-line-vc-info))
     ...))

ありがとう。これは、自分の構成にコピーする必要があるもののようです:)

関数はanyどこで入手できますか?
MonLau
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.