Emacs: open large files in external apps automatically - elisp

I would like to use Emacs as file manager too and open large file (in dired or speedbar) with xdg-open. Can I use defadvice for abort-if-file-too-large function and how to do it correctly?

Advising abort-if-file-too-large requires that it still raise an error even if it opens the file externally, otherwise find-file-noselect will still try to open the file. Also, you want to call the external program only when the operation type passed to abort-if-file-too-large indicates a file is being opened. Something like the following will work, though you might want to tweak the arguments to call-process to make it fit your scenario better:
(defun open-outside-emacs (orig-fun size op-type filename)
(if (not (string-equal op-type "open"))
(apply orig-fun size op-type filename)
(call-process "/usr/bin/xdg-open" nil 0 nil (expand-file-name filename))
(error "opened externally")))
(advice-add 'abort-if-file-too-large :around #'open-outside-emacs)

Related

How to debug? emacs lisp program behavior does not achieve the desired but the executing the same as command does?

In a test buffer in emacs with Spacemacs, I have the following (the problem is also described in the buffer content):
* Top Heading
** A subheading created by executing commands
M-x org-insert-heading
M-x org-do-demote
Below I tried to achieve the same with an elisp function:
*** A subheading created by executing an interactive elisp function still works
It also works. Here is the program:
(defun org-insert-subheading-relative ()
"Replacement of org-insert-subheading, as it requires to provide an argument,
which is not convenient to program."
(interactive)
(org-insert-heading)
(org-do-demote)
)
However, having the code segment below,
the (org-do-demote) would not work, in
the following code segment:
(progn
(goto-end-of-code-block)
(insert "\n")
(org-insert-heading)
(org-do-demote)
(insert block)
(hide-subtree)
)
What could be the cause of the problem?
Here is the related code not defined by standard emacs:
(defun goto-end-of-code-block ()
(re-search-forward "#\\+END_SRC.*$" nil t 1) ; no raising error
)

Run emacs lisp script

