BNU-FZH

fengzhenhua@outlook.com

项目地址:https://github.com/echasnovski/mini.nvim

项目简介

Mini.nvim 是一个由开发者 echasnovski 创建的简洁高效的Neovim配置库。它旨在提供一个基础但全面的功能集,让你的Neovim体验既精简又高效。作为一个开源项目,Mini.nvim 已经吸引了众多用户和贡献者,并且持续更新以适应不断变化的开发需求。

技术分析

Neovim 基础

Neovim 是 Vim 的一个分支,具有更高的可扩展性和性能优化。Mini.nvim 利用了 Neovim 的这些优势,通过精心挑选的插件和配置,实现了极佳的交互性和速度。

Lua 配置

Mini.nvim 使用 Lua 语言进行配置,这是一种轻量级、快速且易于阅读的语言。Lua 的使用使得配置文件更易理解,降低了维护难度,同时也方便了对现有配置的个性化修改。

插件选择

该项目选用了诸如 nvim-lspconfig(用于语言服务器协议支持), telescope.nvim(用于查找和选择文件),和 treesitter(语法高亮和结构解析)等优秀插件,为开发环境提供了强大的功能,而不会牺牲性能。

敏捷性与性能

Mini.nvim 的设计注重启动速度和运行效率。它的核心理念是“只加载你需要的东西”,避免了不必要的资源消耗,确保在日常使用中流畅无阻。

应用场景

  • 开发环境: Mini.nvim 提供了一套完整的 LSP 支持,可以满足大多数编程语言的代码智能提示和自动完成。
  • 文本编辑: 对于日常文档编辑,其优秀的搜索、替换和导航工具使工作效率倍增。
  • 远程工作: 在低带宽或资源有限的环境中,Mini.nvim 的轻量化特性尤为突出。

特点

  1. 简洁 - 只包含必要的组件,避免了过度配置。
  2. 模块化 - 容易添加或移除特定功能,便于自定义。
  3. 高性能 - 专为速度和低内存占用优化。
  4. 可扩展 - 灵活地与新的插件和配置集成。
  5. 社区驱动 - 有活跃的开发社区支持,问题反馈和新特性更新迅速。

结语

无论是初识Neovim的新手,还是寻求简约高效的老手,Mini.nvim 都是一个值得尝试的选择。其优化的配置和强大的功能组合,能够提升你的编辑器体验,助你在编程旅程中更加得心应手。

项目简介

Gogh 是一个为终端用户提供高度可定制主题的Go语言项目。它允许你在终端中轻松切换和个性化你的命令行界面,让你的日常操作变得更有趣,更具个性化。

技术分析

Gogh 基于 Go 语言编写,这使得它具有良好的跨平台支持和优秀的性能。其设计理念是简洁、易用,通过提供一系列预设的主题,同时也支持用户自行创建和管理主题。它的核心功能包括:

  1. 主题库:Gogh 内置了丰富的主题集合,你可以方便地选择并应用。
  2. 动态配置:在运行时可以实时更改主题,无需重启终端。
  3. 颜色检测:自动检测并适应256色或真彩色终端。
  4. 易于扩展:由于使用Go语言,开发者可以通过简单的API来添加新的主题或者修改现有功能。

应用场景

无论你是初级用户还是经验丰富的开发人员,Gogh 都能在提升你的终端体验方面发挥大作用:

  • 美化工作环境:让每天都要面对的命令行更加美观舒适,提升工作效率。
  • 教育用途:通过改变终端样式,帮助初学者更好地理解和区分不同的命令输出。
  • 个人品牌化:自定义独特的主题,展示你的个性和技术风格。

特点与优势

  1. 轻量级:Gogh 的体积小,不占用过多系统资源,适用于各种环境。
  2. 兼容性好:不仅支持主流的Linux发行版,也兼容macOS和Windows系统。
  3. 社区活跃:持续更新和完善,社区成员积极贡献新主题和建议。
  4. 安装便捷:只需一行命令即可完成安装,简单快速。

结语

如果你对个性化你的终端界面感兴趣,或者想要给你的命令行体验带来一点新鲜感,那么 Gogh 绝对值得一试。尝试一下,看看哪个主题能最好地匹配你的工作风格,或是激发你的创造力吧!开始你的Gogh之旅,让每一次敲击命令都成为视觉享受。

