Como personalizar a indentação no modo organizacional?

12

essa pergunta realmente surge porque eu gosto de usar fontes não monoespaçadas (Sabon, Minion, Garamond etc.) Isso causa um problema ao usar o modo de indentação orgânica, pois o texto sob as manchetes agora não está alinhado com as manchetes. Exemplo: insira a descrição da imagem aqui

A fonte é Georgia. Agora, se eu mudar para consolas:

insira a descrição da imagem aqui

Eu acho que o problema é que, em fontes não monoespaçadas, o "espaço" e o * não ocupam o mesmo espaço. Embora eu não saiba como resolver isso. Eu pesquisei na internet e não consegui encontrar um tutorial para ajustar o recuo. Eu tentei ler org-indent.el, mas é um tiro no escuro para eu entender. A ajuda é muito apreciada!

Alex
fonte
Também gosto de usar fontes serif com espaçamento proporcional no Emacs e tive problemas semelhantes. Eu estive pensando que talvez alguns ajustes na fonte possam ajudar, mas ainda não o examinei completamente.
Christian Gagné
1
Parece que isso não tem nada a ver com o modo Org e você está se perguntando como alinhar fontes não monoespaçadas. A resposta é que você precisa fazer isso usando código - não pode confiar em caracteres de espaço com a mesma largura que outros caracteres, etc. Em resumo, em geral, você está sem sorte.
Tirou
@ Drew você pode estar certo "em geral". Mas, para esse problema específico, há uma solução, veja minha resposta. Os espaços iniciais usados ​​para indentação por org-indentnão estão realmente lá, são apenas line-prefixpropriedades, portanto podem ser substituídos por qualquer outro caractere, desde que invisível.
descontinuado
@ reprovado: Entendo. Obrigado pela correção. BTW, talvez a própria organização possa, por padrão, fazer o que você sugere. Ou apenas use SPCchars, mas com a propriedade text (ou overlay) que impõe uma face que (por padrão) possui uma fonte monoespaçada. Talvez uma solicitação de aprimoramento da organização esteja em ordem. ;-)
Drew
@ Drew é realmente muito fácil fazer isso com o bloqueio de fonte, não é?
Clément

Respostas:

9

Uma solução é modificar org-indent-stringspara usar estrelas em vez de espaços como o caractere de indentação. Isso significa que a largura da indentação sempre estará correta, mesmo ao usar uma fonte proporcional. O truque é definir a cor de primeiro plano da indentação como a cor de fundo, para que as estrelas fiquem invisíveis.

Podemos conseguir isso com o seguinte código, que aconselha a função org-indent-initialize:

