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

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

我正在开发 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

如何更改 Read 的属性和 Write标题中的所有源代码块,除非另有说明,否则将被放入各自的 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...

最佳答案

尽管您找到了所需的答案,但我想指出
你的方法仍然很结构化,因此不采取
充分利用文学编程的力量。在 famous wc example , 你
可以看到定义和全局变量穿插
贯穿全文。这意味着您可以花更多时间组织
你的想法在一个对人类更有意义的结构中
电脑。

根据您的方法,您似乎正在对 noweb 进行分组。
根据它们在纠结中的显示方式将它们分成几部分
文件。这对您来说可能有意义,但是您可以使用另一种方法
它。例如,您可以按主题组织文件并分组
这些子标题下的所有相关代码,但使用 noweb block 将它们组合在纠结中的正确位置
文件。

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

* 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 中,但我只是想向你和其他任何人证明
可能会读到这个,你不必将你的想法分组
对计算机有意义。事实上,文盲的全部意义
编程是以对人类有意义的方式组织事物。因此,有时明确而不是扭曲您的思维过程以匹配计算机可能是有意义的。

祝你好运!

关于emacs - 如何使用 org-mode 隐式组织识字代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20316342/

相关文章:

r - 查找功能的帮助引用页时如何指定软件包?

emacs - Elisp:保存一个位置,在它之前插入文本,然后返回到相同的位置

组织模式:隐藏缓冲区设置/导出选项

emacs - 为 Org-mode 中的每个条目分配 ID

javascript - "$"noweb(文学编程)文件代码块中的符号

racket - scribble/lp 文档中未解析的链接

emacs - 可以使一个缓冲区透明/暗淡吗?

emacs - 如何阻止组织模式将我的数字移动到最后一页?

org-mode - 在 org 文件中包含代码片段