1
2
# 使用以下命令安装 Gogh(根据你的操作系统选择合适的命令)
curl -sSfL https://raw.githubusercontent.com/Mayccoll/Gogh/master/install.sh | sh -

现在,你可以用gogh themes查看所有可用主题,然后使用gogh apply <theme_name>来设置你喜欢的主题。享受这个过程,并分享你的定制成果吧!

一直使用Neovim作为日常办公的主力,偶尔也使用一下系统的剪切板从外部粘贴文本,在X11时直接使用鼠标就能直接粘贴到Neovim中,但是系统升级到wayland之后,每次点鼠标粘贴时都会弹出一个确认的对话框,点击之后才粘贴上!这很影响办公效率,于是今天决定认真对待一下这个问题。启动Neovim,然后输出命令:h clipboard就可以看到全部详细信息了,为了提高效率,此处记录关键内容。

Vim与Neovim使用系统剪切板的不同

Nvim has no direct connection to the system clipboard. Instead it depends on a |provider| which transparently uses shell commands to communicate with the system clipboard or any other clipboard "backend".

设置Neovim所有操作使用剪切板

要始终将剪贴板用于所有操作(而不是显式地与“+”和/或“*”寄存器交互, 需要设置init.vim中加入:

1
set clipboard+=unnamedplus

安装剪切板依赖

The presence of a working clipboard tool implicitly enables the '+' and "*" registers. Nvim looks for these clipboard tools, in order of priority:

  • |g:clipboard| (unless unset or false)
  • pbcopy, pbpaste (macOS)
  • wl-copy, wl-paste (if $WAYLAND_DISPLAY is set)
  • waycopy, waypaste (if $WAYLAND_DISPLAY is set)
  • xsel (if $DISPLAY is set)
  • xclip (if $DISPLAY is set)
  • lemonade (for SSH) https://github.com/pocke/lemonade
  • doitclient (for SSH) https://www.chiark.greenend.org.uk/~sgtatham/doit/
  • win32yank (Windows)
  • termux (via termux-clipboard-set, termux-clipboard-set)
  • tmux (if $TMUX is set)

由于我的电脑同时支持waylandx11, 所以我直接安装了wl-clipboardxclip, 其中wl-clipboard提供命令wl-copywl-paste

在Neovim的粘贴快捷键

"Paste" is a separate concept from |clipboard|: paste means "dump a bunch of text to the editor", whereas clipboard provides features like |quote+| to get and set the OS clipboard directly. For example, middle-click or CTRL-SHIFT-v (macOS: CMD-v) in your terminal is "paste", not "clipboard": the terminal application (Nvim) just gets a stream of text, it does not interact with the clipboard directly.

能过这段话我们可知,在Linux下,使用命令CTRL-SHIFT-v就可以直接将剪切板中的内容粘贴到Neovim中了,在macOS中使用命令CMD-v.

在科研论文中,图片是一个非常重要的组成部分。LaTeX 提供了许多定制化图片的功能。这篇文章将会介绍如何用最常见的格式插入图片、缩放图片、旋转图片,以及如何在文档中引用这些图片。实现插入图片的功能需要在导言引用graphicsgraphicx, 下面就一些重要的点展开讨论。

图片的路径

当你的文档拥有很多个图片的时候,创建多个文件夹来存储图片是一个规划项目的好办法。

命令\graphicspath{ {images/} }告诉 LaTeX 在_images_文件夹中寻找图片。这个路径是当前工作文件夹的相对路径,所以,编译器会在当前文档所在的目录中开始寻找文件。文件夹的路径默认情况下是相对路径,如果没有一个初始的目录被指定,例如:

1
2
%Path relative to the .tex file containing the \includegraphics command
\graphicspath{ {images/} }
阅读全文 »

有时候在编写LaTeX文件时需要插入图片,但是图片源自网络,这时可以使用\write18调用外部命令,下载图片,然后再插入到文件中,引用网络上的一个具体例子为:

\write18 插入图片
1
2
3
4
5
6
\documentclass{article}
\usepackage{graphix}
\begin{document}
\write18{wget http://www.some-site.com/path/to/image.png}
\includegraphic{image.png}
\end{document}

参考:LaTeX技巧427:LaTeX如何插入网络上的图片?

在日常编写脚本的过程中,不可避免的可打开一些文件进行编辑,对于一些特定的文件可以使用某相应的软件打开。但是,若脚本需要处理的有各种各样的文件,若针对每一个文件都设计一个对应程序来打开,原理上可行,但是比较麻烦。现在的Linux基本都内置了命令xdg-open, 它可以自动调用系统的默认程序打开文件,可以大大提高脚本的效率。为了方便查询,此贴出它的帮助文件:

xdg-open --help
1
2
3
4
5
6
7
8
9
10
   xdg-open -- opens a file or URL in the user's preferred
application

Synopsis

xdg-open { file | URL }

xdg-open { --help | --manual | --version }

Use 'man xdg-open' or 'xdg-open --manual' for additional info.

提出这个要求是因为我今天在脚本xugit.sh中加入了根据选项打开文件,避免每次都切换路径的麻烦。尽管有z-lua等路径切换插件,但是在连接U盘时,使用ugit -l选择文件再打开,更加直接。

使用diary.sh写博客已经有近两年了,对于菜单一直没有细致的设计,这主要是因为对Shell理解的不够透彻。今天实现了真正意义上的可选择菜单,实现原理是:不再使用clear每次按键后清屏,改用指定行输出来输出菜单!这样就可以避免每按一次键就闪烁一次的不好体验,同时对于一屏的信息,当只有一二行发生变化时,整体上看很流畅:

运行截图展示

可选择菜单

可选择菜单支持vim的快捷键,即j向下,k向上,同时J向下一页,K向上一页.

shell源代码

可选择菜单shell源码
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
DY_FILES=($(ls /home/$USER/))  #设置用来列表输出的数组, 此处可以改为您自己的路径
DY_SET_SIZE(){
TTY_H=$(stty size|awk '{print $1}')
let TTY_H-=2
TTY_W=$(stty size|awk '{print $2}')
}
DY_LINE="-"
DY_MKLINE(){
l=0
while [ $l -lt $TTY_W ]; do
echo -n "$DY_LINE"
let l+=1
done
}
NEO_FORMAT=7 # 高亮行的格式,可以自行修改
# 参数: 输出行,行号,数组号, 高亮行号
NEO_PRINT(){
if [[ $3 -eq $4 ]]; then
echo -e "\033[$1;1H\033[?25l\033[${NEO_FORMAT}m[$2] ${NEO_ARR[$3-1]}\033[0m\033[K\033"
else
echo -e "\033[$1;1H\033[?25l[$2] ${NEO_ARR[$3-1]}\033[K"
fi
}
# 参数:$1 起始点 $2 列表长度 $3 高亮行
NEO_LIA(){
k=0 ; i=$1
while [[ $k -lt $TTY_H ]]; do
let k+=1
if [ $i -lt -$2 ]; then
let i=$i+$2
fi
let i+=1
if [ $i -gt $2 ]; then
let i=$i-$2
fi
if [ $i -lt 1 ]; then
let j=$i+$2
else
j=$i
fi
NEO_PRINT $k $j $i $3
done
}
NEO_SELECT(){
echo -ne "\r\033[${NEO_FORMAT}m[s] 选择\033[0m "; echo -ne "\033[K" ; read TLS_SNum
expr "$TLS_SNum" + 0 &> /dev/null
if [ $? -eq 0 ]; then
if [ $TLS_SNum -lt $1 -o $TLS_SNum -gt $2 ]; then
echo "编号超出范围,请重新选择编号!"
exit
else
NEO_OUT_H=$TLS_SNum
fi
else
echo "输入非数字,请重新输入编号!"
exit
fi
}
# 参数: 输出行,光标所在行
NEO_MENUE(){
let r=$1+2
if [ $NEO_SEL_ON -eq 1 ]; then
echo -ne "\033[$r;1H[j] 向下 [k] 向上 [s] 选择 [q] 退出 \033[${NEO_FORMAT}m$2\033[0m\033[K\033[?25h"
else
echo -ne "\033[$r;1H[j] 向下 [k] 向上 [q] 退出 \033[${NEO_FORMAT}m$2\033[0m\033[K\033[?25h"
fi
}
NEO_LISA(){
DY_SET_SIZE
p=$1 ; let q=$p+$TTY_H; m=$3
if [ $q -gt "${#NEO_ARR[*]}" ]; then
let q=$q-"${#NEO_ARR[*]}"
let p=$p-"${#NEO_ARR[*]}"
let m=$m-"${#NEO_ARR[*]}"
fi
if [ $p -le "-${#NEO_ARR[*]}" ]; then
let q=$q+"${#NEO_ARR[*]}"
let p=$p+"${#NEO_ARR[*]}"
let m=$m+"${#NEO_ARR[*]}"
fi
NEO_LIA $p $2 $m
DY_MKLINE
if [ $m -le 0 ]; then
let NEO_CURRENT=$m+"${#NEO_ARR[*]}"
else
NEO_CURRENT=$m
fi
NEO_MENUE "$TTY_H" "$NEO_CURRENT"
read -s -n 1 ListDo
case "$ListDo" in
j)
let m+=1
if [ $m -gt $q ]; then
let p+=$TTY_H
fi
NEO_LISA $p $2 $m
;;
J)
let p+=$TTY_H
let m=$p+1
NEO_LISA $p $2 $m
;;
k)
let m-=1
if [ $m -le $p ]; then
let p-=$TTY_H
fi
NEO_LISA $p $2 $m
;;
K)
let m=$p
let p-=$TTY_H
NEO_LISA $p $2 $m
;;
"")
if [ $NEO_SEL_ON -eq 1 ]; then
NEO_OUT_H=$m
else
exit
fi
;;
s)
if [ $NEO_SEL_ON -eq 1 ]; then
NEO_SELECT $p $q
else
NEO_LISA $p $2 $m
fi
;;
q)
exit
;;
esac
}
NEO_LIB(){
k=0 ; i=$1
while [[ $k -lt $2 ]]; do
let k+=1
if [ $i -lt -$2 ]; then
let i=$i+$2
fi
let i+=1
if [ $i -gt $2 ]; then
let i=$i-$2
fi
if [ $i -lt 1 ]; then
let j=$i+$2
else
j=$i
fi
NEO_PRINT $k $j $i $3
done
}
NEO_LISB(){
DY_SET_SIZE
p=$1 ; q=$2 ; m=$3
if [ $m -gt $q ]; then
let m=$p+1
fi
if [ $m -le $p ]; then
m=$q
fi
NEO_LIB $p $2 $m
DY_MKLINE
NEO_MENUE $q $m
read -s -n 1 ListDo
case "$ListDo" in
j)
let m+=1
NEO_LISB $p $2 $m
;;
k)
let m-=1
NEO_LISB $p $2 $m
;;
s)
if [ $NEO_SEL_ON -eq 1 ]; then
NEO_SELECT $p $q
else
NEO_LISB $p $2 $m
fi
;;
"")
if [ $NEO_SEL_ON -eq 1 ]; then
NEO_OUT_H=$m
else
exit
fi
;;
q)
exit
;;
esac
}
# 参数:列出的数组, 1开启选择,0关闭选择
NEO_LIST(){
NEO_ARR=($1) ; NEO_SEL_ON=$2
clear
DY_SET_SIZE
if [ "${#NEO_ARR[*]}" -gt $TTY_H ]; then
NEO_LISA 0 "${#NEO_ARR[*]}" 1
else
NEO_LISB 0 "${#NEO_ARR[*]}" 1
fi
echo $NEO_OUT_H # 目标是获得光标所在的行
}
NEO_LIST "${DY_FILES[*]}" 1 # 测试程序命令

