Eu gostaria de poder ver o local do diretório pai do arquivo atual, independentemente do nome do buffer atual.
Eu gostaria de poder ver o local do diretório pai do arquivo atual, independentemente do nome do buffer atual.
Respostas:
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 :propertize
construçã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.ext
e file.ext<2>
. Você pode ajustar o formato customizando uniquify-buffer-name-style
.
(require 'uniquify)
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-line
faz).
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.
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).