当前位置: 首页 > news >正文

Linux小课堂: 深入掌握 Nano 文本编辑器与.bashrc 配置机制

文本编辑器的本质与分类:理解 Text Editor 与 Text Processor 的核心区别


在 Linux 系统中,文本编辑器(Text Editor) 是程序员和系统管理员日常操作不可或缺的工具,其核心差异在于是否支持格式化操作

它是一种专门用于创建、查看和修改纯文本文件的程序,其核心特征是仅处理无格式的原始文本内容,不包含字体、颜色、加粗、斜体、图片或超链接等富文本信息

  • 文本编辑器:仅用于创建和修改纯文本文件,不支持字体、颜色、加粗、斜体、图片插入等富文本功能。它处理的是“内容”本身而非“表现形式”。
    常见的文本编辑器包括:

    • Windows 下的记事本(Notepad)
    • Linux/Unix 下的 vi, vim, emacs, gedit, nano
    • macOS 中也内置了 nanovim
  • 文本处理器:又称文档处理器,具备完整的排版能力,可对文字进行样式设计、段落布局、图文混排等,通常运行于图形界面环境
    典型代表有:

    • Microsoft Word(Windows)
    • Apple Pages(macOS)
    • LibreOffice Writer / OpenOffice Writer(Linux)

关键区分点:

  • 文本编辑器 → 纯文本(Plain Text)→ 适合代码、配置文件、日志分析
  • 文本处理器 → 富文本(Rich Text)→ 适合报告、论文、演示文稿

因此,程序员编写的源代码文件(如 .c, .cpp, .py, .java, .php, .xml 等)必须使用文本编辑器来编辑,因为这些文件本质上是纯文本,任何隐藏的格式字符都可能导致程序无法编译或执行异常

Nano 文本编辑器:轻量级但功能完备的终端编辑利器


1 ) 为什么选择 Nano?初学者友好的设计哲学

Nano 是 GNU 项目中的一个轻量级终端文本编辑器,全称为 GNU nano。它的设计哲学是“简单易用”,但绝不意味着功能简陋

在众多终端文本编辑器中,nano 被广泛认为是最适合初学者入门的选择。尽管 vimemacs 功能极其强大,但它们的学习曲线陡峭,需要记忆大量模式切换和快捷键组合。而 nano 的设计理念是“开箱即用”——启动后即可直接输入文字,无需进入插入模式或其他状态

命名来源:

  • “nano” 源自国际单位制前缀,表示 10−910^{-9}109,即十亿分之一,常见于“纳米科技”(nanometer)。

  • 在软件命名中,“nano” 寓意“短小精悍”,体现其小巧而功能完备的特点。

  • 同时,“nano” 也是一个递归缩写:NAno Is NOT Another editor(早期版本曾为 “Nano is Another Editor”,后改为反讽式命名以致敬 Emacs 的递归传统)

  • 官网地址:https://www.nano-editor.org
    官网明确指出它是 GNU 工程的一部分,遵循自由软件协议

适用场景:

  • 编辑配置文件(如 .bashrc, /etc/hosts
  • 编写脚本(Shell、Python、Perl 等)
  • 快速修改日志或临时文本
  • 远程服务器维护(无需 GUI)

这使得 nano 成为快速编辑配置文件、编写脚本片段的理想工具,尤其适用于远程 SSH 连接下的紧急修复任务。

Nano 的优势总结:

  • 启动即进入可编辑状态
  • 底部实时显示常用快捷键提示
  • 操作直观,符合现代用户直觉
  • 支持语法高亮(配合 .nanorc 配置)

2 ) Nano 的命名来源与项目背景

nano 并非随意命名。它是 GNU 项目的官方文本编辑器之一,全称为 GNU nano,继承自早期的 Pico 编辑器,并在其基础上进行了自由软件许可下的重构与发展。

更有趣的是,nano 是一个递归缩写: Nano Another New Editor —— “另一个新的编辑器”

