karabiner-elements

karabiner-elements 使用命令行/vim/emacs等键盘操作比较多的用户,有一点感触就是:小拇指很容易累。本人起初不喜欢修改键盘映射,主要原因是定制化比较多的系统,在团队合作时互相操作会不方便,无论是自己偶尔在别人电脑上使用或者别人在自己的电脑上使用,都会不习惯。ORZ最后因为vi… ...更多

三月 12, 2022 [桌面与效率] #快捷键
一致性哈希

一致性哈希 一致性hash // http://walkerdu.com/2020/01/02/consistent_hash/ /*

  • map
  • 对于map的底层原理,是通过红黑树(一种非…
...更多

三月 12, 2022 [算法与数学]
cxx抛异常

cxx抛异常 C++程序抛出异常后执行顺序 析构函数中是否可以抛出异常 首先我们看一个常见的问题,析构函数中是否可以抛出异常。答案是C++标准指明析构函数不能、也不应该抛出异常!   C++异常处理模型是为C++语言量身设计的,更进一步的说,它实际上也是为C++语言中面向对象而服务的。C++异常处理… ...更多

二月 10, 2022 [C/C++]
Hexo and gitalk

Hexo and gitalk Welcome to Hexo! This is very first post. Check documentation for more info. If get any problems when using Hexo, can find the answer … ...更多

六月 11, 2021 [杂项]
Vim 使用系统剪切板

Vim 使用系统剪切板

Vim 是运行在 Terminal 里的 Shell 程序,所以要把内容拷贝出来可以通过 Terminal,也可以通过 Vim 自己。不配置 Vim 剪切板时只能通过 Shell 来拷贝粘贴:

  • 通过 Shell 拷贝(比如在 iTerm 里按住 Alt 选取内容)会有问题:比如会包含 Vim 左侧行号、折行变成了换行。
  • 通过 Shell 粘贴有类似的问题:相比于 p 命令,在插入模式下 Ctrl+V 时 Vim 会把内容当作字符键入,触发 Vim 的所有处理键入的插件,比如自动补全、语法检查等。不仅会很慢,而且可能会破坏你的内容(比如粘贴一对括号,可能 Vim 会再帮你自动补全一个多余的右括号)。

所以完美的拷贝粘贴一定要通过 Vim 本身。Vim 中 p(paste)、d(delete)、y(yank)等拷贝粘贴操作使用的是 匿名寄存器 ""(unnamed register),本文就来解释怎么在 Mac/Windows/Linux 上把 Vim 的 匿名寄存器 映射到操作系统的剪切板。

TL; DR

  1. 确保你的 vim 支持剪切板,通过 vim --version | grep clipboard 检查。
  2. 确定你的剪切板寄存器是 "+(XA_SECONDARY)还是 "*(XA_PRIMARY)。
  3. 同步剪切板和匿名寄存器,在 ~/.vimrc 添加配置比如 set clipboard=unnamed。
...更多

九月 04, 2020 [桌面与效率] #Vim #clipboard #寄存器
Bash 转义和引号的使用

Bash 转义和引号的使用

字面量、转义和引号是任何编程语言的基础,但却少有人认真地学习 Bash 中的转义和 引号。 好消息是 Bash 引号的语义非常简单,这篇文章就可以完全描述。 TL;DR:

  1. 反斜线用来转义除换行之外的所有字符,反斜线加换行为连行;
  2. 单引号用来直出字面量,其内容部分不允许转义,包括单引号转义也不允许;
  3. 双引号内允许 命令替换 和对特定几个字符转义,双引号内的反斜线对其他字符没有特殊含义,会被当作字面量处理。
...更多

六月 26, 2020 [Linux 与系统] #Bash #grep #sed
对 tail -f 使用管道

对 tail -f 使用管道

最近发现 tail -f 时管道后面的程序都会被卡住,才发现 grep,sed,awk 不直接输出到 TTY 时都是带缓冲的。平时跟在 cat 后使用没问题是因为输入管道关闭触发了 flush。本文详细解释其中的坑,以及怎么让 sed, awk, grep 立即 flush。 TL;DR:grep 添加 --line-buffered,sed 添加 -u,awk 调 fflush()。

...更多

六月 06, 2020 [Linux 与系统] #TTY #grep #sed
从当前位置打开 Terminal

从当前位置打开 Terminal

我们有很多工作区时,每次打开一个 Terminal 都需要先 cd 到和上一个 Terminal 一样的位置再开始工作。 这个过程既然是固定的,那就一定能自动化。

Harttle 遇到的具体场景是,i3wm 有 workspace(工作区)的概念,每个工作区可以打开任意多个 Terminal。 我希望同一个工作区的 Terminal 打开时都有一样的 CWD(Current Working Directory), 不同的工作区有不同的 CWD。即:打开 Terminal 时,自动 cd 到当前工作区其他 Terminal 所在的位置。

本文基于 Reddit 上的一个小脚本展开,这一思路适用所有 Terminal Emulator 和 Desktop Environment(尽管我只有 Window Manager 也是适用的)。

...更多

十二月 26, 2019 [桌面与效率] #Terminal #Shell
X11 多显示器配置:玩转 XRandR

X11 多显示器配置:玩转 XRandR

RandR(Resize and Rotate)协议是基于 X Window 系统的一个扩展,它可以直接操作显示器模式、刷新率,属于 DDX 组件。 xrandr 是官方的 RandR 配置工具,比老的 Xinerama 机制更容易测试和配置。 本文在没有桌面环境的情况下直接对底层软件进行配置,如果有安装某种 DE 可以在其控制面板中找到对应的配置。

...更多

十二月 24, 2019 [桌面与效率] #Mac #X11 #HDMI
VT 下的键盘映射设置

VT 下的键盘映射设置

最近遇到在 X11 下切换到 TTY 可以用 Ctrl+LeftAlt+Fn 或 Ctrl+RightAlt+Fn,但从 TTY 切换回 X11 只能使用 Ctrl+LeftAlt+Fn 的问题。 为了手感比较一致今晚解决了这个问题并记录在这里,希望能帮助遇到同样问题的人。

具体原因是 X11 下的键盘映射由 xkbmap 来管理,它默认提供了比较复杂的配置;但 VT 直接运行在内核上没有经过 X11 它的配置更直接和简单。 这两份配置的不同导致了在 VT 下 RightAlt 不能正确映射。 这里我们关心的是 keycode 到 keysym 的映射关系, 更过关于 scancode, keycode, keysym 的概念解释可以先参考 ArchLinux 键盘映射 的第一小节。 这个 keycode 到 keysym 的映射关系就是我们常说的 keymap, 就是装各种系统时要选的键盘布局。 所有的 keymap 都存在 /usr/share/dbd/keymaps 中:

find /usr/share/kbd/keymaps/ -type f

关键在于 X11 和 VT 中如何选择这些文件,其中每个 .map.gz 文件解压后得到的 .map 文件即为键盘布局文件。文件中的数字表示 keycode,Alt、Control 这样的词即为 keysym。

...更多

十二月 07, 2019 [桌面与效率] #ArchLinux #keycode #TTY #X11
使用模逆元计算组合问题

使用模逆元计算组合问题

模逆元(modular multiplicative inverse)俗称模倒数,是指与原数的乘积和 1 同余的整数。即对于整数 $a$ 和 $n$:

$$ ax \equiv 1 \mod(n) $$

上式中 x 就是 a 对于 n 的模逆元,$a$ 与 $n$ 互质时模倒数存在,否则不存在。 它的数学意义是模倒数存在时,除以一个数和乘以它的模倒数同余,可以把除法转换为乘法。 这对于计算大数(10 以上)组合问题非常有效,适用于 Sherlock and Permutations 和 Matrix Tracing 等问题。 这类问题的都可以转化为组合问题 ${n \choose m}$,由于它的值通常会很大,我们只关心它对某个大质数 M(比如 $1e9 + 7$)的模:

$$ {n \choose m} = C_n^m = \frac{n!}{m!(n-m)!} \mod{M} $$

...更多

十月 20, 2019 [算法与数学]
ArchLinux 休眠到交换文件

ArchLinux 休眠到交换文件

Linux 使用交换分区来休眠,首先冻结所有进程并申请足够的交换内存(位于磁盘),把当前内存都存进去。 然后下次启动时,initramfs 会直接加载上次休眠时的内存状态,跳过内核的 init 过程。 因此首先需要有足够大的交换分区或交换文件;再把内核指向到休眠的分区上;最后再配置 initramfs 让它加载休眠的内存文件。 官方文档请参考 Power_management/Suspend_and_hibernate#Hibernation, 本文细述如何休眠到交换文件,并对其中一些概念和细节进行了解释。

在本文讨论的范围内, 挂起(suspend)是指冻结当前的进程,保留它们的内存,并把几乎除了内存之外的设备都断电。 休眠(hibernate)是指把挂起后的内存写入磁盘并完全关机。 锁定(lock)则只是显示一个模态的全屏软件输入正确的密码才能退出。

...更多

十月 19, 2019 [Linux 与系统] #ArchLinux
ArchLinux 下的屏幕背光恢复

ArchLinux 下的屏幕背光恢复

最近发现我的 ArchLinux 每次解锁之后屏幕背光都会设置为最大,今晚终于有时间把它修复了。 写这篇文章介绍在 ArchLinux 下开机(Boot)和解锁(Resume)时,如何恢复此前的屏幕背光。 先解释背光控制的机制,再给如何入配置和调试。 本文以 MacBook Pro 2013 Late 为例(intel 显卡,xf86-video-intel 驱动)。

本文只解决背光恢复的问题,如果你的 Fn 功能键无法调整背光,请参考 在 MacBookPro 上安装 ArchLinux 中的“显示器/键盘背光”一节。

...更多

十月 13, 2019 [Linux 与系统] #ArchLinux #Mac #systemd
龙胆虎威中的四加仑水迷题(Die Hard 3)

龙胆虎威中的四加仑水迷题(Die Hard 3)

龙胆虎威 3 中的一个场景:在泉水旁有两个瓶子,容量分别是 5 加仑和 3 加仑。 Bruce 需要在 5 分钟内精确地得到 4 加仑水来停止定时器,差一盎司都会引起爆炸。 本文对这个问题进行推广,分别讨论有解的条件和解的构造两个问题,再给出判断是否有解的简单方法:能否被公约数整除。

如果目标水量 c 是 a 和 b 的线性组合就有解,否则无解。具体地:

  1. 得到的水量一定是 a 和 b 的线性组合。即如果 c 不是 a 和 b 的线性组合就无解。
  2. 重复地从 a 倒入 b,就可以得到 a 和 b 的所有线性组合。即只要是线性组合就有解。

c 是否是 a 和 b 的线性组合,取决于 c 能否被 gcd(a,b) 整除:

  1. gcd(a,b) 是 a 和 b 最小的正的线性组合。
  2. gcd(a,b) 能整除 c 等价于 c 是 a 和 b 的线性组合。

为方便讨论,本文所有线性组合都指整数线性组合,所有数字 x、y、m、n 都表示整数。

...更多

九月 21, 2019 [算法与数学]
ArchLinux 键盘映射:交换 CapsLock 和 Ctrl

ArchLinux 键盘映射:交换 CapsLock 和 Ctrl

笔者在几个月前 切换到 Linux 下干活,使用 Xmodmap 交换掉 CapsLock 和 Ctrl。 但 Xmodmap 只能改键无法区分是哪个键盘硬件设备(偏偏 HHKB 的 Caps 本来就在左边),而且只在 X11 下好使(Virtual Console 下不起作用)。 于是近日研究了下 scancode 到 keycode 映射,通过 udev 匹配和配置特定的输入设备。 Harttle 的环境是 Macbook 下的 ArchLinux,下面的命令以此为例,但其他环境也应该类似。

注意:本文只讨论如何重新定义个别键的 keysym 的问题。更改键盘布局请参考 kbdmap,更改快捷键请使用 xbindkeys 或 i3 bindsym 或你的桌面系统配置。

...更多

八月 08, 2019 [桌面与效率] #ArchLinux #keycode
保存和恢复 TMUX 工作区 —— The Easy Way

保存和恢复 TMUX 工作区 —— The Easy Way

Harttle 此前介绍过 Tmux 的使用,我们知道 Tmux 可以把所有打开的 Shell 都保存在服务器。 你的 Terminal 重启不会丢失任何东西,但 Server 重启后 Session 会全部丢失。 如果你像 Harttle 一样在开发 PC 本地运行 Tmux Server 的话,每次开机后都需要重新建立各种会话和窗格。

本文介绍一个 Tmux 插件:tmux-resurrect, 可以一键保存当前 Tmux 状态,包括 Session、Window、Pane 布局,甚至 Vim 状态也可以恢复。

如果你更偏向 The Hard Way,可以参考 恢复 TMUX 工作区 - The Hard Way,手动完成一切初始化工作。

...更多

十一月 24, 2017 [桌面与效率] #Bash #tmux