Emacs で Helm をストレスなく使うための個人的な設定 (2)

前回、次のようなエントリーを書きました。
Emacs で Helm をストレスなく使うための個人的な設定 - あらびき日記

他にも辛いことがあったので続編です。
前回は 1 点を除いては advice で対処していましたが、限界を感じてきたので fork して関数の内容を直接書き換えることにしました。

というわけで、以下、ストレスだった点と対処法です。

helm-find-files の persistent-action でシンボリックリンクを辿ってしまう

何が困るかって、あるディレクトリのファイルを選択しようとしている時に誤ってシンボリックリンクに対して persistent-action を実行してしまったら、元のディレクトリまで再度移動しないといけないわけですよ。
これが本当に苦痛で苦痛で・・・。

この挙動を変更するには次のように関数を書き換えます。

diff --git a/helm-files.el b/helm-files.el
index decde8b..f6b8ffd 100644
--- a/helm-files.el
+++ b/helm-files.el
@@ -1929,8 +1929,7 @@ If a prefix arg is given or `helm-follow-mode' is on open file."
           ( ;; A symlink directory, expand it's truename.
            (and (file-directory-p candidate) (file-symlink-p candidate))
            (funcall insert-in-minibuffer (file-name-as-directory
-                                          (file-truename
-                                           (expand-file-name candidate)))))
+                                           (expand-file-name candidate))))
           ;; A directory, open it.
           ((file-directory-p candidate)
            (when (string= (helm-basename candidate) "..")
@@ -1939,7 +1938,7 @@ If a prefix arg is given or `helm-follow-mode' is on open file."
                                           (expand-file-name candidate))))
           ;; A symlink file, expand to it's true name. (cl-first hit)
           ((and (file-symlink-p candidate) (not current-prefix-arg) (not follow))
-           (funcall insert-in-minibuffer (file-truename candidate)))
+           (funcall insert-in-minibuffer candidate))
           ;; A regular file, expand it, (cl-first hit)
           ((and (>= num-lines-buf 3) (not current-prefix-arg) (not follow))
            (funcall insert-in-minibuffer new-pattern))

cf. https://github.com/abicky/helm/commit/6ddf643

helm-buffers-list でパターンを入力するとよくわからない順番にソートされる

Emacs は select-window の際に、最近使われた buffer が先頭に来るように buffer のリストを更新します。なので、buffer-list の結果をソートしなければ最近利用したバッファが上に来るようになるんです。
ところが、helm-buffers-list はパターンが入力されていない場合はソートせずに候補を表示し、パターンが入力されるとバッファ名の長さでソートして表示します。

この意味不明な仕様はデメリットしか感じられません。
というわけで、次のような変更を加えて解決です。

