rolandwalker / simpleclip

Simplified access to the system clipboard in Emacs.
174 stars 16 forks source link

Advice on getting this working with emacs-mac-port #1

Open huyz opened 10 years ago

huyz commented 10 years ago

I'm trying to use https://github.com/railwaycat/emacs-mac-port/ on OS X, but for some reason the keybindings don't work. I've filed an issue here https://github.com/railwaycat/emacs-mac-port/issues/57 but maybe you have some insight as to what keybindings may be overriding simpleclip's.

rolandwalker commented 10 years ago

Hi!

Yes, the Mac port has different modifier bindings than Cocoa Emacs.app.

The Mac port has the meta modifier on , and reserves the option key for native OS X extended characters. So, by default

By contrast Cocoa Emacs.app maps to the super modifier, and option to the meta modifier.

So, if you want the modifiers in the Mac port to match Cocoa Emacs.app, you are halfway there: you have meta on both and option. Emacs sees them as the same key. This should do what you want:

(setq mac-option-modifier 'meta)
(setq mac-command-modifier 'super)

You may also want to set

(setq mac-pass-command-to-system nil)

However, it seems that I should update the docs for this and several other libraries, because the docs just assume that OS X users are running Cocoa Emacs. But ⌘-v is different on the different ports.

huyz commented 10 years ago

Yay, that did it. I was missing the (setq mac-command-modifier 'super) command.

Thanks!

huyz commented 10 years ago

It turns out that that wasn't my problem. I didn't need to switch the option and command keys.

The problem was that I had lost the use of the "M-x" key, which is the only meta key that I need since I use vimpulse mode.

So to get the M-X key back, I just did:

    (global-set-key "≈" 'execute-extended-command)

These are my settings, if this helps someone else:

(global-set-key [(meta s)] 'save-buffer)
(global-set-key [(meta l)] 'goto-line)
(global-set-key [(meta w)]
                (lambda () (interactive) (delete-window)))
(global-set-key [(meta z)] 'undo)

(if window-system
  (progn
    (require 'simpleclip)
    (simpleclip-mode 1)
    (global-set-key "≈" 'execute-extended-command)))

Note that this doesn't entirely solve the problem of which key is the meta key for Emacs (this only fixes the M-x key).

huyz commented 10 years ago

Ok, now I'm trying to solve a similar problem with regular Emacs 24.3 for Mac OS X . I also lost the use of the M-x key. In fact it looks like the option and cmd keys do the exact thing. I guess they're both mapped to super? so how do i set my option key to be meta?

I tried (setq mac-option-modifier 'meta) but that didn't work

rolandwalker commented 10 years ago

I tried (setq mac-option-modifier 'meta) but that didn't work

Right. The mac- prefix is specific to the Mac port. Cocoa Emacs uses variables starting with ns-. To make option map to the meta modifier:

(setq ns-alternate-modifier 'meta)

Thanks very much for the snippet above regarding vimpulse. I'd like to make simpleclip "just work" under vimpulse/evil/viper, but have not done anything about it since I don't use those modes.

huyz commented 10 years ago

Oh, good to know.

In my attempts to harmonize regular Emacs for Mac OS X and emacs-mac-port (which uses the option key for Mac alternate characters), I ended up reshuffling things. I mapped the option key to Hyper and then got my M-x keybinding back that way:

;; Change function key to hyper so that we can rebind our regular M-x to it
; For regular Emacs for Mac OS X
(setq ns-function-modifier 'hyper)
(setq ns-option-modifier 'super)  ; Doesn't seem to have any effect as option and meta do the same thing
(setq ns-command-modifier 'meta)
; For emacs-mac-port
(setq mac-function-modifier 'hyper)

;; Get back our M-x key, which won't interfere with emacs-mac-port use of the Option
;; key for Mac alternate characters
(global-set-key [(hyper x)] 'execute-extended-command)

;; To backward-kill-word, in Mac we usually do Option-Backspace, but since
;; emacs-mac-port takes over the Option key, we have to rely on the default
;; Ctrl-Backspace or map Fn-Backspace.
;; Note that Fn-Backspace only works in emacs-mac-port so best to use Ctrl-Backspace
;; just like on Windows
(global-set-key [(hyper delete)]  'backward-kill-word)

;; Typical Mac bindings
(global-set-key [(meta s)] 'save-buffer)
(global-set-key [(meta w)]
                (lambda () (interactive) (kill-buffer)))
;                (lambda () (interactive) (delete-window)))
(global-set-key [(meta z)] 'undo)
(global-set-key [(meta backspace)]
                (lambda nil (interactive) (kill-line 0)))

;; Emacs bindings
(global-set-key [(meta l)] 'goto-line)

I wish I could make sense of it all :)