自定义GNU / Emacs nxml模式缩进

时间:2011-12-13 18:26:16

标签: emacs dot-emacs

作为一些使用GNU / Emacs为Android开发的人,您肯定知道最新的Android工具引入了new xml formatter。我使用优秀的nxml-mode来编辑xml,因为...我编辑了xml文件;)我对它非常满意但是...因为我可以自定义Nxml属性缩进变量,文档说:

Indentation for the attributes of an element relative to the start-tag. Hide   
This only applies when the first attribute of a tag starts a line.
In other cases, the first attribute on one line is indented the same
as the first attribute on the previous line.

当第一个属性与元素在同一行上时,第一个属性上的独立属性对齐的后备是重要的。

是否可以更改该行为,以获得与Android Tools兼容的缩进?我刚刚在文档中找不到任何内容,谷歌搜索失败了......

更新

评论帮助我意识到我不清楚。因此,这里是nxml-mode默认执行的示例:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="org.foo.bar"
          android:versionCode="1"
          android:versionName="1.0">

  <uses-sdk android:minSdkVersion="8" />
  <application
      android:label="@string/app_name"
      android:icon="@drawable/ic_launcher">

    <activity
        android:name="Foo"
        android:label="@string/foo" />

    <activity android:name="Bar"
              android:label="@string/bar" />

  </application>

</manifest>

我想得到什么:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.foo.bar"
    android:versionCode="1"
    android:versionName="1.0">

  <uses-sdk android:minSdkVersion="8" />
  <application
      android:label="@string/app_name"
      android:icon="@drawable/ic_launcher">

    <activity
        android:name="Foo"
        android:label="@string/foo" />

    <activity android:name="Bar"
        android:label="@string/bar" />

  </application>

</manifest>

第一种情况(默认的nxml模式缩进行为):

  • package元素的manifest属性与xmlns:android decl
  • 对齐
  • android:label元素的Bar activity属性与android:name元素对齐。

第二种情况(预期结果):

  • package元素的manifest属性与父manifest元素对齐,加上可配置的空格数
  • android:label元素的Bar activity属性与父元素以及可配置的空格数对齐

我浏览了nxml-mode源代码,缩进行为以nxml-indent-line开头,但我没有按照许多子句来查看应该定制的defun ...由于我缺乏lisp知识

您可以看到manifest秒属性未与第一个属性对齐

干杯,

Renaud(很难控制大规模头痛以符合Android编码和格式规则)

1 个答案:

答案 0 :(得分:1)

看起来不容易修改,因为它似乎被硬编码到nxml-compute-indent-in-start-tag函数中。相关的代码块似乎是这样的:

              (let* ((att (car atts))
                     (start (xmltok-attribute-name-start att)))
                (when (< start pos)
                  (goto-char start)
                  (setq off 0))))

你可以随时将该方法复制到你自己的init文件中,注释掉这些行,并在加载nxml模式后加载你的函数定义(这将覆盖原始实现)。

注意,您可能还想向gnu emacs维护者提交增强请求,以便将来轻松自定义此行为。