这种命名方式在开源社区中极为常见(如 GNU = GNU's Not Unix),体现了开发者幽默且自指的文化传统

官网地址为:https://www.nano-editor.org
所有源码、文档与版本发布均托管于此,属于 GNU 工具链的重要组成部分

3 )与其他编辑器对比

特性NanoVimEmacs
学习曲线极低极高
启动即输入✅ 支持❌ 需进入插入模式✅ 支持
内置帮助提示✅ 底部快捷键显示❌ 默认无✅ 复杂帮助系统
鼠标支持✅ (-m)❌(需特殊配置)
脚本扩展性❌ 基本无✅ 强大✅ 极强(Lisp)

nano 是初学者理想的入门工具,尤其适用于紧急修复、远程调试等场景;随着技能提升,可逐步过渡至 vimemacs

Nano 的基本使用方法与核心快捷键体系


1 ) 启动 Nano 及基础交互流程

在大多数 Linux 发行版及 macOS 中,nano 默认已预装。只需在终端执行以下命令即可启动:

nano

若要编辑特定文件(若不存在则自动创建):

nano filename.txt

首次启动时界面如下所示:

GNU nano 7.2                         New Buffer                                 ^G Get Help    ^O WriteOut   ^R Read File    ^Y Prev Page   ^K Cut Text     ^C Cur Pos
^X Exit        ^J Justify    ^W Where Is    ^V Next Page   ^U Paste Text   ^T To Spell

其中 ^ 符号代表 Control 键(Ctrl),例如 ^X 表示按下 Ctrl + X

2 ) 核心快捷键详解(必须掌握)

快捷键功能说明
^G (Ctrl+G)显示帮助文档(Help Menu)
^O (Ctrl+O)写出文件(Write Out),即保存当前内容
^R (Ctrl+R)插入其他文件内容(Read File)
^W (Ctrl+W)查找字符串(Where Is)
^\ (Ctrl+\)替换功能(Replace)
^K (Ctrl+K)剪切当前行(Cut Text)
^U (Ctrl+U)粘贴剪切内容(Paste Text)
^J (Ctrl+J)自动对齐段落(Justify)
^V (Ctrl+V)下一页(Next Page)
^Y (Ctrl+Y)上一页(Previous Page)
^C (Ctrl+C)显示光标位置(Current Position)
^X (Ctrl+X)退出编辑器(Exit)

提示:

  • 方向键可用于移动光标;Page Up / Page Down 等价于 ^Y / ^V
  • 底部两行始终显示常用快捷键组合,符号 ^ 表示 Control 键(非 Shift),字母大小写无关

光标移动控制,除方向键外,还可使用如下组合:

  • Ctrl+F:向前移动一字符
  • Ctrl+B:向后移动一字符
  • Ctrl+P:向上移动一行
  • Ctrl+N:向下移动一行
  • Page Up / Page Down:等同于 Ctrl+Y / Ctrl+V

3 ) 控制帮助栏显示/隐藏

默认情况下底部两行始终显示快捷键提示,占用屏幕空间。可通过以下操作临时关闭:

  1. 按下 Esc
  2. 再按 X

此时会提示 Help Mode Disabled。重复相同操作可重新启用
该行为可通过配置文件永久设定

4 )Nano 的高级参数与实用选项

nano 支持多种启动参数以增强用户体验,以下是三个最常用的参数:

参数含义示例命令
-m启用鼠标支持nano -m config.txt
-i开启自动缩进(对代码友好)nano -i script.py
-a激活智能 Home 键行为nano -a code.c

智能 Home 键解释:当某行存在缩进时,首次按 Home 跳转至首个非空格字符处,再次按下才跳至行首。极大提升代码编辑效率。

4.1 组合参数使用示例

nano -miA ~/.bashrc

该命令同时启用:

  • 鼠标操作
  • 自动缩进
  • 智能 Home 键

推荐开发人员日常使用此组合

通过 .nanorc 实现个性化配置:提升编辑效率的关键实践

