2

Xemacs 是否可用于Windows 样式键绑定?Emacs 有这些Windows 键绑定

Emacs 的键绑定早于现代 GUI,后来的 GUI 选择用于剪切和复制的键被赋予了重要的功能,作为 Emacs 中的扩展键映射。CUA 模式尝试通过在区域处于活动状态时将 Cx 和 Cc 定义为 kill-region 和 copy-region-as-kill 来让这两个绑定共存,并在区域不活动时让它们具有正常的 Emacs 绑定。许多人认为这是一个可以接受的折衷方案。CUA 模式还定义了许多其他键(Cv、Shift 选择),并且可以从“选项”菜单中打开

4

2 回答 2

1

如果您可以忍受 emacs 而不是 Xemacs,那么可以使用EmacsW32 ,它是经过修改的普通 emacs,可以更好地与 Windows 集成。它有很多功能,包括在 emacs/win 键绑定之间进行选择。

从网页:

EmacsW32 是 Emacs lisp 模块和您可以从 Emacs 使用的 MS Windows 程序的集合。它可以使 Emacs 中的键盘和其他东西的功能更像它们通常在 MS Windows 程序中所做的那样。

EmacsW32 不是用于 MS Windows 的 Emacs。相反,它是用于 MS Windows 的 Emacs 的附加组件。但是,您可以在一个安装程序中下载 Emacs+EmacsW32。

于 2009-12-12T13:47:03.093 回答
0

我不确定您要查找哪些 Windows 键绑定,可能是剪切、复制、粘贴?这就是所谓的 CUA,不,默认情况下它不附带这些键绑定,但它们可以很容易地添加。这是指向具有 xemacs 的 CUA 模式的站点的链接。您应该能够安装 XEmacs,然后添加 CUA 模式,从而有效地创建您想要的内容。 http://sites.google.com/site/olegalexandrov/xemacs

或者,您可以自己添加它们,并在 init.el 文件中添加几行键分配。首先在带有 Cx Ce 的缓冲区中尝试它们以运行它们并确保它们工作。

我不使用 kill-ring 并且想以不同的方式标记块,所以我在文件 skm-mark-blocks.el 中编写了一些函数,我将尝试在此处插入或附加。在文件的末尾,您可以看到 global-set-key 行并将它们用作模板,以使 Windows 键按照它们在 Windows 中的工作方式工作。

-剪辑--------------------------------------

; skm-blocks.el

; 拜尔和史蒂夫·米切尔

; 2009 年 11 月 12 日

; 通过以下方式标记块:

; 用于标记第一个和第二个块结束标记的相同键

; 标记两端后,复制、剪切、移动和删除块的键

;

; 目标:

; 执行所有块命令:用左手标记、复制、移动、删除等

; 而右手用于用光标键在缓冲区中定位;

; 第一次写模仿 Vedit+ 方法(右手)::

; F9 标记第一端,

; F9 标记第二端,

; 然后 Cntl-F9(复制到光标)或 Alt-F9(移动到光标)

; Vedit+ 在块突出显示时使用删除键删除块。不会在这里工作

; 所以我们定义了一个具有相同前缀(super)的键来删除突出显示的块

;

; 可能的改进:

; 添加变量以选择在阻塞时如何移动点(或光标位置或块标记)

; 被复制等

; 也就是说,这些东西是否与块一起移动,保持在原来的位置,

; 或移动到新块的末尾等。

; 添加功能以取消标记所有块结束?

; 当前标记“第三”端取消标记先前选择的 2 个块端

; 并将第三端计为标记块的新第一端

; 除了我的姓名缩写之外,找到这种块标记的名称。

; 添加功能以使用新的组合键进行柱状块标记(矩形)。

; 添加 vars 以配置柱状块标记的工作方式、插入、覆盖等。

;

(defvar 块标记突出显示模式 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 块标记结束位置模式 t

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

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

插入块

  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 保存块的第一端

(defvar block-mark2 (point-marker)) ;var 保存块的第二端

(defvar block-ends-marked 0) ;0 如果没有标记结束,;1 或 2 表示标记的结束数

(defvar block-copiedp nil) ;t 如果块被复制

;-------- 标记块 --------------

(defun 标记块 ()

“用 skm 类型的块标记块的任一端。”

(交互的)

(if ( or (eq block-ends-marked 0 ) (eq block-ends-marked 2)) ;我们是否标记了一个块的第一个末端?

  (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 )  ))) )

;-------- 复制块到点 -----

(defun 复制块到点 ()

“将 skm 标记的块复制到当前光标位置。”

(交互的)

(让((开始位置(点)))

(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)) ))

;-------- 移动块到点 -----

(defun 移动块到点 ()

“将 skm 标记的块移动到当前光标位置。”

(交互的)

(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)) )))

;-------- 切块 ---------------

(defun 剪切块 ()

“从文件中删除带有 skm 标记的块。”

(交互的)

(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)))

;------- 持续高亮一个块 -----------

(defun 高亮区域 ()

(交互的)

(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)))

;------- 清除缓冲区中突出显示的块 -----------

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

(交互的)

(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 (&可选缓冲位置)

(交互的)

(如果(不是位置)

  (setq position (point)))

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

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

;------------按键分配 ------

;--- 模拟 VEdit+ 方法的键分配

;--- 验证我们的算法是否正确

;--- 一旦不需要它们就注释掉

(global-set-key [ f9 ] '标记块)

(global-set-key [ (control f9) ] '复制块到点)

(global-set-key [ (meta f9) ] '移动块到点)

(global-set-key [ (control meta f9) ] 'cut-block) ;不在 Vedit 中,但用于测试

(global-set-key [ (control shift f9) ] 'clear-highlighting) ;不在 Vedit 中,但用于测试

;------- 左手使用的按键分配

;--- 仅使用超级键(左 windows-logo 键)移动

; 不适用于 Windows 中的 xemacs,因为 Windows 抢占了超级键

; 必须试验才能找到适用于 Windows 的 xemacs 的东西......

(global-set-key [ (super space) ] '标记块)

(global-set-key [ (super v) ] 'copy-block-to-point) ;助记符:V 为插入,驱动一个V(楔形)in

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

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

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

;助记符:认为 N 表示不突出显示

--snip----------------- 希望这可以帮助您了解它是多么容易。在看到代码如何进入此消息后,很明显我需要一些练习将代码放入此编辑器(笑)。

于 2012-05-31T04:09:07.483 回答