使用Org-Babel控制缩进

时间:2014-01-03 00:54:48

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

使用Org–Babel编写识字Python时,我需要能够控制缩进级别(显式地使用:indentation-level 3或隐式地使用一些聪明的指示)。

这是一个演示此问题的示例文件。

#+BEGIN_SRC python :tangle "sample.py"
  class Test:
      def __init__(self):
          self.a = 'a test class'
#+END_SRC
#+BEGIN_SRC python :tangle "sample.py"
      def say_hi(self):
          print 'Hi from this Test object!'
          print 'ID: {}'.format(repr(self))
          print 'Data: {}'.format(str(self.__dict__))
#+END_SRC

3 个答案:

答案 0 :(得分:7)

org-src-preserve-indentation设为t

答案 1 :(得分:1)

我并不像Tobias' answer那样完美,因为当我org-edit-specialC-c ')代码块时,我的python-mode缓冲区会对我大喊大叫(我有几个python minor)具有语法检查器的模式)由于具有独立方法的块的意外缩进(因为设置了org-src-preserve-indentation,我将在各个块中的所有方法前面进行缩进)。所以相反,我喜欢使用org-mode' :noweb标头参数的解决方案:

#+BEGIN_SRC python :tangle "sample.py" :noweb yes
  class Test:
      <<init_method>> # these are indented
      <<more_methods>> # these are indented
#+END_SRC

#+BEGIN_SRC python :noweb-ref init_method
  def __init__(self):
      self.a = 'a test class'
#+END_SRC

#+BEGIN_SRC python :noweb-ref more_methods
  def say_hi(self):
      print 'Hi from this Test object!'
      print 'ID: {}'.format(repr(self))
      print 'Data: {}'.format(str(self.__dict__))
#+END_SRC

只要您在类定义中缩进Noweb语法引用(double << >>),其他块(&#34; init_method&#34;和&#34; more_methods&#34;)将与你的缩进纠缠在一起。那么,最终输出&#34; sample.py&#34;文件看起来像这样:

class Test:
    def __init__(self):
        self.a = 'a test class'
    def say_hi(self):
        print 'Hi from this Test object!'
        print 'ID: {}'.format(repr(self))
        print 'Data: {}'.format(str(self.__dict__))

尼斯!

答案 2 :(得分:0)

我知道这不是理想的解决方案,但作为解决方法,您可以在源块中插入注释(特定于您的编程语言),并在该注释后进行所需的缩进。这也将在退出edit-buffer

时保留缩进
#+BEGIN_SRC python :tangle "sample.py"
  class Test:
      def __init__(self):
          self.a = 'a test class'
#+END_SRC
#+BEGIN_SRC python :tangle "sample.py"
  # This is my dummy python comment to keep the correct indentation 
      def say_hi(self):
          print 'Hi from this Test object!'
          print 'ID: {}'.format(repr(self))
          print 'Data: {}'.format(str(self.__dict__))
#+END_SRC