如何使用org-mode隐式组织识字代码?

时间:2013-12-01 19:39:24

标签: emacs org-mode literate-programming org-babel

我正在开发Stack Exchange mode for Emacs,我正在尝试使用literate programmingorg-mode}来组织the project

我发现自己重复了很多信息。 我正在对文档采取(可能过度)结构化的方法。 说我有一个标题Questions;该标题下有副标题ReadWrite,   

我有一个顶级的

;; some-package.el starts here
<<read methods>>
<<write methods>>
;; some-package.el ends here

如何更改ReadWrite标题的属性,以便除非另有说明,否则内部的所有源代码块将被放入各自的noweb纠结中?


Here is what I do currently

* TODO Stack Mode (Entry Point): =stack-mode=
Stack mode is /the/ major mode.  What do I mean by this?  Stack mode
is the entry point of the whole package.  There is no other way to
obtain the full, original functionality of the package without first
running =M-x stack-mode=.  Stack Mode is the only mode available
interactively.  It is a dispatcher that decides, based on user
preferences, how the whole system shall behave.  It provides the basic
framework upon which the rest of the package is built, and makes sure
all tools are available.

#+name: build-stack-mode
#+begin_src emacs-lisp :tangle elisp/stack.el
  ;; stack.el starts here

  (add-to-list 'load-path "~/github/vermiculus/stack-mode")

  <<stack-require-dependencies>>
  <<stack-setup-customization>>
  <<stack-setup-keymap>>
  <<stack-setup-api>>
  <<stack-load-children>>

  (provide 'stack)

  ; stack.el ends here
#+end_src

Thus, there are a few packages that it itself requires.

JSON (JavaScript Object Notation) is the standard by which we
communicate with Stack Exchange itself.  The details of this
communication has [[id:DC2032C5-BC11-47E2-8DDB-34467C2BC479][already been discussed]] so I will not repeat myself
here.  The JSON package provides many utilities for manipulating JSON
snippets within Emacs Lisp, and is required for the operation of this
package.  =json.el= is included with Emacs 24+ (and can easily be
obtained from the ELPA if missing).
#+name: stack-require-dependencies
#+begin_src emacs-lisp
  (require 'json)
#+end_src

This package also requires =request.el=, a package designed to
simplify making HTTP requests.  =request.el= was written by [[http://stackoverflow.com/users/727827][SX@tkf]] and
is maintained and documented on [[http://tkf.github.com/emacs-request/manual.html][GitHub]]. The package is also available
for automatic install via MELPA.
#+name: stack-require-dependencies
#+begin_src emacs-lisp
  (require 'request)
#+end_src

#+name: stack-require-dependencies
#+begin_src emacs-lisp
  (require 'stack-api)
#+end_src

Simply put, =defgroup= defines a customization group for the graphical
interface within Emacs.  Since it pulls all of the customizable
settings together and how to customize them, it is also useful as a
'word bank' of sorts for customizing the package manually.  Every
customizable variable in the entire package is listed here.
#+name: stack-setup-customization
#+begin_src emacs-lisp
    (defgroup stack-exchange
      nil
      "Stack Exchange mode."
      :group 'environment)
#+end_src

Every mode needs a hook, so we here define one.  This hook is run
/after/ stack-mode is finished loading (when called interactively or
from Emacs Lisp).
#+name: stack-setup-customization
#+begin_src emacs-lisp
  (defvar stack-mode-hook nil)
#+end_src

In addition to a hook, most if not all major modes define their own
key-map.  Stack mode as a whole is no exception, but remembering the
nature of =stack-mode= as a dispatcher, a key-map seems out of place
here.  As such, the official key-map for =stack-mode= defines all keys
to be =nil= except those that are necessary for the smooth use of
Emacs as an operating system.  Such necessary keystrokes include
=C-g=, =M-x=, and others.
#+name: stack-setup-keymap
#+begin_src emacs-lisp
  (defvar stack-mode-map
    (let ((map (make-sparse-keymap)))
      map)
    "Keymap for Stack Exchange major mode.  This keymap is not
    used.")
#+end_src
...

以下是我喜欢的事情:

({+ 1}}的Ctrl + F并查看属性抽屉。)

**

2 个答案:

答案 0 :(得分:3)

:noweb-ref标头(http://orgmode.org/manual/noweb_002dref.html#noweb_002dref)有助于使用属性继承将noweb引用名称传播到子树。

答案 1 :(得分:2)

虽然你找到了你需要的答案,但我想指出这一点 你的方法仍然很有条理,因此不需要 充分利用文学编程的力量。在famous wc example,你 可以看到定义和全局变量是散布的 整篇文章。这意味着您可以花更多时间组织 你的想法在一个对人类更有意义的结构中 计算机。

根据您的方法,您似乎正在对noweb进行分组 根据它们在纠结中的显示方式阻塞 文件。这可能对你有意义,但你可以采取另一种方式 它。例如,您可以按主题和组织方式组织文件 这些副标题下的所有相关代码但使用noweb 阻止将它们组合在一起纠缠在一起的正确位置 文件。

例如,通常有各种依赖关系和 包括它们的原因将取决于具体的方法 你的程序的功能。在您的示例中,您没有提供足够的内容 让我举一个具体的例子,但让我们说你有 以下功能或部分:

* Stack Mode

** customisation

** get from stack exchange

** edit post

** send back to stack exchange

我不确定这些是否相关,但这就是我的想法。一些 这些功能将需要某些依赖项。所以,例如, 你可能会有这样的事情:

* Stack Mode (Entry Point): =stack-mode=

Stack mode is /the/ major mode.  What do I mean by this?  Stack mode
is the entry point of the whole package.  There is no other way to
obtain the full, original functionality of the package without first
running =M-x stack-mode=.  Stack Mode is the only mode available
interactively.  It is a dispatcher that decides, based on user
preferences, how the whole system shall behave.  It provides the basic
framework upon which the rest of the package is built, and makes sure
all tools are available.

#+NAME: build-stack-mode
#+HEADER: :noweb    tangle
#+HEADER: :comments both
#+HEADER: :tangle   elisp/stack.el
#+BEGIN_SRC emacs-lisp 
  (add-to-list 'load-path "~/github/vermiculus/stack-mode")

  <<stack-require-dependencies>>
  <<stack-definitions>>
  <<stack-initialisation>>
  <<stack-customisaton>>
  <<stack-functions>>

  (provide 'stack)
#+END_SRC

** customisation

*** definitions
:PROPERTIES:
:noweb-ref: stack-definitions
:END:
Simply put, =defgroup= defines a customization group for the graphical
interface within Emacs.  Since it pulls all of the customizable
settings together and how to customize them, it is also useful as a
'word bank' of sorts for customizing the package manually.  Every
customizable variable in the entire package is listed here.

#+BEGIN_SRC emacs-lisp
  (defgroup stack-exchange
    nil
    "Stack Exchange mode."
    :group 'environment)
#+END_SRC

Every mode needs a hook, so we here define one.  This hook is run
/after/ stack-mode is finished loading (when called interactively or
from Emacs Lisp).

#+BEGIN_SRC emacs-lisp
  (defvar stack-mode-hook nil)
#+END_SRC

*** functions

Whatever is required here

#+NAME: stack-functions
#+BEGIN_SRC emacs-lisp

#+END_SRC

** setup
*** Keymap

In addition to a hook, most if not all major modes define their own
key-map.  Stack mode as a whole is no exception, but remembering the
nature of =stack-mode= as a dispatcher, a key-map seems out of place
here.  As such, the official key-map for =stack-mode= defines all keys
to be =nil= except those that are necessary for the smooth use of
Emacs as an operating system.  Such necessary keystrokes include
=C-g=, =M-x=, and others.
#+NAME: stack-definitions
#+BEGIN_SRC emacs-lisp
  (defvar stack-mode-map
    (let ((map (make-sparse-keymap)))
      map)
    "Keymap for Stack Exchange major mode.  This keymap is not
    used.")
#+END_SRC

** get from stack exchange
*** get post
**** dependencies
:PROPERTIES:
:noweb-ref: stack-require-dependencies
:END:

JSON (JavaScript Object Notation) is the standard by which we
communicate with Stack Exchange itself.  The details of this
communication has [[id:DC2032C5-BC11-47E2-8DDB-34467C2BC479][already been discussed]] so I will not repeat myself
here.  The JSON package provides many utilities for manipulating JSON
snippets within Emacs Lisp, and is required for the operation of this
package.  =json.el= is included with Emacs 24+ (and can easily be
obtained from the ELPA if missing).

#+BEGIN_SRC emacs-lisp
  (require 'json)
#+END_SRC

This package also requires =request.el=, a package designed to
simplify making HTTP requests.  =request.el= was written by [[http://stackoverflow.com/users/727827][SX@tkf]] and
is maintained and documented on [[http://tkf.github.com/emacs-request/manual.html][GitHub]]. The package is also available
for automatic install via MELPA.

#+BEGIN_SRC emacs-lisp
  (require 'request)
#+END_SRC
**** functions

get the actual post

#+NAME: stack-functions
#+BEGIN_SRC emacs-lisp

#+END_SRC

*** parse post
**** dependencies
JSON (JavaScript Object Notation) is the standard by which we
communicate with Stack Exchange itself.  The details of this
communication has [[id:DC2032C5-BC11-47E2-8DDB-34467C2BC479][already been discussed]] so I will not repeat myself
here.  The JSON package provides many utilities for manipulating JSON
snippets within Emacs Lisp, and is required for the operation of this
package.  =json.el= is included with Emacs 24+ (and can easily be
obtained from the ELPA if missing).
#+NAME: stack-require-dependencies
#+BEGIN_SRC emacs-lisp
  (require 'json)
#+END_SRC
**** functions
*** display post
** edit post
** send back to stack exchange
*** dependencies
#+NAME: stack-require-dependencies
#+BEGIN_SRC emacs-lisp
  (require 'stack-api)
#+END_SRC
*** functions

#+NAME: stack-functions
#+BEGIN_SRC emacs-lisp
  (send-back-function)
#+END_SRC

这只是一个例子,当然,我不知道如何编程 在口齿不清,但我只想向你和其他任何人证明 可能会读到这一点,你不必以某种方式对你的想法进行分组 对计算机有意义。事实上,整个文化点 编程是以对人类有意义的方式组织事物。因此,有时可能有意义而不是扭曲您的思维过程以匹配计算机。

祝你好运!