(require 'cl)
(defun org-indent-use-stars-for-strings ()
  "Initialize the indentation strings with stars instead of spaces."
  (setq org-indent-strings (make-vector (1+ org-indent-max) nil))
  (aset org-indent-strings 0 nil)
  (loop for i from 1 to org-indent-max do
    (aset org-indent-strings i
          (org-add-props
          (concat (make-string (1- i) ?*) ; <- THIS IS THE ONLY CHANGE
              (char-to-string org-indent-boundary-char))
          nil 'face 'org-indent))))

(advice-add 'org-indent-initialize :after #'org-indent-use-stars-for-strings)
(set-face-foreground 'org-indent "white")

O resultado é assim para mim no Mac OS X usando emacs -Qe (set-face-font 'default :family "Gill Sans"):

insira a descrição da imagem aqui

descontinuada
fonte
Oi @ obsoleto, muito obrigado por fornecer a resposta! Esta é uma pergunta boba, mas devo colocar seu código no org-indent.el ou no meu init.el? Nem parece funcionar para mim. Estou usando o Emacs 24.4 no Windows - preciso compilar alguma coisa ou o quê? Obrigado!
Alex
tudo bem, eu fiz uma pergunta estúpida. Eu preciso compilar org-indent.el. Para referência futura: a maneira mais fácil seria alterar esta linha: (concat (make-string (1- i) ?\ ) para (concat (make-string (1- i) ?*) na definição de org-indent-initializeie (defun org-indent-initialize... , use Mx byte-compile-file para compilar org-indent.el a org-indent.elc. Em seguida, reinicie o emacs.
Alex
3

a resposta de obsoleta é muito boa, mas não funcionou muito bem para mim. Atualmente, estou no Emacs 24.4 e na 8.2.4, e o conselho org-indent-initializenão fez nada. Eu tive que redefinir a função com o caractere de recuo alterado, e isso funcionou. Talvez quando eu atualizar para o Emacs 24.5 e org 8.3, o aviso funcionará.

Mas também tive que fazer alguns outros ajustes, porque uso fontes de tamanho variável de tamanho diferente para diferentes níveis de cabeçalho, o que significa que um cabeçalho de nível 1 *não tem a mesma largura que um de nível 2 e assim por diante.

Então eu também tive que fazer isso:

  1. Defina as faces org-hide(usadas para recuar linhas de título) e org-indent(usadas para recuar linhas que não sejam de título) para garantir que elas usem a mesma fonte no mesmo tamanho.
  2. Defina a variável org-indent-boundary-charactercomo em *vez do padrão (um espaço). Esse é o caractere que é inserido após os caracteres de recuo, mas antes do conteúdo. Não tenho certeza se mudar isso é uma necessidade, mas parece ajudar a consistência. Pode depender da fonte que você está usando, tamanhos, etc.

Fazer essas coisas, além de fazer a alteração org-indent-initializecomo obsoleta fornecida, parece ter feito isso. Acabo com um buffer parecido com este:

captura de tela

Você pode ver que, à medida que o nível do título diminui, o recuo não se alinha perfeitamente ao texto do cabeçalho. Acho que é por causa do uso de fontes menores para títulos de nível inferior, e não acho que haja uma maneira fácil de corrigir isso. Pode ser possível fazer algo com propriedades de texto comoline-prefix e wrap-prefix, porque elas podem ser configuradas para imagens e caracteres especiais, mas isso provavelmente seria complicado e lento. Se você usar o mesmo tamanho de fonte para todos os níveis de cabeçalho, isso provavelmente não será um problema.

Enfim, isso provavelmente é bom o suficiente. :)

PS Conforme solicitado, aqui estão meus org-levelrostos. Eles são copiados custom-set-faces, mas se você não usar, customizepode configurá-los fora dele.

 '(org-level-1 ((t (:inherit variable-pitch :foreground "#cb4b16" :weight bold :height 1.3))))
 '(org-level-2 ((t (:inherit variable-pitch :foreground "#859900" :weight bold :height 1.2))))
 '(org-level-3 ((t (:inherit variable-pitch :foreground "#268bd2" :weight bold :height 1.15))))
 '(org-level-4 ((t (:inherit variable-pitch :foreground "#b58900" :weight bold :height 1.1))))
 '(org-level-5 ((t (:inherit variable-pitch :foreground "#2aa198" :weight bold))))
 '(org-level-6 ((t (:inherit variable-pitch :foreground "#6c71c4" :weight bold))))
 '(org-level-7 ((t (:inherit variable-pitch :foreground "#d33682" :weight bold))))
 '(org-level-8 ((t (:inherit variable-pitch :foreground "#dc322f" :weight bold))))
Blujay
fonte
@bluejay Eu gosto de como isso parece. Você tem a configuração completa para publicar isso em algum lugar?
erikstokes 27/09/2015
Bem, estou usando o solarized-darktema, que faz parte do solarized-themepacote que você pode instalar no ELPA. Quanto aos org-level-*rostos, vou adicioná-los à resposta acima.
blujay
Isso parece super legal. Como você substitui o padrão * por esses símbolos especiais?
7285 Alex
Isso é do org-bulletspacote. Execute package-list-packagese confira todos os pacotes começando com org-. :)
blujay
2

De alguma forma, não consegui que as outras respostas funcionassem para minha configuração, mas a correção mais rápida e fácil que funcionou para mim foi:

`M-x customize-face org-hide`

Em seguida, basta alterar o Font Familyatributo para sua fonte monoespaçada (no meu caso Iosevka).

E isso é literalmente tudo o que você precisa fazer , pois org-indent(face para recuo de contorno) herda automaticamente de org-hide(face usada para ocultar estrelas principais nas manchetes)

insira a descrição da imagem aqui

Christabella Irwanto
fonte
1

Uma solução muito mais simples: no modo organizacional, pressione M-:e execute o seguinte

(font-lock-add-keywords 
 nil 
 '(("^[[:space:]*]+" 0 '(face (:family "Ubuntu Mono")) append))
 'append)

Você pode precisar M-x font-lock-fontify-bufferdepois disso. Essa solução simplesmente força os caracteres principais (espaços e estrelas) a usar uma fonte monoespaçada.

Além disso, convém substituir o "Ubuntu Mono" por uma fonte monoespaçada de sua escolha,

Clemente
fonte
Isso não é mais necessário, considerando as outras soluções. :)
blujay