I found the script and i need run it.
I tried to run it like this (i used eval-buffer command):
(require 'subr-x)
(require 's)
(load-file "~/git-graph.el")
(require 'git-graph)
(git-graph/to-graphviz-pretty
"git"
(git-graph/git-graph-head
"E:/GitStack/repositories/gitRepo.git"
"master"))
But get an error:
Loading e:/emHome/git-graph.el (source)...done
let*: Symbol’s function definition is void: first
picture
Please tell me what is wrong. And how i can run this script?
I'm new to this.
Why are you loading library git-graph twice?
What happens if you just remove either the load-library line or the require line -- do you still get an error?
With your original code, insert this line after the load-library line:
(message "After load-library")
And insert this line after the require line:
(message "After require")
See which message(s) you get: check buffer *Messages*. That should tell you which attempt to load the library (if either) led to the error. Maybe look for the text first in the library, to see if you notice anything funny.
If it doesn't look like the problem comes from loading that library then it likely comes from the expression after your require.
Do M-x toggle-debug-on-error, then do your M-x eval-buffer, and post the *Backtrace* output here. That will show us just where the error is raised.
You can also try M-x debug-on-entry git-graph/to-graphviz-pretty and step through the debugger using d (or c to skip details of a given step). That will eventually show you which code raised the error.

Enabling org-latex in emacs24.5

I am complete beginner trying to set up emacs to work with latex in org mode to generate latex enabled pdfs.
I followed this link to add latex but i am getting following error on start of my emacs.
This happened after adding the code in the "1.2 Org-mode LaTeX export setup" in my init.el
Debugger entered--Lisp error: (file-error "Cannot open load file" "no such file or directory" "org-latex")
require(org-latex)
eval-buffer(#<buffer *load*> nil "/Users/prabhath/.emacs.d/init.el" nil t) ; Reading at buffer position 14780
load-with-code-conversion("/Users/prabhath/.emacs.d/init.el" "/Users/prabhath/.emacs.d/init.el" t t)
load("/Users/prabhath/.emacs.d/init" t t)
#[0 "\205\262 \306=\203\307\310Q\202; \311=\204\307\312Q\202;\313\307\314\315#\203*\316\202;\313\307\314\317#\203:\320\nB\321\202;\316\322\323\322\211#\210\322=\203a\324\325\326\307\327Q!\"\323\322\211#\210\322=\203`\210\203\243\330!\331\232\203\243\332!\211\333P\334!\203}\211\202\210\334!\203\207\202\210\314\262\203\241\335\"\203\237\336\337#\210\340\341!\210\266\f?\205\260\314\323\342\322\211#)\262\207" [init-file-user system-type delayed-warnings-list user-init-file inhibit-default-init inhibit-startup-screen ms-dos "~" "/_emacs" windows-nt "/.emacs" directory-files nil "^\\.emacs\\(\\.elc?\\)?$" "~/.emacs" "^_emacs\\(\\.elc?\\)?$" (initialization "`_emacs' init file is deprecated, please use `.emacs'") "~/_emacs" t load expand-file-name "init" file-name-as-directory "/.emacs.d" file-name-extension "elc" file-name-sans-extension ".el" file-exists-p file-newer-than-file-p message "Warning: %s is newer than %s" sit-for 1 "default"] 7 "\n\n(fn)"]()
command-line()
normal-top-level()
Any suggestions are helpful.
I am using emacs 24.5, org mode > 8.
The link is outdated: there is no such thing as org-latex.el any longer. It is also the case that you do not need what that link describes at all.
To export an org file to latex (and thence to PDF), all you need to do is
C-c C-e l o
The LaTeX exporter is already loaded by default.

Emacs shell script mode hook

For some reason my shell script mode hooks do not get executed. Example in my .emacs:
(add-hook 'shell-script-mode-hook (lambda ()
(rainbow-delimiters-mode 1)))
causes the variables to be set, but the mode is not loaded for the opened script files. What is the proper way to hook here?
I use the default shell script mode (modeline says e.g. Shell-script[bash]). Do I have to hook for each shell type individually (sh, bash, zsh)? If yes can you please tell me how?
Thank you very much!
EDIT3:
It turned out to be due a conflict of textmate-mode with the skeleton-pair-insert in sh-mode (I tried to avoid the conflict by disabling textmate in sh-mode, which then left the sh-mood-hook aparatus in ruins. I've removed textmate-mode completely and use now the standard skeleton-pair approch globaly.
I'll accept phils answer - without him I'd probably not be able to debug this on my own.
EDIT2:
Thanks to phils, I think his comment takes us closer to solution. It's not a problem with rainbow-delimiters though. I removed all sh-mode-hook except your hello message one and restart Emacs. When I open a .sh file I get this:
Setting up indent for shell type bash
setting up indent stuff
Indentation variables are now local.
Indentation setup for shell type bash
File mode specification error: (void-function nil)
Note no "hello" message. The value of sh-mode-hook is:
(nil
(lambda nil
(message "hello")))
I think the problem is this first nil value - though I don't see that it would be set anywhere.
If I eval this:
(setq sh-mode-hook t)
(add-hook 'sh-mode-hook (lambda () (message "hello")))
I see the hello message, though after restart (I've put those lines in .emacs) it is gone again (the nil is again on top of the hook).
Any idea what to do to have active hook at setup?
EDIT1:
I've tried also:
(add-hook 'sh-mode-hook (lambda ()
(rainbow-delimiters-mode 1)))
with same negative result - not sure if this is relevant though...
shell-script-mode is an alias for sh-mode. I haven't checked, but I would suspect that only the hook variable for the 'real' function name is evaluated, so I think sh-mode-hook would be the one to use.
Anyhow, there's nothing broken about your syntax, so there may be something amiss with the use of (rainbow-delimiters-mode 1). For instance, you should be able to observe that the following works correctly:
(add-hook 'sh-mode-hook (lambda () (message "hello")))
FWIW, for hooks I recommend not using anonymous functions at all, simply because it's much easier to update your hook function if it is named (removing the old lambda expression from the variable before adding an updated one is just annoying in my books).
Try to remove ':
(add-hook 'shell-script-mode-hook (lambda () (rainbow-delimiters-mode 1)))

How can I get 'next-error' to copy the line causing the error into the kill-ring?

I tried running
(list (next-error)
(kill-ring-save (line-beginning-position) (line-end-position)))
immediately after M-x compile
But it pushes the current line to the kill ring, not the line where the error was found...
If so how do I make emacs wait for (next-error) to complete before continuing with the next command?
This little bit of advice will copy the line specified by the error into the kill ring:
(defadvice compilation-goto-locus (after next-error-copy-offending-line activate)
(kill-ring-save (line-beginning-position) (line-end-position)))
If you decided you wanted to grab the error message, you could use this:
(progn
(next-error)
(with-current-buffer next-error-last-buffer
(kill-ring-save (line-beginning-position) (line-end-position))))

Resources