org-mode не может редактировать исходный код C - PullRequest
5 голосов
/ 30 ноября 2011

Когда я использую org-mode в emacs для редактирования программы на C, то есть когда я редактирую следующий сегмент:

#+begin_src c
#define MAX 100
#+end_src

и после того, как я вызываю функцию 'org-edit-src-code' дляпри редактировании кода C в новом буфере возникает ошибка:

В языковом режиме `c-mode 'происходит сбой: stringp

, и я не могу ни сохранить, нивернуться в исходный буфер после того, как я отредактирую код в новом буфере.

Любые другие языки могут работать без каких-либо проблем, включая C ++, elisp, sh.

Как я могу решить эту проблему?Моя версия в режиме org - 7.6, а версия emacs - 23.2.

полная отладочная информация (следуйте методу Нуфаля Ибрагима):

Debugger entered--Lisp error: (error "Language mode `c-mode' fails with: stringp")
  signal(error ("Language mode `c-mode' fails with: stringp"))
  error("Language mode `%s' fails with: %S" c-mode stringp)
  (condition-case e (funcall lang-f) (error (error "Language mode `%s' fails with: %S" lang-f ...)))
  (let ((org-inhibit-startup t)) (condition-case e (funcall lang-f) (error ...)))
  (if (and (setq buffer ...) (if org-src-ask-before-returning-to-edit-buffer ... t)) (org-src-switch-to-buffer buffer (quote return)) (when buffer (with-current-buffer buffer ...) (kill-buffer buffer)) (setq buffer (generate-new-buffer ...)) (setq ovl (make-overlay beg end)) (overlay-put ovl (quote edit-buffer) buffer) (overlay-put ovl (quote help-echo) "Click with mouse-1 to switch to buffer editing this segment") (overlay-put ovl (quote face) (quote secondary-selection)) (overlay-put ovl (quote keymap) (let ... ... map)) (overlay-put ovl :read-only "Leave me alone") (setq transmitted-variables (append transmitted-variables ...)) (org-src-switch-to-buffer buffer (quote edit)) (if (eq single ...) (setq code ...)) (insert code) (remove-text-properties (point-min) (point-max) (quote ...)) (unless (cadr ...) (setq total-nindent ...)) (let (...) (condition-case e ... ...)) (dolist (pair transmitted-variables) (org-set-local ... ...)) (when org-mode-p (goto-char ...) (while ... ... ...)) (when markline (org-goto-line ...) (org-move-to-column ...) (push-mark ... ... t) (setq deactivate-mark nil)) (org-goto-line (1+ ...)) (org-move-to-column (if org-src-preserve-indentation col ...)) (org-src-mode) (set-buffer-modified-p nil) (and org-edit-src-persistent-message (org-set-local ... msg)) (let (...) (when ... ...)))
  (if (not info) nil (setq beg (move-marker beg ...) end (move-marker end ...) msg (if allow-write-back-p ... "Exit with C-c ' (C-c and single quote)") code (or code ...) lang (or ... ...) lang (if ... ... lang) single (nth 3 info) block-nindent (nth 5 info) lang-f (intern ...) begline (save-excursion ... ...) transmitted-variables (\` ...)) (if (and mark ... ...) (save-excursion ... ...)) (if (equal lang-f ...) (setq lang-f ...)) (unless (functionp lang-f) (error "No such language mode: %s" lang-f)) (save-excursion (if ... ...) (setq line ... col ...)) (if (and ... ...) (org-src-switch-to-buffer buffer ...) (when buffer ... ...) (setq buffer ...) (setq ovl ...) (overlay-put ovl ... buffer) (overlay-put ovl ... "Click with mouse-1 to switch to buffer editing this segment") (overlay-put ovl ... ...) (overlay-put ovl ... ...) (overlay-put ovl :read-only "Leave me alone") (setq transmitted-variables ...) (org-src-switch-to-buffer buffer ...) (if ... ...) (insert code) (remove-text-properties ... ... ...) (unless ... ...) (let ... ...) (dolist ... ...) (when org-mode-p ... ...) (when markline ... ... ... ...) (org-goto-line ...) (org-move-to-column ...) (org-src-mode) (set-buffer-modified-p nil) (and org-edit-src-persistent-message ...) (let ... ...)) t)
  (let ((mark ...) (case-fold-search t) (info ...) (full-info ...) (org-mode-p ...) (beg ...) (end ...) (allow-write-back-p ...) block-nindent total-nindent ovl lang lang-f single lfmt buffer msg begline markline markcol line col transmitted-variables) (if (not info) nil (setq beg ... end ... msg ... code ... lang ... lang ... single ... block-nindent ... lang-f ... begline ... transmitted-variables ...) (if ... ...) (if ... ...) (unless ... ...) (save-excursion ... ...) (if ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...) t))
  org-edit-src-code()
  (cond ((save-excursion ... ...) (find-file ...)) ((org-edit-src-code)) ((org-edit-fixed-width-region)) ((org-at-table\.el-p) (org-edit-src-code)) ((or ... ...) (call-interactively ...)) (t (call-interactively ...)))
  org-edit-special()
  call-interactively(org-edit-special nil nil)

Я новичок и не знаюв чем проблема.Любой совет?

1 Ответ

2 голосов
/ 01 декабря 2011

Как выяснилось в комментариях, это вызвано доступом к buffer-file-name во временном буфере, который не поддерживается файлом и, следовательно, buffer-file-name равен нулю, что приводит к его ошибке stringp. В любом случае, один из способов исправить это, заменив экземпляры buffer-file-name на

(or buffer-file-name "DEFAULT-NAME")

если вам нужно его использовать, или блоком, подобным следующему

(when buffer-file-name
  (code-going-here-will-only-be-executed-if-buffer-file-name-in-non-nil))

Что легче / лучше, конечно, будет зависеть от того, что вы делаете.

...