首页
归档
友情链接
关于
Search
1
在wsl2中安装archlinux
285 阅读
2
从零开始配置 vim(15)——状态栏配置
168 阅读
3
nvim番外之将配置的插件管理器更新为lazy
159 阅读
4
2018总结与2019规划
145 阅读
5
PDF标准详解(五)——图形状态
121 阅读
软件与环境配置
读书笔记
编程
Thinking
FIRE
菜谱
翻译
登录
Search
标签搜索
c++
c
学习笔记
emacs
windows
elisp
文本操作术
编辑器
NeoVim
Vim
win32
读书笔记
VimScript
linux
文本编辑器
投资理财
Java
反汇编
OLEDB
数据库编程
Masimaro
累计撰写
437
篇文章
累计收到
32
条评论
首页
栏目
软件与环境配置
读书笔记
编程
Thinking
FIRE
菜谱
翻译
页面
归档
友情链接
关于
搜索到
2
篇与
的结果
2026-08-13
《elisp 每日一练》——显示buffer的新姿势
上一篇提到,可以使用 split-window 来创建新的窗口,也区分了buffer和窗口的概念,同时也知道如何获取、修改窗口展示的buffer。split-window 创建的窗口有一个特点:它需要我们自己指定新窗口的摆放位置,窗口位置由我们自己维护。一般情况下,在编程或者做工程化的项目时引入 workspace 的概念,我们规定如何划分窗口区间是有利的,但是有些窗口像 *Help*、*Messages* 、Shell 这类窗口我们经常看一眼或者临时需要打开,如果将它纳入自主的窗口管理就不合适了。本节我们来解决这个问题知识铺垫Emacs 中提供了两个函数 display-buffer 和 pop-to-buffer。我们先从 display-buffer 开始。它的函数原形为(display-buffer BUFFER-OR-NAME &optional ACTION FRAME)它会根据我们已有的窗口布局来选择合适的窗口显示对应的buffer内容,也就是说它不一定会创建新的窗口,它只是根据用户需求选择合适的窗口来显示。如果没有合适的则创建,有则利用已有的窗口来显示。我们可以通过 ACTION 参数来定义它的行为。它只负责显示buffer,而不会跳转光标,这种一般用于设置查看日志但是不操作buffer内容的场合。如果我们希望在显示buffer之后光标也跟着跳转,可以使用函数 pop-to-buffer。它们显示buffer的行为完全一样,但是 pop-to-buffer 会移动光标到新的buffer所所在窗口中。(pop-to-buffer BUFFER-OR-NAME &optional ACTION NORECORD)我们看到它的函数参数中,也有一个 ACTION 参数。我们可以通过这个参数来实现自定义显示行为。一个标准的ACTION是 '(FUNCTIONS . ALIST) 的结构。其中 FUNCTION 表示函数或者函数列表,Emacs 在显示时会Emacs 会从左到右依次尝试这些函数,直到其中有一个成功找到或创建了窗口为止。ALIST 是一个由 (属性 . 值) 构建的关联列表。用来微调上述函数执行时的行为(如窗口高度、分屏方向、是否专有等)。各位读者看到这些结构也不必惊慌,Emacs为我们提供了一些常用的通用封装。对于function来说,有以下常用的预定义函数:display-buffer-reuse-window : 重用已有窗口, 如果该 Buffer 已经在某个窗口显示了,直接使用该窗口。display-buffer-same-window : 占用当前窗口, 直接在当前光标所在的窗口中显示该 Buffer。display-buffer-pop-up-window : 切分新窗口, 根据 split-height-threshold 或 split-width-threshold 在周围切出一个新窗口。display-buffer-below-selected : 在下方切分, 在当前窗口的正下方新建或重用一个窗口。display-buffer-at-bottom : 底部全宽弹出, 在当前 Frame(或屏幕)的最底部创建一个跨越整宽的窗口。display-buffer-in-side-window : 侧边栏/侧边窗口, 在 Frame 的四周(left/right/top/bottom)作为 Sidebar 弹出(通常搭配专属属性)。display-buffer-pop-up-frame : 弹出新 Frame , 直接新建一个独立的 OS 窗口(Frame)。对于 ACTION 中的 ALIST 也有一些预定义的属性(window-height . N) : 设置弹出窗口的高度。整数(如 15)表示固定行数;浮点数(如 0.3)表示占当前/全屏高度的比例。(window-width . N) : 设置弹出窗口的宽度。整数表示列数;浮点数表示宽度比例。(side . left/right/top/bottom) : 指定侧边栏弹出的位置,可以与上述 display-buffer-in-side-window 搭配使用(slot . N) : 侧边栏的位置,用于同侧有多个窗口的情况,(reusable-frames . val) : 寻找可重用窗口时的范围:t(所有 Frame)、visible(所有可见 Frame)、0(当前及当前可见 Frame)、nil(仅当前 Frame)。(inhibit-same-window . t): 明确要求绝对不能占用当前窗口。(dedicated . t) : 将新创建的窗口标记为专有(Dedicated)。专有窗口在用户切换其他 Buffer 时不会被轻易替换。有了这些知识,我们可以对显示messages buffer给出简单的定义,例如我希望message buffer永远只出现在最底部,并且占用整个底部。就可以有下面的代码:(defun my/show-messages-buffer() (interactive) (display-buffer "*Messages*" ;; 底部全宽显示 '((display-buffer-at-bottom) ;;ALIST 参数, 高度为30,强制不覆盖当前窗口 (window-height 30) (inhibit-same-window . t))))实际上除了在 ACTION 参数中设置这些属性外,还可以通过全局变量 display-buffer-alist 来设置这里的 ACTION 参数。它与这里通过参数设置的方式相比,优势在于它可以通过正则表达式来匹配一次性定义一堆buffer的显示方式。它的数据结构为:((CONDITION . ACTION) (CONDITION . ACTION) ...)上一节我们提到,可以使用 quit-window 和 delete-window 删除窗口,但是没有讲它们的区别,因为那个时候还没有引入这种显示buffer的新姿势。现在有了这些知识就可以来说说它们的区别了。今天的新姿势对比之前来讲,最大的区别就是不一定要创建新窗口,它可以重用现在的窗口来显示新内容。quit-window 是一种温和的删除窗口的方式,对于这种重用的状态,它只是不显示新buffer的内容但是会酌情保留原来的窗口。而 delete-window 来说就比较不讲情面了,它不管你还需不需要用这个窗口,直接删除。练习今天的练习,我们来实现一个查看message、log这种buffer的功能,我们希望通过 display-buffer-alist 设置全局的,对于这种窗口我们采用底部显示的方式,取底部35%的区域进行显示。(add-to-list 'display-buffer-alist '("\\*.*\\(?:log\\|messages\\).*\\*" (display-buffer-reuse-window display-buffer-at-bottom);; 优先重用已打开的对应窗口;若未打开,则在当前 Frame 的最底部弹出 (window-height . 0.35) ;; 占用25%的空间 (reusable-frames . visible))) ;; 允许在当前可见的其他Frame中搜寻 (display-buffer "*Messages*")总结本篇我们了解了另一种通过window 显示buffer的方式,主要的函数有:display-bufferpop-to-buffer
2026年08月13日
11 阅读
0 评论
0 点赞
2024-12-05
在wsl2中安装archlinux
在之前的博客中,我介绍了如何在虚拟机或者真实机上安装archlinux并且进行一定的配置,但是实际上Linux不管怎么配置在日常使用中都没有Windows简单便利,在开发有关Linux的程序时过去用虚拟机或者直接在Windows上使用ssh在远程服务器上进行开发。但是微软发布了wsl以及后续更新的wsl2,可以很方便的实现在Windows中拥有两个系统,并且两个系统可以进行互联。在不改变Windows操作习惯的基础之上操作Linux。进一步提升了Linux的便捷易用性。晚上的教程大多数都是使用wsl安装Ubuntu的,作为一个铁archlinux党,我不太用得惯Ubuntu,那么就要想办法安装自己习惯的arch,好在在网上有现成的教程。终于完成了这一工作准备工作安装wsl2,需要Windows 11或者Windows 10 的19041 及更高版本。因此如果系统版本不够需要提前进行系统的更新操作我们需要在Windows功能中开启 "适用于Linux的Windows子系统",如下图所示勾选之后可能需要重启。或者也可以在应用商店进行安装。这里就不得不吐槽一下微软的应用商店了,它居然能做到挂梯子和不挂梯子一样卡。我这里死活登录不上,就不演示这种方式了安装完成之后可以在powershell中查看它的版本wsl -v从图上可以看到,我们已经安装上了wsl2安装 archlinux安装完wsl2 之后,我们可以在GitHub官网上下载最新的ArchWSL。这里我们要下载两个东西,一个是不带online 标识的appx文件以及同名的cer文件。下载完成之后双击 .cer 文件,点击“安装证书”,选择“本地计算机”,在下一个页面中选择“将所有的证书都放入下列存储”,点击“浏览”,选择“受信任的根证书颁发机构”,执行安装。证书安装完成之后,我们双击下载的appx 文件,直接点击安装appx文件安装完成之后,可以使用wsl --list来查看当前wsl中的Linux子系统此时已经有了对应的系统了我们在命令行输入 arch 即可进入archlinux子系统,此时是以root的身份进入的配置arch配置普通用户新系统安装之后的第一件事就是创建一个普通用户,并且永远以这个普通用户进行登录,在需要的时候使用 sudo 来申请某些管理员权限进行操作我们在之前安装archlinux的教程中已经提到过对应的操作方式useradd -m -G wheel -s /bin/bash arch我们创建一个名为 arch 的用户,并指定shell为 bash接下来我们使用passwd arch passwd root来设置root和arch两个用户的密码。因为archlinux中安装的编辑器是vim,所以我们先将vim设置一个名为vi的别名ln -sf /usr/bin/vim /usr/bin/vi然后 使用visudo 将文件中 #%whell ALL=(ALL) ALL 这行的注释去掉,以便当前用户能够使用 sudo 命令接着可以使用su arch 将当前用户切换到arch。并且使用命令sudo pacman -Syyu来更新系统,同时测试一下输入用户密码之后能否执行一些root命令之后我们推出 arch 子系统,在powershell中执行Arch.exe config --default-user arch来指定默认使用arch 来登录系统设置完登录用户之后,在powershell中输入 arch 进入archlinux子系统中,此时我们发现,登录用户已经变成arch了初始化密钥环和更新源接着我们执行以下命令,来初始化密钥环sudo pacman-key --init sudo pacman-key --populate sudo pacman -Syy archlinux-keyring sudo pacman -Su鉴于目前国内的网络环境,上述几条命令有可能执行出问题或者卡着不动,我们可以进行换源的操作,这里我采用清华源在/etc/pacman.d/mirrorlist 文件的最顶端添加Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch开启32位软件库支持与ArchLinuxCN库的支持按照之前博客中的内容,我们先打开 32位软件的支持,在 /etc/pacman.conf 中去掉[multilib]一节中两行的注释,来开启 32 位库支持。然后在该文件的结尾处加入下面的文字,来开启 ArchLinuxCN 源[archlinuxcn] Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch之后通过以下命令安装 archlinuxcn-keyring 包导入 GPG key。pacman -Sy archlinuxcn-keyring具体的使用可以看镜像的官方文档如果报错可以看官网或者看我博客的办法是否能解决上述命令都成功之后使用 sudo pacman -S yay 来安装 yay成功之后我们可以试着安装一下neofetchyay -S neofetch安装成功之后,执行neofetch 就可以看到系统信息了配置终端基础内容安装完成之后,我们可以对终端进行一下美化和配置,毕竟日常使用上大部分时间都是直接在终端中使用,有一个漂亮点的终端用起来也舒服一点我们首先安装一下必要的组件sudo pacman -S net-tools man-db man-pages man-pages-zh_cn texinfo ntfs-3g tree pacman-contrib neofetch wget git usbutils pciutils acpi base-devel接着我们安装一下相应的字体sudo pacman -S adobe-source-han-serif-cn-fonts wqy-zenhei sudo pacman -S noto-fonts-cjk noto-fonts-emoji noto-fonts-extra ## 这里我把官方推荐的所有带unicode标识的全装上了,这样后续就不太会出现乱码的情况了 yay -S ttf-ubraille ttf-symbola otf-cm-unicode ttf-arphic-ukai ttf-arphic-uming ttf-dejavu gnu-free-fonts ttf-google-fonts-git nerd-fonts-complete ttf-hack ttf-joypixels默认的bash 功能比较弱,我们采用zshsudo pacman -S zsh然后将默认的shell 设置为 zshchsh -l # 列出系统中存在的所有shell chsh -s /bin/zsh #根据上一个命令得到的shell路径,设置当前shell我们推出系统再次登录的时候,shell已经切换到zsh了,我们按照提示生成一个默认的 .zshrc 文件即可为了支持终端上显示一些图形,我们需要安装 nerd-font 。可以在GitHub上找到 nerd-font可以通过git clone https://github.com/ryanoasis/nerd-fonts.git --depth=1来克隆,也可以通过在宿主机上下载zip包,然后传入archlinux 中。我们可以直接在Windows的文件资源管理器上输入 \\wsl$ 来访问archlinux的文件系统在获取项目之后,在项目的根目录执行 sh ./install.sh 来执行安装需要注意的是,如果你是通过本地的windows terminal 来ssh到远程archlinux化,本地也需要安装 nerd-font 因为这个时候显示的责任在宿主机的终端程序。需要宿主机本身也有那些字体。Windows上可以使用 .\install.ps1 来安装字体准备好后,我们可以使用 powerlevel10k 来美化终端git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/powerlevel10k echo 'source ~/powerlevel10k/powerlevel10k.zsh-theme' >>~/.zshrc source ~/.zshrc接着按照它的提示选择样式即可,如果不满意了,可以在 .zshrc 中对应的配置,直接重新选择样式即可。完成之后,可以看到终端相对来说比较好看了接下来我们对zsh 进行一些简单的配置安装 zsh-autosuggestions ,它是一个命令提示插件,当你输入命令时,会自动推测你可能需要输入的命令,按下右键可以快速采用建议git clone https://github.com/zsh-users/zsh-autosuggestions ~/.zsh/zsh-autosuggestions在 .zshrc 中添加下列代码source ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh安装完成之后效果如下我们可以按TAB自动补全zsh-syntax-highlighting 是一个命令语法校验插件,在输入命令的过程中,若指令不合法,则指令显示为红色,若指令合法就会显示为绿色。git clone https://github.com/zsh-users/zsh-syntax-highlighting.git echo "source ${(q-)PWD}/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" >> ${ZDOTDIR:-$HOME}/.zshrc安装完成之后效果如下autojump 是一个懒人神奇,有了它,当我们此前跳转过某个路径之后,可以很方便的跳转到之前路径。例如我们之前跳转到/usr/bin /home/arch那么我们可以直接使用 j b 跳转到 /usr/bin 中,或者在其他目录使用 j a 跳转到家目录中,如果跳转的目录路径有相似的字符,可能需要多输入一些字符来区分我们下面来安装它git clone https://github.com/wting/autojump.git cd autojump ./install.py安装好之后,它会提示我们需要手动将下列命令加入到 /zshrc 中,我们添加就好了thefuck 这也是一个懒人神奇,当命令输入错误的时候只要fuck一下就好了在archlinux中,我们可以直接使用sudo pacman -S thefuck我们将下列代码放入到 .zshrc 中eval $(thefuck --alias)安装完成之后,效果如下使用gui程序在Windows11和Windows 10 的内部版本在19045以上的时候,wsl本身就可以直接在打开Linux的gui程序。这里我们安装一个firefox作为测试例子sudo pacman -S firefox firefox-i18n-zh-cn我们启动firefox,这个时候报错了不要慌,这里我们需要链接wslg的接口套接字到x11sudo rm -r /tmp/.X11-unix ln -s /mnt/wslg/.X11-unix /tmp/.X11-unix可以将这段代码手动添加到 .zshrc 中,以便重启之后仍然能生效if ! [ -S /tmp/.X11-unix/X0 ]; then sudo ln -sf /mnt/wslg/.X11-unix/X0 /tmp/.X11-unix/X0 fi这个时候再打开就能在Windows上看到firefox的界面了还有一个惊喜,那就是我们可以从开始菜单中找到对应的Linux gui程序,并且直接点击就能打开。使用rdp连接除了这种使用方式,我们还可以使用rdp通过Windows的远程连接来进入archlinux子系统。这里我不太推荐这种方式,因为上面那种方式可以直接在Windows上使用linux gui程序,已经特别方便了,而且这种方式需要有桌面环境,需要消耗资源,但是当你的Windows版本不够的时候,可以考虑使用这种方式来使用gui程序这里我们先安装桌面环境sudo pacman -S xfce4 xfce4-goodies这里我采用轻量的xfce4,不管是使用kde 还是gnome,感觉都比较重接着我们下载rdp相关的软件yay -S xrdp xorgxrdp-glamor pulseaudio-module-xrdp根据 arch wiki 的说法,xrdp 仅支持使用XVNC作为后端,所以这里我们需要安装一下 vncsudo pacman -S tigervnc安装完成之后,需要在home目录下,添加一个.xinitrc 文件,这个文件会在rdp新建一个虚拟桌面的时候执行,文件的内容如下unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS exec dbus-launch startxfce4最后我们启动一个rdp服务sudo systemctl start xrdp.service最后我们就可以使用Windows远程桌面连接上Linux的桌面了好了,配置到这里也就基本结束了,希望各位小伙伴在其中玩的愉快。总体来说Windows的wsl用起来还是很香的,特别是使用wslg服务在Windows中使用Linux的gui程序。它用起来就跟在Windows上开启一个gui程序一样丝滑,可以很好的将Linux程序融入到Windows的工作流中。
2024年12月05日
285 阅读
10 评论
0 点赞