Line Ending Controller

approved

by anse

Control line ending format (LF/CRLF) per file or per folder. Prevent Obsidian from silently converting CRLF to LF. - This plugin has not been manually reviewed by Obsidian staff.

↓ 27 downloadsUpdated 13d agoMIT

Line Ending Controller

GitHub release

Control line ending format (LF / CRLF) per file or per folder in Obsidian.

🌐 This plugin supports English and įŽ€äŊ“中文 — automatically follows Obsidian's display language.

📖 ä¸­æ–‡æ–‡æĄŖ


Why?

Obsidian's editor (CodeMirror 6) normalizes all line endings to LF (\n) internally. When you open a file with CRLF (\r\n) line endings — even if you make no edits — and save it, Obsidian silently converts all line endings to LF.

If your project uses CRLF (common on Windows, or enforced by .editorconfig / .gitattributes), this causes:

  • Unexpected Git diffs — every line appears changed
  • CI failures — linting rules like linebreak-style fail
  • Team friction — mixed line endings across the codebase

This plugin fixes line endings automatically after every save (and optionally on file open), so your files always have the line endings you expect.


Features

  • 🔧 Auto-fix on save — line endings are corrected immediately when you save a file
  • 📂 Auto-fix on open — (enabled by default) corrects line endings when you open a file
  • 📋 Per-file / per-folder rules — different line ending strategies for different parts of your vault
  • 📊 Status bar indicator — shows the current file's line ending (LF / CRLF) at a glance
  • ⚡ Manual commands — convert any file to LF or CRLF on demand
  • 🌐 Chinese / English i18n — UI language follows Obsidian's display language

Configuration

Open Settings → Line Ending Controller to configure rules:

SettingDescription
PatternPath prefix to match (e.g. projects/ or docs/spec.md). Empty matches all files as fallback.
StrategyLF (Unix) — force LF line endings
CRLF (Windows) — force CRLF line endings

Rules use longest prefix matching — more specific rules take priority. The rule with an empty pattern acts as the default for all unmatched files.

Example

PatternStrategyEffect
(empty)CRLFAll files → CRLF
linux-scripts/LFFiles under linux-scripts/ → LF
docs/README.mdLFOnly docs/README.md → LF

Result: docs/README.md and everything under linux-scripts/ uses LF; everything else uses CRLF.


Commands

This plugin adds two commands to the Command Palette (Ctrl+P):

CommandDescription
Convert current file to LFImmediately converts the active file to LF
Convert current file to CRLFImmediately converts the active file to CRLF

Installation

From Obsidian Community Plugins

  1. Open Obsidian → Settings → Community Plugins
  2. Disable Safe mode
  3. Click Browse and search for "Line Ending Controller"
  4. Install and enable

Manual Installation

  1. Download main.js, manifest.json, styles.css from the latest release
  2. Copy them to <Vault>/.obsidian/plugins/line-ending-controller/
  3. Restart Obsidian and enable the plugin in Settings

From Source

git clone https://github.com/anseyuyin/line-ending-controller.git
cd line-ending-controller
npm install
npm run build
# Then copy main.js, manifest.json, styles.css to your vault

FAQ

Q: Does this plugin modify files without me saving? A: By default, yes — the "Fix on open" option corrects line endings when you open a file. You can disable this in settings.

Q: Will this cause merge conflicts in Git? A: No. The plugin ensures consistent line endings, which prevents merge conflicts caused by mixed line endings.

Q: Does it work on mobile? A: No — desktop only.

Q: Can I exclude certain files? A: Not directly, but you can use path prefix rules to control which files get which strategy. Files not matched by any rule use the empty-pattern fallback.


Development

git clone https://github.com/anseyuyin/line-ending-controller.git
cd line-ending-controller
npm install
npm run dev    # watch mode — auto-rebuilds on changes
npm run build  # production build

Project Structure

├── src/main.ts          # Plugin source
├── main.js              # Bundled output
├── manifest.json        # Plugin metadata
├── styles.css           # Plugin styles
├── esbuild.config.mjs   # Build configuration
├── version-bump.mjs     # Version management
└── versions.json        # Version compatibility map

Releasing

npm version patch   # or minor / major
git push --tags

GitHub Actions will automatically build and create a draft release.


License

MIT

For plugin developers

Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.