关于emacs:EmacsTalk-2021-年终回顾

本文参加了 SegmentFault 思否征文「2021 总结」,欢送正在浏览的你也退出。Time Flies! 回顾EmacsTalk 在 2021-06-26 上线,到当初曾经半年了,除夕将至,是时候做个年初回顾了。先看看这半年的数据吧: 播客:9 期技巧文章:13 期网站 PV:13450网站 UV:10758公众号订阅数:866发电资助: ¥500(由衷感谢这些发电的热心听众) 在节目一开始,次要是进行播客的制作,一方面是离奇,热情高涨,另一方面是晓得随着工夫的推动,节目的节奏必定会慢下来,因而想一开始多制作几台,让大家对这个播客有些理解,算是在市场站住脚。 最快的时候当天录制,第二天就剪辑公布进去了。时长一小时的播客,制作工夫个别须要 3-4 个小时,然而听播客就很快,我个别都是倍速听播客,而且个别听是在空闲工夫,所以更没有工夫的概念。 在制作了 9 期后,正好赶上双十一,工作上的事会多些,因而就打算形式放松一段时间,而后就始终到当初。这期间始终在创作应用技巧的文章,Emacs 就是这么神奇,即便在应用了 5 年后,还是能不断发现新的用法。 数据分析借助于百度、微信等平台,能大抵看出 EmacsTalk 的听众的画像,感觉还比拟有意思,这里和大家分享下。 最受欢迎的嘉宾排名百度统计Google 统计小宇宙微信公众号1领蜂陈斌陈斌Kathy2陈斌Kathy领蜂领蜂3tumashustardivinerKathy陈斌祝贺上述 TOP3 的嘉宾,但数据并不能代表所有,受多种因素的影响(晚期的嘉宾显著占劣势),其余嘉宾的内容同样“湿货”满满,这里着重感激所有嘉宾的鼎力支持。❤️️ 听众区域散布 瞻望在新一年,除了现有采访模式的播客,我还认为能再找一个主播,和我一起来探讨 Emacs 最近的一些动向,因为在订阅 emacs-devel 邮件列表后,发现外面有很多有意思的探讨。邮件列表的内容很容易被湮没,因而如果能有人能定期把外面有价值、乏味的内容分享进去,感觉会是件十分是意义的事,如果哪位听众、读者对这件事感兴趣,欢送和我分割。 此外,如果能找到另一个主播,节目的更新频率也能失去更好地保障。 最初定个新年指标吧,心愿 2022 年能实现 12 期播客节目,30 篇应用技巧的文章。 祝各位读者、听众新年快乐,Make Emacs Great Again! 原文地址:https://emacstalk.github.io/p...

January 1, 2022 · 1 min · jiezi

关于emacs:emacs-基础2源码安装最新Emacs

一、参考emacs系列文章目录——更新ing emacs 源码 How to Install Emacs 28 on MacOS 二、下载安装2.1 源码下载git@github.com:emacs-mirror/emacs.git 2.2 编译装置./autogen.sh./configuremake bootstrapmakemake install2.3 zsh设置# MacOS设置mv nextstep/Emacs.app /Applications/2.4 tmux运行tmux new -t "emacs"emacs

November 9, 2021 · 1 min · jiezi

关于emacs:emacs模块4tramp-远程操作

一、参考emacs系列文章目录——更新ing TRAMP 2.5.1 User Manual Short introduction how to use TRAMP 二、根本应用2.1 语法C-x C-f + sshx:user@host:/file_path 三、个性化配置

November 1, 2021 · 1 min · jiezi

关于emacs:emacs模块3项目管理

一、参考emacs系列文章目录——更新ing projectile 二、装置

August 17, 2021 · 1 min · jiezi

关于emacs:Emacs-Tips-使用-Dired-快速移动文件

关注 EmacsTalk 播种更多 Emacs 应用技巧在第五期节目里举荐过 Raycast 这个神器,之前晓得它能够间接执行脚本,但始终没尝试过,最近发现它提供了一个 script-commands 仓库,外面整顿了一些罕用的脚本,比方清空废纸篓、刷新 DNS 等,比拟实用。 但这个仓库的脚本十分多,我须要的只是其中很小一部分,所以须要一种形式来便捷地在两个目录间拷贝文件(称为 src 与 dst )。 之前的话我都是在 Dired 里 mark 相干文件,而后再在 minibuffer 里找到 dst,如果 src 和 dst 离得比拟远,整个过程会十分干燥、低效,明天尝试 Google 了一下这个问题,发现一个好形式,流程如下: 关上两个 Dired 窗口,别离对应 src 目录与 dst 目录在 src 里 mark 文件后,按 C 拷贝时,提醒的目录默认就是 dst间接回车即可复制文件设置 (setq dired-dwim-target t) 即可应用上述性能。Emacs is amazing !

August 8, 2021 · 1 min · jiezi

关于emacs:004-与-stardiviner-聊-Emacs-与他与众不同的人生经历