每个用户可在主目录下创建隐藏配置文件 .nanorc 来定制 nano 的行为。路径为:

~/.nanorc
  • 每行一条配置指令
  • set 开头表示启用某功能
  • unset 开头表示关闭某功能
  • 行首以 # 开头为注释

注意:以 . 开头的文件为隐藏文件,此为隐藏文件(以 . 开头),需使用 ls -a 才能查看,默认不存在,需手动创建。

1 ) 创建并初始化 .nanorc 文件

nano ~/.nanorc

输入以下配置语句(每行一条指令):

set mouse
set autoindent
set smarthome
set tabstospaces
set tabsize 4
set linenumbers

各配置项含义解析:

配置项作用说明
set mouse启用鼠标点击定位光标(需启动时加 -m 参数或全局启用)
set autoindent回车后自动继承上一行缩进(对代码编写至关重要)
set smarthomeHome 键智能跳转:若有缩进,则停在首非空格字符处,而非行首
set tabstospaces将 Tab 键转换为空格(推荐用于代码一致性)
set tabsize 4设置缩进宽度为 4 个空格
set linenumbers显示行号(便于调试与引用)

保存步骤:

  1. ^O(Ctrl+O)
  2. 系统自动填充文件名为 .nanorc,回车确认
  3. ^X 退出

重新启动 nano 可测试鼠标是否可用、缩进是否自动延续

2 ) 全局配置文件 /etc/nanorc:统一多用户环境策略

对于系统管理员而言,若希望所有用户共享一套默认配置,应修改全局配置文件:

sudo nano /etc/nanorc

此文件通常包含大量被注释掉的选项(以 # 开头)。取消某行前的 # 即可激活对应功能

示例:为所有用户开启行号显示

找到如下行并去掉 #

set linenumbers

改为:

set linenumbers 

保存后,所有新会话都将应用此设置

权限说明:只有 root 用户或具有 sudo 权限者才能修改 /etc/nanorc

语法高亮支持:通过 include 加载 .nanorc 语法包,实现不同语言的颜色标记(需系统已安装相应插件),如

include "/usr/share/nanorc/syntax/python.nanorc"

终端配置机制剖析:.bashrcprofile 的层级关系与加载逻辑


1 ) 用户级配置文件 .bashrc:定义交互式 Shell 行为

Linux 终端使用的 shell 解释器通常是 bash(Bourne Again Shell),它是用户与操作系统之间的命令解释桥梁。每当打开一个新的图形化终端窗口(如 GNOME Terminal、iTerm2),都会加载用户的个人配置文件:

~/.bashrc

该文件本质是一个 Bash 脚本,可用于定义:

  • 自定义别名(alias)
  • 环境变量(export PATH=…)
  • 函数定义
  • 命令提示符(PS1)样式
  • 启动欢迎信息等

示例:简化命令提示符

编辑 .bashrc

nano ~/.bashrc

添加以下内容以精简提示符:

# 如果不是交互式 shell,则退出
if [ -z "${PS1}" ]; then return
fi# 设置别名
alias ll='ls -alF'
alias rm='rm -i'# 自定义提示符 
# PS1='[\u@\h \W]\$ '
PS1='\u:\W\$ '

效果对比:

  • 原始:[wang@wang-laptop ~]$
  • 修改后:wang:~$

生效方式:修改后需重新登录,或手动执行:

source ~/.bashrc 

变量解释:

变量含义
\u当前用户名
\h主机名(hostname)
\W当前工作目录名称
\$普通用户 $,root 用户 #

示例:将提示符改为绿色简洁风格

PS1='\[\e[0;32m\][\u@\h \W]\$\[\e[m\] '

全局配置文件 /etc/bash.bashrc/etc/bashrc

系统级的 Bash 配置位于:

  • Debian/Ubuntu 系列:/etc/bash.bashrc
  • CentOS/RHEL/Fedora 系列:/etc/bashrc

