Bagaimana cara menyesuaikan lekukan mode-org?

12

pertanyaan ini sebenarnya muncul karena saya suka menggunakan font non-monospace, (Sabon, Minion, Garamond, dll.) Ini menyebabkan masalah ketika menggunakan mode indentasi-org, karena teks di bawah judul sekarang tidak selaras dengan berita utama. Contoh: masukkan deskripsi gambar di sini

Fonnya adalah Georgia. Sekarang, jika saya beralih ke konsol:

masukkan deskripsi gambar di sini

Saya pikir masalahnya adalah bahwa dalam font non-monospace, "spasi" dan * tidak memakan ruang yang sama. Meskipun saya tidak tahu bagaimana menyelesaikannya. Saya telah mencari di internet dan tidak bisa menemukan tutorial untuk memperbaiki indentasi sendiri. Saya sudah mencoba untuk membaca org-indent.el tetapi ini merupakan jalan panjang bagi saya untuk mengerti. Bantuan sangat dihargai!

Alex
sumber
Saya juga suka menggunakan font serif yang proporsional di Emacs dan pernah mengalami masalah serupa. Saya telah berpikir bahwa mungkin beberapa penyesuaian font dapat membantu, tetapi saya belum melihat secara menyeluruh.
Christian Gagné
1
Kedengarannya seperti ini tidak ada hubungannya dengan mode Org dan Anda hanya ingin tahu bagaimana mendapatkan font non-monospace untuk disejajarkan. Jawabannya adalah bahwa Anda perlu melakukannya menggunakan kode - Anda tidak dapat mengandalkan ruang karakter yang memiliki lebar yang sama dengan karakter lainnya, dll. Singkatnya, secara umum Anda kurang beruntung.
Drew
@Drew Anda mungkin benar "secara umum". Tetapi untuk masalah khusus ini ada solusinya, lihat jawaban saya. Ruang terdepan yang digunakan untuk lekukan oleh org-indenttidak benar-benar ada, mereka hanya line-prefixsifat, sehingga mereka dapat digantikan oleh karakter lain selama itu tidak terlihat.
usang
@deprecated: Begitu. Terima kasih atas koreksinya. BTW, mungkin Org sendiri bisa, menjadi default, melakukan apa yang Anda sarankan. Atau cukup gunakan SPCkarakter tetapi dengan properti teks (atau hamparan) yang memaksakan wajah yang (secara default) memiliki font monospace. Mungkin permintaan penyempurnaan Organisasi sedang dilakukan. ;-)
Drew
@Drew itu sebenarnya sangat mudah dilakukan dengan font-lock, bukan?
Clément

Jawaban:

9

Salah satu solusinya adalah memodifikasi org-indent-stringsmenggunakan bintang alih-alih spasi sebagai karakter lekukan. Ini berarti bahwa lebar lekukan akan selalu benar, bahkan ketika menggunakan font yang proporsional. Triknya adalah mengatur warna latar depan lekukan menjadi sama dengan warna latar belakang, sehingga bintang-bintang menjadi tidak terlihat.

Kita dapat mencapai ini dengan kode berikut, yang menyarankan fungsi 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")

