Question

I've been trying teach myself emacs, and because I am using dvorak, I foolishly rebound C-c to a movement key and got used to it. Now i'm actually starting to do some programming with it, and I loaded up a python file and noticed that C-c is the prefix to all the special commands in python-mode.

Can I rebind the prefix key and change all python commands in one swoop in my init.el file? If not, should I rebind all the python commands individually?

Was it helpful?

Solution

If you look at the source code for python.el, you'll see that the commands were added individually using the full specification, e.g. (define-key map "\C-c\C-r" 'python-send-region).

So, you're going to have to redo them all yourself. That said it is pretty straight-forward. From your comment, you want to change the prefix key to be C-', and the trick to getting escaping right is to not use escapes at all, but instead to use the macro kbd (documentation link).

With that, you can update the mode-map definition to be:

(defvar python-mode-map
  (let ((map (make-sparse-keymap)))
    ;; Mostly taken from python-mode.el.
    (define-key map ":" 'python-electric-colon)
    (define-key map "\177" 'python-backspace)
    (define-key map (kbd "C-' <") 'python-shift-left)
    (define-key map (kbd "C-' >") 'python-shift-right)
    (define-key map (kbd "C-' C-k") 'python-mark-block)
    (define-key map (kbd "C-' C-d") 'python-pdbtrack-toggle-stack-tracking)
    (define-key map (kbd "C-' C-n") 'python-next-statement)
    (define-key map (kbd "C-' C-p") 'python-previous-statement)
    (define-key map (kbd "C-' C-u") 'python-beginning-of-block)
    (define-key map (kbd "C-' C-f") 'python-describe-symbol)
    (define-key map (kbd "C-' C-w") 'python-check)
    (define-key map (kbd "C-' C-v") 'python-check) ; a la sgml-mode
    (define-key map (kbd "C-' C-s") 'python-send-string)
    (define-key map (kbd "C-\\ M-x") 'python-send-defun)
    (define-key map (kbd "C-' C-r") 'python-send-region)
    (define-key map (kbd "C-' M-r") 'python-send-region-and-go)
    (define-key map (kbd "C-' C-c") 'python-send-buffer)
    (define-key map (kbd "C-' C-z") 'python-switch-to-python)
    (define-key map (kbd "C-' C-m") 'python-load-file)
    (define-key map (kbd "C-' C-l") 'python-load-file) ; a la cmuscheme
    (substitute-key-definition 'complete-symbol 'symbol-complete
                               map global-map)
    (define-key map (kbd "C-' C-i") 'python-find-imports)
    (define-key map (kbd "C-' C-t") 'python-expand-template)
    (easy-menu-define python-menu map "Python Mode menu"
      `("Python"
        :help "Python-specific Features"
        ["Shift region left" python-shift-left :active mark-active
         :help "Shift by a single indentation step"]
        ["Shift region right" python-shift-right :active mark-active
         :help "Shift by a single indentation step"]
        "-"
        ["Mark block" python-mark-block
         :help "Mark innermost block around point"]
        ["Mark def/class" mark-defun
         :help "Mark innermost definition around point"]
        "-"
        ["Start of block" python-beginning-of-block
         :help "Go to start of innermost definition around point"]
        ["End of block" python-end-of-block
         :help "Go to end of innermost definition around point"]
        ["Start of def/class" beginning-of-defun
         :help "Go to start of innermost definition around point"]
        ["End of def/class" end-of-defun
         :help "Go to end of innermost definition around point"]
        "-"
        ("Templates..."
         :help "Expand templates for compound statements"
         :filter (lambda (&rest junk)
                   (abbrev-table-menu python-mode-abbrev-table)))
        "-"
        ["Start interpreter" python-shell
         :help "Run `inferior' Python in separate buffer"]
        ["Import/reload file" python-load-file
         :help "Load into inferior Python session"]
        ["Eval buffer" python-send-buffer
         :help "Evaluate buffer en bloc in inferior Python session"]
        ["Eval region" python-send-region :active mark-active
         :help "Evaluate region en bloc in inferior Python session"]
        ["Eval def/class" python-send-defun
         :help "Evaluate current definition in inferior Python session"]
        ["Switch to interpreter" python-switch-to-python
         :help "Switch to inferior Python buffer"]
        ["Set default process" python-set-proc
         :help "Make buffer's inferior process the default"
         :active (buffer-live-p python-buffer)]
        ["Check file" python-check :help "Run pychecker"]
        ["Debugger" pdb :help "Run pdb under GUD"]
        "-"
        ["Help on symbol" python-describe-symbol
         :help "Use pydoc on symbol at point"]
        ["Complete symbol" symbol-complete
         :help "Complete (qualified) symbol before point"]
        ["Find function" python-find-function
         :help "Try to find source definition of function at point"]
        ["Update imports" python-find-imports
         :help "Update list of top-level imports for completion"]))
    map))

OTHER TIPS

If you want Ctrl+C to act as left and F12 to act as C-c:

(define-key key-translation-map [f12] "\C-c")
(define-key key-translation-map "\C-c" [left])

Note that this will also influence multi-key bindings, e.g. you now need to type Ctrl+X F12 to exit Emacs. The flip side of this coin is that C-c C-c is typed as F12 F12.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top