这些文件影响所有用户,优先级低于 ~/.bashrc。当两者存在冲突时,用户配置覆盖全局配置

查看当前系统的全局配置:

cat /etc/bash.bashrc    # Ubuntu
cat /etc/bashrc         # CentOS
文件路径作用范围触发条件是否需要登录
/etc/bashrc所有用户的 bash shell每次启动 bash 时加载
/etc/profile所有用户的登录环境用户登录时一次性加载
~/.bashrc当前用户的非登录 bash图形终端每次新开窗口时加载
~/.profile当前用户的登录环境登录时加载(TTY 或 SSH 登录)

依赖关系:.profile 会主动 source .bashrc,因此修改 .bashrc 会影响 .profile 的最终行为

3 ) 登录 Shell 与非图形终端的配置:/etc/profile~/.profile

除了 .bashrc,还有一个重要配置文件:/etc/profile~/.profile,它们主要用于登录 Shell(Login Shell)环境,例如:

  • 通过 Ctrl+Alt+F2F6 可切换至纯文本终端(TTY),此类终端属于“登录 Shell”,读取 .profile
  • 而 GNOME Terminal、iTerm2 等图形终端属于“非登录 Shell”,仅读取 .bashrc

.profile.bashrc 的调用关系:

Login Process → /etc/profile → ~/.profile → ~/.bashrc (if exists)

4 ) 全局配置文件:/etc/bashrc/etc/profile

Linux 系统提供两类全局配置文件:

文件路径适用范围加载时机
/etc/bashrc所有用户的非登录 Bash Shell(GUI 终端)每次打开终端时加载
/etc/profile所有用户的登录 Shell(TTY 登录)用户登录系统时一次性加载

关键区别:

  • 图形化终端(如 GNOME Terminal、iTerm2)读取的是 .bashrc
  • 文本模式终端(TTY1–TTY6,通过 Ctrl+Alt+F1~F6 切换)属于“登录 Shell”,优先读取 /etc/profile~/.profile

profile 与 bashrc 的关系:

在 /etc/profile 中通常包含如下逻辑:
if [ -f ~/.bashrc ]; thensource ~/.bashrc 
fi

这表明:.profile 会主动加载 .bashrc,因此修改 .bashrc 实际上也会间接影响 TTY 登录环境
最佳实践:将通用环境变量设在 .profile,将交互式特性(如 alias、PS1)放在 .bashrc

配置热重载技术:无需重启使更改立即生效

修改任何配置文件后,默认需重新登录才能看到变化。但可通过 source 命令实现即时加载:

重新加载用户 bash 配置 
source ~/.bashrc重新加载 profile 配置
source ~/.profile重新加载全局配置(谨慎操作)
source /etc/bash.bashrc

等价写法(. 操作符):

. ~/.bashrc
. ~/.profile
. ~/etc/bash.bashrc

安全提醒:修改 /etc/bashrc/etc/profile 对所有用户生效,建议先备份:

sudo cp /etc/bash.bashrc /etc/bash.bashrc.bak

基于 NestJS + TypeScript 的终端配置辅助管理系统原型代码


1 ) 方案1

虽然终端配置本身属于系统层面操作,但在 DevOps 自动化平台或云 IDE 场景中,可通过 Node.js 构建配置生成与校验服务。以下是使用 NestJS + TypeScript 实现的一个简易 .nanorc 配置管理模块示例:

项目结构概览

src/
├── config/
│   └── nanorc.service.ts
├── dto/
│   └── update-nanorc.dto.ts
└── controller/└── config.controller.ts

DTO 定义:配置更新请求体

// src/dto/update-nanorc.dto.ts
import { IsBoolean, IsInt, Min, Max } from 'class-validator';export class UpdateNanoRcDto {@IsBoolean()mouse?: boolean;@IsBoolean()autoIndent?: boolean;@IsBoolean()smartHome?: boolean;@IsBoolean()tabToSpaces?: boolean;@IsInt()@Min(2)@Max(8)tabSize?: number;@IsBoolean()lineNumbers?: boolean;
}

