Org Babel có thể có các khối mã rối có điều kiện dựa trên loại hệ thống không?


10

Chỉnh sửa: Trong khi tôi vẫn đang học những sợi dây thừng của Babel, Tôi đã đọc về system-type, emacs-versionwindow-systemcác biến, mà âm thanh như chúng chứa tất cả các thông tin mà tôi cần để có được những hành vi của tôi đã mô tả ở đây. Trong thực tế, tôi chỉ có thể bọc mã dành riêng cho hệ điều hành trong các điều kiện khi cần trong các khối mã. Tôi đang tự hỏi nếu đây là cách tốt nhất để đi về điều này, tuy nhiên.


Tôi đang sử dụng Babel để viết các tệp cấu hình biết chữ cho Emacs. Tôi muốn các tệp cấu hình của mình hoạt động trên tất cả các nền tảng tôi thường sử dụng (về cơ bản là các bản phân phối Linux và máy Mac khác nhau) và một phần của việc này bao gồm các cài đặt phụ thuộc vào hệ thống (ví dụ: phông chữ mặc định tôi sử dụng trên máy Mac của mình là khác với cái tôi sử dụng trên Linux Mint).

Mặc dù tôi chắc chắn rằng tôi đã thấy các cách để nhận biết liệu tôi có sử dụng máy Mac hay không (và do đó có thể bao bọc mọi cài đặt dành riêng cho hệ thống trong một số điều kiện dựa trên điều này), tôi tự hỏi liệu Org / Babel có một số cách để phát hiện loại hệ thống mà tôi cho phép tôi viết các khối mã khác nhau cho các hệ thống khác nhau. Tốt hơn nữa, điều này cũng có thể được thực hiện cho các phiên bản khác nhau của Emacs? Tôi đang hình dung mã trông giống như sau (với các tên tiêu đề và nền tảng là các ví dụ)

#+Platform: LinuxMint
#+Emacs: GNU Emacs
#+EmacsVersion: 24+
#+BEGIN_SOURCE EMACS-LISP
    [Some configuration for Linux Mint and GNU Emacs 24+]
#+END_SOURCE

#+Platform: LinuxMint
#+Emacs: GNU Emacs
#+EmacsVersion: 22.1
#+BEGIN_SOURCE EMACS-LISP
    [Some other configuration for Linux Mint and GNU Emacs 22.1]
#+END_SOURCE

#+Platform: Mac
#+Emacs: Aquamacs
#+EmacsVersion: 24+
#+BEGIN_SOURCE EMACS-LISP
    [Some other configuration for Mac and Emacs 24+]
#+END_SOURCE

Cá lớn để chiên là nền tảng, vì phiên bản của emacs và emacsen tôi sử dụng có thể được suy ra từ điều này trong hầu hết các tình huống. Tôi nên đề cập rằng nền tảng có thể thô hơn những gì tôi đề xuất ở trên. (Tôi thực sự chỉ cần biết nếu tôi đang phân phối Linux, Windows hoặc Mac.) Ngoài ra, nếu những tính năng này không có sẵn, tôi sẽ làm cách nào để tạo các tiêu đề khối mã như thế này?

Chỉnh sửa: Tôi cho rằng nó cũng có thể trông giống như sau.

#+BEGIN_SOURCE EMACS-LISP :os Linux :emacs GNU :emacs-version 24+
    [Some configuration for Linux and GNU Emacs 24+]
#+END_SOURCE

Tôi tưởng tượng điều này có thể được tìm thấy ở đâu đó trong tài liệu nếu nó tồn tại nhưng dường như tôi không thể tìm thấy một danh sách toàn diện các tiêu đề cho các khối mã. Cảm ơn vì bất kì sự giúp đỡ nào của bạn!


Câu trả lời:


12

Tôi không chắc làm thế nào bạn có thể trích xuất chúng vào các tiêu đề tùy chỉnh, nhưng bạn có thể đặt ELISP thô trong các đối số tiêu đề của mình. Vì vậy, để rối một cách có điều kiện, bạn chỉ cần đặt một kiểm tra trong :tangleđối số của mình như sau:

#+BEGIN_SRC emacs-lisp :tangle (when (eq system-type 'gnu/linux) "yes")
 (princ "I DO THINGS! (But only on Linux.)")
#+END_SRC

Khi tệp bị rối và biểu thức ELISP " (eq system-type 'gnu/linux)" là đúng, nó sẽ trả về " "yes"", nó sẽ bị rối với tên tệp mặc định cho khối ngôn ngữ đó. Bạn cũng có thể đặt một tên tệp trong đó nếu bạn thích nó. Nếu điều kiện trả về nil, khối không bị rối.