diff --git a/helm-buffers.el b/helm-buffers.el
index 0697e4a..fafa63e 100644
--- a/helm-buffers.el
+++ b/helm-buffers.el
@@ -644,7 +644,6 @@ displayed with the `file-name-shadow' face if available."
                                          (helm-ediff-marked-buffers candidate t))))
       (persistent-help . "Show this buffer")
       (filtered-candidate-transformer helm-skip-boring-buffers
-                                      helm-buffers-sort-transformer
                                       helm-highlight-buffers))
   "Buffer or buffer name.")

cf. https://github.com/abicky/helm/commit/779b458

helm-find-files で現在のファイルが preselect されてしまう

個人的に C-x C-f で現在のディレクトリを Dired で開きたいです。この仕様のせいでそれができません。 自分にとって現在のファイルが preselect されることのメリットがほぼ皆無だったので書き換えました。

diff --git a/helm-files.el b/helm-files.el
index f6b8ffd..fa1173c 100644
--- a/helm-files.el
+++ b/helm-files.el
@@ -2703,7 +2703,6 @@ This is the starting point for nearly all actions you can do on files."
                               (default-input)
                               (t (expand-file-name (helm-current-directory)))))
          (presel        (helm-aif (or hist
-                                      (buffer-file-name (current-buffer))
                                       (and (eq major-mode 'dired-mode)
                                            default-input))
                             (if helm-ff-transformer-show-only-basename

cf. https://github.com/abicky/helm/commit/77cdbf9

helm-buffers-list のバッファ名の領域が狭い

自分は uniquify でバッファ名がユニークになるようにしています。そうするとデフォルトの 20 文字だと狭すぎます。
というわけで、次のように helm-buffer-max-length を 50 にセットするようにしました。

(setq helm-buffer-max-length 50)

また、バッファサイズが邪魔です。自分の場合はバッファを選択する際にサイズを見ることがないので表示しないようにしました。

diff --git a/helm-buffers.el b/helm-buffers.el
index ff14bae..0697e4a 100644
--- a/helm-buffers.el
+++ b/helm-buffers.el
@@ -236,7 +236,7 @@ See `ido-make-buffer-list' for more infos."
         (concat name-prefix
                 (propertize name 'face 'helm-ff-directory
                             'help-echo dir))
-        size mode
+        mode
         (and details (propertize (format "(in `%s')" dir) 'face 'helm-buffer-process))))
       ;; A buffer file modified somewhere outside of emacs.=>red
       ((and file-name (file-exists-p file-name)
@@ -245,7 +245,7 @@ See `ido-make-buffer-list' for more infos."
         (concat name-prefix
                 (propertize name 'face 'helm-buffer-saved-out
                             'help-echo file-name))
-        size mode
+        mode
         (and details (propertize (format "(in `%s')" dir) 'face 'helm-buffer-process))))
       ;; A new buffer file not already saved on disk.=>indianred2
       ((and file-name (not (verify-visited-file-modtime buf)))
@@ -253,7 +253,7 @@ See `ido-make-buffer-list' for more infos."
         (concat name-prefix
                 (propertize name 'face 'helm-buffer-not-saved
                             'help-echo file-name))
-        size mode
+        mode
         (and details (propertize (format "(in `%s')" dir) 'face 'helm-buffer-process))))
       ;; A buffer file modified and not saved on disk.=>orange
       ((and file-name (buffer-modified-p buf))
@@ -261,7 +261,7 @@ See `ido-make-buffer-list' for more infos."
         (concat name-prefix
                 (propertize name 'face 'helm-ff-symlink
                             'help-echo file-name))
-        size mode
+        mode
         (and details (propertize (format "(in `%s')" dir) 'face 'helm-buffer-process))))
       ;; A buffer file not modified and saved on disk.=>green
       (file-name
@@ -269,14 +269,14 @@ See `ido-make-buffer-list' for more infos."
         (concat name-prefix
                 (propertize name 'face 'font-lock-type-face
                             'help-echo file-name))
-        size mode
+        mode
         (and details (propertize (format "(in `%s')" dir) 'face 'helm-buffer-process))))
       ;; Any non--file buffer.=>grey italic
       (t (list
           (concat (when proc name-prefix)
                   (propertize name 'face 'italic
                               'help-echo buffer))
-          size mode
+          mode
           (and details
                (propertize
                 (if proc

cf. https://github.com/abicky/helm/commit/9a7e7a7

ファイル選択の際に C-l で上のディレクトリに移動しても元のディレクトリが選択される

この仕様のせいでハマることが度々ありました。例えば Dired からファイルを上のディレクトリに移動する際、C-l を押しても、現在のディレクトリが選択されている状態になるので何も起こりません。 rgrep の際も、上のディレクトリを起点に走査しようとして C-l を押しても現在のディレクトリの走査結果しか表示されません。 いちいち M-< で . を選択しないといけないのです。

自分にとってはメリットよりデメリットの方が大きかったので変更しました。

diff --git a/helm-files.el b/helm-files.el
index fa1173c..47775ad 100644
--- a/helm-files.el
+++ b/helm-files.el
@@ -1174,7 +1174,6 @@ If prefix numeric arg is given go ARG level down."
             ((and cur-cand (file-exists-p cur-cand))
              (setq helm-ff-last-expanded cur-cand)))
       (helm-set-pattern new-pattern)
-      (with-helm-after-update-hook (helm-ff-retrieve-last-expanded))
       (helm-check-minibuffer-input))))

 (defun helm-ff-retrieve-last-expanded ()

cf. https://github.com/abicky/helm/commit/7aae445

helm-find-files の候補に .. が含まれる

.. が含まれること自体はそれほど問題ないんですが、pattern を入力してすぐ persistent-action を実行すると上のディレクトリに移動するということがよくあります。
再現条件がよくわかっていないですが、おそらく .. が候補に含まれることが原因です。個人的には .. が必要になることはまずないので候補から外しました。

diff --git a/helm-files.el b/helm-files.el
index 47775ad..9ef606b 100644
--- a/helm-files.el
+++ b/helm-files.el
@@ -1470,15 +1470,14 @@ purpose."
   "List contents of DIRECTORY.
 Argument FULL mean absolute path.
 It is same as `directory-files' but always returns the
-dotted filename '.' and '..' even on root directories in Windows
+dotted filename '.' even on root directories in Windows
 systems."
   (setq directory (file-name-as-directory
                    (expand-file-name directory)))
   (let ((ls   (directory-files
                directory full directory-files-no-dot-files-regexp))
-        (dot  (concat directory "."))
-        (dot2 (concat directory "..")))
-    (append (list dot dot2) ls)))
+        (dot  (concat directory ".")))
+    (append (list dot) ls)))

 (defun helm-ff-handle-backslash (fname)
   ;; Allow creation of filenames containing a backslash.

cf. https://github.com/abicky/helm/commit/9252e43

以上です!これでかなりましになった気がします。