开发者

Xemacs with Windows Style Key Bindings

Is Xemacs available with Windows Style Key Bindings ? Emacs has these Windows key bindings

The keybindings of Emacs predate modern GUIs, and the keys that were chosen by later GUIs for cut and copy were given important functions as extended keymaps in Emacs. CUA mode attempts to let both bindings co-exist by defining C-x and C-c as kill-region and copy-region-as-kill when the region is active, and letting them have their normal Emacs bindings when the region is not active开发者_运维技巧. Many people find this to be an acceptable compromise. CUA mode also defines a number of other keys (C-v, Shift selection), and can be turned on from the Options menu


If you could put up with emacs instead of Xemacs there is EmacsW32 it's plain emacs modified to integrate better with windows. It has a lot of features including a choice between emacs/win keybindings.

From webpage:

EmacsW32 is a collection of Emacs lisp modules and MS Windows programs you can use from Emacs. It can make the keyboard and other things in Emacs function more like they do usually in MS Windows programs.

EmacsW32 is not Emacs for MS Windows. Instead it is an add-on to Emacs for MS Windows. You can however download Emacs+EmacsW32 in one installer.


I'm not sure which Windows key bindings you are looking for, probably cut.copy,paste? That is called CUA and no it does not come with those key bindings by default, but they can be easily added. Here's a link to a site that has a CUA-mode for xemacs. You should be able to install XEmacs, then add the CUA-mode, effectively creating what you are wanting. http://sites.google.com/site/olegalexandrov/xemacs

Alternatively, you can add them yourself with a few lines of key assignments added to your init.el file. Try them first in a buffer with C-x C-e to run them and make sure they work.

I do not use the kill-ring and wanted to mark blocks a different way, so I wrote some functions in a file skm-mark-blocks.el which I will try to insert or attach here. At the end of the file you can see the global-set-key lines and use them as a template for making the Windows keys work the way they do in Windows.

-snip--------------------------------------

; skm-blocks.el

; Byrel and Steve Mitchell

; Nov 12, 2009

; mark blocks by:

; same key for marking first and second block end markers

; once both ends marked, keys to copy, cut, move, & delete block

;

; Goal:

; to do all block commands: mark, copy, move, del, etc. with the left hand

; while the right hand used for positioning in buffer with cursor keys ;

; first written mimicing Vedit+ method (for right hand)::

; F9 to mark first end,

; F9 to mark second end,

; then Cntl-F9 (copy to cursor) or Alt-F9 (move to cursor)

; Vedit+ uses the delete key while block highlighted to delete block. Won't work here

; so we define a key with the same prefix (super) for deleting highlighted block

;

; possible improvements:

; add vars to choose how point (or cursor position or block markers) is moved when block

; is copied, etc.

; that is, do these things move with the block, stay where they were was,

; or move to end of new block, etc.

; add function to unmark all block ends?

; currently marking a "third" end unmarks the 2 previously selected block ends

; and counts the third end as marking a new first end of block

; find a name for this kind of block marking other than my intials.

; add functions to do columnar block marking (rectangles), with new key combinations.

; add vars to config how columnar block marking should work, insert, overwrite, etc.

;

