emacs_config

设置Emacs的HOME目录

总的来说,Emacs的默认配置文件放在变量HOME所指的路径下,所以,只要我们把.emacs扔到HOME所指向的目录就可以了,下面就简单介绍一下在Windows下设置home目录的几种方法,并进行简单的对比。

第一种方法,改变home环境变量的值。 这种方法,改变了$home变量,也会影响Cygwin或是其他一些应用程序,因为有一些程序会根据Windows的home环境变量来寻找数据存放的路径。

第二种方法,不改变Windows默认的home值,设置默认的.emacs文件读取你自己的Emacs配置文件,并重新设定Emacs的home目录。 你可以在Emacs中输入C-x C-f,然后打开路径~(即当前的home环境变量所指的路径,一般来说是这样的路径:C:/Documents and Settings/water/Application Data)。

看看显示的是哪个目录,如果此目录下没有.emacs,可以创建一个.emacs或_emacs,然后在这个.emacs文件里,加入如下语句: (load-file "E:/water/.emacs") 文件 E:/water/.emacs 才是我们真正的Emacs配置文件,我们可以在这个真正的配置文件里用如下语句设置我们的home目录:

1
2
3
4
  ;; (setenv "HOME" "C:/cygwin/home/username")                           
  ;; (setenv "PATH" "C:/cygwin/home/username")                           
  ;; (set default-directory "C:/cygwin/home/username")                   
  ;; (add-to-list 'load-path "C:/cygwin/home/username/.emacs.d/init.el")

这个方法的优点是比较简单同样也方便对.emacs文件备份,不会对其它应用程序产生任何影响。

第三种方法,修改注册表,在注册表中进行如下设置: HKEY_LOCAL_MACHINE§OFTWARE\GNU\Emacs\HOME=%emacs_dir% 以上三种方法都可以设置好Emacs的Home目录,但是,系统是按什么顺序来解析它们的呢?大体上的顺序是这样的:

如果设置了环境变量HOME,则使用HOME指定的目录。 如果设置了注册表里的值HKCU§OFTWARE\GNU\Emacs\HOME,则使用这个值所指定的目录作为home目录。并不是太推荐使用这种方法,因为会导致用户共享一个home目录。 如果 C:\.emacs 文件存在,则使用 C:\.emacs 这个文件。这个是为了向低版本的Emacs兼容,因为低版本的Emacs就是默认用这个文件作为配置文件。 把用户的AppData目录作为home目录(通常来说,就是类似这样的目录 C:/Documents and Settings/water/Application Data ),这个用户的数据目录根据Windows版本的不同而有所不同。 我个人比较喜欢用第二种方法,即简单又方便备份。

其实,如果你只是想要Emacs能找到你的.emacs的话,也可以不用管HOME目录的,写个批处理文件emacs.bat: path-of-emacs.exe -q -l path-of-your.emacs

emacs查看快捷键是否被占用

先执行C-h c,然后按下执行某快捷键,查看minibuffer提示快捷键情况

emacs查看函数

先执行C-h a,然后输入某一函数并回车,查看函数说明

基于时间创建文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
  (defun extract-time-keyword ()                                     
	"提取当前时间的关键词"                                             
	(interactive)                                                      
	(let ((time (format-time-string "%Y-%m-%d_%H-%M-%S")))             
	  (setq time-keyword (replace-regexp-in-string "[-:]" "" time))      
	  (message "提取的时间关键词为:%s" time-keyword)                    
	  (create-new-file time-keyword)))                                   

  (defun create-new-file (time-keyword)                              
	"使用时间关键词创建新文件"                                         
	(let ((file-path (concat "~/path/to/files/" time-keyword ".txt"))) 
	  (with-temp-file file-path                                          
		(insert "这是一个新文件,创建时间:" time-keyword))))              

  (global-set-key (kbd "C-c t") 'extract-time-keyword)

完善后

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
  (defun extract-time-keyword ()                                
	"提取当前时间的关键词"                                        
	(interactive)                                                 
	(let ((time (format-time-string "%Y-%m-%d")))                 
	  (setq time-keyword (replace-regexp-in-string "[-:]" "" time)) 
	  (message "提取的时间关键词为:%s" time-keyword)               
	  (create-new-file time-keyword)))                              

  (defun create-new-file (time-keyword)                         
	"使用时间关键词创建新文件"                                    
	(let ((file-path (concat "./" time-keyword ".txt")))          
	  (with-temp-file file-path                                     
		(insert time-keyword ": name\n1. "))))                        

  (global-set-key (kbd "C-c t") 'extract-time-keyword)

基于时间添加代码块并设置tangle

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
  (defun add-code-block ()                                                           
	"在当前位置添加一个代码块,并以时间作为块名进行命名"                               
	(interactive)                                                                      
	(let* ((time (format-time-string "%Y-%m-%d_%H-%M-%S"))  ; 获取当前时间             
		   (clean-time (replace-regexp-in-string "[-:]" "" time))  ; 去除时间中的破折号和冒号 
		   (block-name (concat "block-" clean-time))  ; 构建代码块名                          
		   (code-block (format                                                                
						"* %s  ; 创建时间:%s                                                              
  ,#+BEGIN_SRC emacs-lisp :tangle %s.el                                              
  ;; 在这里插入你的代码\n#+END_SRC"                                                  
						block-name time block-name)))                                                      
	  (insert code-block)))  ; 在当前位置插入代码块                                      

  ;; 设置快捷键 C-c b 绑定到 add-code-block 函数                                     
  (global-set-key (kbd "C-c b") 'add-code-block)

完善后

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
  (defun add-code-block ()                                                           
	"在当前位置添加一个代码块,并以时间作为块名进行命名"                               
	(interactive)                                                                      
	(let* ((time (format-time-string "%Y-%m-%d"))  ; 获取当前时间                      
		   (clean-time (replace-regexp-in-string "[-:]" "" time))  ; 去除时间中的破折号和冒号 
		   (block-name (concat clean-time))  ; 构建代码块名                                   
		   (code-block (format                                                                
						"* %s                                                                              
  ,#+BEGIN_SRC emacs-lisp :tangle %s.el                                              
  %s: name\n1.                                                                       
  ,#+END_SRC"                                                                        
						block-name clean-time block-name)))                                                
	  (insert code-block)))  ; 在当前位置插入代码块                                      

  ;; 设置快捷键 C-c b 绑定到 add-code-block 函数                                     
  (global-set-key (kbd "C-c b") 'add-code-block)

wsl-ubuntu18.04.6安装最新版本emamcs教程

1
2
3
4
  $sudo add-apt-repository ppa:ubuntu-elisp/ppa      
  $sudo apt update                                   
  $sudo apt install emacs-snapshot emacs-snapshot-el 
  $emacs --version    #查看emacs版本

在linux环境设置emacs守护进程

常规操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
  # 启动emacs server:
  $ emacs --daemon  
  # 编辑文件
  $ emacsclient file
  $ emacsclient -t file # 字符界面
  $ emacsclient -c file # GUI界面 
  # 添加命令行别名 
  # 为了方便在终端上使用,在~/.bashrc文件中加入如下两行:
  alias ec='emacsclient -t -a ""'                       
  alias sec='sudo emacsclient -t -a ""'

脚本操作

如果安装了dashboard,想启动时已dashboard作为启动界面,可以更改alias别名的定义

1
  alias ec='emacsclient -c -e "(dashboard-setup-startup-hook)"'
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
  find ./ -name "*~" | xargs rm
  ps -ef | grep "emacs --daemon" | grep -v "grep" > /dev/null 2>&1
  if [ $? -ne 0 ]                                                                               
  then                                                                                          
	  nohup emacs --daemon &                                                                        
  fi                                                                                            
  alias 'emacs'='emacsclient'                                                                   
  if [ -e "~/null" ]                                                                            
  then                                                                                          
	  rm ~/null                                                                                     
  fi                                                                                            
  if [ -e "~/nohup.out" ]                                                                       
  then                                                                                          
	  rm ~/nohup.out                                                                                
  fi                                                                                            

  alias ec='emacsclient -c -e "(dashboard-setup-startup-hook)"'

在windows环境可以如下操作

首先下载emacs最新版本,并将其添加windows系统环境变量,然后在终端中执行"emacs –daemon",如果该命令占用终端,可以将其作为守护进程运行,在cygwin环境中参考linux环境操作 还有就是在.emacs.d/下有了server(socket文件)后,可以执行"emacs –server-file .emacs/server"指定socket文件路径 第二步的前提是通过第一步产生了server文件,或者在emacs中通过运行"server-start"设置守护进程

在windows创建守护进程脚本

1
2
3
4
5
6
7
  @echo off                                                                                   
  if "%1"=="h" goto begin                                                                     
  start mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit 
  :begin                                                                                      

  emacs --daemon                                                                              
  doskey emacs=emacsclient

在windows_Cygwin创建启动脚本,因从守护进程运行的emacsclient与正常运行emacs效果不一样,因此只是介绍方法,不过多介绍

1
2
3
  #!/usr/bin/bash         

  cmd /c emacs --daemon &

在emacs中获取终端家目录或者用户,用户对就"USER"

1
2
3
4
5
6
(setq terminal-home (getenv "HOME"))                                
(setq relative-path "Documents/example.txt")                        
                                                                    
(setq absolute-path (expand-file-name relative-path terminal-home)) 
                                                                    
(message "Absolute path: %s" absolute-path)

emacs的init.el,我保存在.emacs.d/init.el中

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
  ;; 实用参考链接

  ;; 列出一些常用学习链接                                                                                                                                                                                                                                                                           
  ;; https://zhuanlan.zhihu.com/p/385214753                                                                                                                                                                                                                                                         
  ;; https://github.com/emacs-china/Spacemacs-rocks#%E5%AE%89%E8%A3%85-spacemacs                                                                                                                                                                                                                    
  ;; https://www.cnblogs.com/holbrook/archive/2012/04/12/2444992.html                                                                                                                                                                                                                               
  ;; https://www.cnblogs.com/ts65214/p/5561646.html                                                                                                                                                                                                                                                 

  ;; 目录配置

  ;; (setenv "HOME" "C:/cygwin/home/username")                                                                                                                                                                                                                                                      
  ;; (setenv "PATH" "C:/cygwin/home/username")                                                                                                                                                                                                                                                      
  ;; (set default-directory "C:/cygwin/home/username")                                                                                                                                                                                                                                              
  ;; (add-to-list 'load-path "C:/cygwin/home/username/.emacs.d/init.el")                                                                                                                                                                                                                            

  ;; 函数配置

  (setq inhibit-startup-message 1) ;; 禁止Emacs显示启动画面                                                                                                                                                                                                                                         
  (fset 'display-startup-echo-area-message 'ignore) ;; 禁止Echo Area显示For information about GNU Emacs and the GNU system,type C-h C-a                                                                                                                                                             
  (setq-default indent-tabs-mode 1) ;; 在缩进时使用制表符                                                                                                                                                                                                                                           
  (setq-default tab-width 4) ;; 指定制表符的宽度为4个空格                                                                                                                                                                                                                                           
  (setq c-default-style "linux") ;; 指定C语言的默认代码样式为Linux风格,这其中包含了一些特定的规则和约定,例如缩进方式、括号对齐等等,可心根据自己的喜好和项目要求来修改这个值                                                                                                                      
  (setq c-basic-offset 4) ;; 在C语言模式下,每个缩进级别使用4个空格                                                                                                                                                                                                                                 
  (recentf-mode 0) ;; recentf-mode是一个Emacs历史记录插件,它允许你在Emacs会话之间保留文件的历史记录,一旦启用recentf-mode,它将自动跟踪你最近打开的文件,并将它们保存在一个列表中,当你需要再次访问这些文件时,可以通过recentf-mode提供的命令和功能来查找和打开它们                                
  ;; (tool-bar-mode 0) ;; 禁用工具栏显示,工具栏通过包含了一些常用的功能按键                                                                                                                                                                                                                        
  (menu-bar-mode 0) ;; 禁用菜单栏显示,菜单栏通过包含了一系列的菜单项                                                                                                                                                                                                                               
  ;; (scroll-bar-mode 0) ;; 禁用滚动条显示,滚动条通过用来显示当前文档的滚动位置                                                                                                                                                                                                                    
  ;; (global-hl-line-mode 1) ;; 全局高亮当前行模式,这个模式会在当前行添加高这显示                                                                                                                                                                                                                  
  (global-linum-mode 1) ;; 全局显示行号,这个模式会在每行的左侧显示行号                                                                                                                                                                                                                             
  (column-number-mode 1) ;; 显示列号                                                                                                                                                                                                                                                                
  (xterm-mouse-mode 1) ;; 启用xterm鼠标模式,这个模式允许使用鼠标进行交互操作                                                                                                                                                                                                                       
  ;; (desktop-save-mode 1) ;; 启用Emacs的桌面保存模式,当桌面保存模式开启后,Emacs会在退出时保存当前的工作 环境(打开的文件、窗口配置等),以便在下次启动时自动恢复                                                                                                                                   
  (save-place-mode 1) ;; 是用来启用Emacs的记忆光标位置模式,开启后,Emacs会记录你最后离开每个文件时的光 标位置,在再次打开该文件时会自动将光标定位到上次的位置                                                                                                                                      
  ;; (toggle-truncate-lines t) ;; 换行模式,每次加载变量的值都会被再次取反                                                                                                                                                                                                                          
  (add-hook 'org-mode-hook (lambda () (setq truncate-lines nil))) ;; org-mode固定自动换行                                                                                                                                                                                                           
  (setq default-major-mode 'text-mode)                                                                                                                                                                                                                                                              

  (add-to-list 'default-frame-alist '(foreground-color . "#FFFFFF")) ;; 配置emacs前景颜色                                                                                                                                                                                                           
  (add-to-list 'default-frame-alist '(background-color . "#000000")) ;; 配置emacs背景颜色                                                                                                                                                                                                           

  (defun g-org-insert-note-header () ;; 定义一个名为g-org-insert-note-header ()的函数                                                                                                                                                                                                               
	(interactive) ;; 函数的一个特殊声明,表示函数可以被用户调用                                                                                                                                                                                                                                       
	(insert "#+options: ^:nil\n#+title: \n#+options: \n:t\n#+author: yenao\n")) ;; insert函数用于在当前光标位置插入指定的文本内容,当你调用这个函数时,它会在当前光标位置插入文本#+options: ^:nil、#+title: 和#+author: yenao                                                                         

  (with-eval-after-load 'eww                                                                                                                                                                                                                                                                        
	(custom-set-variables                                                                                                                                                                                                                                                                             
	 '(eww-search-prefix "https://bing.com/search?q=")))                                                                                                                                                                                                                                               

  ;; 参考链接:https://www.jianshu.com/p/af9e43f7f13e                                                                                                                                                                                                                                               
  ;; 尝试配置GTD                                                                                                                                                                                                                                                                                    
  (unless (file-exists-p "~/.emacs.d/OneDrive")                                                                                                                                                                                                                                                     
	(make-directory "~/.emacs.d/OneDrive")                                                                                                                                                                                                                                                            
	);; 检测OneDrive目录是否存在,如果不存在就创建这个目录                                                                                                                                                                                                                                            
  (unless (file-exists-p "~/.emacs.d/OneDrive/org")                                                                                                                                                                                                                                                 
	(make-directory "~/.emacs.d/OneDrive/org")                                                                                                                                                                                                                                                        
	);; 检测org目录是否存在,如果不存在就创建这个目录                                                                                                                                                                                                                                                 
  (let ((filename "~/.emacs.d/my-agenda.el")) ;; 如果my-agenda.el文件不存在,就创建这个文件,如果需要往 该文件内写入内容,将该段该中insert的注释取消即可                                                                                                                                            
	(unless (file-exists-p filename)                                                                                                                                                                                                                                                                  
	  (with-temp-file filename                                                                                                                                                                                                                                                                          
		;; (insert "这是文件内容") ;; 写入文件内容                                                                                                                                                                                                                                                        
		)))                                                                                                                                                                                                                                                                                               
  (let ((filename "~/.emacs.d/OneDrive/org/todo.org")) ;; 如果todo.org文件不存在,就创建这个文件,如果需要往该文件内写入内容,将该段该中insert的注释取消即可                                                                                                                                        
	(unless (file-exists-p filename)                                                                                                                                                                                                                                                                  
	  (with-temp-file filename                                                                                                                                                                                                                                                                          
		;; (insert "这是文件内容") ;; 写入文件内容                                                                                                                                                                                                                                                        
		)))                                                                                                                                                                                                                                                                                               

  (load-file "~/.emacs.d/my-agenda.el") ;; 加载my-agenda.el配置文件                                                                                                                                                                                                                                 
  (setq org-agenda-files '("~/.emacs.d/OneDrive/org")) ;; 指定data存放目录                                                                                                                                                                                                                          
  (setq org-default-notes-file "~/.emacs.d/OneDrive/org/todo.org") ;; 配置好data目录后,再配置具体要将信息写于哪个文件,可以配置多个文件,出于简化,这里将所有的agenda todo写入~/Onedrive/org/todo.org文件下                                                                                        
  (global-set-key "\C-cl" 'org-store-link)                                                                                                                                                                                                                                                          
  (global-set-key "\C-cc" 'org-capture)                                                                                                                                                                                                                                                             
  (global-set-key "\C-ca" 'org-agenda)                                                                                                                                                                                                                                                              
  (global-set-key "\C-cb" 'org-iswitchb)                                                                                                                                                                                                                                                            
  (define-key global-map "\C-cr" 'remember)                                                                                                                                                                                                                                                         

  (setq org-todo-keywords '((sequence "TODO(t!)" "NEXT(n)" "WAITTING(w)" "SOMEDAY(s)" "                                                                                                                                                                             " "DONE(d@/!)" "ABORT(a@/!)"))) 
  (setq org-tag-alist '(("@office" . ?w) ("@home" . ?h) ("traffic" . ?t) ("computer" . ?c) ("nocomputer" . ?n) ("either" . ?e) ("immediately" . ?i) ("wait" . ?w) ("action" . ?a)))                                                                                                                 

										  ; 插件配置                                                                                                                                                                                                                                                                                        
  (require 'package)                                                                                                                                                                                                                                                                                
  (add-to-list 'package-archives                                                                                                                                                                                                                                                                    
			   '("melpa-stable" . "https://stable.melpa.org/packages/") t) ;; 配置melpa-stable仓库,如果不配置的话,use-package安装不了,比如在wsl-ubuntu18.04环境上就是这样                                                                                                                                     
  (package-initialize)                                                                                                                                                                                                                                                                              
  ;; 配置use-package用于安装各种插件                                                                                                                                                                                                                                                                
  (eval-when-compile                                                                                                                                                                                                                                                                                
	(require 'use-package)                                                                                                                                                                                                                                                                            
	)                                                                                                                                                                                                                                                                                                 

  ;; 配置company用于文本补全                                                                                                                                                                                                                                                                        
  (use-package company                                                                                                                                                                                                                                                                              
	:ensure t                                                                                                                                                                                                                                                                                         
	:init (global-company-mode 1) ;; 启用全局的自动补全功能,这将使得在所有的缓冲区中的文本输入时,company会自动显示可能的实例选项                                                                                                                                                                    
	:config                                                                                                                                                                                                                                                                                           
	(setq company-minimun-prefix-length 1) ;; 只需敲一个字母就开始进行自动补全                                                                                                                                                                                                                        
	(setq company-tooltip-align-annotations t) ;; 设定自动补全提示框与注解的对齐方式,如果设为nil,则对 齐,如果设为t,则不对齐                                                                                                                                                                       
	(setq company-idle-delay 0.0) ;; 设置自动补全的延时,在输入之后立即触发自动补全                                                                                                                                                                                                                   
	(setq company-show-numbers 1) ;; 给选项编号(按快捷键M-1、M-2等等来进行选择)                                                                                                                                                                                                                       
	(setq company-selection-wrap-around 1) ;; 当光标移到最后一个选项后,再按下TAB键时,光标将回到第一个 选项                                                                                                                                                                                          
	(setq company-transformers '(company-sort-by-occurrence)) ;; 根据选择的频率进行排序,如果不喜欢可以 去掉                                                                                                                                                                                          
	)                                                                                                                                                                                                                                                                                                 

  (use-package ox-hugo                                                                                                                                                                                                                                                                              
	:ensure t                                                                                                                                                                                                                                                                                         
	)
Licensed under CC BY-NC-SA 4.0