[bat-cli] docs | 控制器

鏈接:https://github.com/sharkdp/bat

前文傳送:

  • 【探索Linux命令行】從基礎指令到高級管道操作的介紹與實踐
  • 【Linux命令行】從時間管理->文件查找壓縮的指令詳解
  • 【Linux】1w詳解如何實現一個簡單的shell

docs:bat

在這里插入圖片描述

bat 是一個**命令行文件查看器**,能夠美化代碼和文本文件。

它的工作原理是接收原始輸入,智能地檢測編程語言,然后應用生動的語法高亮和其他視覺裝飾(如行號或 Git 變更)。

最終,增強后的輸出會*直接顯示或通過分頁器(如 less)*輸出,從而提供更好的查看體驗。

可視化

在這里插入圖片描述

章節

  1. 控制器
  2. 輸入管理
  3. 輸出處理
  4. 配置 (Config)
  5. 高亮資源
  6. 語法映射
  7. 行范圍處理
  8. 打印器

第一章:控制器

歡迎來到 bat 🐻???

如果你想通過漂亮的語法高亮、行號等功能讓你的代碼和文本文件更加清晰,那么你來對地方了ovo。

在這第一章中,我們將介紹“控制器”,它是 bat 強大顯示功能背后的核心大腦。

控制器解決了什么問題?

假設我們有一個純文本文件,比如一個 Python 腳本,我們想在屏幕上顯示它。不僅僅是原始文本,而是帶有各種裝飾效果:不同關鍵詞的鮮艷顏色、清晰的行號,甚至可能還有版本控制中的變更標記。如何從一個簡單的文本文件變成這樣豐富、視覺上吸引人的輸出呢?

這就是控制器的作用!它就像是整個顯示操作的項目經理。我們告訴它想要顯示哪些文件以及如何顯示(我們的“配置”),然后控制器負責確保一切正確執行。

本章的目標是理解控制器如何協調這一過程,將一個簡單的文件準備好,以便進行漂亮的顯示。

控制器:我們的項目經理

控制器本身并不直接執行高亮或行號添加。相反,它協調所有其他專業化的組件。可以將其視為:

  • 協調者:確保從讀取文件到最終顯示的每一步都按正確順序進行。
  • 指揮官:根據我們的設置告訴其他組件該做什么。
  • 錯誤處理者:如果出現問題(例如文件無法找到),控制器會捕獲錯誤。

使用控制器

雖然 bat 提供了一個用戶友好的 PrettyPrinter 來處理常見任務,但直接理解 Controller 有助于掌握核心邏輯。讓我們看一個基本示例,展示如何使用 batController 來顯示一個簡單的 Rust 文件。

以下是一個最小化的代碼片段,靈感來自 bat 的示例,直接使用 Controller 將文件內容(這里是 examples/buffer.rs 本身)打印到一個字符串緩沖區:

use bat::{assets::HighlightingAssets, // 管理語法定義和主題config::Config,            // 我們的顯示偏好controller::Controller,    // 協調者!output::OutputHandle,      // 輸出目標Input,                     // 表示輸入文件
};fn main() {let mut buffer = String::new(); // 輸出將存儲在這里let config = Config {colored_output: true, // 是的,我們需要顏色!..Default::default()};let assets = HighlightingAssets::from_binary(); // 加載內置的高亮信息let controller = Controller::new(&config, &assets); // 創建控制器// 為當前文件創建輸入let input = Input::from_file(file!());// 運行控制器處理并打印輸入controller.run(vec![input.into()], // 提供輸入文件Some(OutputHandle::FmtWrite(&mut buffer)), // 告訴它寫入字符串緩沖區).unwrap();println!("{buffer}"); // 最終打印緩沖區中的結果
}

說明:

  1. 我們設置了一個名為 bufferString,用于存儲高亮后的輸出
  2. 我們創建了一個 Config 對象,其中包含所有偏好設置,比如是否需要彩色輸出。..Default::default() 為其他設置填充默認值。
  3. HighlightingAssets::from_binary() 加載所有內置的語法定義(例如如何高亮 Rust、Python 等)和顏色主題。
  4. 然后,我們使用 Controller::new(&config, &assets) 創建控制器。我們提供偏好設置(config)和高亮規則(assets)。
  5. 我們定義要顯示的內容為 Input。這里,Input::from_file(file!()) 表示我們要求 bat 處理包含這段代碼的 Rust 文件!
  6. 最后,controller.run(...) 是魔法發生的地方。我們給控制器提供 input(要處理的文件),并告訴它將輸出寫入 buffer 通過 OutputHandle