本期节目又请来了一资深 Emacs 用户 stardiviner,同时也是一名淘宝店主,用来售卖本人的 IT 技能。 从 org-mode 的使用者到贡献者,他是如何做到的?更让人好奇的是他不同凡响的人生经验,大学肄业后,他做过房地产销售、必胜客服务员、幼教老师、IT 反对,最初在无意间发现能够通过售卖本人的 IT 技能来赚钱,从此辞别职场,走上了 freelancer 的路线。 在一次次的抉择中,他逐步远离“常人”走过的路,这其中或者有一时的莽撞,但更多的是他敢于冲破传统的解放,逐步造成了其独特的做事格调。近一个半小时的内容,“湿货”十足,不容错过! 本期人物主播:西瓜嘉宾:stardiviner 时间轴00:02:09 嘉宾学习 Emacs 经验00:10:35 org mode 介绍00:15:15 Elisp 学习经验00:22:19 保护开源插件的感触00:29:04 开淘宝店,做技术咨询的经验00:39:19 国内外对服务、常识付费态度的差别00:49:22 服务定价00:57:36 转行00:58:27 如何走出一条不同凡响的路线01:06:54 将来的路01:09:31 嘉宾绝对听众说的话01:11:01 举荐 Show Notes嘉宾介绍 名字:金国工作经验:干过除了程序员之外的大多数工作淘宝店:蓝鲨网络工作室对 org-mode 的奉献:https://github.com/stardivine...入坑经验 2 年 vim -> org mode喜爱复古风Emacs 很多厉害的黑客都在应用,跟着大宗师的路走没错一开始是带着一点宗教意义上的盲目崇拜,好像学会了 Emacs 就能用它变得无所不能。男孩子嘛,总是心愿手中有一把长剑,学会剑术后,幻想从此仗剑走咫尺。而 Emacs 就是我手中的长剑。org mode 奉献经验 零配置复现问题,再去社区求助本人想要的性能没人乐意实现Elisp 学习经验 文本处理比拟删除不如 common lisp 弱小,次要是对异步的反对的比拟差kiwix 在 Emacs 中离线搜寻 Wikipedia开淘宝店售卖征询 19 年开始顾客形形色色,高中生、大学生、清华、北大、以及海内的学生为服务付费如何给服务定价 最贵的:500+ 人民币,100¥/小时最难的:Proof General 的 Emacs 环境配置嘉宾的人生经验及感悟嘉宾的分享 ...

July 17, 2021 · 1 min · jiezi

关于emacs:EmacsTalk一档专注在-Emacs-社区的程序员闲聊节目

______ _______ _ _| ____| |__ __| | | || |__ _ __ ___ __ _ ___ ___| | __ _| | | __| __| | '_ ` _ \ / _` |/ __/ __| |/ _` | | |/ /| |____| | | | | | (_| | (__\__ \ | (_| | | <|______|_| |_| |_|\__,_|\___|___/_|\__,_|_|_|\_\EmacsTalk 是一档专一在 Emacs 社区的程序员闲聊节目。节目宗旨: 专一 Emacs 社区,摸索 Emacs 社区背地的 奇人轶事不谋求「枯燥无味」的干货,更关注「回味无穷」教训分享如果您喜爱这档节目,欢送通过「❤️发电」来反对 ...

July 15, 2021 · 1 min · jiezi

关于emacs:emacs-lisp-4-变量

一、参考emacs系列文章目录——更新ing二、变量2.1 variable 一个变量由一个符号symbol和符号绑定的值value组成,绑定的值能够是 值的类型示例数值10字符串"such as this"列表'(spruce pine oak)函数定义 2.2 解释变量可能呈现的谬误(1) 变量被当作函数名称 如果一个列表中只有1个变量,会被解释器解释为一个函数的定义 (fill-column) 如上,fill-column会被解释为一个函数名称,因为该变量没有绑定函数,所有*backtrace*中会呈现如下的error message (2) 短少函数参数 (+ 1 1) 如上,将光标放到+后,执行C-c C-e,解释器将+当作函数名称,然而发现没有函数参数 将产生如下谬误 2.3 函数的参数

June 17, 2021 · 1 min · jiezi

关于emacs:emacs开发环境配置3java开发环境

# 创立 maven 我的项目mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false

June 10, 2021 · 1 min · jiezi

关于emacs:emacs插件6录屏-gifscreencast

一、参考emacs系列文章目录——更新ing 神器:EMACS GIF屏幕录制 emacs-gif-screencast 二、依赖装置(MacOS)2.1 装置imagemagickbrew install imagemagick或者 tar包装置 呈现问题: (1)依赖版本问题 我的解决形式是重新安装brew,详见重新安装brew 注:我抉择的是科大源 2.2 装置 ffmpeg brew install ffmpeg2.3 装置 gifsiclebrew install gifsicle三、配置应用3.1 配置 init.el (with-eval-after-load 'gif-screencast (setq gif-screencast-args '("-x")) ;; To shut up the shutter sound of `screencapture' (see `gif-screencast-command'). (setq gif-screencast-cropping-program "mogrify") ;; Optional: Used to crop the capture to the Emacs frame. (setq gif-screencast-capture-format "ppm")) ;; Optional: Required to crop captured images.3.2 罕用的命令命令阐明M-x gif-screencast开始录制M-x gif-screencast-toggle-pause暂停录制M-x gif-screencast-stop进行录制留神:默认的保留门路是 ~/Videos/emacs ...

