27 April 2014

(Ubuntu 14.04, 18.04) Nautilusの日付形式が変更できないのを解決する

Ubuntu 14.04のNautilus(ファイルマネージャ)は、(Ubuntu 12.04の)前バージョンに比べて、カスタマイズ性に劣っている。

特に問題なのが、日時の形式(Date Format)が全く変更できないこと。 ファイル管理には、「年月日 時分秒」が必要なのに、直近の日時のものは「月日」や「時分」のみの表示となる糞仕様。

ソースコードを少しだけいじって、何とかしてみる

ソースコードの入手と、ビルド環境の準備

apt-get source nautilus
sudo apt-get build-dep nautilus
sudo apt-get install tracker-sparql

ソースコードの修正

nautilus-3.10.1/libnautilus-private/nautilus-file.c
static char *
nautilus_file_get_date_as_string (NautilusFile *file, NautilusDateType date_type, gboolean compact)
{
    time_t file_time_raw;
    const char *format;
    char *result = NULL;
    GDateTime *date_time, *today;
    int y, m, d;
    int y_now, m_now, d_now;
    GDesktopClockFormat value;
    gboolean use_24;
 
    if (!nautilus_file_get_date (file, date_type, &file_time_raw)) {
        return NULL;
    }
 
    date_time = g_date_time_new_from_unix_local (file_time_raw);
 
    g_date_time_get_ymd (date_time, &y, &m, &d);
 
    today = g_date_time_new_now_local ();
    g_date_time_get_ymd (today, &y_now, &m_now, &d_now);
    g_date_time_unref (today);
 
    value = g_settings_get_enum (gnome_interface_preferences, "clock-format");
    use_24 = value == G_DESKTOP_CLOCK_FORMAT_24H;
 
    if (!compact) {
        format = use_24 ? FULL_FORMAT_24 : FULL_FORMAT;
    } else if (y == y_now && m == m_now && d == d_now) {
        format = use_24 ? TODAY_TIME_FORMAT_24 : TODAY_TIME_FORMAT;
    } else if (y == y_now && m == m_now) {
        format = THIS_MONTH_TIME_FORMAT;
    } else if (y == y_now) {
        format = THIS_YEAR_TIME_FORMAT;
    } else {
        format = ANYTIME_TIME_FORMAT;
    }
 
//  result = g_date_time_format (date_time, _(format));
    result = g_date_time_format (date_time, "%Y-%m-%d %H:%M:%S");
 
    g_date_time_unref (date_time);
 
    return result;
}

'aclocal-1.13' is missing on your system というエラーがmake時に発生するため、現在システムにインストールされている 1.14.1 に無理やり書き換えてしまう。(とにかく、1.13.x と書かれているところを 1.14.1 に書き換え。 悪影響は… 知らん)

nautilus-3.10.1/aclocal.m4
# generated automatically by aclocal 1.13.4 -*- Autoconf -*-
 
# Copyright (C) 1996-2013 Free Software Foundation, Inc.
 
 〜 中略 〜
 