運行這段代碼時,bat 會處理 examples/buffer.rs 文件,根據 Rust 規則和默認主題應用語法高亮,并將格式化后的輸出存儲在 buffer 中,然后打印到控制臺。

在這里插入圖片描述

控制器內部工作原理

讓我們揭開控制器的面紗,看看調用 controller.run() 時發生了什么。控制器作為我們的項目經理,與多個專業團隊協調完成任務。

以下是簡化的步驟分解:

  1. 接收請求:我們(程序員)告訴控制器處理一組文件,并提供特定配置。
  2. 準備輸入:對于每個文件,控制器要求輸入管理團隊讀取其內容。該團隊負責打開文件、從標準輸入讀取,甚至處理字節數組。
  3. 收集設置:控制器使用我們提供的 Config(即配置)。Config 包含所有指令:“使用這個顏色主題”、“顯示行號”、“換行長行”等。
  4. 加載高亮信息:控制器查詢 HighlightingAssets 以找到正確的語法定義(例如,“這是一個 Rust 文件,這是它的關鍵詞和結構”)和選擇的顏色主題。
  5. 啟動打印機:對于每個輸入文件的每一行,控制器將原始行連同所有配置和高亮規則交給打印機團隊。打印機是實際應用顏色、添加行號并格式化文本的藝術家。
  6. 定向輸出:打印機的格式化輸出隨后發送到輸出處理。這可能意味著直接寫入終端,或通過分頁程序(如 less)以便于瀏覽大文件。
  7. 處理錯誤:如果任何團隊遇到問題(例如文件不可讀),控制器會捕獲并報告。

以下是描述這一流程的序列圖:

在這里插入圖片描述

深入代碼

讓我們看看 bat 源代碼中控制器的結構。

首先是 Controller 結構體本身(來自 src/controller.rs):

// src/controller.rs
pub struct Controller<'a> {config: &'a Config<'a>,assets: &'a HighlightingAssets,// ... 其他字段(用于 lessopen 特性的預處理器)
}

說明:

  • config: &'a Config<'a>:這是對配置對象的引用,包含用戶的所有偏好設置。控制器需要這些指令來知道如何顯示文件。
  • assets: &'a HighlightingAssets:這是對 HighlightingAssets 的引用,包含所有語法定義和主題。這告訴控制器應用哪些高亮規則和顏色。

接下來是控制器的構造函數(new)和主要的 run 方法:

// src/controller.rs
impl Controller<'_> {pub fn new<'a>(config: &'a Config, assets: &'a HighlightingAssets) -> Controller<'a> {Controller {config,assets,// ... 初始化其他字段}}pub fn run(&self, inputs: Vec<Input>, output_handle: Option<OutputHandle<'_>>) -> Result<bool> {// ... 設置輸出 ...let mut no_errors: bool = true;for (index, input) in inputs.into_iter().enumerate() {let result = if input.is_stdin() {// 處理標準輸入self.print_input(input, &mut writer, io::stdin().lock(), identifier, is_first)} else {// 處理文件輸入self.print_input(input, &mut writer, io::empty(), identifier, is_first)};if let Err(error) = result {// ... 錯誤處理 ...no_errors = false;}}Ok(no_errors)}fn print_input<R: BufRead>(&self,input: Input,writer: &mut OutputHandle,stdin: R,stdout_identifier: Option<&Identifier>,is_first: bool,) -> Result<()> {let mut opened_input = input.open(stdin, stdout_identifier)?;// ... 可能獲取 git diff ...let mut printer: Box<dyn Printer> = /* ... 創建 InteractivePrinter 或 SimplePrinter ... */;self.print_file(&mut *printer,writer,&mut opened_input,!is_first,// ... line_changes ...)}// ... 其他輔助方法如 print_file, print_file_ranges ...
}

說明:

  1. Controller::new:這是創建控制器的方式。只需傳遞 ConfigHighlightingAssets
  2. Controller::run:這是啟動處理的主要方法。
    • 它準備 output_type,確定輸出去向(例如直接到終端或通過分頁程序)。這將在輸出處理中進一步討論。
    • 然后遍歷每個提供的 Input 文件或流。
    • 對于每個輸入,調用 self.print_input
  3. Controller::print_input:此方法處理單個輸入的流程:
    • 使用輸入管理組件 open 輸入,使其內容可讀。
    • 創建一個 printerSimplePrinterInteractivePrinter)。printer 是實際根據 ConfigHighlightingAssets 對原始文本應用樣式的組件。我們將在打印機章節深入探討。
    • 最后調用 self.print_file,將逐行打印的實際工作委托給選定的 printer

