Skip to main content

VSCode搭建最强Markdown编辑环境

VSCode是笔者用过的最好用的开发工具,没有之一。笔者14年的码龄生涯中,先后用过Eclipse、 IntelliJ IDEA、 WebStorm、 PyCharm、 Visual Studio(2010/2013/2015)、 NetBeans、 Sublime Text等,但自从用VSCode之后,就再没换过其他工具,一直用到现在有5年多的时间。

1. 本文目标

这篇文章主要介绍如何使用VSCode来进行Markdown的写作,用VSCode来搭建一套markdown的文档写作环境。

什么是markdown?

Markdown是一种轻量级的标记语言,旨在简化文本格式化的过程。它允许用户使用纯文本格式编写文档,并通过简单的标记语法来添加格式,如标题、列表、粗体、斜体、链接和图片等。Markdown文件通常以.md或.markdown为扩展名。具体语法参见以下文档,这里不再赘述。

先展示一下最终的效果图:

2. 准备工作

官网下载VSCode并安装: https://code.visualstudio.com/

3. 安装插件

vscode默认是支持Markdown的,基本的语法、编辑功能、预览功能都可以用,但如果需要更高级的功能,可以安装一些插件来提升效率。使我们的markdown文档编辑起来更加丝滑、高效。

插件名称发布者功能介绍
Markdown All in OneYu Zhang支持快捷键(如粗体/斜体)、创建目录、表格自动格式化、LaTeX 数学公式支持等功能
markdownlintDavid AnsonMarkdown语法检查器,可识别和快速修复常见的Markdown语法错误。
Markdown TableTakumi IshiiMarkdown表格编辑的神器,可对表格进格式化、插入行、行/列等。
Markdown PDFyzane支持将Markdown文件转换成pdf, html, png, jpeg等格式。
Markdown Preview Github StylingMatt BiernerGithub使用的Markdown渲染样式,整体样式:朴素、简洁。
Markdown Preview EnhancedYiyi WangMarkdown预览插件,支持目录树,提供更丰富的功能和更强的定制化能力。
Markdown Preview Github Styling是同类型的插件,可以根据自己的喜好选择其中一个安装。
Write Timestampmichael gieson插入系统当前时间戳,可以自定义格式。
Paste Imagemushan粘贴图片,支持将剪切板里的图片直接保存到文档中。支持自定义保存路径。

4. 插件的用法

4.1. Markdown All in One

4.1.1. 快捷键

快捷键功能
Ctrl + B加粗
Ctrl + I斜体
Ctrl / Cmd + Shift + V切换预览模式和编辑模式

4.1.2. 创建/更新目录

  1. 打开命令面板(Ctrl + Shift + P)。
  2. 输入“Markdown All in One: Create Table of Contents”创建目录,输入“Markdown All in One: Update Table of Contents”更新目录。
  3. 点击/或按下回车确认。

4.1.3. 给标题增加序号

  1. 打开命令面板(Ctrl + Shift + P)
  2. 输入“Markdown All in One: Add/Update section Number”
  3. 点击/或按下回车确认

4.2. markdownlint

4.2.1. 格式检查

markdownlint安装后,默认会开启格式检查的功能。当markdown文档格式错误时,编辑器内对应的错误行会有(黄色波浪线的)提示信息。

4.2.2. 文档格式化

可以通过markdownlint对整个markdown文档进行格式化,并自动修复错误。

快捷键:

MacOS: Option + Shift + F Windows: Ctrl + Shift + F

鼠标右键:

  1. 编辑器内右键鼠标 -> 选择“Format Document With” -> 选择“markdownlint” -> 点击/或按下回车确认。
  2. 编辑器内右键鼠标 -> 选择“Format Document With” -> 选择“Configure Default Formatter...” -> 配置默认的格式化器。

保持时自动格式化:

settings.json文件中添加以下内容:

"editor.formatOnSave": true,
"editor.formatOnSaveMode": "modificationsIfAvailable"

