7

我正在为 Emacs 开发 Stack Exchange 模式,并且正在尝试使用识字编程(with org-mode)来组织项目

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

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

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


这是我目前所做的

* 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...
4

2 回答 2

4

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

于 2013-12-02T15:55:10.543 回答
3

尽管您找到了所需的答案,但我想指出您的方法仍然非常结构化,因此没有充分利用识字编程的力量。在著名 的wc示例中,您可以看到定义和全局变量散布在整个文本中。这意味着您可以花更多的时间将您的想法组织在一个对人类比对计算机更有意义的结构中。

根据您的方法,您似乎正在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 编程,但我只是想向你和任何可能读到这篇文章的人演示,你不必以某种方式对你的想法进行分组这对计算机来说是有意义的。事实上,文学编程的全部意义在于以对人类有意义的方式组织事物。因此,有时明确而不是扭曲您的思维过程以匹配计算机可能是有意义的。

祝你好运!

于 2016-01-02T05:09:11.603 回答