compile command across emacs sessions - emacs

how do i maintain a compile command across emacs sessions for a given file?
so, suppose I have file1.x, and I would like to use tool XComp to compile it. To do this, I need to run the following hypothetical command:
Xcomp file1.x && extract file1.x && Xlink file1.obj
So I do M-x compile, and write that thing. Now I have it available until I close emacs. How do I make that compile command persistent across emacs sessions, maybe a
% -*-
line somewhere? Any help appreciated.

The variable is "compile-command" so you could put this on the first line in your file:
// -*- compile-command: "Xcomp file1.x && extract file1.x && Xlink file1.obj" -*-
You may want to change the "//" for whatever you need to do for comments.

Related

emacs verilog moide:full command that include verilog-library-directories

I use the Verilog mode from emacs.
My question is:
What is full syntax of command that includes verilog-library-directories ?
emacs --batch f.sv -q --eval='(setq-default verilog-typedef-regexp
".*_t$")' -f verilog-batch-auto
For including verilog libraries I use the following comment at the end of the file:
// verilog-library-flags:("-y ../rtl")
I think then you can reuse this syntax for command line.

set-language-environment and M-x shell

I am using shells using UTF-8 and others using Latin-1. However, when I change the default with set-language-environment, also the existing shells change their buffer-coding-system - indicator in the status-line.
How can I make a shell-buffer stick to its encoding?
Have you tried looking at the Emacs Wiki? It has a tip on how to edit the ~/.emacs file:
Working around a broken LANG
If your LANG is not set up correctly, and you don’t want to fix it,
you can do the setup in your ~/.emacs file:
(set-language-environment "Latin-1")
Usually you would do it interactively: ‘C-x RET l’.
To check the environment you want see ‘M-x
describe-language-environment’ and TAB to see all completions.
as suggested here,
simply create a shell script such as e.g.latinshell.sh (adjust the desired variables):
#!/bin/sh
LANG=de_DE:Latin-1
and then run it in a shell with:
. latinshell.sh

Open zsh scripts in sh-mode in emacs

*.zsh files open in the default mode (text-mode for me). However, sh-mode is actually multiple modes including behaviours for zsh, bash, etc. How can I tell emacs to open *.zsh files specifically in the zsh flavor of sh-mode?
The flavor of sh-mode is autodetected from the shebang line (first line of your script). If you have "#!/bin/zsh", zsh will be assumed and (for instance) autoload will be recognized as a keyword. autoload will be not recognized as such if first line is "#!/bin/bash"
To make emacs recognize *.zsh files as shell scripts, just add this to your init file:
(add-to-list 'auto-mode-alist '("\\.zsh\\'" . sh-mode))
A programmatic way of selecting a flavor when you don't want to use the shebang is doing this in a sh-mode buffer:
(sh-set-shell "zsh")
So in your case what you need (unless you use shebang) is to update the auto-mode-alist as above and
(add-hook 'sh-mode-hook
(lambda ()
(if (string-match "\\.zsh$" buffer-file-name)
(sh-set-shell "zsh"))))
Whether your file has a #! shebang or not, you can always use a file mode line or a local variables section to set shell-script mode. Having one of these in your script will allow Emacs to do the right thing even if you haven't updated the auto-mode-alist, so is recommended for any non-standard file extension.
The Emacs file mode line for shell scripts is -*- mode: sh -*-. It should be in a comment, and must appear on the first line (or the second line if the first one is a shebang line).
If you can't put it on the first (second) line for some reason, you can create a local variables section at the end of the file (in the last 3000 characters of the file, and on the last page, according to the manual):
# Local Variables:
# mode: sh
# End:
Note that just setting the Emacs mode will still rely on a shebang line for shell type autodetection, and if no shebang line is detected will default to the current SHELL environment variable or the value of sh-shell-file if set).
If you can't have a shebang line, but want the correct shell type to be selected, the only way to do this is with an eval in the mode line or local variables section. Adding this will generate a confirmation prompt every time the file is loaded into Emacs, so this is not generally recommended, but may be acceptable in some cases.
The mode line would be -*- mode: sh; eval: (sh-set-shell "zsh") -*-, and the local variables form would be:
# Local Variables:
# mode: sh
# eval: (sh-set-shell "zsh")
# End:
If you use the shebang method, a more robust form is
#!/usr/bin/env zsh
# env will search the path for zsh. Some distros may put it a different place.
# env is pretty much guaranteed to be in /usr/bin

How to empty a file in fish?

In bash shell scripting, I would typically run :> file to empty a file.
Now using fish, things are slightly different and the above command doesn't work.
What is fish equivalent?
Although it's not as short as :, true is a command that will work everywhere and produces no output:
true > file
Probably the easiest way that will be work in both Fish and Bash is to do echo "" > file
EDIT: Commenter was absolutely right echo "" > file produces a file with a newline, the correct command I was thinking of to create an empty file is cat /dev/null > file.
There is, and always was the magic method called touch which set change time to actual or create non-existent file. For compatiblity I suggest you to use this way in all scripts that you write (even if you write bash code).

Recognize a file with a shebang and no extension

I know that emacs can recognize a file by the extension, a -*- mode -*- first line, and even by the shebang line, but what do I do if I want to override the shebang?
For example, a script that starts with
#!/usr/bin/env python2.7
...
won't be recognized by the shebang line alone. I also can't add in a -*-python-*- line, because then the shell tries to parse it. How do I deal with this?
You put the -*- mode: python -*- in the second line (special exception, added specifically for the shebang thingies).
You can try putting something like
(add-to-list 'interpreter-mode-alist '("python2.7" . python-mode))
in your .emacs. See “Choosing File Modes” for more info.
Like this:
#!/usr/bin/env python2.7
print "test"
# Local Variables:
# mode: python
# End:
This information comes from Specifying File Variables node of info.
Use f1 i to enter info.
Use g (emacs) to jump to emacs info.
Use g Specifying File Variables to jump to the page.
You can use tab to complete node names.