【问题标题】:How can I implicitly organize literate code with org-mode?如何使用 org-mode 隐式组织识字代码?
【发布时间】:2013-12-01 19:39:24
【问题描述】:

我正在开发一个Stack Exchange mode for Emacs,我正在尝试使用literate programming(和org-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
...

这是我喜欢要做的事情:

** 的 Ctrl+F 并查看属性抽屉。)

* 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
** Require Dependencies
:PROPERTIES:
:noweb-key: stack-require-dependencies
:END:
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).
#+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

#+begin_src emacs-lisp
  (require 'stack-api)
#+end_src
** Customization
:PROPERTIES:
:noweb-key: stack-setup-customization
: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
** Keymap
:PROPERTIES:
:noweb-key: stack-setup-keymap
:END:
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.
#+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
** Load Children...

【问题讨论】:

  • 很抱歉,我不清楚这个问题。您能否提供一个(不那么简单的)示例来说明您所做的事情以及您想做的事情?
  • @fniessen 完成——谢谢
  • :noweb-ref (orgmode.org/manual/noweb_002dref.html#noweb_002dref) 有帮助吗?它使用属性继承来传播 noweb 块的名称。
  • @AlexVorobiev 成功了!您可以将其发布为答案以便可以接受吗?

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


【解决方案1】:

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

【讨论】:

    【解决方案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
    

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

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      相关资源
      最近更新 更多