4.3. Markdown Table

4.3.1. 格式化表格

  1. 打开命令面板(Ctrl + Shift + P),或者鼠标右键点击表格区域。
  2. 选择“Markdown Table: format table”。
  3. 点击/或按下回车确认。

4.3.2. 插入表格列

  1. 打开命令面板(Ctrl + Shift + P),或者鼠标右键点击表格区域。
  2. 选择“Markdown Table: insert column left/right”。
  3. 点击/或按下回车确认。

4.4. Markdown PDF

  1. 打开命令面板(Ctrl + Shift + P)。
  2. 输入“Markdown PDF:”。
  3. 选择需要导出的文件格式。
  4. 点击/或按下回车确认。

注意: Markdown PDF导出的PDF文件没有目录,如果需要目录,可以使用prince工具。prince的安装和使用可以参考《将Markdown转换为PDF文件(支持目录大纲)》。

4.5. Write Timestamp

  1. 快捷键

PC: ctrl-shift-t

MAC: cmd-shift-t

  1. 自定义时间格式

在settings.json文件中添加以下配置:

"writeTimestamp.bCustomFormat": "yyyy-mm-dd  HH:MM:SS"

4.6. Paste Image

默认快捷键:

Windows/Linux: Ctrl+Alt+V

MacOS: Cmd+Alt+V

自定义保存路径:

在settings.json文件中添加以下配置:

// 设置图片保存路径:与文件同级的目录创建一个与文件同名的文件夹,在此文件夹下存放图片。
"pasteImage.path": "${currentFileNameWithoutExt}/",
// 设置图片默认名称, 默认为当前文件名
"pasteImage.defaultName": "${currentFileNameWithoutExt}",

4.6.1. WSL环境下无法粘贴Windows剪贴板的图片

问题现象:

在Windows上用VSCode通过WSL Remote连接到WSL中编辑Markdown时,按Ctrl+Alt+V粘贴在Windows主机上复制的图片会失败,通常报错:There is not an image in clipboard.

原因:

Paste Image插件运行在WSL(Linux)端的vscode-server里,读取剪贴板时调用的是Linux下的xclip,而xclip无法访问Windows主机的剪贴板(即使开启了WSLg,图片这种二进制剪贴板格式也无法跨过去)。所以本质不是插件Bug,而是Remote架构限制。

解决方案:

推荐二选一,按需要选择。

方案A(推荐):使用 VSCode 内置的 Markdown 图片粘贴功能

VSCode 1.79+ 已经原生支持往Markdown里粘贴剪贴板里的图片,并且走的是VSCode自己的Remote协议,可以正确地把Windows主机剪贴板里的图片传到WSL再落盘,无需任何额外插件。

settings.json里加入以下配置:

// 启用粘贴图片时自动复制为文件
"editor.experimental.pasteActions.enabled": true,
// 设置图片保存路径:与当前文件同级、与文件同名的目录下
"markdown.copyFiles.destination": {
"**/*.md": "${documentBaseName}/"
},
// 粘贴时直接生成 Markdown 链接
"markdown.editor.filePaste.copyIntoWorkspace": "mediaFiles"

之后在Markdown文件中直接按 Ctrl+V(注意不是 Ctrl+Alt+V)即可粘贴图片,VSCode会自动保存图片到指定目录并插入![](xxx.png)链接。

方案B:改用 Markdown Image Paste for Remote 插件

mushan发布的Paste Image插件已多年未更新,对Remote场景没做适配。社区有专门面向Remote/WSL环境的替代插件 Markdown Image Paste for Remote(发布者 watahani),它通过WebView的clipboard API绕开了Linux端拿不到Windows剪贴板图片的问题。

安装后,使用方式与Paste Image基本一致,路径模板配置项为markdownImagePaste.path,例如:

"markdownImagePaste.path": "${currentFileNameWithoutExt}/",
"markdownImagePaste.defaultName": "Y-MM-DD-HH-mm-ss"