May 26, 2021 · 1 min · jiezi

关于emacs:emacs插件5复制到剪贴板-xclip

一、参考emacs系列文章目录——更新ing Copy text from Emacs to OS X clipboard xclip 二、问题形容应用 C-w 即kill-region, C-k 即kill-line,只能将剪切文本复制到emacs外部的缓存中,来到以后的emacs实例,无奈应用,即emacs中的复制剪贴和 零碎的剪贴板不兼容 三、应用xclip 2.1 装置M-x package-install RET xclip RET 2.2 根本应用应用 C-w, C-k将文本剪贴到 零碎的剪贴板,而后在其余利用中复制文本

May 13, 2021 · 1 min · jiezi

关于emacs:emacs模块2hideshow-代码折叠

一、参考emacs系列文章目录——更新ing Hideshow minor mode Hidden Gem Packages 二、根本应用2.1 init.el配置 48 ;; 配置代码折叠 111 (add-hook 'emacs-lisp-mode-hook 'hs-minor-mode) 112 (add-hook 'python-mode-hook 'hs-minor-mode) 113 (add-hook 'go-mode 'hs-minor-mode) 114 (global-set-key (kbd "M-[") 'hs-show-block) 115 (global-set-key (kbd "M-]") 'hs-hide-block)

May 12, 2021 · 1 min · jiezi

关于emacs:emacs插件5-calctex-数学公式

一、参考emacs系列文章目录——更新ing github calctex 二、装置运行2.1 环境依赖(1) basictex brew install basictex

May 11, 2021 · 1 min · jiezi

关于emacs:emacs插件4包的配置usepackage

