Sơ lược về cách Emacs làm việc với buffer/file
Buffer nói 1 cách dễ hiểu là 1 tệp ảo (không cần)/(chưa được)/(đã được) lưu thành 1 tệp. Đối tượng mà emacs làm việc là buffer. Khi mở 1 file trong emacs, emacs sẽ mở file đó vào 1 buffer cùng tên hoặc tên sẽ được đi kèm với thư mục cha khác nhau để phân biệt nếu mở file trùng tên.
Mỗi buffer sẽ đi kèm với 1 biến local là default-directory
. Biến này sẽ cho chúng ta biết ta đang ở đâu, nó giống như cd
vào default-directory
rồi mở file.
Biến local này rất quan trọng, nó là thư mục ngầm định cho các câu lệnh mà mình sẽ thực hiện. Ví dụ:
-
M-x shell-commmand
->touch ABC
thì sẽ tạo ra file ABC ởdefault-directory
-
M-x find-grep
hayM-x grep
sẽ tìm kiếm trên thư mục này -
M-x compile
sẽ chạy function trên thư mục này
Chúng ta có thể thay đôỉ biến local này trên mỗi buffer bằng M-x cd
.
Các phạm vi mà mình định nghĩa
Giả sử chúng ta gọi base_dir
để chỉ thư mục đang đứng ở đó để chạy các function.
Trong quá trình sử dụng, mình nhận thấy rằng mình cần có 3 nhóm phạm vi lúc tương tác với file
-
Phạm vi thư mục hiện hành => chính là dùng
default-directory
làmbase_dir
như emacs mặc định sử dụng. -
Phạm vi thư mục project => Tức là sử dụng thư mục project làm
base_dir
-
Pham vi thư mục khác => Tức mình sẽ chỉ định chính xác thư mục nào sẽ được làm
base_dir
Với việc làm rõ như này, mình rất linh động khi sử dụng các function trên thư mục mà mình mong muốn. Vừa hiệu quả mà lại còn tốc độ thì nhanh khủng khiếp mà không cần dùng chuột =))
Phạm vi thư mục hiện hành
Cái này cơ bản nhất. Khi muôn thực hiện các function CHỈ ở trong thư mục hiện hành. Mình thường sử dụng các funcion như: find-file, ripgrep, compile, find-grep
Phạm vi thư mục project
Khi làm việc với 1 project. Mình thường sử dụng các function sau
-
project-find-file
-> Tìm file trong project -
project-consult-ripgrep
-> Tìm pattern trong project (src) -
project-compile
-> Biên dịch trong project như chạymake build
-
magit
-> Mở git -
…
Phạm vi thư mục khác
Trong trường hợp mình cần chạy function nào đó ở 1 thư mục không phải là thư mục hiện tại và cũng không phải là thư mục của project nào cả. Thì đây là pham vi thư mục khác
Ví dụ chạy ripgrep
ở 1 thư mục khác như /usr/share/emacs/site-lisp
Mình sẽ sử dụng M-x find-file
-> /usr/share/emacs/site-lisp
-> chạy embark-act -> embark-chroot và chạy function mà mình muốn