(defvar block-marker-highlight-mode 1

 "block-marker-highlight-mode can have 3 values: 

  0 = highlighing is removed following a block copy or block move

  1 = w/ a copy, orig block remains highlighted

      w/ a move, block is highlighted at new position

  2 = w/ copy or move, block is highlighted at new position" )

(defvar block-marker-end-position-mode t

 "block-marker-end-position-mode has 2 values:

  t = after a block copy/move, cursor is positioned at end of 

inserted block

  nil = after a block copy/move, cursor is positioned at beginning of inserted block

  note: t is similar to the way Xemacs works by default")

(defvar block-mark1 (point-marker)) ;var to hold 1st end of our block

(defvar block-mark2 (point-marker)) ;var to hold 2nd end of our block

(defvar block-ends-marked 0) ;0 if no ends marked, ;1 or 2 for number of ends marked

(defvar block-copiedp nil) ;t if block copied

;-------- mark-block --------------------------

(defun mark-block ()

"Marks either end of block with skm type blocks."

(interactive)

(if ( or (eq block-ends-marked 0 ) (eq block-ends-marked 2)) ;are we marking the first end of a block?

  (progn 

(setq block-mark1 (point-marker))    

(setq block-ends-marked 1)

    (clear-highlighting )

(set-mark-command nil))       ;starts highlighting      

( if (eq block-ends-marked 1)  ; if there is 1 block marker already, we are marking the second end.

(progn (setq block-mark2 (point-marker))

       (setq block-ends-marked 2) 

           (highlight-region )  ))) )

;-------- copy-block-to-point -----------------

(defun copy-block-to-point ()

"Copies skm-marked block to cur. cursor pos. "

(interactive)

(let ((start-pos (point)))

(if ( < block-ends-marked 2) 

(message "Both ends not marked: %d end(s) marked." block-ends-marked ) ;error if there aren't 2 ends marked 

  (save-excursion

(set-buffer (marker-buffer block-mark1))

(copy-to-register ?c block-mark1 block-mark2))

  (insert-register ?c t)                     

  (setq block-copiedp t)

  (let ((end-pos (point)))

(if (eq block-marker-highlight-mode 0)               ;0 = clear all highlighting

    (clear-highlighting-at-point ( marker-buffer block-mark1) block-mark1)

  (if (eq block-marker-highlight-mode 2 )             ;2 = highlight at new position  

      (progn 

    (clear-highlighting-at-point ( marker-buffer block-mark1) block-mark1)

    (goto-char start-pos)

    (push-mark)

    (goto-char end-pos)

    (highlight-region))))))

(if (not block-marker-end-position-mode) ;determine where to leave cursor

(goto-char start-pos)) ))

;-------- move-block-to-point -----------------

(defun move-block-to-point ()

"Moves skm-marked block to current cursor pos. "

(interactive)

(if ( < block-ends-marked 2)

  (message "Both ends not marked: %d end(s) marked." block-ends-marked )

(save-excursion

  (set-buffer (marker-buffer block-mark1))

  (copy-to-register ?c block-mark1 block-mark2 t))

(let ((start-pos (point)) end-pos )

  (insert-register ?c t)

  (setq end-pos (point))

  (setq block-copiedp t)

  (clear-highlighting-at-point ( marker-buffer block-mark1) block-mark1)

  (if (eq block-marker-highlight-mode 0) ;0 = clear all highlighting

  nil

(goto-char start-pos)

(push-mark)

(goto-char end-pos)

(highlight-region))

  (if (not block-marker-end-position-mode)             ;determine where to leave cursor

  (goto-char start-pos)) )))

;-------- cut-block ---------------------------

(defun cut-block ()

"Cuts skm-marked block from file."

(interactive)

(if ( < block-ends-marked 2)

  (message "Both ends not marked: %d end(s) marked." block-ends-marked )

(copy-to-register ?c block-mark1 block-mark2 t)

(setq block-copiedp t)))

;------- highlight a block persistantly -----------

(defun highlight-region ()

(interactive)

(let (new-extent) (setq new-extent (make-extent (mark t) (point)))

   (set-extent-property new-extent 'face 'zmacs-region)

   (set-extent-property new-extent 'wordstar-block t)))

;------- clear the highlighted blocks in a buffer -----------

(defun clear-highlighting-whole-buffer (&optional buffer)

(interactive)

(let ((highlighted-list (extent-list buffer nil nil nil 'face 'zmacs-region)))

(while highlighted-list

  (delete-extent (car highlighted-list))

  (setq highlighted-list (cdr highlighted-list)))))

(defun clear-highlighting-at-point (&optional buffer position)

(interactive)

(if (not position)

  (setq position (point)))

(while (extent-at position buffer 'wordstar-block nil 'at )

(delete-extent (extent-at position buffer 'wordstar-block nil 'at )) ))

;------------key assignments ------------------

;--- key assignments to mimic VEdit+ method

;--- to verify we have algorithm correct

;--- comment out once they are not needed

(global-set-key [ f9 ] 'mark-block)

(global-set-key [ (control f9) ] 'copy-block-to-point)

(global-set-key [ (meta f9) ] 'move-block-to-point)

(global-set-key [ (control meta f9) ] 'cut-block) ;not in Vedit, but for testing

(global-set-key [ (control shift f9) ] 'clear-highlighting) ;not in Vedit, but for testing

;------- key assignments for left hand use

;--- using only super key (left windows-logo key) shifting

;Doesn't work with xemacs in Windows since Windows preempts the super key

; have to experiment to find something to work for windows' xemacs...

(global-set-key [ (super space) ] 'mark-block)

(global-set-key [ (super v) ] 'copy-block-to-point) ;mnemonic: V for insert, drive a V (wedge) in

(global-set-key [ (super m) ] 'move-block-to-point) ;mnemonic: M for move

(global-set-key [ (super c) ] 'cut-block) ;mnemonic: C for Cut

(global-set-key [ (super n) ] 'clear-highlighting-at-point)

;mnemonic: think N for No highlighting

--snip----------------- Hope this helps you see how easy it is to do. After seeing how the code went into this message, it is obvious that I need some practice putting code into this editor (grin).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