一、参考emacs系列文章目录——更新ing use-package Configuring Emacs from Scratch — use-package 二、为什么须要use-package?当配置好init.el后,常常会呈现上面的两个问题 2.1 可移植性当须要在其余机器中,配置emacs时候,如果不能保障须要的packages都装置,可能导致init.el中的许多配置不能失效 2.2 代码构造太扁平因为在init.el中,有多个packages都须要配置,然而init.el是所有包的配置文件,随着packages的增加,可能会呈现配置之间的抵触 2.3 解决packages的装置问题(defvar my-packages '(spacemacs-theme company))(dolist (p my-packages) (when (not (package-installed-p p)) (package-install p)))下面的形式,能够解决 2.1 可移植性,然而不能很好的解决 2.2 代码构造引入新的package——use-package能够很好的解决下面的两个问题 三、根本应用3.1 装置M-x package-install <RET> use-package <RET> 3.2 根本语法(use-package <package-name> :init <code to be executed before loading the package> <加载包之前,执行的代码> :config <code to be executed after loading the package> <加载包之后,执行的代码> :bind <key bindings for this package>)3.3 示例(1) 没有应用use-package (global-company-mode t)(define-key company-active-map (kbd "C-n") 'company-select-next)(define-key company-active-map (kbd "C-p") 'company-select-previous)(setq company-idle-delay 0.0)(2) 应用use-package ...

April 26, 2021 · 1 min · jiezi

关于emacs:emacs-lisp-学习-2-列表

一、参考emacs系列文章目录——更新ing An Introduction to Programming in Emacs Lisp 二、list2.1 list构造'(rose violet daisy buttercup)(1) 单引号示意是一个列表的开始 (2) 列表中的元素间接应用空格隔离 (3) 列表中的元素蕴含于()中 2.2 带有数字/子列表的列表 2.3 带有"的字符串列表 " "蕴含的字符串当作一个列表元素 2.4 运行列表运行eval程序后的3种可能状况: (1) 间接返回一个列表 (2) 产生error message (3) 把列表中的第一个元素,解析为一个执行命令,执行该列表 在一个列表之前增加',能够使得运行时候,不解析具体的表达式,只是输入表达式的原始字符串 2.5 其余的类型除了最常见的列表构造,还有如下类型 (1) 变量 变量不须要'和() (2) 宏 (3) 嵌套列表 嵌套列表,先执行最里层的表达式,再顺次外层执行 2.6 字节码 vs lisp代码名称lisp代码字节码文件后缀.el.elc速度比拟须要先解释为字节码后,在执行预编译的lisp代码, 执行速度更快

April 20, 2021 · 1 min · jiezi

关于emacs:emacs-lisp-学习-1-前言

一、参考emacs系列文章目录——更新ing An Introduction to Programming in Emacs Lisp 二、为什么学习Emacs lisp?只管通常只有Emacs编辑器中才会应用Emacs lisp, 然而Emacs lisp是一个残缺的计算机语言,通过学习这门语言能够: (1) 理解编程 (2) 扩大Emacs (3) 变成一个开发者 三、lisp历史选项lispcommon lispEmacs lisp产生年代195819841985创始人John McCarthyScott Fahlman, Richard P. Gabriel, David A. Moon, Kent Pitman, Guy Steele, Dan WeinrebRichard Stallman,Guy L. Steele, Jr.阐明3.1 演变关系lisp最早于1950年代末在MIT被开发,用于人工智能钻研,lisp弱小的性能使得作为编辑器命令和集成环境,也有劣势 Common Lisp在1980年代,变为lisp语言的规范 Emacs Lisp受到Common Lisp的影响,Emacs Lisp比Common Lisp更加简洁 规范的Emacs发行版中蕴含一个可扩大的文件cl.el,该文件能够为Emacs Lisp 增加Common Lisp的性能

April 20, 2021 · 1 min · jiezi

关于emacs:emacs系列文章目录更新ing

一、根底emacs 根底(1)——常见问题 二、lisp三、模块emacs模块(1)——文件治理 四、插件emacs插件(1)——谷歌翻译 emacs插件(2)——长久化scratch emacs插件(3)——版本治理 magit 五、开发环境emacs 开发环境配置(1)——golang开发环境

April 15, 2021 · 1 min · jiezi

关于emacs:emacs插件2持久化scratch

一、参考emacs系列文章目录——更新ing Re-open scratch buffer in Emacs? persistent-scratch Lisp Interaction Buffers 二、scratch2.1 根本介绍当启动eamcs的时候, (1)会主动进入lisp交互模式 (2)会主动产生一个lisp交互式的buffer——scratch buffer 2.2 进入 *scratch*(1) C-x b *scratch* 执行下面的命令,将主动进入 scratch buffer (2) M-x switch-to-buffer *scratch* 2.3 *scratch* 的根本命令命令阐明C-j执行以后的表达式,后果输入到下一行,C-x C-e执行以后的表达式,后果输入到上面的输入区域 三、*scratch* 文件3.1 *scratch* 保留为文件C-x C-s 即save-buffer将以后*scratch* 保留为文件 3.2 文件复原(1) 关上文件 C-x C-f 即find-file 关上之前保留的文件 (2) 切换模式 默认关上文件后,进入的模式是 Fundamental mode, 相当于一个一般文本编辑模式 须要应用 M-x lisp-interaction-mode进入lisp交互模式 四、插件 persistent-scratch4.1 装置插件M-x package-install RET persistent-scratch RET ...

April 15, 2021 · 1 min · jiezi

关于emacs:emacs-添加谷歌翻译

一、参考新写的 Google 翻译插件二、装置2.1 安装包m-x package-install go-translate RET2.2 自定义配置(1) 配置谷歌翻译国内地址 (setq go-translate-base-url "https://translate.google.cn") (2) 设置翻译语言 (setq go-translate-local-language "zh-CN")(3) mac下面配置 (defun go-translate-token--extract-tkk () (cons 430675 2721866130))解决报错 user-error: Error when fetching Token-Key. Check your network and proxy, or retry later三、应用3.1 go-translate命令最次要的命令,能够将 marked范畴中的文本翻译 能够绑定为其余快捷键 (global-set-key (kbd "M-t") 'go-translate)

April 9, 2021 · 1 min · jiezi

关于emacs:Spacemacs-中-Elisp-调试技巧记录

前言因为本人要在 Org Mode 中写 Latex, 然而在 Org Mode 中的预览 Latex 不怎么敌对, 新看到的插件 org-latex-impatient 在 Windows 运行的尚未解决问题(已有解决办法) 所以只能本人去折腾一下这个插件将这个过程的学习到有对于 Elisp 调试 的点记录一下 调试记录首先是本人曾经遗记的 Spacemacs 文档 中 Elisp 调试无关货色 Debugging Elisp 其中 SPC m d f 这个快捷键来调试函数几个细节 若在已装置了这个包的状况下,你再将这个包的文件(通常是一个文件)Copy 一份,而你在这个 Copy 文件上 应用这个快捷键来进行调试,同样会触发调试。 也就是说 我能够在不去批改原文件(甚至原文件的地位在哪都不必在乎)应用新 Copy 文件调试对 Copy 文件中的某个函数外部进行批改,不会走原函数定义,而是走新的函数定义,相当于原函数被笼罩了。在以上的条件下,咱们能够增加一些调试语句如:将变量值插入(相当于打印)How to insert a formatted string into a specific buffer?另一个 buffer 中 (with-current-buffer buffer-name insert var)一些办法查看 Emacs 中 Image Mode 是否反对 svg :(image-type-available-p 'svg) Reference ...

April 8, 2021 · 1 min · jiezi

关于emacs:Spacemacs-配置-LatexTikZpgfctex极轻量的

最近想玩 Latex 就倒腾了一下 顺便记录一下 环境与平台为 Windows 装置 TinyTex $ scoop bucket add r-bucket https://github.com/cderv/r-bucket.git$ scoop install tinytexReference TinyTeX releases for Windows, macOS, and Linux通过试验它的装置文件夹中 bin/win32文件夹保留平台可执行文件,把这个门路放到零碎环境变量中就能被其余程序所调用,(这也是老教训了)在 bin/win32 有一个 tlmgr.bat 用来治理包的,增加到零碎环境变量后,就能在命令行中应用了,不过要先换源来减速国内下载包的速度。这里间接参考清华源帮忙 CTAN 镜像应用帮忙安装包 我想用几个包就是 (TikZ & pgf) & ctex$ tlmgr install pgf$ tlmgr install ctex - tlmgr 说要更新就依据它说的更新Spacemacs dotspacemacs-configuration-layers 增加 lsp(latex :variables latex-backend 'lsp )dotspacemacs-additional-packages 增加 company-lsplatex-preview-pane集体配置中增加 (add-to-list 'auto-mode-alist '("\\.tex$" . latex-mode))(add-hook 'LaTeX-mode-hook (lambda () (setq lsp-latex-build-args '("-xelatex" "-outdir=lsp" "-interaction=nonstopmode" "-synctex=1" "%f")) ;; SPC m c default use Tex, so we config tex engine to support Chinese (setq TeX-engine 'xetex) ))预览 ...

February 13, 2021 · 1 min · jiezi

VSCode-帮助贫困的乌干达儿童

最近把开发环境从 WebStorm 迁移到了世界上最好的编辑器 VSCode,因为需要经常开启多个项目,CPU 和内存都爆了只能弃坑。使用过一段时间 vsc 发现里面自带插件库有个叫做 vscodevim 的插件特别有意思。它使用了一些诡异的键位和模式,和普通编辑体验差别很大,但是一看评价这么高,下载量这么大,我一度怀疑自己。看来大家都很认可这个插件,坚持使用了一段时间,发现这些诡异的键位用起来是真的特别爽,颠覆了我对文本编辑体验的认知。接下来我要开始安利了! 模式要学会使用 vim 首先要弄清楚它和其他编辑器最大的区别之一就是它拥有多个模式,而其他大部分编辑器就只有编辑模式,直接就能插入修改删除,作为一篇安利入门性质文章,我们需要知道 vim 中最重要的四种模式。 normal<esc>:可以简单的理解为浏览模式,默认就是 normal,在这种状态下你可以移动光标,跳转翻页,也可以做一些其他如删除等操作,在插入模式下按 esc 回到 normal 模式。insert<i>:就是常用编辑器的编辑态,符合我们常规的使用方式,在 normal 下按 i 键进入插入模式。command<:>: 在 normal 模式下按冒号进入命令模式,比如 :wq 退出 vim。visual<v>:和 normal 类似但是命令会高亮选中区域,类似普通编辑器选中了一段文本。vim 不止这四种模式,但是这几种是比较常用到的,更多模式可以看 vim 文档。 Text Objectvim 对文本进行了抽象,句子由单词组成,段落由句子组成,文章由段落组成,如一个单词就是一个 text-object,它配合 operator 可以进行一些非常高效的操作。常见文本对象的类型: iw - inner wordaw - a wordis - inner sentenceas - a sentenceip - inner paragraphap - a paragraph如果结合下面要提到的 operator 就可以组合成一个指令如:daw(delete a word) 即可删除当前光标下的单词。 Motionvim 中使用一些 motion 可以快速的来移动光标,如: ...

September 8, 2019 · 2 min · jiezi

反思搭建博客时出现的emacs问题

第一个问题本地执行bundle exec jekyll serve命令时,本地启了一个服务器,只要在浏览器上访问localhost:4000就可以显示,博客文章。之后使用git命令,更新到个人github仓库后。使用username.github.io访问发现,跟本地localhost:4000内容不一致。 诶怎么会这样?想了许久,直到我无意间在github展示博客的仓库上的设置里,去选择了博客主题。选择了也更改了仓库内容。但我本地没有同步更新,所以使用git pull 拉取github仓库上的内容,融合过程进入了编辑器模式。我并不想更改东西,只想快点退出编辑模式。 我一开始自己认为进入的vi编辑器,当时认知是这样,根本没有怀疑过自己的想法从何而来。按ESC,以为是命令模式,然后输入wq!回车,发现根本没用,自己大脑就好像凭着感觉随意输入,看看碰碰运气。试了一会,但想起计算机科学家吴军老师送给我们读者的一段话,”注意你的态度,因为它决定你的想法....“,好吧,既然遇到了点麻烦,就正面解决它才是最节约时间的。 冷静一会,事情的出现总有原因吧。出现这结果前提条件是什么?总有依赖的环境吧,不然怎么会出现。我就耐心阅读编辑器的英文如果截图上的Debugger什么的。不知道怎么输入,发现了这是调式模式,我就谷歌,搜索”Mac vi 调式模式“关键词,发现没有我要的答案。就在想,我自己再进入一个vi编辑器,vi index.html诶,发现按下ESC,输入wq!回车是可以退出的。我就猜测也许这不是vi编辑器。运气很好,果然不是vi编辑器,感谢终端的标题。 原来答案早在终端的标题上了,我进入的emacs编辑器,终于问题锁定了,就去谷歌,看看使用什么命令可以退出emacs编辑器。 问题终于解决,我回过想想,我是怎么解决的?起码一开始态度是正确的,这段时间不干别的事就思考如何怎么解决出现无法退出编辑器的问题。这个过程一开始没有想到就搜索一些vi、deugger mode、mac这些关键词,都没有结果,当时根本的方向在哪里都不知道,只知道要退出这个编辑模式。直到锁定了emacs编辑器,才知道,要往这个方向去解决。 当时有一种说不出感觉,一定有因果关系,就觉得事情发生了总有原因,大方向是什么?不能凭感觉搜索什么就什么吧。就感觉我自己被很细节的事情困住了,完全不知道身在何方,我内心想说,我得知道我身在何方吧。隐约想起吴军老师的话,技术的依赖条件,你说屏幕上显示这东西,肯定依赖什么才会出现的。当时想到是vi编辑器,进入了编辑模式,那么我就去查vi的使用手册,也在终端输入了vi --help。解决这个问题真的有偶然性,要不是无意间看到两个截图上的标题,我还没有幡然醒悟。 第二个问题当时自己username.github.io早就已经写了index.html,然后通过jekyll new blog再复制进usename.github.io仓库上,其实一开始,我就应该直接jekyll new username.github.io,然后推送到个人仓库上的。 发现自己并不太能描述问题,描述问题能力差。描述问题有待提高。 总结自己解决问题的思维方式完全没有形成好的依据理论。此刻想起得到专栏,解决问题的四个步骤。第一个明确和理解问题、第二个是拆分和定位问题、第三个提出解决方案、第四个总结问题。 当平时的行为产生跟以往完全不同的结果时,想想这个问题跟之前的环境不一样。我一直以为这个是vi编辑器,按照以往的命令怎么也退不出,还会抱怨怎么回事。解决问题思维方式没有形成自己的一套。

May 7, 2019 · 1 min · jiezi

不同工具查看代码分支diff的差异

本文只是简单地讲述我自己在使用GNU Emacs、Fork,以及Visual Studio Code查看Git仓库的不同分支的diff上的经历。Emacs当使用Emacs时,我更喜欢用M-x package-install安装的magit提供的功能——magit-diff,而不是它自带的vc-dir。按下M-x,输入magit-diff并敲下回车后,Emacs会在minibuffer中等待用户输入要比较的分支。就像在shell中使用git-diff一样,只需要输入两个以..连接的分支名并敲下回车,就可以列出它们间的差异。如下图所示上图是master与re两个分支间的差异。magit-diff会列出两个分支间不一致的文件,与直接使用git-diff命令没有不同。往下滚动跨过文件清单后,还可以查看单个文件的差异。如下图所示Fork第一次知道Fork是在知乎闲逛的时候,好像是在浏览“Mac下有什么值得推荐的软件”这类问题时看到的。某一次,为了能直观地查看两个commit间的差异,便试用了一番,效果确实不错。Fork的界面如下图所示还记得,当时为了能够比较两个commit间的差异,我还在Fork的菜单栏中翻了很久——虽然是毫无收获。结果发现,原来只需要选中两个commit就可以了。如下图所示图片两行蓝色的就是我选中的两个commit——先用鼠标点击其一,按住control键后再选中另一个即可。图片下方的部分与magit-diff差不多,应该也算是一目了然了。Visual Studio Code原本我觉得Fork已经足够好了,某一天在用VSCode时才忽然发现,在Fork中显示的代码差异,是没有语法高亮的。通常来说,即使没有语法高亮,查看短小的diff也不成问题。但如果差异的内容很多,或是diff位于一个很长的函数内部,这时光靠diff来做代码审查已经不太够了——因为不好确定在这片diff中出现的变量和函数,到底是不是正确地定义了的。后来我发现,VSCode自带的“源代码管理”,即便是在查看diff时也是有语法高亮的——不仅有语法高亮,对于Node.js代码而言,还有ESLint的提示和“跳转到定义”的功能,awesome!不愧是全宇宙最好用的编辑器(笑为了可以用VSCode来查看两个分支间的差异,放狗搜了一下,找到了神器GitLens。安装GitLens后,VSCode的最左侧会多出一个菜单项,在其中可以方便地选择两个分支来进行比较。首先,找到一个要比较的分支,选择“Select for Compare”。如下图所示再选中另一个要比较的分支,右键单击选择“Compare with Selected”,然后便可以在下方看到VSCode罗列出不一致的文件清单了。如下图所示VSCode是最吼的!全文完。

February 28, 2019 · 1 min · jiezi

拿Emacs对接我的cuckoo

cuckoo是一个我自己开发的类似待办事项的工具,运行在我本地的电脑上。它有如下两个接口:传入一个UNIX Epoch时间戳创建提醒传入一个标题以及提醒的ID来创建任务这样一来,便能在设定的时刻调用alerter在屏幕右上角弹出提醒。我喜欢用Emacs的org-mode来安排任务,但可惜的是,org-mode没有定点提醒的功能(如果有的话希望来个人打我的脸XD)。开发了cuckoo后,忽然灵机一动——何不给Emacs添砖加瓦,让它可以把org-mode中的条目内容(所谓的heading)当做任务丢给cuckoo,以此来实现定点提醒呢。感觉是个好主意,马上着手写这么些Elisp函数。PS:读者朋友们就不用执着于我的cuckoo究竟是怎样的接口定义了。为了实现所需要的功能,让我从结果反过来推导一番。首先,需要提炼一个TODO条目的标题和时间戳(用来创建提醒获取ID),才能调用cuckoo的接口。标题就是org-mode中一个TODO条目的heading text,在Emacs中用下面的代码获取(nth 4 (org-heading-components))org-headline-components在光标位于TODO条目上的时候,会返回许多信息(参见下图)其中下标为4的component就是我所需要的内容。接着便是要获取一个提醒的ID。ID当然是从cuckoo的接口中返回的,这就需要能够解析JSON格式的文本。在Emacs中解析JSON序列化后的文本可以用json这个库,示例代码如下(let ((s “{"remind":{"create_at":"2019-01-11T14:53:59.000Z","duration":null,"id":41,"restricted_hours":null,"timestamp":1547216100,"update_at":"2019-01-11T14:53:59.000Z"}}”)) (cdr (assoc ‘id (cdr (car (json-read-from-string s))))))既然知道如何解析(同时还知道如何提取解析后的内容),那么接下来便是要能够获取上述示例代码中的s。s来自于HTTP响应的body,为了发出HTTP请求,可以用Emacs的request库,示例代码如下(let* ((this-request (request “http://localhost:7001/remind” :data “{"timestamp":1547216100}” :headers ‘((“Content-Type” . “application/json”)) :parser ‘buffer-string :type “POST” :success (cl-function (lambda (&key data &allow-other-keys) (message “data: %S” data))) :sync t)) (data (request-response-data this-request))) data)此处的:sync参数花了我好长的时间才捣鼓出来——看了一下request函数的docstring后才发现,原来需要传递:sync为t才可以让request函数阻塞地调用,否则一调用request就立马返回了nil。现在需要的就是构造:data的值了,其中的关键是生成秒级的UNIX Epoch时间戳,这个时间戳可以通过TODO条目的SCHEDULED属性转换而来。比如,一个条目的SCHEDULED属性的值可能是<2019-01-11 Fri 22:15>,将这个字符串传递给date-to-time函数可以解析成代表着秒数的几个数字(date-to-time “<2019-01-11 Fri 22:15>")时间戳字符串要怎么拿到?答案是使用org-mode的org-entry-get函数(org-entry-get nil “SCHEDULED”)PS:需要先将光标定位在一个TODO条目上。至此,所有的原件都准备齐全了,最终我的Elisp代码如下(defun scheduled-to-time (scheduled) “将TODO条目的SCHEDULED属性转换为UNIX时间戳” (let ((lst (date-to-time scheduled))) (+ (* (car lst) (expt 2 16)) (cadr lst))))(defun create-remind-in-cuckoo (timestamp) “往cuckoo中创建一个定时提醒并返回这个刚创建的提醒的ID” (let (remind-id) (request “http://localhost:7001/remind” :data (json-encode-alist (list (cons “timestamp” timestamp))) :headers ‘((“Content-Type” . “application/json”)) :parser ‘buffer-string :type “POST” :success (cl-function (lambda (&key data &allow-other-keys) (message “返回内容为:%S” data) (let ((remind (json-read-from-string data))) (setq remind-id (cdr (assoc ‘id (cdr (car remind)))))))) :sync t) remind-id))(defun create-task-in-cuckoo () (interactive) (let ((brief) (remind-id)) (setq brief (nth 4 (org-heading-components))) (let* ((scheduled (org-entry-get nil “SCHEDULED”)) (timestamp (scheduled-to-time scheduled))) (setq remind-id (create-remind-in-cuckoo timestamp))) (request “http://localhost:7001/task” :data (concat “brief=” (url-encode-url brief) “&detail=&remind_id=” (format “%S” remind-id)) :type “POST” :success (cl-function (lambda (&key data &allow-other-keys) (message “任务创建完毕”))))))在create-task-in-cuckoo中,之所以没有再传递application/json形式的数据给cuckoo,是因为不管我怎么测试,始终无法避免中文字符在传递到接口的时候变成了\u编码的形式,不得已而为之,只好把中文先做一遍url encoding,然后再通过表单的形式(form/x-www-urlencode)发送给接口了。全文完。 ...

February 5, 2019 · 1 min · jiezi

一些在Emacs中搜索文本的方法

在Emacs中写代码的时候,常常需要查找一个函数、方法,或者变量的定义。如果是正在写Common Lisp,那么SLIME已经配置好了相应的快捷键M-.,只需要将光标移动到要查看的函数、方法,或者变量的名字上,按下M-.便可以跳转过去——再按一下M-,还能回到原来的位置。如果是写其它语言的代码,很多时候都没办法方便地跳转过去,这时候就需要依赖于文本搜索了,这也是本篇所要讲述的主题。通常情况下,用C-s和C-r就足够了——一个负责“往下”搜索一个负责“往上”搜索。尤其在安装了Emacs的插件swiper之后,只需使用C-s便可以同时查看到上下两个方向的匹配文本。但C-s也有其局限性。例如,它不能跨文件搜索,如果要查看的函数、方法,或者变量的定义不在当前buffer中,就不得不手动在多个buffer间切换并频繁按下C-s了。有多种办法可以解决上面这种问题。例如,可以用Emacs的projectile-ag。通常,如果代码散布在多个源文件中,那么它们多半是放在一个项目中——比如一个Git仓库。打开位于项目中的文件时,Emacs的projectile-mode就会启动。此时,按下C-c C-p s s这套组合键,会调用projectile-ag函数。projectile-ag会在minibuffer中等候输入要搜索的内容,按下回车后,Emacs会调用命令行工具ag来搜索这个项目下的所有文件,找出匹配关键字的行并显示。projectile-ag函数会打开另一个buffer来展示搜索结果,一个示例如下ag –literal –group –line-number –column –color –color-match 30;43 –color-path 1;32 –smart-case –stats – emacs .0 matches0 files contained matches36 files searched111365 bytes searched0.007795 seconds使用projectile-ag的前提是要搜索的文件都在同一个一个项目中,但并非所有时候都满足这个要求。这时,可以用Emacs的find-grep函数。find-grep函数调起后同样要求使用者在minibuffer输入内容,但它更原始一点光标会定位在-e选项之后,需要填补交给grep的正则表达式。由于minibuffer中给出的是完整的、将会被运行的命令,因此可以也给find命令添加一些选项和参数,来改变搜索行为。如果是在一个Node.js项目中搜索,一般还要让find忽略一些文件,如node_modules目录下的大量依赖,或者构建产生出来的.css和.js文件。这些文件中的行不仅很可能会命中输入的正则表达式,还极可能成片地出现,占据搜索结果中的半壁江山。除了grep之外,还有许多命令行的文本搜索工具,例如ack和rg,并且它们都称自己更快。要在Emacs中使用它们也很简单,尤其是后者还有相应的插件rg.el可以方便调起。如果经常要控制find来忽略node_modules,可以考虑用git-grep。man git-grep中说到,它只会搜索tracked的文件node_modules一般都不会被git跟踪,自然也就不会被搜索。全文完

January 11, 2019 · 1 min · jiezi

Emacs的org-mode实现自动的internal archive

缘由org-mode是一个Emacs内置的major mode,当打开一个后缀为.org的文件时就会被启用。在官网的介绍中提到,它可以用于管理待办事项,而这也正是我目前使用org-mode最多的场合。比如,我用它来记录漫画的阅读进度,每一话或每一章就是一个标记了TODO关键字的条目,读完那一话或那一章后就会将对应的条目标记为DONE。一般我会一周一次地归档自己标记为DONE的条目,但由于一次要处理的条目可能很多,逐一将它们归档比较繁琐,因此,便打算二次开发实现一个自动归档的功能。需要事先声明的是,本文不是org-mode的入门教程,也不会讲解如何配置org-mode。对这方面有兴趣的读者,可以自己搜索一番,资料还是相当丰富的。菜谱对于每一个被完成的单独的阅读任务,我的做法是将其internal archive。等到一整本漫画都读完之后,再将整个以漫画名命名的条目归档到别的文件中去。要实现自动的internal archive,最简单直接的办法是借助于org-mode提供的各种hook。org-mode提供了许多的hook,在官方的文档中有一一列举 。其中,名为org-after-todo-state-change-hook的便是我所需要的钩子。只需往这个变量所绑定的列表中添加一个函数,那么这个函数便会在条目切换状态时(比如从TODO切换到DONE)被org-mode调用。最终的ELisp代码如下(defun lt-archive-if-manga () (let ((state org-state)) (when (string= state “DONE”) (let ((tags (org-get-tags-at))) (when (member “漫画” tags) (org-toggle-archive-tag))))))(add-to-list ‘org-after-todo-state-change-hook ’lt-archive-if-manga t)稍微解释一下。从C-h v org-after-todo-state-change-hook RET的文档可以得知,条目的新状态可以通过变量org-state获取。取得新状态(是个字符串)后,首先检查其是否为"DONE"。如果是,再检查这个条目是否为一个阅读漫画的任务。在我的用法中,凡是漫画条目,都打上了名为"漫画"的标签。因此,使用函数org-get-tags-at取得一个条目的所有标签(包括从父级条目继承下来的),再用member函数判断这些标签中是否包含字符串"漫画"。如果有,就调用org-toggle-archive-tag将该条目internal archive。传给函数add-to-list的第三个参数t的作用,是让这个新加入钩子的函数最后被调用。全文完

January 7, 2019 · 1 min · jiezi