Hasilnya terlihat seperti ini untuk saya di Mac OS X menggunakan emacs -Qdan (set-face-font 'default :family "Gill Sans"):

masukkan deskripsi gambar di sini

usang
sumber
Hai @deprecated, terima kasih banyak telah memberikan jawabannya! Ini adalah pertanyaan konyol tetapi haruskah saya menempatkan kode Anda di org-indent.el atau init.el saya? Sepertinya tidak bekerja untuk saya. Saya menggunakan Emacs 24.4 di bawah windows, - apakah saya perlu mengkompilasi sesuatu atau apa? Terima kasih!
Alex
baiklah aku memang mengajukan pertanyaan bodoh. Saya perlu mengkompilasi org-indent.el. Untuk referensi di masa mendatang: cara termudah adalah dengan mengubah baris ini: (concat (make-string (1- i) ?\ ) ke (concat (make-string (1- i) ?*) dalam definisi org-indent-initializeyaitu (defun org-indent-initialize... kemudian gunakan Mx byte-compile-file untuk mengkompilasi org-indent.el ke org-indent.elc. Kemudian mulai ulang emacs.
Alex
3

Jawaban yang sudah usang itu sangat bagus, tetapi tidak cukup untuk saya. Saya saat ini menggunakan Emacs 24.4 dan org 8.2.4, dan memberi saran org-indent-initializetidak melakukan apa-apa. Saya harus mendefinisikan kembali fungsi dengan karakter indentasi yang diubah, dan itu berhasil. Mungkin ketika saya meningkatkan ke Emacs 24.5 dan org 8.3 nasihat akan bekerja.

Tetapi saya juga harus membuat beberapa penyesuaian lainnya, karena saya menggunakan font dengan ukuran variabel dengan ukuran yang berbeda untuk level heading yang berbeda, yang berarti bahwa heading level-1 *tidak sama lebar dengan level-2, dan seterusnya.

Jadi saya juga harus melakukan ini:

  1. Setel wajah org-hide(digunakan untuk membuat indentasi baris judul) dan org-indent(digunakan untuk indentasi garis non-judul) untuk memastikan mereka menggunakan font yang sama pada ukuran yang sama.
  2. Set variabel org-indent-boundary-characteruntuk *bukan default (spasi). Ini adalah karakter yang dimasukkan setelah karakter lekukan tetapi sebelum konten. Saya tidak yakin apakah mengubah ini adalah suatu keharusan, tetapi tampaknya membantu konsistensi. Ini mungkin tergantung pada font yang Anda gunakan, ukuran, dll.

Melakukan hal-hal itu selain membuat perubahan menjadi org-indent-initializeusang disediakan tampaknya telah melakukannya. Saya berakhir dengan buffer yang terlihat seperti ini:

tangkapan layar

Anda dapat melihat bahwa, ketika level judul turun, indentasi tidak sejajar dengan teks judul. Saya pikir itu karena menggunakan font yang lebih kecil untuk judul tingkat bawah, dan saya tidak berpikir ada cara mudah untuk memperbaikinya. Dimungkinkan untuk melakukan sesuatu dengan properti teks seperti line-prefixdan wrap-prefix, karena itu dapat diatur ke gambar dan karakter khusus, tetapi itu mungkin akan rumit dan lambat. Jika Anda menggunakan ukuran font yang sama untuk semua level tajuk, ini mungkin tidak akan menjadi masalah.

Bagaimanapun, ini mungkin cukup bagus. :)

PS Seperti yang diminta, inilah org-levelwajah saya . Ini disalin dari custom-set-faces, tetapi jika Anda tidak menggunakan customizeAnda dapat mengaturnya di luar itu.

 '(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
sumber
@bluejay Saya suka bagaimana ini terlihat. Apakah Anda memiliki konfigurasi lengkap untuk memposting ini di suatu tempat?
erikstokes
Yah, saya menggunakan solarized-darktema, yang merupakan bagian dari solarized-themepaket yang dapat Anda instal dari ELPA. Sedangkan untuk org-level-*wajah, saya akan menambahkannya ke jawaban di atas.
blujay
Ini terlihat sangat keren. Bagaimana Anda mengganti default * dengan simbol-simbol khusus itu?
Alex
Itu dari org-bulletspaket. Jalankan package-list-packagesdan periksa semua paket yang dimulai dengan org-. :)
blujay
2

Entah bagaimana saya tidak bisa mendapatkan jawaban lain yang berfungsi untuk pengaturan saya, tetapi perbaikan tercepat dan termudah yang berhasil bagi saya adalah:

`M-x customize-face org-hide`

Kemudian, ubah saja Font Familyatribut ke font monospace Anda (dalam kasus saya, Iosevka).

Dan itu benar - benar semua yang harus Anda lakukan , karena org-indent(wajah untuk lekukan garis besar) secara otomatis mewarisi dari org-hide(wajah yang digunakan untuk menyembunyikan bintang terkemuka di berita utama)

masukkan deskripsi gambar di sini

Christabella Irwanto
sumber
1

Solusi yang lebih sederhana: dalam mode org, tekan M-:dan jalankan yang berikut ini

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

Anda mungkin perlu M-x font-lock-fontify-buffersetelah itu. Solusi ini hanya memaksa karakter utama (spasi dan bintang) untuk menggunakan font monospace.

Juga, Anda ingin mengganti "Ubuntu Mono" dengan font monospace yang Anda pilih,

Sejuk
sumber
Ini tidak lagi perlu mempertimbangkan solusi lain. :)
blujay