Как сделать в Emacs правильный отступ в конструкции if-then-else в elisp - PullRequest
11 голосов
/ 15 апреля 2010

Когда я делаю отступ в конструкции if-then-else в emacs lisp, блок else не отступает правильно. Что я получаю:

(defun swank-clojure-decygwinify (path)
  "Convert path from CYGWIN UNIX style to Windows style"
  (if (swank-clojure-cygwin)
      (replace-regexp-in-string "\n" "" (shell-command-to-string (concat "cygpath -w " path)))
    (path)))

где еще форма не имеет отступа на том же уровне, что и форма then. Есть ли очевидный способ исправить это?

Ответы [ 4 ]

17 голосов
/ 15 апреля 2010

Это правильный отступ. Цитата из руководства:

Слово "else" не записано в коде Lisp; остальная часть Выражение «если» идет после части then. В написанном Лиспе else-часть обычно пишется для начала в отдельной строке и является с отступом меньше, чем тогда:

 (if TRUE-OR-FALSE-TEST
     ACTION-TO-CARRY-OUT-IF-THE-TEST-RETURNS-TRUE
   ACTION-TO-CARRY-OUT-IF-THE-TEST-RETURNS-FALSE)

Например, следующее выражение if печатает сообщение 4 is not greater than 5!, когда вы оцениваете его обычным способом:

 (if (> 4 5)                               ; if-part
     (message "4 falsely greater than 5!") ; then-part
   (message "4 is not greater than 5!"))   ; else-part

Обратите внимание, что различные уровни отступов облегчают отличить тогдашнюю часть от остальной части. (GNU Emacs имеет несколько команды, которые автоматически делают правильные отступы if выражений. *Заметка GNU Emacs помогает вам печатать списки: печатать списки.)

Это функция, а не ошибка: -)

8 голосов
/ 15 апреля 2010

У меня нет соответствующей документации под рукой, но, похоже, это делает то, что вы хотите:

(put 'if 'lisp-indent-function nil)

Кроме того, вы неправильно использовали слово «правильно»; по определению, однако отступы emacs "правильные":)

5 голосов
/ 02 августа 2011

Стиль по умолчанию правильный - для Emacs Lisp. Для Common Lisp и других разновидностей Lisp предложение «else» должно быть выровнено под предложением «then». Чтобы получить Common Lisp, вы должны сделать что-то вроде этого:

(set (make-local-variable lisp-indent-function)
     'common-lisp-indent-function)

Чтобы это произошло автоматически, вы можете сделать что-то вроде этого:

(add-hook 'lisp-mode-hook
          '(lambda ()
             (set (make-local-variable lisp-indent-function)
                  'common-lisp-indent-function))))

Обратите внимание, однако, что пакеты взаимодействия Lisp-Emacs, такие как Slime, могут переопределять поведение отступов, и в этом случае приведенное выше может ничего не делать Вышеуказанное должно работать в базовом Emacs.

0 голосов
/ 05 декабря 2016

Верьте в то, что Элисп является Схемой, и используйте progn. Это разделяет выражения then и else, но выравнивает их в одном столбце:

(defun swank-clojure-decygwinify (path)
  "Convert path from CYGWIN UNIX style to Windows style"
  (if (swank-clojure-cygwin)
      (replace-regexp-in-string "\n" "" (shell-command-to-string (concat "cygpath -w " path)))
    (progn
      (path))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...