在对函数进行命名时,每个人都有自己的标准。本书会推荐两种,希望这两种标准成为读者以后编程时的命名规范。比较著名的命名规则首推匈牙利命名法,这种命名方法是由Microsoft 程序员查尔斯·西蒙尼(Charles Simonyi)提出的。其主要思想是“在变量和函数名中加入前缀,以增进人们对程序的理解”。匈牙利命名法的关键是:标识符的名字以一个或者多个小写字母开头作为前缀;前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途。骆驼(Camel)命名法近年来越来越流行,在许多新的函数库和 Java 开发平台下使用得相当多。正如它的名称所表示的那样,骆驼命名法指的是混合使用大小写字母来构成标识符的名字,其中的第一个单词首字母小写,余下的单词首字母大写。帕斯卡(Pascal)命名法与骆驼命名法类似。只不过骆驼命名法是第一个单词首字母小写,而帕斯卡命名法则是第一个单词首字母大写。

对于以上的几种命名规则,本书认为对变量或函数进行描述时常用的是骆驼命名法和匈牙利命名法,因此,我们推荐使用这两种命名标准。

对于函数来说,一般是根据函数的功能来进行命名,通常有两种命名方式:

  • 对于一些复杂点的函数操作,可以使用“操作对象+操作”的形式命名,如array_sort()函数,从字面上就可以看出,该函数用于对数字进行排序。
  • 对于简单的函数,可以直接使用操作名作为函数名,但要注意不要和系统的命令相同,否则容易造成不必要的错误,如address(),对该函数进行操作。

