Emacs 折騰日記(二十)——修改emacs的一些默認行為

上一篇我們完成了emacs輸入法的配置以及將emacs配置成了使用vim的操作方式。但是emacs目前有些默認行為我不太喜歡,這節我們一起來修改它

備份設置

我們打開emacs的配置文件所在路徑,發現有大量的~結尾的文件,這是emacs的備份文件。這里,我們不使用這個特性,可以通過git等版本管理軟件進行版本的控制和備份的管理。而且去掉這些還能讓目錄干凈點。

(setq make-backup-files nil)                                  ; 不自動備份
(setq auto-save-default nil)                                  ; 不使用Emacs自帶的自動保存

將用戶設置獨立開來

在修改這些配置的時候經常會發現在init.el 中出現類似下面的代碼被修改

(custom-set-variables;; custom-set-variables was added by Custom.;; If you edit it by hand, you could mess it up, so be careful.;; Your init file should contain only one such instance.;; If there is more than one, they won't work right.'(package-selected-packages nil))
(custom-set-faces;; custom-set-faces was added by Custom.;; If you edit it by hand, you could mess it up, so be careful.;; Your init file should contain only one such instance.;; If there is more than one, they won't work right.)

這里保存的是使用編輯器接口產生的配置信息。如果讓它們隨意堆砌在init.el 中不利于版本的管理,我們將它放入到另一個文件中

(setq custom-file (expand-file-name "~/.emacs.d/custom.el"))
(load custom-file 'no-error 'no-message)

之前我們用 require 來加載一個代碼文件,這里我們使用 load 來加載代碼文件。它們有什么區別呢?

  • 首先 require 需要加載一個已經被定義為庫的代碼文件,也就是通過 provide 定義的庫文件。而load傳入文件路徑來加載
  • 其次 require 會根據 provide 定義的庫文件自動處理庫文件,每個庫文件只加載一次,并且會自動處理依賴。而 load 這些操作都需要手動進行
  • load 可以根據if條件來有選擇的加載不同的庫文件。而 require 則無法做到
  • load 可以進行錯誤處理,例如上面我們定義在加載時通過 noerror 限制錯誤,通過 no-message 不輸出信息。而 require 是嚴格報錯的。

其他的一些基礎設置

這里再添加一些其他的基礎配置

(fset 'yes-or-no-p 'y-or-n-p)    ;; 將所有的 yes-or-no-p 都替換為 y-or-n-p
(setq confirm-kill-emacs #'y-or-n-p)   ; 在關閉 Emacs 前詢問是否確認關閉,防止誤觸
(electric-pair-mode t)            ; 自動補全括號
(column-number-mode t)            ; 在 Mode line 上顯示列號
(global-auto-revert-mode t)         ; 當另一程序修改了文件時,讓 Emacs 及時刷新 Buffer
(delete-selection-mode t)          ; 選中文本后輸入文本會替換文本(更符合我們習慣了的其它編輯器的邏輯)(add-hook 'prog-mode-hook #'hs-minor-mode)  ; 編程模式下,可以折疊代碼塊
(add-hook 'prog-mode-hook #'show-paren-mode) ; 編程模式下,光標在括號上時高亮另一個括號

(fset 'yes-or-no-p 'y-or-n-p) 將所有的 yes-or-no-p 都替換為 y-or-n-p。這樣在每次確定的時候能從 yes 或者 no的輸入變成輸入 y 或者 n,能少輸入幾個字符。

這里又看到了一個新的符號# ,它代表的意思是取符號的函數部分。前面我們介紹符號的時候說,符號有兩個部分的值,變量值和函數值。我們可以通過 function 來獲取符號的函數部分的值。它的作用等同于 (setq confirm-kill-emacs (function y-or-n-p))

這里又有一個新的函數 function。我們在介紹符號的時候介紹過使用 symbol-function 來獲取符號的函數,那么他們兩個有什么區別呢?

首先 function 返回的是函數對象,而 symbol-function 返回函數本身。這個比較的抽象,我們使用例子來說明

(setq bar "I am a bar variable")
(defun bar()"I am a bar function")(function bar) ;; ==> bar
(symbol-function 'bar) ;; ==> #[nil ("I am a bar function") (t)](functionp bar) ;; ==> nil
(functionp (function bar)) ;; ==> t

上面的例子中,我們實際上定義了bar的變量部分和函數部分的值。同一 bar 符號它既可以作為變量使用,也可以作為函數使用。我們在使用 functionbar 求值的時候,得到的返回雖然也是 bar 但是它返回的是它的函數部分,而 symbol-function 則直接返回函數的結構,因為lisp代碼本身就是一個列表結構,所以這里它返回的實際上是函數的代碼。它返回的比 function 更加的底層。

下面我們使用 functionp 進行了測試,發現 function 返回的是一個函數對象。

雖然在理解上有些差別,但是都可以直接通過 funcall 來調用

(bar) ;; ==> "I am a bar function"
(funcall bar) ;; ==> error
(funcall (function bar)) ;; ==> "I am a bar function"
(funcall (symbol-function 'bar)) ;; ==> "I am a bar function"

我們發現當一個符號既有值部分,又有函數部分,是無法通過 funcall 來直接調用的。所以上述代碼使用 # 這個語法糖來保證后續正常調用這個符號對應的函數部分。

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

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

相關文章

聊透多線程編程-線程基礎-4.C# Thread 子線程執行完成后通知主線程執行特定動作

在多線程編程中,線程之間的同步和通信是一個常見的需求。例如,我們可能需要一個子線程完成某些任務后通知主線程,并由主線程執行特定的動作。本文將基于一個示例程序,詳細講解如何使用 AutoResetEvent 來實現這種場景。 示例代碼…

【網絡安全 | 項目開發】Web 安全響應頭掃描器(提升網站安全性)

原創項目,未經許可,不得轉載。 文章目錄 項目簡介工作流程示例輸出技術棧項目代碼使用說明項目簡介 安全響應頭是防止常見 Web 攻擊(如點擊劫持、跨站腳本攻擊等)的有效防線,因此合理的配置這些頭部信息對任何網站的安全至關重要。 Web 安全響應頭掃描器(Security Head…

使用libcurl編寫爬蟲程序指南

用戶想知道用Curl庫編寫的爬蟲程序是什么樣的。首先,我需要明確Curl本身是一個命令行工具和庫,用于傳輸數據,支持多種協議。而用戶提到的“Curl庫”可能指的是libcurl,這是一個客戶端URL傳輸庫,可以用在C、C等編程語言…

使用pip3安裝PyTorch與PyG,實現NVIDIA CUDA GPU加速

使用python3的pip3命令安裝python依賴庫。 # python3 -V Python 3.12.3 # # pip3 -V pip 25.0.1 from /root/.pyenv/versions/3.12.3/lib/python3.12/site-packages/pip (python 3.12)Usage: pip3 install [options] <package> ...pip3 install [options] -r <re…

五種常用的web加密算法

文章目錄 五種常用Web加密算法實戰及原理詳解1. AES (高級加密標準)原理詳解應用場景實戰代碼&#xff08;Node.js&#xff09; 2. RSA (非對稱加密)原理詳解應用場景實戰代碼&#xff08;Node.js&#xff09; 3. SHA-256 (安全哈希算法)原理詳解應用場景實戰代碼&#xff08;瀏…

深入解析 C++ 設計模式:原理、實現與應用

一、引言 在 C 編程的廣袤領域中&#xff0c;設計模式猶如閃耀的燈塔&#xff0c;為開發者指引著構建高效、可維護軟件系統的方向。設計模式并非神秘莫測的代碼魔法&#xff0c;實際上&#xff0c;我們在日常編程中或許早已與之打過交道。簡單來說&#xff0c;設計模式常常借助…

Python刷題筆記

Python刷題筆記 1、輸出格式化 第一種格式化的輸出&#xff1a; name "jack" age 17 salary 20031.8752 print("你的名字是&#xff1a;%s,今年 %d 歲,工資 %7.2f" % (name,age,salary) ) --------------------------------------- 你的名字是&#…

【Kubernetes】Kubernetes 如何進行日志管理?Fluentd / Loki / ELK 適用于什么場景?

由于 Kubernetes 運行在容器化的環境中&#xff0c;應用程序和系統日志通常分布在多個容器和節點上&#xff0c;傳統的日志管理方法&#xff08;例如直接訪問每個節點的日志文件&#xff09;在 Kubernetes 中不適用。 因此&#xff0c;Kubernetes 引入了集中式日志管理方案&am…

Ansible(8)——循環與條件任務

目錄 一、循環迭代任務&#xff1a; 1、簡單循環&#xff1a; 2、循環字典列表&#xff1a; 3、Ansible 2.5 之前的循環關鍵字&#xff1a; 4、在循環中使用 register 變量&#xff1a; 二、條件任務&#xff1a; 1、使用條件句的常見場景&#xff1a; 2、條件任務語法…

adb|scrcpy的安裝和配置方法|手機投屏電腦|手機聲音投電腦|adb連接模擬器或手機

adb|scrcpy的安裝和配置方法手機投屏電腦|手機聲音投電腦|adb連接模擬器或手機或電視 引言 在數字設備交織的現代生活中&#xff0c;adb&#xff08;Android Debug Bridge&#xff09;與 scrcpy 宛如隱匿的強大工具&#xff0c;極大地拓展了我們操控手機、模擬器乃至智能電視等…

vue3項目集成electron

一、環境準備 1. 確保已安裝 Node.js (建議版本 16.x 或更高) 2. 創建或進入現有 Vue 項目目錄 cd your-vue-project 二、添加 Electron 支持 在項目根目錄執行: vue add electron-builder 執行后會在 `src` 目錄下生成 `background.js` 主進程文件。 三、主進程配置 (ba…

循環神經網絡 - 參數學習之隨時間反向傳播算法

本文中&#xff0c;我們以同步的序列到序列模式為例來介紹循環神經網絡的參數學習。 循環神經網絡中存在一個遞歸調用的函數 &#x1d453;(?)&#xff0c;因此其計算參數梯度的方式和前饋神經網絡不太相同。在循環神經網絡中主要有兩種計算梯度的方式&#xff1a;隨時間反向…

體驗OceanBase的 并行導入功能

在數據庫的日常使用中&#xff0c;會經常遇到以下場景&#xff1a; ?數據復制?&#xff1a;將一個或多個表中的數據復制到目標表中&#xff0c;可能是復制全部數據&#xff0c;也可能僅復制部分數據。數據合并&#xff1a;將數據從一個表轉移到另一個表&#xff0c;或者將多…

Kafka和RocketMQ相比有什么區別?那個更好用?

Kafka和RocketMQ相比有什么區別?那個更好用? Kafka 和 RocketMQ 都是廣泛使用的消息隊列系統&#xff0c;它們有很多相似之處&#xff0c;但也有一些關鍵的區別。具體選擇哪個更好用&#xff0c;要根據你的應用場景和需求來決定。以下是它們之間的主要區別&#xff1a; 1. …

UniApp 實現兼容 H5 和小程序的拖拽排序組件

如何使用 UniApp 實現一個兼容 H5 和小程序的 九宮格拖拽排序組件&#xff0c;實現思路和關鍵步驟。 一、實現目標 支持拖動菜單項改變順序拖拽過程實時預覽移動位置拖拽松開后自動吸附回網格兼容 H5 和小程序平臺 二、功能結構拆解以及完整代碼 完整代碼&#xff1a; <…

[raspberrypi 0w and respeaker 2mic]實時音頻波形

0. 環境 ubuntu22主機&#xff0c; 192.168.8.162&#xff0c; raspberry 0w&#xff0c; 192.168.8.220 路由器 1. 樹莓派 # rpi - send.py # 或者命令行&#xff1a;arecord -D plughw:1,0 -t wav -f cd -r 16000 -c 2 | nc 192.168.8.162 12345import socket imp…

公司內部建立apt源

有一篇建立pypi源的在這里需要的可以查看&#xff1a;公司內部建立pypi源-CSDN博客 背景&#xff0c;公司內部有很多工具僅供內部使用&#xff0c;如果用apt的方式就比較方便&#xff0c;只需要修改sources.list將源添加進去就可以了。我們接下來的操作就是為了實現這個需求。…

UE5中如何修復后處理動畫藍圖帶來的自然狀態下的metablriger身體綁定形變(如聳肩)問題

【[metablriger] UE5中如何修復后處理動畫藍圖帶來的自然狀態下的metablriger身體綁定形變(如聳肩)問題】 UE5中如何修復后處理動畫藍圖帶來的自然狀態下的metablriger身體綁定形變(如聳肩)問題

AWS Bedrock生成視頻詳解:AI視頻創作新時代已來臨

?? TL;DR: AWS Bedrock現已支持AI視頻生成功能,讓企業無需深厚AI專業知識即可創建高質量視頻內容。本文詳解Bedrock視頻生成能力的工作原理、應用場景和實操指南,助你快速掌握這一革命性技術。 ?? AWS Bedrock視頻生成:改變內容創作的游戲規則 還記得幾年前,制作一個專…

1.2 測試設計階段:打造高質量的測試用例

測試設計階段&#xff1a;打造高質量的測試用例 摘要 本文詳細介紹了軟件測試流程中的測試設計階段&#xff0c;包括測試用例設計、測試數據準備、測試環境搭建和測試方案設計等內容。通過本文&#xff0c;讀者可以系統性地了解測試設計的方法和技巧&#xff0c;掌握如何高效…