# AM_AUTOMAKE_VERSION(VERSION)
# ----------------------------
# Automake X.Y traces this macro to ensure aclocal.m4 has been
# generated from the m4 files accompanying Automake X.Y.
# (This private macro should not be called outside this file.)
AC_DEFUN([AM_AUTOMAKE_VERSION],
[am__api_version='1.14'
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
dnl require some minimum version.  Point them to the right macro.
m4_if([$1], [1.14.1], [],
      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
])
 
 〜 中略 〜
 
# AM_SET_CURRENT_AUTOMAKE_VERSION
# -------------------------------
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
[AM_AUTOMAKE_VERSION([1.14.1])dnl
m4_ifndef([AC_AUTOCONF_VERSION],
  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])

※ 追記 2016/02/10
次のコマンドでconfigureファイルを再構築することで、automakeのバージョンを自動的に現在インストールされているものにアップデートすることができる。

aclocal
automake
autoconf
configure

ソースコードのビルドとインストール

cd nautilus-3.10.1
automake
./configure --prefix=/usr
make

インストールは、nautilus本体の実行ファイルのみを強制上書きする。(オリジナルのファイルのバックアップも取っておく)

sudo mv /usr/bin/nautilus /usr/bin/nautilus.original
sudo chmod -x /usr/bin/nautilus.original
sudo cp src/.lib/nautilus /usr/bin/
sudo chmod +x /usr/bin/nautilus

念の為、OSを再起動する

改造の結果

■ 改造前

20140427-nautilus-org.jpg

■ 改造後

20140427-nautilus-new.jpg

他の解決法 : nemo のインストール

nemo本体だけならUbuntuの標準リポジトリに含まれているが、プラグインは次のようにPPAを使ってインストールする

sudo add-apt-repository ppa:webupd8team/nemo
sudo apt-get update
audo apt-get install nemo

20140427-nemo.jpg

参考資料

Where is "Date Format" preference in Nautilus 14.04 settings?
Unhappy with 14.04 Nautilus; how many are installing diff file-browser?

Ubuntu 18.04での方法

Ubuntu 18.04にインストールされているNautilus(version 3.26)はビルド方法がmesonに変更されているため、少し工夫がいる

ソースコードも少しだけ変化があり、修正箇所は次の通り

nautilus-3.26.4/src/nautilus-file.c
static char *
nautilus_file_get_date_as_string (NautilusFile       *file,
                                  NautilusDateType    date_type,
                                  NautilusDateFormat  date_format)
{
    time_t file_time_raw;
    GDateTime *file_date_time, *now;
    GDateTime *today_midnight;
    gint days_ago;
    gboolean use_24;
    const gchar *format;
    gchar *result;
    gchar *result_with_ratio;
 
 〜 中略 〜
 
        g_date_time_unref (file_date);
        g_date_time_unref (now);
        g_date_time_unref (today_midnight);
    }
    else
    {
        /* xgettext:no-c-format */
        format = _("%c");
    }
 
//    result = g_date_time_format (file_date_time, format);
    result = g_date_time_format (file_date_time, "%Y-%m-%d  %H:%M:%S");
    g_date_time_unref (file_date_time);
 
    /* Replace ":" with ratio. Replacement is done afterward because g_date_time_format
     * may fail with utf8 chars in some locales */
//    result_with_ratio = eel_str_replace_substring (result, ":", "∶");
    result_with_ratio = eel_str_replace_substring (result, ":", "։");
    g_free (result);
 
    return result_with_ratio;
}

青の部分をコメントアウトし、赤の部分に変更している。なお、2個めの修正箇所は半角コロン(:)を全角コロン(:)に変更しているもとのソースコードを、半角コロンぽく見える文字(։)(Unicode U+0589 Armenian Full Stop)に変更している。これは、gnomeのutf8文字列変換にバグがあり半角コロンを扱えない回避措置に伴うもの。

見かけだけは半角コロンに見えるようになる…

Gnomeデスクトップの時計表示が、妙に間延びしている全角コロン(:)なのは、このバグに原因があるようだ。

ソースコードの修正が完了したら、mesonを使ってビルドする

cd nautilus-3.26.4
meson . ./build    ←  第1引数=ソースディレクトリ、第2引数=出力ディレクトリ

buildディレクトリが作成され、その中にコンパイラやリンカに引き渡す設定ファイルが作成される。
まずは、吐き出された設定値を確認する

meson configure ./build
 
〜 表示中略 〜
Directories:
  Option         Current Value        Description
  ------         -------------        -----------
  prefix         /usr/local           Installation prefix.
  libdir         lib/x86_64-linux-gnu Library directory.

インストールディレクトリが/usr/localになっているため、これを/usrに変更する

※インストールディレクトリを変更しないと、コンテキストメニュー(右クリックメニュー)に拡張機能で追加された項目が表示されない。これは、拡張機能が/usr/lib/x86_64-linux-gnu/nautilus/extensions-3.0に格納されているため、もとの設定/usr/local/lib/…では拡張機能のファイルが見つからないため。

meson configure -Dprefix=/usr ./build

そしてビルドを行い、ソースコードをシステムにコピーする

ninja -C ./build
sudo cp ./build/src/nautilus /usr/bin/nautilus

なお、./build/nautilus-desktopに出力されるnautilus-desktopファイルもシステムにコピーすべきだが、今回はデスクトップに対する変更は行っていないので、もとのファイルを使い続けても特に問題はない。

Gnomeデスクトップのタスクバー時計のコロンが全角であるのを修正する

Google検索でこのページにたどり着く人も居るようで… Gnomeデスクトップのタスクバー(システムトレイ)に表示される時計のコロンが間延びしているのは、Gnomeデスクトップをビルドし直さなくても

Clock Override 拡張機能 』を導入するだけで解決する。もちろん、半角コロンではなく半角コロンぽく見える文字(։)(Unicode U+0589 Armenian Full Stop)を使ってください…

20190901-gnometaskbar.jpg
Clock Overrideでカスタマイズ後