Một số loại hệ thống khác mà bạn có thể chơi xung quanh là " windows-nt" cho một số HĐH Windows và " darwin" cho Mac OSX. Thông tin hệ thống khác (Bao gồm " emacs-version" như bạn đã đề cập) có thể được tìm nạp bằng các biến được mô tả trên trang này .

Nếu các đối số tiêu đề này trở nên khó sử dụng, bạn có thể có một phần trong .emacsđó bạn xác định một vài hàm chỉ trả về tên tệp cho các loại hệ thống cụ thể. Bằng cách đó bạn chỉ cần một cuộc gọi chức năng duy nhất trong của bạn :tangle.


Trong khi tôi vẫn đang học các sợi dây của Babel, tôi đã đọc về các biến hệ thống kiểu, phiên bản emacs và hệ thống cửa sổ, nghe có vẻ như chúng chứa tất cả thông tin tôi cần để có hành vi tôi đã mô tả ở đây . Trong thực tế, tôi chỉ có thể bọc mã dành riêng cho hệ điều hành trong các điều kiện khi cần trong các khối mã. Tôi đang tự hỏi nếu đây là cách tốt nhất để đi về điều này, tuy nhiên.

Khi nói đến tập tin cấu hình của riêng bạn, bất cứ điều gì thoải mái nhất đối với bạn là lựa chọn tốt nhất ... Nhưng có nhiều cách khác để tiếp cận vấn đề của bạn, ví dụ, một khả năng khác là có một cái gì đó như:

(cond
 ((eq system-type 'gnu-linux)
  (load "linux.el"))
 ((eq system-type 'darwin)
  (load "mac.el"))
 ((eq system-type 'windows-nt)
  (load "windows.el")))

... ở đầu .orgtệp của bạn và có mỗi khối dành riêng cho nền tảng có một đối số rối chỉ đến tệp tương ứng của chúng ... Giống như " :tangle windows.el" cho một đoạn mã dành riêng cho Windows.

Một chiến lược khả thi khác là tạo nhiều .orgtệp cho các hệ thống khác nhau và (org-babel-load-file ...)một tệp cho hệ thống của bạn bằng cách sử dụng các biến ở trên trong một (cond ...)khối như khối trên. Bằng cách này bạn có thể tránh mọi logic lộn xộn hoàn toàn.

Tuy nhiên, một khả năng khác là chỉ viết mã độc lập với nền tảng trong cấu hình Emacs của bạn - và giữ các chỉnh sửa dành riêng cho hệ thống trong máy của bạn .emacs. (Đây là cách tôi làm.)


Tôi tưởng tượng điều này có thể được tìm thấy ở đâu đó trong tài liệu nếu nó tồn tại nhưng dường như tôi không thể tìm thấy một danh sách toàn diện các tiêu đề cho các khối mã. Cảm ơn vì bất kì sự giúp đỡ nào của bạn!

Có các đối số tiêu đề trong các tệp thông tin Emacs. Bạn có thể đạt được điều đó với " và sau đó ". Nó cũng trực tuyến ở đây .C-h i"mOrg Mode""mSpecific header arguments"

Ngoài ra còn có các đối số tiêu đề cụ thể ngôn ngữ và thông tin khác ở đây. . (Cũng nằm trong tệp Thông tin.)


1
Cảm ơn bạn đã viết lên tuyệt vời này. Tôi vẫn còn rất mới với việc sử dụng emacs (chỉ sử dụng nó làm trình chỉnh sửa chính trong một năm hoặc lâu hơn, và thực sự tích cực kể từ tháng 1). Đây chính xác là kiểu khám phá các lựa chọn khác nhau mà tôi đang tìm kiếm. Tôi không có ý tưởng rằng các tiêu đề sẽ chấp nhận elisp như thế. Bây giờ tôi chỉ cần xác định cách tạo tùy chỉnh ... ít nhất là về lâu dài. Cảm ơn một lần nữa!
Dan

Không thành vẫn đề. ^^ Vì Emacs được ghi chép khá nhiều ở hầu hết mọi khía cạnh, bạn thực sự có thể học được rất nhiều bằng cách chỉ khám phá tài liệu ngẫu nhiên bằng C-h <thing>dây khi bạn thấy điều gì đó thú vị hoặc bằng cách đọc mã của người khác. Chúc may mắn..!
Archenoth
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.