emacs快键和emacs配置

文中“待完善”的地方,都是需要后续进一步刷新的内容


有时间也可以慢慢看下
《21天学会 Emacs上》https://github.com/emacs-china/Spacemacs-rocks或者http://book.emacs-china.org/
《21天学会Emacs下》https://zilongshanren.com/blog/2016-08-21-learn-emacs-21-days-part-two.html
https://github.com/redguardtoo/mastering-emacs-in-one-year-guide/blob/master/guide-zh.org
https://www.masteringemacs.org/
https://www.gnu.org/software/emacs/manual/eintr.html


The Editor of a Life Time视频https://www.youtube.com/watch?v=VADudzQGvU8


--------------------------------------------------------------------------------
.emacs配置,如下以Linux配置文件为例(注意Windows系统里面,/需替换为\):
    
(global-set-key "\C-x\C-m" 'execute-extended-command)
(global-set-key "\C-c\C-m" 'execute-extended-command)
(global-set-key "\C-w" 'backward-kill-word)
(global-set-key "\C-x\C-k" 'kill-region)
(global-set-key "\C-c\C-k" 'kill-region)
(global-set-key "\C-x\ t" 'beginning-of-buffer)
(global-set-key "\C-x\ e" 'end-of-buffer)
(global-set-key "\M-r" 'isearch-backward-regexp)
(global-set-key "\M-s" 'isearch-forward-regexp)
(global-set-key "\C-j" 'goto-line)
(global-set-key (kbd "M-SPC") 'set-mark-command);set mark
(defalias 'qrr'query-replace-regexp)
(global-set-key [f5] 'call-last-kbd-macro)
(require 'recentf)
(recentf-mode 1)


如果修改.emacs文件后,执行M-x load-file载入 .emacs 文件,从而使其中的设置生效即可,不需要重启emacs。要生效其它 elisp 文件只需要把 .emacs 文件名换成其它的即可
解决windows下emacs卡顿的问题:进入emacs的option,修改默认字体为宋体。或者直接修改.emacs里面关于字体的配置项




--------------------------------------------------------------------------------




说明:
1、除了区域选择,尤其是你打算选一个矩形文本时,鼠标比键盘好用外,其他所有操作,你都应该使用键盘抛弃鼠标;
2、请丢弃菜单,丢弃UI,还有可有可无的滚动条;




Linux与Windows
1、两者很多场景下的/与\使用是相反的,包括路径、转义字符,以及.emacs配置文件中;




快键的指法说明
1、/C指代Ctrl键。/M指代Meta键,它可能是 Alt 键,它也可能在您系统所用的键映射表(keymap)中根本不存在。那没关系;Meta 有替代键,就是先按 Esc 键,再按击键后面的字符键位(而不是一起按)。击键是指代“按下键位再松开键位”;
2、/C-d用来删除光标当前所在字符,其指法为,先按住Ctrl键,然后击键d,完成删除后松开Ctrl键。当然在松开Ctrl键之前通过多次击键d,可以实现多次删除字符;
3、/C-x b用来切换buffer,其指法为,先按住Ctrl,然后击键x,再松开Ctrl,最后击键b;
4、/C-x/C-f用来打开文件加载至当前buffer,其指法为,先按住Ctrl,然后击键x,再击键f(或者在击键f之前,可以松开Ctrl,重新按下Ctrl后再击键f),最后松开Ctrl;
5、当键位击错时,可以通过/C-g 从快键中退出;
6、建议修改调换键盘的CapsLock和Right Ctrl键位,因为后者你使用的实在是太多了,而前者默认的键位很容易被小指俘获
7、/M-x被呼唤出来的情况实在是太多了,调用一个有名字的命令的方法是先输入 M-x,再输入命令名。建议用/C-x/C-m来呼唤/M-x,而不是蜷着左手使用Alt,而且Alt键并不可靠也并不是跨平台的标准键。为了提升按键组合容错性,也可设定/C-c/C-m调用/M-x


11、快键使用过程中,如何输入一些特殊字符?例如空格和\和/等?待完善




帮助相关
/C-h i或者/M-x info 开启emacs内置的交互式,菜单驱动的Info引擎
/C-h b 所有快键与对应的命令绑定关系,可以呼唤出来慢慢看。在光标所在的命令处,按Enter就会进入对应命令的帮助
/C-h k或者/M-x describe-key 想知道一个按键操作是干什么的?按下这个快捷,然后按入你感兴趣的按键序列。如果你输的序列是有绑定的,emacs会直接转到那个按键的帮助信息中。
/C-h c 是/C-h k的简化版
/C-h f 解释一个函数。需要输入函数名
/M-x apropos如果你对某个功能感兴趣,想找出相应的命令,并且你已经心里有个大约的命令名,那么你可以用M-x apropos,然后再输入一个正则表达式来搜索命令名。所以的emacs命令(也包括函数和属性表)都存在一个全局表中,以备M-x apropos检索。
/C-h l 检查最近300次的输入键








变量及其值
/M-x describe-variable,按 Enter,然后在小缓冲区的提示符后输入你想查看的变量名,emacs就会输出该变量及其值的介绍。例如你输入变量名kill-ring,就会看到kill-ring这个变量的介绍和值




frame/window/buffer/file的关系说明
1、一个frame可以切成多个window;
2、一个window可以切换/加载一个buffer;
3、在emacs里面增删改的从来不是file,而是光标所在的buffer。手工通过快键触发时,emacs才会把buffer增量变化的东西回写至对应的file;




字符/word/句/region的关系
1、字符就是指代一个单独的字符
2、word要通过边界来划分,符号、空格、英文字符串、中文串彼此互为word边界
3、中英文的句号和空行,都算句的标志
4、region?








buffer与光标相关的快键(光标快移,建议跟搜索拉通看,搜索本质上也是一种快速精准移动光标的方法)
/C-b 光标回移一个字符
/C-f 光标前移一个字符
/M-b 光标回移一个word
/M-f 光标前移一个word
/C-a 光标飞至行首
/C-e 光标飞至行尾
/M-a 光标飞至句首
/M-e 光标飞至句尾
/C-n 光标回移一个行
/C-p 光标前移一个行
/C-x t 光标飞至buffer的开头。默认快键是/M-<
/C-x e 光标飞至buffer的结尾。默认快键是/M->




搜索和替换相关的快键
/C-s 前向递增式搜索,连按就会递增搜索,如果命中太多可以/C-g然后重新找个搜索,当你找到目标时,可以按Enter来终止搜索并保留光标飞移的位置
/C-r 退向递增式搜索,类似/C-s
/M-s 默认命令是ESC /C-s 前向递增式正则搜索
/M-r 默认命令是ESC /C-r 后向递增式正则搜索
/M-% 进入替换交互流程,每次替换都会询问用户是否要替换
/M-x replace-string 进入替换交互流程,字符串替换交互流程。替换前不会有用户确认的流程
/M-x replace-regexp 进入替换交互流程,正则替换交互流程。替换前不会有用户确认的流程
/M-x query-replace-regexp 进入替换交互流程,正则替换交互流程。替换前不\会有用户确认的流程。建议给其起个别名,qrr。这样一来,就可以用/M-x qrr 就可以使用这个功能了
/M-x list-matching-lines -- 可以把buffer中匹配某一regexp的行全列出来     








调换
/M-t 调换连续的两个word,可以把word在句子中拖来拖去




buffer与文件相关的快键
/C-x/C-d 显示当前文件的路径
/C-x/C-f 当前window中切换一个新buffer,并在buffer里面加载好文件内容
/C-x/C-s 直接将当前buffer回写入文件
/C-x s 当前buffer回写入文件,回写前要输入y
/C-x/C-w 当前buffer另存至文件
/M-x recover-file 恢复你的自动保存文件。Emacs 会定期将正在编辑的文件写入一个“自动保存”文件中。自动保存文件的文件名的头尾各有一个“#”字符,比如你正在编辑的文件叫“hello.c”,那么它的自动保存文件就叫“#hello.c#”。这个文件会在正常存盘之后被 Emacs 删除。所以,假如不幸真的发生了,你大可以从容地打开原来的文件(注意不是自动保存文件)然后输入 M-x recover file <Return> 来恢复你的自动保存文件






kill-ring相关的快键
/C-d 杀掉光标所在字符,丢入kill-ring
/M-d 杀掉一个word,丢入kill-ring
/C-w 回杀一个wold,丢入kill-ring。非标准键位,需要写emacs配置。默认绑定的是kill-region
/C-x/C-k 杀掉一个region,待深入分析。。。。。丢入kill-ring。非标准键位,需要写emacs配置。默认绑定的是edit-kbd-macro,但是这个键你真的不会经常去用,所以不会觉得丢了什么东东
/C-k 杀掉光标至行尾的字符,丢入kill-ring,但是保留行尾的回车符
/M-k 杀句,丢入killl-ring
/M-w 将buffer中mark的字符排入kill-ring,mark的字符仍然原封不动的留在buffer。那么如何杀掉mark的字符呢?
/C-y kill-ring取出最新一次的内容,从光标所在处开始写入buffer中。连续按y,会重复追写相同的东东。或者接着连续输入/M-y,就会连续遍历kill-ring并替换最后一次/C-y写入buffer的内容。




穿越到过去
/C-x u 将buffer穿越回最近一次被修改前的状态,连续使用此快键,则会一步步穿越至过去






快键功效加倍
/C-u 在发功某个快键前,如果先使用这个快键,则会将后面快键功效乘以四倍。例如/C-u /C-k就是四杀
/C-u 3 在发功某个快键前,如果先使用这个快键,则会将后面快键功效乘以三倍。例如/C-u 3 /C-k就是三杀,当然把3改成5,就是五杀啦。/C-u如果不加数字,缺省为四倍。








Mark相关的快键
/M-@ 把当前光标所在字(不是字节哈)的尾部作为mark的出发点,mark的内容会随着光标的移动而圈定。类似搜索的快键,中途也可以通过/C-g退出这个mark的
/C-SPC和/C-@ set-mark-command,待研究,跟输入法切换快键冲突了吧?
/C-x h mark整个buffer
/C-x/C-p mark整个page。page啥意思?
/M-h mark-paragraph
/C-x/C-x exchange-poin-and-mark






文本编辑
/C-x/C-u 将mark文本转换为大写
/C-x/C-l 将mark文本转换为小写
/M-c 光标所在字符改为大写
/M-u 光标所在word改为大写
/M-l 光标所在word改为小写
/C-a/C-o 在光标所在行新插入新行




buffer与window相关的快键
/M-x rename-buffer 可以重命名buffer的名字
/C-M v 向后翻动下一个window里面的buffer内容,同时保持光标所在的window不变化
/C-M-S v 向前翻动下一个window里面的buffer内容,同时保持光标所在的window不变化。S指Shift键。
/C-x/C-b 调度一个单独的window来列表出当前所有buffer
/C-x b 在当前window切换buffer,回车的话默认切换到buffer列表中当前buffer的下一个buffer,其实用处最多的是临时起个buffer名,回车后当前window就可以召唤出一个新的buffer
/C-x 2 当前window切成上下两个等高的window,显示同一个buffer的部分可见区域
/C-x 3 当前window切成左右两个等宽的window,显示同一个buffer的部分可见区域
/C-x + 所有可见的window等高
/C-x o 光标飞至下一个window
/C-x 0 关闭光标所在的window(对应的buffer在后台回歇)
/C-x 1 保留光标所在的window,其他window全部关闭(对应的buffer在后台回歇)
/C-x k 杀掉buffer,默认杀掉当前buffer(window仍然坚挺在前台)
/C-l 将window上下滑移,使得光标所在行打头的在window中心/window上沿/window下沿切换
/C-c <left> 返回到上一次buffer与windows的分布模式。例如你使用/C-x 1专注看一个buffer看完后,可以通过这个快键
再回到/C-x 1之前的windows状态
/C-x w 4 从一窗口模式可以变为四窗口模式
;;buffer and windows
(defun split-window-4() 
"Splite window into 4 sub-window"
 (interactive) 
 (if (= 1 (length (window-list))) 
    (progn (split-window-vertically) 
    (split-window-horizontally) 
    (other-window 2) 
    (split-window-horizontally) 
    ) 
  ) 

(global-set-key  (kbd "C-x w 4") (quote split-window-4))


/C-x w c 如果是在三窗口模式下运行该命令,可以将window+buffer作为整体进行旋转,有利于大窗口的内容在横竖之间倒换
 (defun change-split-type-3 () 
  "Change 3 window style from horizontal to vertical and vice-versa"
  (interactive) 


  (select-window (get-largest-window)) 
  (if (= 3 (length (window-list))) 
      (let ((winList (window-list))) 
            (let ((1stBuf (window-buffer (car winList))) 
                  (2ndBuf (window-buffer (car (cdr winList)))) 
                  (3rdBuf (window-buffer (car (cdr (cdr winList))))) 


                  (split-3 
                   (lambda(1stBuf 2ndBuf 3rdBuf split-1 split-2) 
                     "change 3 window from horizontal to vertical and vice-versa"
                     (message "%s %s %s" 1stBuf 2ndBuf 3rdBuf) 


                     (delete-other-windows) 
                     (funcall split-1) 
                     (set-window-buffer nil 2ndBuf) 
                     (funcall split-2) 
                     (set-window-buffer (next-window) 3rdBuf) 
                     (other-window 2) 
                     (set-window-buffer nil 1stBuf)))         


                  (split-type-1 nil) 
                  (split-type-2 nil) 
                  ) 
              (if (= (window-width) (frame-width)) 
                  (setq split-type-1 'split-window-horizontally 
                        split-type-2 'split-window-vertically) 
                (setq split-type-1 'split-window-vertically  
       split-type-2 'split-window-horizontally)) 
              (funcall split-3 1stBuf 2ndBuf 3rdBuf split-type-1 split-type-2) 


 )))) 
 (global-set-key (kbd "C-x w c") (quote change-split-type-3)) 


/C-x w r 如果是在三窗口模式下运行该命令,可以将三窗口模式的buffer进行旋转,windows固定不动,有利于不同的buffer轮流滚入大window
  (defun roll-v-3 (&optional arg) 
    "Rolling 3 window buffers (anti-)clockwise"
    (interactive "P") 
    (select-window (get-largest-window)) 
    (if (= 3 (length (window-list))) 
        (let ((winList (window-list))) 
          (let ((1stWin (car winList)) 
                (2ndWin (car (cdr winList))) 
                (3rdWin (car (last winList)))) 
            (let ((1stBuf (window-buffer 1stWin)) 
                  (2ndBuf (window-buffer 2ndWin)) 
                  (3rdBuf (window-buffer 3rdWin))) 
              (if arg (progn                                
 ; anti-clockwise
                        (set-window-buffer 1stWin 3rdBuf) 
                        (set-window-buffer 2ndWin 1stBuf) 
                        (set-window-buffer 3rdWin 2ndBuf)) 
                (progn                                      ; clockwise
                  (set-window-buffer 1stWin 2ndBuf) 
                  (set-window-buffer 2ndWin 3rdBuf) 
                  (set-window-buffer 3rdWin 1stBuf)) 
                ))))))
 (global-set-key (kbd "C-x w r")  (quote roll-v-3)) 












buffer与shell
/M-x eshell Emacs自己实现的一种shell模式,比较接近Unix/Linux
/M-x shell windows环境下的Shell模式其实就是一个跑在Emacs环境下的cmd
windows emacs组合下,还可以使用cygwin,具体可以百度






package相关
离线安装package
1、在https://stable.melpa.org/packages/或https://melpa.org/packages/等网站下载.tar或 .el文件
2、M-x package-install-file进行安装
在线安装package
1、使用M-X list-packages查看安装好的和可以安装的包
2、用C-h  v   package-archives     查看package源
3、用M-x customize-variable RET package-archives添加package源,选择 INS可以添加package源,例如:
name:  melpa_stable
URL:https://stable.melpa.org/packages/
name:  melpa
URL:https://melpa.org/packages/
保存之后重新查看package,会比之前的多出来许多。








python IDE相关
/C-c /C-c 是emacs自带的执行当前buffer的python脚本的快键


elpy(Emacs Lisp Python Environment),可以实现自动缩进、语法高亮、自动补全、语法检查、REPL集成和虚拟环境支持等等功能。elpy的安装步骤如下:
1、通过pip给python安装flake8和jedi这两个model模块
2、通过在线方式给emacs里面安装elpy package(如果你当前电脑联网环境有问题无法在线安装,可以找个网络无问题的电脑先通过melpa源在线安装好,然后将其~/.emacs.d/下的elpa文件夹打包,复制到无法在线安装的电脑上,再通过离线安装的方式,执行下对应的.el文件即可)
3、/M-x elpy-config,可以查看当前elpy相关的配置


Flycheck,默认情况下,安装了Elpy插件的Emacs提供一个名叫Flymake的语法检查插件。但是,我们还可以选择另外一个名叫Flycheck的插件,后者支持实时语法检查。可以通过在线或离线方式,给emacs安装即可。安装正确的话,在编辑python文件时,就会自动进入(Python FlyC || Elpy)的mode模式


遵循PEP8规范
不管你喜不喜欢,PEP8都不会消失。如果你想遵循PEP8标准的全部或部分规范,给emacs安装py-autopep8这个package,在保存文件时就可以实现自动化合规。


IPython/Jupyter集成
待完善,可参考https://realpython.com/emacs-the-best-python-editor/,对应的中文为https://segmentfault.com/a/1190000004165173






Git集成
待完善,可参考https://www.masteringemacs.org/article/introduction-magit-emacs-mode-git
http://v.youku.com/v_show/id_XMTM3NTI0ODYyMA==.html








C/C++ IDE相关
待完善,http://v.youku.com/v_show/id_XMTM2OTM3MDkwMA==.html




Javascript IDE相关
待完善,http://v.youku.com/v_show/id_XMTQwNTg3MDY4NA==.html








宏相关的快键
https://blog.csdn.net/on_1y/article/details/7477450
[F5] 默认快键是/C-x e,调用最近一次记录的宏
/C-x ( 启动宏记录
/C-x ) 结束宏记录
首先把光标移到你第一个要改动的地方,按下Ctrl-x ( 启动宏记录。继续你的编辑操作,确保你的光标刚好在下一行(或者说下几行,视情况而定),这样就可以按模式运行了。用Ctrl-x )来结束宏录制。再来就是用Ctrl-x e(call-last-kbd-macro)来调用宏了。。
有时,定义一个可靠的宏算得上是一种技艺――你得学会在添加操作之前,使用 beginning-of-line和 end-of-line 这样的锚点来保证宏操作在一个可确定的位置上。
递增搜索可以很方便地跳过下一个位置。如果你在记录宏时使用了isearch,那么宏调用时,isearch也会被执行,非常方便。
在记录宏时有时会有些小的失误,这不要紧,直接改正这个失误,继续录宏。在宏调用时,这个失误会反复出现,然后反复被改正,而且很快,你几首注意不到。










模式
/M-x c-mode 主模式设置为c-mode
/M-x text-mode 主模式设置为text-mode
/M-x describe-variable再按Enter后输入auto-mode-alist,会列出Emacs自动识别的所有主模式




注释
/M-;或者/M-x comment-dwim 注释或者取消注释。可以先把想注释/取消注释的行给mark,然后再执行这个命令






编译
/M-x compile 这个是编译.el文件的吧?不是python、C++等编程环境的编译吧?待完善




正则表达式
emacs正则表达式最常被问到的是:“怎么在正则表达式或者替换字符串读取时输入回车呢?” 如果仅仅简单地直接打回车,那emacs会认为你把regexp输完了。(这也是推荐qrr而不是 replace-regexp的原因啊――――在你非常有信心一次试写就可以把正则表达式写对之前,至少,我还没到那个境界)。
回答是:要输入一个 ^j (译注:也就是Ctrl-j) 字符。在你要输入表达式或者替换串的时候,如果你要输回车符,选按Ctrl-q然后再按Ctrl-j。Ctrl-q是emacs的"quote"命令,它不执行下一个按键,而是把它插入到当前buffer或者minibuffer当中。




还有一些其它与regexp相关的知识:
  * 在elisp代码中,你写两次转义("//"),而在minibuffer输入时,你只写一次转义就OK了。
  * 由于emacs代码有很多要匹配括号,所以emacs反转了括号的语义,在emacs的regexp中,"(",")"匹配实际的括号,而"/)","/("则用以建立匹配组(字串)。
  * 在替换串中,使用/1 /2 ...来插入匹配组中的字符串
  * 如果你输入的regexp没有正确工作,把结果undo掉,重新输一次命令,当提示输入表达式时,使用上下箭头按键可以找出你之前输入过的记录。这样可以习省时间开销和防止混乱。






emacs与维护笔记/TODO lists
Org-mode,待完善,http://keyboardancer.com/2017/06/09/org_learning/
https://blog.csdn.net/dc_726/article/details/8623879




--------------------------------------------------------------------------------

猜你喜欢

转载自blog.csdn.net/superwen_go/article/details/80779292
今日推荐