I use Emacs (emerge) while merging files. Today, when trying to merge some Python code, I found that it was taking exceedingly long time. It was blank for 5 minutes and counting.
Googling revealed that one can print a stack trace under such cases, by having the following line in the .emacs file:
(setq debug-on-quit t)
I did that, restarted Emacs, pressed C-g (Ctrl-g). The stack showed:
Debugger entered--Lisp error: (quit) syntax-ppss() python-syntax-context(paren) python-info-line-ends-backslash-p() python-nav-end-of-statement() python-nav-end-of-defun() byte-code("\306\307!\203\250^@\310 ^X\311\216 \203^V^@\312 W\205^^@\n\2033^@\212\313^R^Kb\210\314 \210\315\307!\210\f^]\316^^^W\317^M!+\206^^@^K\212\312 ^N^X\\^$ python-info-current-defun() python-imenu-prev-index-position() imenu-default-create-index-function() byte-code("^H\205\"^@ \n\235?\205\"^@^K\203^[^@\f^KW\204^[^@^K\306U\205\"^@\212^M )\211^V^G\207" [which-func-mode major-mode which-func-non-auto-modes which-func-m$ which-func-ff-hook() run-hooks(find-file-hook) after-find-file(nil t) find-file-noselect-1(#<buffer ServiceDB.py> "file.py" nil nil "file2.py"$ find-file-noselect("file.py") ediff-find-file(file-B buf-B ediff-last-dir-B startup-hooks) ediff-files-internal("file.py" "file2.py"$ ediff-merge-with-ancestor("file.py" "file2.py$ (let ((base (car (prog1 command-line-args-left (setq command-line-args-left (cdr command-line-args-left))))) (theirs (car (prog1 command-line-args-left (setq comma$ command-line-merge("-merge") command-line-1(("-merge" "file.py" "file2.py$ command-line() normal-top-level()
So it was stuck parsing the Python file. This was a big file (144 KB in size), but still, an inordinate amount of time to parse. The interesting line is
which-func-ff-hook(). This comes because I have which-func-mode enabled on my Emacs. This shows which function the cursor is in in the status line:
I commented that line out, restarted Emacs, and of course, it opened the file in a jiffy!