Como posso exibir o diretório pai do arquivo atual na modeline?

11

Eu gostaria de poder ver o local do diretório pai do arquivo atual, independentemente do nome do buffer atual.

secondplanet
fonte
Talvez usando a biblioteca uniquify é desejada solução (ver resposta Gilles)
alex_1948511

Respostas:

12

Você pode configurar o formato da linha de modo como desejar. Se você deseja mostrar o diretório pai junto com o nome do buffer (que geralmente é o nome do arquivo, para um buffer que está visitando um arquivo), modifique mode-line-buffer-identification; caso contrário, adicione uma entrada a mode-line-format. Não há uma construção interna para o "diretório pai do arquivo atual", portanto, você precisará criar isso sozinho , por exemplo, com :eval. Aqui está um exemplo que adiciona o nome do diretório após o nome do buffer e não faz nada nos buffers que não estão visitando arquivos (incluindo Dired); convém refiná-lo com formatação.

(defun mode-line-buffer-file-parent-directory ()
  (when buffer-file-name
    (concat "[" (file-name-nondirectory (directory-file-name (file-name-directory buffer-file-name))) "]")))
(setq-default mode-line-buffer-identification
      (cons (car mode-line-buffer-identification) '((:eval (mode-line-buffer-file-parent-directory)))))

Outro método seria definir uma variável contendo o texto que você deseja find-file-hooks. Também mostro como você pode definir propriedades com a :propertizeconstrução.

(defvar buffer-file-parent-directory nil
  "Parent directory of the current directory.
This variable is nil if the current buffer isn't visiting a file.")
(make-variable-buffer-local 'buffer-file-parent-directory)
(put 'buffer-file-parent-directory 'permanent-local t)
(defconst mode-line-buffer-file-parent-directory
  '(:propertize (list buffer-file-parent-directory "/") face mode-line-buffer-id))
(defun set-buffer-file-parent-directory ()
  (when buffer-file-name
    (setq buffer-file-parent-directory
          (file-name-as-directory (file-name-nondirectory (directory-file-name (file-name-directory buffer-file-name)))))))
(add-hook 'find-file-hook 'set-buffer-file-parent-directory)
(let ((list mode-line-format))
  (while (not (eq (car list) 'mode-line-buffer-identification))
    (setq list (cdr list)))
  (setcdr list (cons (car list) (cdr list)))
  (setcar list 'mode-line-buffer-file-parent-directory))

Se o que você realmente queria era ter o nome do diretório, caso você tenha vários arquivos com o mesmo nome em diretórios diferentes, o Emacs tem isso incorporado, com a biblioteca uniquify . Quando houver vários buffers com o mesmo nome, essa biblioteca fará com que o nome do buffer seja parecido file.ext<foo>e, em file.ext<bar>vez de file.exte file.ext<2>. Você pode ajustar o formato customizando uniquify-buffer-name-style.

(require 'uniquify)
Gilles 'SO- parar de ser mau'
fonte
9

Eu suponho que você quer dizer que deseja ver o diretório em vez do nome do buffer.

(setq-default mode-line-buffer-identification
              '(:eval default-directory))

Ou se você deseja que seu diretório pessoal seja abreviado para ~/(em vez de um nome de arquivo absoluto, a partir da raiz), então:

(setq-default mode-line-buffer-identification
              '(:eval (abbreviate-file-name default-directory)))

Ou se você deseja apenas o nome do diretório pai, como um único nome de componente do diretório, então:

(setq-default mode-line-buffer-identification
              '(:eval (file-name-nondirectory
                        (directory-file-name default-directory))))

Ou se você deseja manter também o nome do buffer, como supõe @Malabarba, então:

(setq-default mode-line-buffer-identification
              (let ((orig  (car mode-line-buffer-identification)))
                `(:eval (cons (concat ,orig (abbreviate-file-name default-directory))
                              (cdr mode-line-buffer-identification)))))

O ponto é que você só precisa usar o valor de default-directory(possivelmente simplificado a partir de um nome absoluto, se desejar) em mode-line-buffer-identification. Você pode definir essa variável apenas para o nome do diretório ou para um valor que também mantenha o nome do buffer.

Se o que você pede é tudo o que deseja, é simples configurar a linha de modo para incluir o default-directory, no entanto, você deseja que ela apareça. Não há necessidade de carregar várias bibliotecas para isso (é o que smart-mode-linefaz).

Desenhou
fonte
11
Apesar de sua redação, acho que ele quis dizer "além de" não "em vez disso". Claro, eu posso estar errado.
Malabarba 19/10/2014
11
@ Malabarba: Talvez. Nesse caso, a diferença é trivial - adicionada.
Tirou
7

Você instala o uso de linha de modo inteligente . Ele está configurado para exibir o caminho do arquivo na linha de modo, sempre que isso for relevante.

tema escuro

Basta instalá-lo e depois ativá-lo (sml/setup).

Ele também possui muitos recursos para tornar a exibição mais concisa. Por exemplo, “~ / .emacs.d /” é substituído por “: ED:” (e você pode configurar outras substituições).

Malabarba
fonte