撸了一个package:number-lock

原文地址: http://liu233w.github.io/blog/2016/08/21/programming-mode/

现在package的名字已经被改成number-lock

项目简介

项目地址:https://github.com/Liu233w/number-lock.el

这个 package 的主要功能与我的另一个脚本:CapsLocKeys.ahk 中的一个功能类似, 可以把键盘上方的数字键替换成对应的符号,也就是说按下数字的时候会输入数字 上方的符号,而 shift+数字 则是数字本身。这个在写程序的时候非常有用。

但是那个脚本不能判断应用程序目前的状态,我只想在 evil 的 insert state 里面启用 替换的功能,而在其他模式底下关闭,而且在带有数字键的快捷键(比如 C-x 0 )里面 我也不想启用替换,所以只好写一个 emacs 的插件来替换按键了。

这个 package 定义了一个输入法:number-lock,只要用 set-input-method 把 输入法设置成这个,然后就可以用 C-\ 来启用替换了。每个 buffer 的状态都是独立的, 并且只有在 buffer 的 insert-state 中才会开启,其他时候无论是在组合键还是在 minibuffer 中都不会启动。而且,如果有一些 package 在单个按键上绑定了函数,比如说 paredit 就在 ) 上绑定了 paredit-close-round ,在按下右括号的时候可以把光标跳到最近 的右括号的外面,在使用了本 package 之后按下 0 之后可以调用这个函数,而不是仅仅 insert 一个 )

另一种实现方式

我是不用 emacs 里面的输入法的,所以这种实现方式对我没有什么影响,但使用内置 输入法的同学可能会不方便一些。其实一开始我不是使用这种方法,而是使用 Emacs-Wiki上的方法 ,用 key-translation-map 来替换按键的,但是会产生一些 奇怪的 bug,我把原来的代码保存在了另一个分支里面 ,如果有大神能帮我看看就 好了_(:зゝ∠)_

2 个赞

GNU ELPA 上有个 caps-lock,可以用来模拟 Caps Lock 键,你的需求也可以用类似的方法实现:

(defvar shift-maps
  '((?1 . ?!) (?2 . ?@) (?3 . ?#) (?4 . ?$) (?5 . ?%)
    (?6 . ?%) (?7 . ?&) (?8 . ?*) (?9 . ?\() (?0 . ?\))))

(defun shift ()
  (when (and (characterp last-command-event)
             (eq this-command 'self-insert-command))
    (setq last-command-event
          (or (cdr (assq last-command-event shift-maps))
              (car (rassq last-command-event shift-maps))
              last-command-event))))

(add-hook 'pre-command-hook #'shift)
1 个赞

原来可以这样(´・ω・`)

感觉这么做还是有问题的。

有一些package会把单个的按键替换成其他的命令,比如pareditlisp-mode中的插入模式下按下(会调用函数paredit-open-round

我希望在按下9的时候可以调用这个函数,而不是直接插入字符(,这个shift函数好像不能满足这样的要求。而我的那个使用输入法的方法和之前的使用translation-map的方法都是可以满足这个要求的。

感觉我需要换一个package的名字了,有人在我给melpa的PR里面说这个名字和emacs内置的一个名称太像

大家有什么好主意吗?我的英语太差,实在不知道该叫什么名字好 _(:зゝ∠)_

shift-numbers-mode ?

1 个赞

在github上一搜,找出来一个 vim-numberlock

这么说叫做 number-lock.el也不错啊。github上还没有类似名字的插件呢


刚刚发现在melpa上有一个 shift-number

1 个赞

我的package已经成功登录melpa了

撒花~\(≧▽≦)/~

感谢大家的支持

1 个赞

第一次提交package,感觉就好像第一次很女生 XXOO 一样。。。。。

呆神经验丰富啊