Sebaris kata demi kata dan kode dengan tanda kutip dalam mode-Org

37

Dalam mode-Org saya dapat mengelilingi teks dengan =atau ~untuk menempatkan teks dalam inline verbatim atau mode kode.

Namun ini gagal jika teks memiliki tanda kutip, dan saya tidak dapat menemukan penjelasan atau penyelesaian dalam dokumentasi .

Sebagai contoh:

  • =hello= Merender sebagai kata demi kata
  • ~hello~ Render sebagai kode
  • =hello'= Gagal merender sebagai kata demi kata
  • ~hello'~ Gagal dirender sebagai kode

Satu-satunya solusi yang saya temukan sejauh ini adalah memasukkan karakter yang tidak terlihat, misalnya mengetik C-x 8 <RET> 200b <RET>, seperti yang dijelaskan dalam pertanyaan ini .

Mengapa ini (apakah ini bug?) Dan bagaimana saya bisa menghindari masalah ini tanpa memasukkan karakter yang tidak terlihat?

Amelio Vazquez-Reina
sumber

Jawaban:

47

Pertama-tama: Ini adalah Emacs. Ini bukan bug, ini pengaturan!

Kedua, @glucas benar dalam mengatakan bahwa Anda perlu memodifikasiorg-emphasis-regexp-components untuk mendapatkan yang Anda inginkan. Namun, saya ingin menyarankan dua modifikasi pada kodenya (@ Malabarba's) dan memberikan sedikit lebih banyak konteks:

  1. Anda tidak perlu menyalin seluruh nilai org-emphasis-regexp-componentske file init Anda untuk memodifikasi satu komponen. Untuk kasus penggunaan Anda, berikut ini sudah cukup:

    (setcar (nthcdr 2 org-emphasis-regexp-components) " \t\r\n,\"")
  2. Anda tidak perlu memodifikasi org-emphasis-regexp-componentssebelum memuat org-modevia (require 'org). Cukup tambahkan baris berikut setelah modifikasi Anda:

    (org-set-emph-re 'org-emphasis-regexp-components org-emphasis-regexp-components)

Lebih banyak konteks

Jika Anda ingin menyesuaikan aspek lain tentang cara kerja markup penekanan org-mode, ketahui ini:

Nilai org-emphasis-regexp-componentsadalah daftar dengan lima entri.

  1. Entri pertama mengontrol karakter mana yang diizinkan untuk segera mendahului karakter markup. Jika Anda ingin memiliki sesuatu seperti why=hello=render dengan benar, Anda harus memodifikasi entri ini.

    (setcar org-emphasis-regexp-components "...")
  2. Entri kedua mengontrol karakter mana yang diizinkan untuk segera mengikuti karakter markup. Jika Anda ingin memiliki sesuatu seperti =hello=thererender dengan benar, Anda harus memodifikasi entri ini.

    (setcar (nthcdr 1 org-emphasis-regexp-components) "...")
  3. Entri ketiga menentukan karakter yang tidak diizinkan sebagai karakter pembatas , yaitu, karakter yang segera mengikuti karakter markup pembuka atau mendahului karakter markup penutupan. Anda harus memodifikasi ini untuk membuat hal-hal seperti ='hello'=render dengan benar.

    (setcar (nthcdr 2 org-emphasis-regexp-components) "...")
  4. Entri keempat mencantumkan karakter yang diizinkan di tubuh string yang ditandai, yaitu, karakter yang muncul di antara karakter perbatasan. Anda jarang perlu memodifikasi ini; secara default, karakter apa saja diperbolehkan sebagai karakter tubuh.

    (setcar (nthcdr 3 org-emphasis-regexp-components) "...")
  5. Entri kelima menentukan berapa banyak baris baru yang diizinkan di dalam ekspresi yang ditandai. Secara default, org-modememungkinkan satu baris baru. Jadi jika Anda ingin dapat menambahkan markup ke teks yang membentang lebih dari dua baris berturut-turut, Anda harus memodifikasi entri ini.

    (setcar (nthcdr 4 org-emphasis-regexp-components) N)

    ... di mana Njumlah baris baru yang ingin Anda izinkan.

Pos terkait

Orang-orang tampaknya sering mengalami masalah ini. Selain dari posting yang Anda sebutkan , setidaknya ada dua pertanyaan lagi tentang StackOverflow yang menangani masalah yang sangat mirip:

itu hanya
sumber
7
Saya meningkatkan jawaban Anda tetapi juga ingin memuji kualitas jawabannya.
Kaushal Modi
Terima kasih @itsjeyd Ini berfungsi dengan baik Jika saya menjalankan dua baris itu secara interaktif begitu Emacs sudah penuh dengan buffer saya sudah terbuka. Namun, dan anehnya, saya mengalami "Symbol's value as variable is void: org-emphasis-regexp-components"bahkan jika saya menempatkan dua baris di bagian bawah .emacsfile saya . Adakah pemikiran mengapa itu bisa terjadi?
Amelio Vazquez-Reina
@ AmelioVazquez-Reina Terima kasih :) Hanya untuk memastikan: Apakah Anda ada (require 'org)di .emacsfile Anda sebelum melakukan penyesuaian org-emphasis-regexp-components?
itsjeyd
1
@ AmelioVazquez-Reina Saya senang semuanya bekerja dengan baik untuk Anda sekarang :) Pengamatan Anda benar - Anda tidak perlu (require 'org)dalam init-file Anda untuk dapat menggunakannya. Jika tidak, Emacs akan memuatnya secara otomatis ketika Anda: (a) membuka .orgfile untuk pertama kalinya dalam sesi saat ini, atau (b) mengaktifkan mode secara manual melalui M-x org-modeuntuk pertama kalinya dalam sesi saat ini, atau (c) ) ketika mengembalikan desktop yang disimpan yang menyertakan setidaknya satu .orgfile. (lanjutan)
itsjeyd
1
@ AmelioVazquez-Reina (lanjutan) . Masalahnya adalah : Emacs tidak akan memuat org-modesecara otomatis hanya karena Anda memasukkan beberapa penyesuaian untuk itu di init-file Anda. Itu sebabnya Anda perlu (require 'org)sebelum menyesuaikan salah satu variabelnya. Tanpa memuat mode sepenuhnya, Emacs tidak akan tahu apa yang harus dilakukan dengan variabel seperti org-emphasis-regexp-components; mereka tidak didefinisikan ketika Emacs pertama kali bertemu mereka, karena itu Symbol's value as variable is voidpesannya.
itsjeyd
11

Ada opsi yang lebih sederhana: gunakan blok sumber inline :

src_python{hello'}

Ini berfungsi tanpa masalah untuk karakter seperti tanda kutip, dan ini menyediakan penyorotan sintaks untuk kode sebaris.

Untuk menyertakan kode sumber sebaris saat mengekspor, Anda ingin menambahkan deklarasi ini ke header:

#+PROPERTY: header-args :exports code
Sejuk
sumber
1
Ini tip yang bagus! Sangat bagus untuk mendapatkan highlight sintaks untuk kode inline!
Shon
Ini bagus! Mengingatkan saya pada Lateks (:
Chris.Q
7

Anda dapat menghapus karakter kutipan dari org-emphasis-regexp-componentsseperti yang dijelaskan oleh @Malabarba di posting blog ini .

Kode yang relevan dari pos itu:

;; This HAS to come before (require 'org)
(setq org-emphasis-regexp-components
      '("     ('\"{“”"
        "-   .,!?;''“”\")}/\\“”"
        "    \r\n,"
        "."
        1))

Lihat string doc untuk org-emphasis-regexp-components: secara default karakter kutipan dipertimbangkan:

border - Karakter yang dilarang sebagai karakter border.

glukas
sumber