核心服务:生成 .nanorc 内容

// src/config/nanorc.service.ts
import { Injectable } from '@nestjs/common';@Injectable()
export class NanoRcService {private readonly CONFIG_PATH = '~/.nanorc';generateConfig(dto: Partial<UpdateNanoRcDto>): string {const lines: string[] = [];if (dto.mouse !== undefined) {lines.push(dto.mouse ? 'set mouse' : 'unset mouse');}if (dto.autoIndent !== undefined) {lines.push(dto.autoIndent ? 'set autoindent' : 'set noautoindent');}if (dto.smartHome !== undefined) {lines.push(dto.smartHome ? 'set smarthome' : 'set nosmarthome');}if (dto.tabToSpaces !== undefined) {lines.push(dto.tabToSpaces ? 'set tabstospaces' : 'set notabstospaces');}if (dto.tabSize !== undefined) {lines.push(`set tabsize ${dto.tabSize}`);}if (dto.lineNumbers !== undefined) {lines.push(dto.lineNumbers ? 'set linenumbers' : 'set nolinenumbers');}return lines.join('\n') + '\n';}async writeToFile(content: string): Promise<void> {const homeDir = require('os').homedir();const fs = require('fs').promises;const filePath = `${homeDir}/.nanorc`;try {await fs.writeFile(filePath, content, 'utf-8');console.log(`Successfully wrote nano configuration to ${filePath}`);} catch (err) {console.error('Failed to write .nanorc:', err.message);throw new Error('Configuration write failed');}}
}

控制器接口:提供 RESTful API 更新配置

// src/controller/config.controller.ts
import { Controller, Post, Body } from '@nestjs/common';
import { UpdateNanoRcDto } from '../dto/update-nanorc.dto';
import { NanoRcService } from '../config/nanorc.service';@Controller('config')
export class ConfigController {constructor(private readonly nanoRcService: NanoRcService) {}@Post('nanorc')async updateNanoRc(@Body() dto: UpdateNanoRcDto) {const configContent = this.nanoRcService.generateConfig(dto);await this.nanoRcService.writeToFile(configContent);return {success: true,message: 'Nano configuration updated successfully',config: configContent.trim().split('\n'),};}
}

使用示例(cURL 请求)

curl -X POST http://localhost:3000/config/nanorc \-H "Content-Type: application/json" \-d '{"mouse": true,"autoIndent": true,"smartHome": true,"tabToSpaces": true,"tabSize": 4,"lineNumbers": true}'

响应结果:

{"success": true,"message": "Nano configuration updated successfully","config": ["set mouse","set autoindent","set smarthome","set tabstospaces","set tabsize 4","set linenumbers"]
}

适用场景扩展:集成至 Web IDE、远程开发平台、CI/CD 初始化脚本生成器等。

2 ) 方案2

虽然 nano.bashrc 属于系统级工具,但我们可以通过 Node.js(NestJS 框架)构建一个模拟的“配置文件管理服务”,用于教学或自动化运维场景

项目结构

src/
├── config-file.service.ts
├── nano-config.dto.ts
└── terminal.controller.ts

DTO 定义:.nanorc 配置项

// src/nano-config.dto.ts
export class UpdateNanoRcDto {enableMouse?: boolean;autoIndent?: boolean;smartHome?: boolean;
}

服务层:生成 .nanorc 内容