方案C(保留 Paste Image,推荐重度依赖路径模板的用户):用 PowerShell 桥接 Windows 剪贴板

如果你已经习惯了Paste ImagepasteImage.path / pasteImage.insertPattern等路径模板,不想换插件,可以做一个xclip包装脚本,让Paste Image在 WSL 中调用xclip时实际去读取 Windows 主机的剪贴板。

原理

Paste Image在 Linux 端的实现是 spawn 一个 sh 脚本,本质上跑的是:

xclip -selection clipboard -t image/png -o > /tmp/xxx.png

我们在PATH中放一个优先级高于真xclip的包装脚本,拦截这种"读 image/png"的调用,改用powershell.exe从 Windows 主机剪贴板取图、保存到临时目录、再通过wslpath回传给调用方。其它非图片场景(如读文本)则透传给真xclip,不影响日常使用。

步骤 1:确认前置条件

which powershell.exe   # 应该有路径,例如 /mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe
which wslpath # 应该是 /usr/bin/wslpath
which xclip # 没有的话先装:sudo apt install -y xclip

如果powershell.exe找不到,说明 WSL 互操作被禁用了,在/etc/wsl.conf里加上:

[interop]
enabled=true
appendWindowsPath=true

之后在 PowerShell 里执行wsl --shutdown重启 WSL。

步骤 2:创建 xclip 包装脚本

把下面内容保存为/usr/local/bin/xclip

#!/usr/bin/env bash
# WSL 下让 xclip 能读取 Windows 主机剪贴板里的图片,
# 用于让 vscode Paste Image 插件在 WSL Remote 模式下正常工作。

REAL_XCLIP="/usr/bin/xclip"

is_wsl() {
grep -qiE "microsoft|wsl" /proc/version 2>/dev/null
}

wants_image_png() {
local prev=""
for arg in "$@"; do
if [[ "$prev" == "-t" && "$arg" == "image/png" ]]; then
return 0
fi
prev="$arg"
done
return 1
}

has_o_flag() {
for arg in "$@"; do
[[ "$arg" == "-o" ]] && return 0
done
return 1
}

if is_wsl && wants_image_png "$@" && has_o_flag "$@"; then
PS_CMD='
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$img = [System.Windows.Forms.Clipboard]::GetImage()
if ($img -eq $null) { exit 2 }
$tmp = [System.IO.Path]::GetTempPath() + "vscode_paste_" + [System.Guid]::NewGuid().ToString() + ".png"
$img.Save($tmp, [System.Drawing.Imaging.ImageFormat]::Png)
Write-Output $tmp
'
WIN_PATH="$(powershell.exe -NoProfile -NonInteractive -Command "$PS_CMD" 2>/dev/null | tr -d '\r\n')"

if [ -n "$WIN_PATH" ]; then
WSL_PATH="$(wslpath -u "$WIN_PATH" 2>/dev/null)"
if [ -f "$WSL_PATH" ]; then
cat "$WSL_PATH"
rm -f "$WSL_PATH"
exit 0
fi
fi
fi

exec "$REAL_XCLIP" "$@"

赋可执行权限:

sudo chmod +x /usr/local/bin/xclip

步骤 3:验证

在 Windows 上随便截一张图(Win+Shift+S、Snipaste、QQ截图都可以),回到 WSL 终端:

xclip -selection clipboard -t image/png -o > /tmp/test.png
file /tmp/test.png # 期望输出:PNG image data, ...

输出PNG image data就说明桥接成功,回到 VSCode 直接Ctrl+Alt+V粘贴即可。

步骤 4(可选但建议):关闭 VSCode 内置粘贴避免冲突

如果之前为了试方案 A 启用过 VSCode 内置 Markdown 粘贴,把这几项关掉,统一交给Paste Image处理:

"editor.experimental.pasteActions.enabled": false,
"markdown.copyFiles.destination": {},
"markdown.editor.filePaste.copyIntoWorkspace": "never"