這表明控制器確實是核心樞紐,將 ConfigHighlightingAssets、輸入管理、輸出處理和打印機結合在一起完成任務。

結論

在本章中,我們了解到控制器是 bat 項目的核心協調者。

它像項目經理一樣,接收我們的配置和文件列表,然后指導其他專業組件讀取、處理、高亮并漂亮地顯示代碼。雖然它不直接執行細節工作,但其協調角色bat 的功能至關重要。

現在我們已經理解了控制器在顯示流程中的協調作用,下一步是了解 bat 如何處理我們想要顯示的文件。在下一章中,我們將深入探討輸入管理,學習 bat 如何高效讀取文件和其他數據源。

下一章:輸入管理

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95934.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95934.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95934.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

無線自動信道調整

通過信道調整功能&#xff0c;可以保證每個AP 能夠分配到最優的信道&#xff0c;盡可能地 減少和避免相鄰信道干擾&#xff0c;而且通過實時信道檢測&#xff0c;使AP 實時避開雷達&#xff0c;微波爐等干擾源。 動態信道調整能夠實現通信的持續進行&#xff0c;為網絡的可靠傳…

ios面試八股文

??Swift 語言特性??&#xff1a;請解釋一下 struct和 class的主要區別。特性????struct (值類型)????class (引用類型)????類型本質??值類型 (復制時創建獨立副本)引用類型 (復制時共享同一實例)??內存分配??通常在棧上 (更快速)在堆上 (需要ARC管理)??…

IntelliJ IDEA 2023更新git憑據

背景&#xff1a;已知原來從遠程倉庫獲取的項目&#xff0c;需要更新git用戶和密碼&#xff0c;但是又不想刪除本地項目環境&#xff08;不想重新獲取新建項目&#xff09;。報錯&#xff1a;remote: HTTP Basic: Access denied. The provided password or token is incorrect …

Docker 容器 OOM:從資源監控到JVM調優的實戰記錄

人們眼中的天才之所以卓越非凡&#xff0c;并非天資超人一等而是付出了持續不斷的努力。1萬小時的錘煉是任何人從平凡變成超凡的必要條件。———— 馬爾科姆格拉德威爾 &#x1f31f; Hello&#xff0c;我是Xxtaoaooo&#xff01; &#x1f308; “代碼是邏輯的詩篇&#xff…

【開題答辯全過程】以 基于微信小程序的寵物領養系統為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

【可信數據空間-連接器狀態監控-Java代碼集成】

可信數據空間-連接器狀態監控-Java代碼集成一、 核心概念1. Micrometer2. Micrometer Registry Prometheus3.Prometheus二、 依賴配置 (Maven)三、 集成步驟與代碼示例場景一&#xff1a;在 Spring Boot 應用中集成&#xff08;最簡單&#xff09;1. 添加依賴&#xff08;如上所…

反編譯分析C#閉包

一、問題描述&#xff1a;比如有這樣的代碼&#xff1a;它的輸出結果是 3&#xff0c;3&#xff0c;3。通過搜索得知這一現象是因為C#閉包導致的.我們借助ILSpy看下IL中間代碼&#xff0c;首先它生成了一個名叫DisplayClass的類&#xff0c;類中定義了i的字段主代碼&#xff1a…

卷積神經網絡(CNN):從圖像識別原理到實戰應用的深度解析

目錄一.CNN的技術必要性&#xff1a;破解傳統圖像處理的兩大核心痛點痛點1&#xff1a;特征依賴人工設計&#xff0c;通用性差痛點2&#xff1a;全連接網絡參數爆炸&#xff0c;訓練難收斂二.CNN的核心原理&#xff1a;兩大機制與分層感知邏輯1.核心機制1&#xff1a;局部連接&…

用 SPL 編寫阿里云 FC2.0 函數

前言 在數字化轉型持續加速的背景下&#xff0c;企業越來越多地將業務邏輯以服務化方式部署至云端。阿里云函數計算&#xff08;Function Compute&#xff0c;簡稱FC&#xff09;作為一種無服務器計算平臺&#xff0c;屏蔽了底層資源運維的復雜性&#xff0c;使開發者能夠專注…

AR 巡檢與普通巡檢有哪些區別,有哪些優勢|阿法龍XR云平臺

