How to write a tilde (~) character in Emacs on Mac OS X? - macos

I'm used to write a ~ character by pressing Alt+N on Mac OS X. This does not work in Emacs. Alt+N key seems to be bind to the command history. So my question is how to write a ~ character in Emacs on Mac OS X?
EDIT: I'm using Aquamacs.

While this question is pretty old, none of the answers seems satisfying for Emacs for OS X (the most popular choice these days). So, for future readers ...
Plain Emacs for OS X uses both Alt keys as Meta by default. As many characters are typed using Alt on a german Mac keyboard (tilde, brackets, curly braces etc.), I'd recommend setting ns-right-alternate-modifier to nil, which enables typing tilde (Alt-n) and other characters using the right Alt key, while the left one can be used as Meta (like for M-x).
Alternatively Cmd can be customized to be Meta. All options can be interactively customized under M-x customize-group ns.

You could always open the 'character viewer', select 'Punctuation', find '~' (tilde), and then double click it. That will insert it at the Emacs point. (The 'character viewer' is readily accessible after checking 'Show Keyboard & Character Viewers in menu bar' from the Keyboard pane in the System Preferences window.)
You could also define an emacs-lisp function as:
(defun tilde () (interactive) (insert "~"))
and then invoke it with M-x tilde to insert a tilde. Could then assign that function to the key combo of your choice as
(global-set-key "\M-\C-!" 'tilde) ;; you choose the combo
and add all this to your 'emacs init' file.

quoted-insert should deal with this.
C-qAlt-N

Aquamacs : Options -> Options Commands Meta Key -> Meta and French ?

Unfortunately the answer by fpbhb does not work when running emacs in a terminal (emacs -nw).
I was able to come up with a solution to this problem that works in both situations (standalone and in-terminal). Also, I have an international keyboard and I was also able to fix the problem of not being able to type special characters when running emacs in the terminal.
This snippet properly binds the left option key to "META" when running emacs as an app (i.e. not in a terminal). It does not bind the right option key, which can be used to type special characters:
(setq mac-command-key-is-meta nil
mac-command-modifier nil)
(setq mac-option-key-is-meta t
mac-option-modifier 'meta
mac-right-option-modifier nil)
All of the above has no effect when running emacs in a terminal. To obtain the same key bindings in the Terminal you have to:
Terminal Preferences -> Keyboard -> Use Option as Meta key
Unfortunately, after doing this you will not be able to use the option key to type special characters in international keyboards. In particular I was missing the tilde, the backslash and the #.
I solved this last problem by adding the missing key mapping to my .emacs:
(define-key key-translation-map (kbd "M-ñ") (kbd "~"))
(define-key key-translation-map (kbd "M-º") (kbd "\\"))
(define-key key-translation-map (kbd "M-2") (kbd "#"))
Voilà.

Related

How to enter 3.Plane chars of the Neo2 keyboard layout in emacs running on Mac OS X?

I've got a problem on OS X with emacs, Karabiner and the Neo2 keyboard layout a alternativ German keyboard layout.
The third and fifth keyboard plane entert with Capslock as mod key is not working.
My keyboard layout of choice is Neo2, I set it up, on the Mac im switching to, using jgosmanns neo2-layout-osx from GitHub in combination with the suggested Karabiner and it's rules enabled.
On other Editors like TextEdit the fist 5 planes are working correctly,
but on emacs the 3. and the 5. plane are not. I assume emacs uses somehow the Capslock key. Perhaps there is a similar thing to (setq ns-right-alternate-modifier 'none) which is needed to type characters like ~ or # on a regular german keyboard layout.
Or there is a problem between Karabiner and emacs, since Karabiner is needed to enter the third, fifth and sixth plane of Neo2 on OS X.
A minimal init.el:
(setq inhibit-startup-message t)
(setq mac-function-modifier 'control
mac-control-modifier 'control
mac-option-modifier 'alt
mac-command-modifier 'meta
ns-right-alternate-modifier 'none)
How can I enable at least the 3. plane for the needed chars:
…_[]^!<>=& \/{}*?()-:# #$|~+%"';
To make it work on a recent Apple Silicon MacbookPro with Emacs.app 27.2 it required setting only:
(setq mac-option-modifier 'none)
Otherwise the Mod3 keys would be recognized as Meta keys.
Adding the following configuration option to Emacs did the trick for me:
(setq ns-right-alternate-modifier nil)
(setq ns-alternate-modifier 'meta)
(global-set-key (kbd " ") " ")

<tab> v. TAB in emacs

I'm using emacs 24.3 in the OS X terminal, and have run into something strange.
In markdown-mode.el, the tab key is bound to a specific function in the keymap via (define-key map (kbd "<tab>") 'markdown-cycle), but for some reason this wasn't registering for me (though other parts of the keymap were working fine).
What fixed this was changing <tab> to TAB in the above. Is this something wonky in the OS X terminal? Is there a way to fix this; I feel like this shouldn't occur.
I believe markdown-mode should be using TAB, not <tab>.
As far as I can tell, <tab> is the Tab key on the keyboard, and TAB is control-I, or ascii character 9 (written \t or \x09). The Tab key doesn't have an ascii value.
In GUI Emacs, Emacs sees that you pressed the Tab key (<tab>) and converts it to C-i (TAB) by default. Emacs can distinguish Tab and C-i, but converts Tab to C-i unless you specifically bind <tab> to something else (which markdown-mode does).
In the terminal, the terminal converts the Tab key to C-i (ascii 9), and Emacs sees only C-i. Emacs can't distinguish the two because they both show up as C-i.
The same thing happens with <return> vs RET (C-m, ascii 13).
Using TAB with define-key should automatically bind whatever event your keyboard sends for the key labeled "Tab", whether it is the ASCII TAB character, also known as C-i (Control + i) or something else -- including what Emacs writes as the pseudo-function key <tab>.
This might not work automatically in all cases. If it does not work for your particular keyboard then use C-h k and hit your Tab key, to find out what it is bound to. Whatever Emacs tells you is the key sequence, try binding that. For example, if it tells you that the key sequence is <foobar> then use (kbd "<foobar>").
But in most cases, all you need to do is use (kbd "TAB") (or "\C-i" or [control ?i]).

Emacs question - hash key

I have a Mac Laptop and I am connecting to server running Linux. As Alt+3 is already bound in EMACS to a command, so I cannot insert the hash symbol in a file.
I have tried the following solution I found online:
(global-unset-key (kbd "C-3"))
(global-set-key (kbd "C-3") '(lambda() (interactive) (insert-string
"#"))) //I know that C is for CTRL not Alt - I have tried with
M-3 instead as well
and some others as well, but none seem to work. Can you tell me any
other way in which I might be able to enter the hash sign (#) in a
file.
Aso tried (did not work):
(fset 'insertPound "#")
(global-set-key (kbd "M-3") 'insertPound)
Thank you!
From http://jimbarritt.com/non-random/2010/11/07/typing-the-pound-or-hash-key-in-emacs-on-uk-macbook
Typing the pound, or hash (#) key in emacs on UK Macbook:
The problem with OS X and the UK keyboard is that the pound key actually has a £ on it. To get “#” you have to press Alt+3
Of course, in emacs, the alt key is the meta key which is trapped by emacs. The simple function below inserted into your .emacs file should map the keys correctly.
;; Allow hash to be entered
(global-set-key (kbd "M-3") '(lambda () (interactive) (insert "#")))
I assume that you have a Mac UK keyboard so Shift-3 is £. On most other keyboards Shift-3 is # as others have said.
The way I get round it is to change the input source to Australian the only difference is that Shift-3 is now # and Alt-3 is £ (or leave as the emacs binding)
Input Source setting
was System Preferences->Language&text->Input Source
On later OSX versions (OSX 10.11 definitely but would have been earlier) Input Source setting is System Preferences->Keyboard->Input Source By default this will just show the UK keyboard to see more hit the + at the bottom of the list and add Australian
The reason I prefer this rather than adding code in emacs is that Shift-3 is # for all apps e.g. including Xcode/Eclipse so I don't have to switch the key according to the app or according to wether I am on a US keyboard or on Windows/Linux etc.
I know this is a bit late and the answer has been accepted. However, I have just moved from Linux to MacOS with a UK keyboard and had the same problem.
Note: I am using the emacs from here: http://emacsformacosx.com/. The below may be different for Carbon Emacs/Aquamacs etc.
The global-set-key method above is fine if you just need the # sign, but what if you also need to access the € character? (Which is Alt-3 on a UK keyboard)
The solution for me was to add this to my init file:
(setq ns-right-alternate-modifier (quote none))
This removes the emacs bindings for the right alt/option key.
You can see all the available options with
M-x customize-group RET ns RET
Credit goes to http://emacsformacosx.com/tips
A lot of the solutions given here and elsewhere work for typing # in a normal buffer, but they don't make it work like a normal keypress; in particular, it will abort an incremental search, which makes it hard to write macros that deal with Python comments, or C #includes, for example. So, it's best to transform the key much earlier, so it just acts like another typing keystroke.
I've found that adding this command to your Emacs configuration works very well:
(define-key key-translation-map (kbd "M-3") (kbd "#"))
...and remove all the (global-set-key...) attempts.
If -- like me -- you switch your modifier keys around, Opt ⌥ is mapped to Hyper, so I just go belt-and-braces with:
(define-key key-translation-map (kbd "M-3") (kbd "#"))
(define-key key-translation-map (kbd "M-£") (kbd "#"))
(define-key key-translation-map (kbd "H-3") (kbd "#"))
(define-key key-translation-map (kbd "H-£") (kbd "#"))
(define-key key-translation-map (kbd "S-3") (kbd "#"))
(define-key key-translation-map (kbd "S-£") (kbd "#"))
My solution (note escape sequence):
;; Even though we may have set the Mac OS X Terminal's Alt key as the emacs Meta key ...
;; ... we want to be able to insert a '#' using Alt-3 in emacs as we would in other programs
(fset 'insertPound "#")
(define-key global-map "\M-3" 'insertPound)
As S.Lott said, it's S-3 to insert a number sign (or hash, pound, octothrope).
Why do you want to use the meta modifier to insert it? Also, what is M-3 bound to on your setup? You can get it by doing an C-h-k and then hitting the key combination.
Assuming you are referring to Alt properly and that it's setting the Meta modification bit you can shove
(global-unset-key (kbd "M-3"))
into your .emacs and eval it to disable this from happening.
All "normal" keys are bound to self-insert-command. The shift modifier simply upcases the 'key' which is used to call this function so you get a # instead of 3 when you do a S-3.
Also, I still don't understand why you're using Alt rather than shift to display the # symbol. What do you do when you want to type a #?

Unable to type braces and square braces in emacs

I'm running Mac OS X and GNU Emacs 22.3.1. I use a swedish keyboard. I am unable to type braces { }, [ ] in emacs. When trying to type braces I get parenthesis. Since I'm quite new to Mac and emacs I need a little help on configuring emacs to get this right.
(setq mac-option-modifier nil
mac-command-modifier 'meta
x-select-enable-clipboard t)
This is what I use for my swedish keyboard. It even works with svorak A5, if you use it :)
You could also try:
(setq mac-option-key-is-meta t)
(setq mac-right-option-modifier nil)
I'm assuming that you're using a graphical emacs, and not just using the OS X bundled version from within Terminal.
To ensure that Emacs responds to keystrokes in the same way as other OS X apps, try the following:
(setq default-input-method "MacOSX")
And in particular, if you want to use the Option key to enter extended characters not on your keyboard (e.g. "Option-c c" => "ç"), use these settings:
(setq mac-command-modifier 'meta)
(setq mac-option-modifier 'none)
(Put these commands in your ~/.emacs or ~/.emacs.d/init.el emacs startup file, and restart Emacs, or just "M-x eval-buffer" while editing the file.)
(setq default-input-method "MacOSX")
(setq mac-command-modifier 'meta
mac-option-modifier nil
mac-allow-anti-aliasing t
mac-command-key-is-meta t)
Try this. You will be able to use the Alt key as a AltGR and for all the old M-x functions you will have to use your command key.
Bind the relevant keyboard shortcuts to anonymous functions that insert those characters, for example add these lines to ~/.emacs for European Portuguese:
(global-set-key "\M-(" (lambda () (interactive) (insert "{")))
(global-set-key "\M-)" (lambda () (interactive) (insert "}")))
(global-set-key "\M-8" (lambda () (interactive) (insert "[")))
(global-set-key "\M-9" (lambda () (interactive) (insert "]")))
Then save ~/.emacs with C-x C-s and reload it with M-x load-file and type ~/.emacs.
One downside is that this does not work in the mini-buffer, and typing "Alt-9" will insert text in the buffer and not the mini-buffer.
Comparison with other solutions: This solution maintains compatibility with other shortcuts using M-. The solutions by #monotux, #sanityinc, and Abdul Bijur V A do work, but they do not maintain that compatibility, e.g. Cmd-Q no longer quits the program and M-x no longer calls the mini-buffer to execute commands.
The solution by #patrikha doesn't suit touch-typing, which requires the same modifier commands on the right and the left side of the keyboard (Command, Alt/Option, Shift, and Control). For example, with this solution doing M-x requires the left thumb on the left Alt key and the left index finger on the S key, instead of the right thumb on the right Alt key. You could (setq mac-left-option-modifier nil), but that might require a change in habits for letters on the right side of the keyboard.
Notes: If you use AquaMacs, the wiki has a work-around in the section "Inputting {}[] etc. on non-English keyboards, or other keys with the Option modifier".
I also add this line to the end of ./emacs to show the matching of brackets and braces: (show-paren-mode).
I would try a Cocoa based emacs ie version 23. For a mac integrated emacs I would try Aquamacs
I had the same issue with a french keyboard. It looks like an Aquamacs issue (Carbon Emacs does not replace { with ()).
The change in emacs above work fine and I could type brackets but I could not use standard shortcuts anymore (Ctrl+C/Ctrl+V for instance).
Aquamacs provides a workaround.
Menu Bar > Options > Option, Command, Meta keys > select ...Meta & French
It worked fine for me. However it may not work for swedish, no swedish keyboard option.
Using Aquamacs:
From the main menu, go to Options - Option, command, meta keys and select "option for composed characters".
The braces and the brackets work as with the standard Mac keyboard.
You don't need to remember those programming like things: Here is the answer. Go to Keyboard preferences, and check the "Show keyboard and character viewer in menu bar". After that, check on the menu bar near the battery meter for the icon and start double clicking any character you want.

What does "s-[keyname]" refer to in Emacs, and how do I tell Emacs to ignore it?

Background information:
I'm on a Mac, and I've just upgraded to Emacs 23.1 via http://emacsformacosx.com/. There are a few issues, notably the lack of full screen ability.
I've attempted to get around this last issue by installing Megazoomer, which adds a global input manager bound to Cmd-return. This causes the currently forward application to maximise. However, Emacs reports that <s-return> is undefined. I've never seen an s-[key] mentioned before, and Google isn't forthcoming with an answer.
So, two parts:
What does s-[key] mean? This is purely for my satisfaction; and
Can I tell Emacs to ignore this key combination and let the key combination carry through to the system (so that hopefully I can have full screen Emacs back again)?
EDIT: so 1) is resolved, and as to 2) I've got: (global-set-key (kbd "<s-return>") 'ignore), which at least stops the error. However, Emacs still swallows the key combination, which isn't ideal.
It's the Super key, like M- is the Meta key (alt key on a PC keyboard, Command key on your keyboard) and C- is the Control key.
I have of course never actually seen a super key on my keyboard... they are from a long gone era. Wikipedia has an image of this impressive "Space Cadet keyboard" which has all the modifiers you'll ever need:
With plain Emacs 23.1 on a Macbook Pro, I can map the right option key to super by
(setq ns-right-option-modifier 'super)
Your other choice seems to be the function key, which would be ns-function-modifier. However, fn might have other uses, whereas Emacs’ default is to map ns-right-option-modifier to ’left (ie, the same effect as the left option key, which I at any rate need to get the # character!), so the right option key is to some extent redundant.
Left-handers may want to reverse this.
For the question about what the s-[key] means, on ubuntu box it means the Windows® shaped key. What it means on the OSX systems, I do not know.
As for maximizing windows, could you try this?
(It should work, iif OSX runs an X server somewhere underneath it all)
(if (equal (window-system) 'x)
(progn
(defun toggle-fullscreen ()
"Toggles fullscreen"
(interactive)
(x-send-client-message nil 0 nil "_NET_WM_STATE" 32
'(2 "_NET_WM_STATE_MAXIMIZED_VERT" 0))
(x-send-client-message nil 0 nil "_NET_WM_STATE" 32
'(2 "_NET_WM_STATE_MAXIMIZED_HORZ" 0)))
(global-set-key (kbd "C-c C-y") 'x-clipboard-yank)
(global-set-key (kbd "M-RET") 'toggle-fullscreen)))
This little snippet is what I use to toggle fullscreen on my *nix computers. And yanking from X's clipboard is a neat ability to have.
As for how to set keybindings, use global-set-key for mode independent keybindings.
(Add it to your .emacs file if you want it to be permanent.)
(setq ns-command-modifier nil)
That is supposed to do what you want. However, it's having somewhat unpredictable behaviour on machine when I test it, so be warned.

Resources