// src/config-file.service.ts
import { Injectable } from '@nestjs/common';@Injectable()
export class ConfigFileService {generateNanoRc(config: {enableMouse?: boolean;autoIndent?: boolean;smartHome?: boolean;}): string {const lines: string[] = [];if (config.enableMouse) lines.push('set mouse');if (config.autoIndent) lines.push('set autoindent');if (config.smartHome) lines.push('set smarthome');return lines.join('\n') + '\n';}writeToFile(content: string, path = '~/.nanorc'): void {// 实际项目中调用 fs.writeFileSyncconsole.log(`Writing to ${path}:\n${content}`);}
}

控制器:提供 HTTP 接口更新配置

// src/terminal.controller.ts 
import { Controller, Post, Body } from '@nestjs/common';
import { ConfigFileService } from './config-file.service';
import { UpdateNanoRcDto } from './nano-config.dto';@Controller('terminal')
export class TerminalController {constructor(private readonly configFileService: ConfigFileService) {}@Post('configure-nano')configureNano(@Body() dto: UpdateNanoRcDto): string {const content = this.configFileService.generateNanoRc(dto);this.configFileService.writeToFile(content);return `Generated .nanorc with settings:\n${content}`;}
}

请求示例(curl)

curl -X POST http://localhost:3000/terminal/configure-nano \-H "Content-Type: application/json" \-d '{"enableMouse": true,"autoIndent": true,"smartHome": true}'

输出结果

Generated .nanorc with settings:
set mouse
set autoindent
set smarthome

此模块可用于 DevOps 自动化平台、实验系统或容器初始化脚本生成器

3 ) 方案3

为体现专业性与扩展性,以下提供一个基于 NestJS 与 TypeScript 的小型服务模块,用于模拟读取、校验与更新 .nanorc.bashrc 配置文件的逻辑。

项目结构概览

src/
├── config-file.service.ts
├── dto/
│   └── update-config.dto.ts
└── controllers/└── config.controller.ts

DTO 定义:update-config.dto.ts

export class UpdateConfigDto {readonly filePath: string;readonly content: string;
}

服务层:config-file.service.ts

import { Injectable, NotFoundException, Logger } from '@nestjs/common';
import * as fs from 'fs';
import * as path from 'path';@Injectable()
export class ConfigFileService {private readonly logger = new Logger(ConfigFileService.name);async readFile(filePath: string): Promise<string> {const resolvedPath = this.resolvePath(filePath);if (!fs.existsSync(resolvedPath)) {throw new NotFoundException(`配置文件未找到: ${resolvedPath}`);}try {return fs.readFileSync(resolvedPath, 'utf-8');} catch (err) {this.logger.error(`读取文件失败: ${err.message}`, err.stack);throw new Error(`无法读取文件: ${resolvedPath}`);}}async writeFile(dto: UpdateConfigDto): Promise<void> {const resolvedPath = this.resolvePath(dto.filePath);// 确保目录存在 const dir = path.dirname(resolvedPath);if (!fs.existsSync(dir)) {fs.mkdirSync(dir, { recursive: true });}try {fs.writeFileSync(resolvedPath, dto.content.trim() + '\n', 'utf-8');this.logger.log(`成功写入配置文件: ${resolvedPath}`);} catch (err) {this.logger.error(`写入文件失败: ${err.message}`, err.stack);throw new Error(`无法写入文件: ${resolvedPath}`);}}private resolvePath(relativePath: string): string {return path.resolve(process.env.HOME || '/home/user', relativePath);}
}

控制器:config.controller.ts

import { Controller, Get, Post, Body, Param } from '@nestjs/common';
import { ConfigFileService } from './config-file.service';
import { UpdateConfigDto } from './dto/update-config.dto';@Controller('config')
export class ConfigController {constructor(private readonly configService: ConfigFileService) {}@Get(':file')async getConfig(@Param('file') file: string) {const map = {nanorc: '.nanorc',bashrc: '.bashrc',};const filename = map[file.toLowerCase()];if (!filename) throw new Error('不支持的配置文件');return await this.configService.readFile(filename);}@Post('update')async updateConfig(@Body() dto: UpdateConfigDto) {await this.configService.writeFile(dto);return { message: '配置更新成功', filePath: dto.filePath };}
}

使用示例(CURL 测试)

获取 .nanorc 内容
curl http://localhost:3000/config/nanorc更新 .bashrc
curl -X POST http://localhost:3000/config/update \-H "Content-Type: application/json" \-d '{"filePath": ".bashrc","content": "PS1=\"\\u@\\h:\\w$ \"\nalias ll=\"ls -lh\""}'

此模块可用于构建自动化运维平台、远程终端管理系统或实验环境

构建高效终端工作流的核心要素


本文系统梳理了 Linux 终端环境下文本编辑与配置管理的核心知识体系,重点涵盖:

  • 文本编辑器的本质:明确 nano 在纯文本处理中的不可替代性
  • Nano 的易用性与可配置性:从快捷键到 .nanorc 实现深度定制
  • 配置文件的层级模型:理解 ~/.bashrc/etc/bashrc~/.profile/etc/profile 的加载顺序与作用域
  • 即时生效机制:掌握 source 命令在运维中的实用价值
  • 自动化延伸能力:结合现代框架(如 NestJS)实现配置即代码(Configuration as Code)
  • 掌握 Ctrl+ 系列快捷键是熟练使用 nano 的基础,特别是 Ctrl+O(保存)、Ctrl+X(退出)、Ctrl+W(查找)
  • Nano 是专为终端设计的纯文本编辑器,强调简洁高效,适合初学者快速上手
  • 通过 ~/.nanorc 可实现个性化持久化配置,推荐启用 mouse, autoindent, smarthome 提升编码效率。
  • 系统级配置 /etc/nanorc 适用于大规模部署管理,避免逐个用户重复设置。
  • .bashrc 是用户级终端配置核心文件,影响命令提示符、别名、环境变量等。
  • 区分 .bashrc.profile 的加载时机,有助于理解 TTY 与图形终端的行为差异。
  • 利用 source 命令实现配置热重载,无需重启即可查看修改效果。
  • 现代工程实践中,可通过 NestJS 等框架封装配置逻辑,实现自动化、可视化配置管理

最终建议:

  • 掌握 nano 不是为了长期依赖它,而是作为通往 vim/emacs 的桥梁
  • 学习配置文件不是为了炫技,而是为了打造高度个性化的生产力环境

真正的高手,不仅能写代码,更能驾驭自己的工具链,每位开发者都应精通至少一款终端编辑器,nano 是最佳起点,后续可深入学习 vim 以获得更强生产力

http://www.dtcms.com/a/504739.html

相关文章:

  • 邯郸网站建设渠道怎么筛选一家做网站做的好的公司
  • 公司网站备案条件中国建设工程造价管理协会官网
  • JMESPath基础例子
  • 南京电商网站设计公司wordpress opml
  • 商城网站设计企业资源平台
  • 做网站公司负责修图吗一诺建站
  • 南京网站设计平台商丘的网络公司
  • h5网站设计报价建站公司网站源码社区
  • 山西太原网站制作成都门户网站
  • 网站开发资源网网站规划与建设的流程与方法 高中信息技术
  • android中 c++类对象存储和虚拟机关系
  • 济南自助建站软件祖庙网站开发
  • Week 21: 深度学习补遗:ViT Overview与手搓Multi-Head Attention
  • asp 网站开发兰州seo优化入门
  • aop之agent增强
  • 历史权重查询百家号优化上首页
  • wdcp网站无法访问宁波优化网站排名软件
  • 网上做的好金融网站微信网站开发设计
  • 13-原码、反码、补码
  • 数据压缩与解压
  • 使用MQ解耦点赞通知功能
  • 青岛高品质网站制作window服务器如何做网站访问
  • 机械加工网站易下拉大测网站建设的步骤及方法
  • 《AI的未来:从“召唤幽灵”到学会反思》
  • 特性设计的网站网站建设安全方案
  • 英文公司网站制作wordpress 4.7.1
  • 烟台教育平台网站建设手机网站的尺寸做多大的
  • 获取网站漏洞后下一步怎么做初中做语文题的网站
  • 明星网站策划书阿里云 ip 网站
  • 网站设计昆明ipv6网站建设