AR 巡檢&#xff08;增強現實巡檢&#xff09;與普通巡檢&#xff08;傳統人工巡檢&#xff09;在技術應用、效率、準確性等多個維度存在顯著差異&#xff0c;具體區別如下&#xff1a; 1. 巡檢方式更智能 普通巡檢&#xff1a;依賴人工現場觀察&#xff0c;主要通過眼看、手…

Java中的volatile關鍵字詳解

核心作用&#xff1a;解決可見性和有序性問題volatile 的主要作用可以歸結為兩點&#xff1a;1.保證變量的可見性 和 禁止指令重排序。2.它提供了一種輕量級的同步機制&#xff0c;3.但需要注意的是&#xff0c;它不能保證原子性。保證可見性&#xff1a;什么是可見性問題&…

【Linux】MySQL數據目錄遷移步驟(含流程圖踩坑經驗)

在生產環境中&#xff0c;有時候你會遇到一些看似簡單但實際上很棘手的問題。最近我就碰到了一次典型的服務器磁盤空間告急&#xff0c;最后通過遷移 MySQL 數據目錄成功解決了問題。本文記錄整個過程&#xff0c;包括我的分析思路、遷移步驟、踩坑和經驗總結&#xff0c;希望對…

數據驅動下的連鎖模式復制:技術科普與方法論深度解析

前言在連鎖經營的賽道上&#xff0c;“復制”是核心命題&#xff0c;但絕非簡單的“粘貼”。當行業進入數字化深水區&#xff0c;數據驅動正成為連鎖模式突破增長瓶頸、實現高效復制的“隱形引擎”。本文將從技術科普與方法論心得兩個維度&#xff0c;深度拆解數據如何重塑連鎖…

數據庫學習MySQL系列2、Windows11系統安裝MySQL方法一.msi安裝詳細教程

方法一.msi安裝詳細教程 Windows系統下MySQL——.msi安裝詳細教程&#xff08;默認--只安裝服務端“Server only”&#xff09;MySql官網地址&#xff1a;https://www.mysql.com/&#xff1b;快速下載通道請單擊→ No thanks, just start my download.ps&#xff1a;其他資源(…

html+css+vue實現增刪改查

代碼如下&#xff1a;<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>優化版 Vue.js CRUD 示例&l…

(計算機網絡)DNS解析流程及兩種途徑

在計算機網絡中&#xff0c;DNS&#xff08;Domain Name System&#xff09;用于 將域名解析為 IP 地址。一個完整的解析過程涉及 遞歸查詢、迭代查詢&#xff0c;以及多個關鍵角色&#xff08;LDNS、本地域名服務器&#xff1b;根服務器&#xff1b;頂級域名服務器&#xff1b…

數據結構——隊列(Java)

一.基本概念 隊列用來存儲邏輯關系為“一對一”的數據&#xff0c;是一種“特殊”的線性存儲結構。 特點&#xff1a; ?先進先出&#xff1a;隊列中元素的添加&#xff08;入隊enqueue&#xff09;和移除&#xff08;出隊dequeue&#xff09;遵循先進先出的原 則。 ?端點&…

【Go】:mac 環境下GoFrame安裝開發工具 gf-cli——gf_darwin_arm64

當前主要是關于gf_darwin_arm64的安裝步驟 如何快速給mac電腦安裝gfgf是什么安裝步驟方法1&#xff1a;去github下載gf-cli去git上下載對應電腦版本的gf-cli驗證下載文件是否二進制文件授予該文件權限方法2&#xff1a;去goframe官網教你下載步驟驗證gf是否安裝成功可能遇到的問…

【新】ApiHug官方文檔-ApiHug Spring Security 擴展-補充說明

概述 在上次說明中我們寫了ApiHug 如何做授權的&#xff0c; 這里有個概念的混淆&#xff0c; 其實 apihug 不是在spring security 上做的安全擴展&#xff0c; 應該是 apihug spring, 安全設計框架&#xff0c; 和本身 spring security 沒有半毛錢關系&#xff0c; 而如果你…

【Flask】測試平臺開發,新增說明書編寫和展示功能 第二十三篇

概述&#xff1a;本篇是接著上一篇&#xff0c;細分出說明書的編寫部分&#xff0c;實現這個功能的需求&#xff0c;是內部很多同事反饋&#xff0c;需要有個地方存工具&#xff0c;并且可以寫說明書&#xff0c;如果需要的人&#xff0c;那么可以在界面上直接下載工具和查看工…