2011-11-30 20 views
4

當我用emacs的org-模式來編輯一個C程序,即當我編輯下面段:org-模式不能編輯的C源代碼

#+begin_src c 
#define MAX 100 
#+end_src 

和後我調用函數「有機-edit-SRC-代碼」在新的緩衝區編輯C代碼,有一個錯誤:

Language mode `c-mode' fails with: stringp

,我既不能節省,也沒有恢復到原來的緩衝後,我在新的緩衝區編輯代碼。

其他語言都可以正常工作,包括C++,elisp,sh。

我該如何解決這個問題?我的組織模式版本是7.6,emacs版本是23.2。

全面調試信息是(遵循Noufal伊布的方法):

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) 

我是新手,我不知道是什麼問題。有什麼建議?

+0

對於我使用組織模式版本7.5和emacs 23.3.1來說工作得很好。您可以使用'(setq debug-on-error t)'啓用調試,並查看您是否在回溯中找到有用的東西。 –

+0

@noufal感謝您的建議,tarceback信息是(我不知道如何格式化代碼的評論,是由我添加生成換行符,但它不起作用):調試器進入 - Lisp錯誤:(錯誤「Language mode'c-mode'failed with:stringp」) signal(error(「Language mode'c-mode'failed with:stringp」)) error(「Language mode'%s '%S'c-mode stringp) byte-code(「\ 302 \ 303^HA @#\ 207」[語言錯誤「語言模式'%s'失敗,並顯示:%S」] 4) 組織編輯-SRC-代碼() 組織編輯特() 調用交互(ORG-編輯特零零) astropeak

+0

嘗試重新加載Org未編譯的'C-u M-x org-reload'(請參閱:http://orgmode.org/manual/Feedback.html)。它應該提供更好的回溯,如果不完全解決這個問題,如果它涉及到一個嚴重編譯的宏。 –

回答

1

正如在評論中發現的,這是由於在臨時緩衝區中訪問buffer-file-name而導致的,該臨時緩衝區沒有被文件支持,因此buffer-file-name不會導致它失敗stringp。總之,要解決這個問題的一種方式是通過與

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

更換的buffer-file-name情況下,如果你需要像下面

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

這當然是更容易/更好的將使用它,或者由塊取決於你在做什麼。