【问题标题】:Xemacs with Windows Style Key Bindings带有 Windows 样式键绑定的 Xemacs
【发布时间】:2009-12-12 12:38:53
【问题描述】:

Xemacs 是否与 Windows Style Key Bindings 一起使用? Emacs 有这些Windows key bindings

Emacs 的键绑定早于 现代图形用户界面,以及以前的键 由后来的 GUI 选择用于剪切和复制 被赋予了重要的功能 Emacs 中的扩展键盘映射。 CUA模式 试图让两个绑定共存 通过将 C-x 和 C-c 定义为 kill-region 当 区域是活跃的,并让他们 有他们正常的 Emacs 绑定时 该地区不活跃。很多人 发现这是可以接受的 妥协。 CUA 模式还定义了一个 其他键的数量(C-v、Shift 选择),并且可以从 选项菜单

【问题讨论】:

    标签: xemacs


    【解决方案1】:

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

    来自网页:

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

    EmacsW32 不是用于 MS Windows 的 Emacs。 相反,它是 Emacs 的附加组件 微软视窗。不过你可以下载 Emacs+EmacsW32 在一个安装程序中。

    【讨论】:

      【解决方案2】:

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

      或者,您可以自己添加它们,在您的 init.el 文件中添加几行键分配。首先在缓冲区中使用 C-x C-e 尝试它们以运行它们并确保它们正常工作。

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

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

      ; skm-blocks.el

      ;拜尔和史蒂夫·米切尔

      ; 2009 年 11 月 12 日

      ;标记块:

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

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

      ;

      ;目标:

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

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

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

      ; F9 标记第一端,

      ; F9 标记第二端,

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

      ; Vedit+ 使用删除键,而块突出显示删除 堵塞。在这里不行

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

      ;

      ;可能的改进:

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

      ;被复制等等。

      ;也就是说,这些东西是否会随着积木移动,留在原来的位置,

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

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

      ;当前标记“第三”端取消标记之前的 2 选定的块结束

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

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

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

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

      ;

      (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 
      

      插入块

        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 标记的块复制到当前光标位置。"

      (互动)

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

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

      (defun 移动块到点 ()

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

      (互动)

      (if (

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

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

      (互动)

      (if (

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

         (set-extent-property new-extent 'face 'zmacs-region)
      
         (set-extent-property new-extent 'wordstar-block t)))
      

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

      (defun clear-highlighting-whole-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)] 'mark-block)

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 2013-09-21
        • 1970-01-01
        • 1970-01-01
        • 2011-11-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多