对于变量来说, 一般通过匈牙利命名法命名:

  • 对于单个英文单词就可命名,可直接用该单词进行命名,如变量average可用于对变量“平均数”的命名。
  • 对于单个单词无法命名的单词,可通过双单词或多单词形式的缩略词进行命名,如dir_num可用于命名变量“目录个数”

对于常量来说,可通过将该变量全部设置为大写与变量形成区别,下面是常量的命名方式:

  • 对于单个单词可以名句的,可直接使用该单词的全部大写形式进行命名,如:常量TOTAL可对常量“总数”进行命名。
  • 对于单个单词无法表达清晰的常数,可以通过加下画线的形式命名,如GLOBAL_CON可以常量“全局常量”进行命名。

注:上述引用自《LINUX SHELL 编程从初学到精通》

为了提高我们使用 Bash Shell 的效率,本文总结了一些 Bash 中常用的高效快捷键,可以帮助我们在快节奏的学习和工作环境中提高生产力。熟悉了这些常用的快捷键之后,将会极大的提升我们与终端交互的速度,从而有效利用时间。

光标移动

快捷键 对应功能
Ctrl + a 或 Home 将光标移动到整行命令的开头 (#)
Ctrl + e 或 End 将光标移动到整行命令的末尾 (#)
Ctrl + b 或 <- 将光标向左移动一个字符 (#)
Ctrl + f 或 -> 将光标向右移动一个字符 (#)
Alt + b 或 Ctrl + <- 将光标向左移动到当前单词或前一个单词的第一个字母上 (#)
Alt + f 或 Ctrl + -> 将光标向右移动到当前单词或后一个单词的末尾的第一个空格处 (#)
Alt + c 将光标向右移动到当前单词或后一个单词的末尾的第一个空格处,并将对应单词的首字母大写
Alt + u 将光标向右移动到当前单词或后一个单词的末尾的第一个空格处,并将对应单词的所有字母大写
Alt + l 将光标向右移动到当前单词或后一个单词的末尾的第一个空格处,并将对应单词的所有字母小写
Alt + -> 将光标向右移动到当前单词或后一个单词的末尾的第一个空格处 (#)
Alt + <- 将光标向左移动到当前单词或前一个单词的首字母处 (#)

终端编辑

快捷键 对应功能
Ctrl + u 删除从命令开始位置到当前光标所在位置之前的所有字符(会保留当前光标所在位置的字符) (#))
Ctrl + k 删除从当前光标位置到结尾的所有字符(不保留当前光标所在位置的字符) (#)
Ctrl + w 删除当前光标之前的第一个命令行参数或从光标位置往左删除至上一个空字符处(会保留当前光标位置的字符) (#)
Ctrl + t 交换当前光标之前和之后的两个字符
Ctrl + h 或 Backspace 删除光标之前的单个字符 (#)
Ctrl + d 或 Delete 往后删除当前光标所在位置的字符 (#)
Alt + d 或 Ctrl + Delete 往右删除从当前光标到下一个单词结尾的所有字符(不会保留当前光标所在位置的字符)
Alt + Backspace 往左删除从当前光标到上一个单词开头的所有字符(会保留当前光标所在位置的字符)

任务处理

快捷键或命令 对应功能
Ctrl + c 通过向当前前台进程发送SIGINT信号来中断当前前台进程。默认行为是终止进程 (#)
Ctrl + z 向进程发送SIGTSTP信号,并挂起当前前台进程。可以使用fg命令将重新将进程拉回到前台 (#)
[Command] & 将Command命令放到后台执行,一般和nohup一起使用(eg: nohup ping http://www.baidu.com &) (#)
jobs 或 jobs -l 查看当前终端后台所执行的用户提交任务 (#)
kill -9 PID 杀掉进程ID号为PID的进程 (#)

其他

快捷键 对应功能
Ctrl + l 清除整个屏幕,与clear命令作用相同 (#)
Ctrl + s 暂停终端屏幕的显示
Ctrl + q 终止Ctr

旧版的Gnome3默认的终端叫gnome-terminal, 新版(2023年5月之后)的新终端控制台启动命令叫kgx, 于是解决方法为: 设置键盘自定义键盘设置自定义快捷键

Console 设置启动快捷键