กล่องเครื่องมือเทอร์มินัลที่ทันสมัย
เครื่องมือเทอร์มินัล เชลล์ และบรรทัดคำสั่งกำหนดมาตรฐานในปี 2566
นักพัฒนาทั้งหมดใช้เทอร์มินัล สำหรับบางคน เวิร์กโฟลว์ทั้งหมดของพวกเขาคือเทอร์มินัล
โพสต์นี้แนะนำHypermodern Terminal Toolbox — เครื่องมือเทอร์มินัล เชลล์ และบรรทัดคำสั่งที่กำหนดมาตรฐานในปี 2023
คิตตี้เป็น Terminal Emulator
คิตตี้เป็นโปรแกรมจำลองเทอร์มินัลซึ่งเป็นทางเลือกแทนเทอร์มินัล GNOME, Alacritty หรือ Windows Terminal
โปรแกรมจำลองเทอร์มินัลคือโปรแกรมที่รันเทอร์มินัลของคุณ ระบบปฏิบัติการ (OS) ที่แตกต่างกันมีเทอร์มินัลอีมูเลเตอร์ที่แตกต่างกัน ไม่ว่าจะเป็นส่วนหนึ่งของระบบปฏิบัติการหรือเป็นโปรแกรมของบุคคลที่สามที่ติดตั้งได้
Kitty เป็นโปรแกรมจำลองเทอร์มินัลของบุคคลที่สามที่เร่งด้วย GPU Kitty ทำงานรวดเร็ว ปรับแต่งได้สูง และเป็นโอเพ่นซอร์ส
การกำหนดค่าเสร็จสิ้นโดยใช้kitty.conf
ไฟล์ข้อความ:
# $XDG_CONFIG_HOME/kitty/kitty.conf
font_family Operator Mono Book
font_size 14.0
scrollback_lines 2000
เคล็ดลับ — เมื่อเปลี่ยนการตั้งค่าของ Kitty ในkitty.conf
คุณจะต้องรีสตาร์ทโปรแกรม Kitty ทั้งหมด
Zsh & Prezto เป็นเชลล์
Zshเป็นเชลล์ที่เขียนด้วยภาษา Cซึ่งเป็นทางเลือกแทน Bash หรือ Fish
เชลล์เป็นส่วนต่อประสานข้อความของระบบปฏิบัติการที่ทำงานภายในเทอร์มินัล คำสั่งเชลล์ทำงานเช่นการสร้างไฟล์และเรียกใช้โปรแกรม
Zsh เป็นเชลล์โอเพ่นซอร์สที่มีฟังก์ชันการทำงานและการปรับแต่งได้มากกว่า Bash
Zsh ได้รับการกำหนดค่าโดยใช้.zshrc
ไฟล์:
# ~/.zshrc
HISTSIZE=9999
alias brew='arch -x86_64 brew'
export PATH="$HOME/dotfiles/scripts:$PATH"
คุณสมบัติของ Prezto รวมถึงการเน้นไวยากรณ์และการทำให้แท็บคำสั่งสมบูรณ์ การทำให้แท็บสมบูรณ์มีประโยชน์สำหรับการสำรวจเครื่องมือบรรทัดคำสั่งใหม่แบบโต้ตอบ
Prezto ได้รับการกำหนดค่าโดยใช้.zpreztorc
ไฟล์:
# ~/.zpreztorc
zstyle ':prezto:load' pmodule \
'environment' \
'terminal' \
'editor' \
'history' \
'directory' \
'spectrum' \
'utility' \
'completion' \
'git' \
'syntax-highlighting' \
'history-substring-search' \
'autosuggestions' \
'prompt'
Neovim เป็นโปรแกรมแก้ไขข้อความ
Neovimเป็นโปรแกรมแก้ไขข้อความที่เขียนด้วย Luaซึ่งเป็นทางเลือกแทน Vim, Nano หรือ Emacs
Neovim เป็นผู้สืบทอดยอดนิยมของ Vim ระบบนิเวศทั้งหมดของปลั๊กอิน Vim ที่เขียนด้วย Vimscript ทำงานใน Neovim นอกเหนือจากระบบนิเวศที่พลุกพล่านของปลั๊กอิน Neovim ที่เขียนด้วย Lua
Neovim ที่ได้รับการกำหนดค่าอย่างดีมีเซิร์ฟเวอร์ภาษาสำหรับการเติมข้อความอัตโนมัติ (เซิร์ฟเวอร์ภาษาเดียวกับที่มีอยู่ใน VS Code) การเน้นไวยากรณ์ด้วย Treesitter และ Telescope สำหรับการค้นหาผ่านรายการประเภทต่างๆ
การกำหนดค่า Neovim เสร็จสิ้นใน Lua — เริ่มต้นด้วยinit.lua
ไฟล์:
-- $XDG_CONFIG_HOME/nvim/init.lua
-- set size of a tab to be 4
-- vim command line `:set tabstop=2`
-- vimscript `set tabstop=2`
vim.opt.set.tabstop = 2
-- run vimscript in lua
vim.cmd([[set tabstop=2]])
-- set variable
-- vimscript `let g:zoom#statustext = 'Z'`
vim.g['zoom#statustext'] = 'Z'
เคล็ดลับ — สมัครสมาชิกสัปดาห์นี้ใน Neovimเพื่อรับจดหมายข่าวรายสัปดาห์ที่ครอบคลุมระบบนิเวศ Neovim ที่พลุกพล่าน
Tmux สำหรับเทอร์มินัลหลายเครื่อง
Tmuxเป็นเทอร์มินัลมัลติเพล็กเซอร์ที่เขียนด้วยภาษา Cซึ่งเป็นทางเลือกแทน Screen หรือการรันเทอร์มินัลในหลายหน้าต่าง
เทอร์มินัลมัลติเพล็กเซอร์ช่วยให้คุณจัดการเซสชันเทอร์มินัลหลายรายการได้ภายในหน้าต่างเดียว
Tmux ให้เซสชันแบบถาวร การจัดการหน้าต่างและบานหน้าต่างด้วยการผูกคีย์ที่ปรับแต่งได้
Tmux ใช้ลำดับชั้นของแนวคิดในการจัดการเทอร์มินัลหลายเครื่อง:
- บานหน้าต่างเป็นพื้นที่สี่เหลี่ยมภายในหน้าต่าง แต่ละบานหน้าต่างแสดงเซสชันของเทอร์มินัลแยกกัน
- หน้าต่างคือคอนเทนเนอร์แบบเต็มหน้าจอที่มีบานหน้าต่างอย่างน้อยหนึ่งบาน
- เซสชันคือชุดของหนึ่งหรือหลายหน้าต่าง
คุณสามารถเริ่มเซสชัน Tmux ใหม่ด้วยtmux new
:
# create a session named `work`
$ tmux new -s work
คุณสามารถเชื่อมต่อกับเซสชัน Tmux ที่กำลังทำงานอยู่ใหม่ได้ด้วยtmux attach
:
# reattach to last session
$ tmux attach
# reattach the session named `work`
$ tmux attach -t work
Ctrl-b c
: สร้างหน้าต่างใหม่Ctrl-b n
: สลับไปยังหน้าต่างถัดไปCtrl-b p
: สลับไปยังหน้าต่างก่อนหน้า
# ~/.tmux.conf
set -g default-terminal "screen-256color"
setw -g mode-keys vi
set -g status-left "#[fg=green,bold]Session: #S #[fg=white,bold]| #[fg=yellow,bold]Window: #W"
set-option -g prefix C-a
เอ็นเตอร์ไพรส์สำหรับพริตตี้
Starshipเป็นเชลล์พรอมต์ที่เขียนด้วย Rustซึ่งเป็นทางเลือกแทน Powerlevel10k หรือ Pure
พรอมต์คือส่วนที่ปรับแต่งได้ของบรรทัดคำสั่งที่มีบริบท เช่น ไดเร็กทอรีปัจจุบันหรือสาขา Git
Starship มอบการแจ้งเตือนที่รวดเร็วและปรับแต่งได้ การกำหนดค่าเสร็จสิ้นโดยใช้starship.toml
ไฟล์:
# $XDG_CONFIG_HOME/starship.toml
[username]
disabled = true
[hostname]
disabled = true
[git_status]
ahead = "↑"
behind = "↓"
[directory]
truncation_length = 2
Ripgrep สำหรับค้นหาข้อความ
Ripgrepเป็นตัวค้นหาไฟล์ข้อความที่เขียนด้วยภาษา Rustซึ่งเป็นทางเลือกแทน grep หรือ find
คุณลักษณะหลักของ Ripgrep คือความเร็ว ซึ่งเร็วกว่าเครื่องมือทางเลือกอื่น
การใช้งานพื้นฐานของ Ripgrep คือการค้นหารูปแบบในไดเร็กทอรี:
$ rg 'pattern' ~/project
alias g='rg -l --hidden --smart-case --line-buffered'
$ g 'some-pattern' some/directory
fzf สำหรับการค้นหาแบบคลุมเครือ
fzfเป็นตัวค้นหาแบบคลุมเครือที่เขียนด้วยภาษา Goซึ่งเป็นทางเลือกแทนการค้นหาแบบกำหนดขอบเขต
fzf ช่วยให้คุณค้นหาโดยใช้อัลกอริทึมการค้นหาแบบคลุมเครือที่จับคู่รูปแบบ regex กับข้อมูลที่ไม่สมบูรณ์ ซึ่งจะทำให้ผลการค้นหาปรากฏขึ้นขณะที่คุณพิมพ์ แม้ว่าจะสะกดผิดก็ตาม
fzf สามารถเรียกใช้เป็นโปรแกรมบรรทัดคำสั่ง:
$ fzf
# fuzzy search all files in the `work` directory
$ cat ~/work/** <TAB>
fzf สามารถใช้กับแบ็คเอนด์การค้นหาต่างๆ เช่น find, grep หรือ Ripgrep
เคล็ดลับ — ใช้ Ripgrep เป็นแบ็กเอนด์ fzf โดยตั้งค่าFZF_DEFAULT_COMMAND
ตัวแปรสภาพแวดล้อมexport FZF_DEFAULT_COMMAND='rg --files --hidden'
Exa สำหรับรายชื่อไฟล์
Exaเป็นโปรแกรมแสดงรายการไฟล์ที่เขียนขึ้นใน Rustซึ่งเป็นทางเลือกแทน ls และ tree
โปรแกรมแสดงรายการไฟล์จะแสดงรายการไฟล์และไดเร็กทอรี Exa นำเสนอคุณสมบัติต่างๆ เช่น ไอคอน การรวม Git และตัวเลือกการเรียงลำดับที่หลากหลาย
Exa มีมุมมองพื้นฐานที่แตกต่างกันเล็กน้อย:
# list as a grid
$ exa -G
bp-historical-data cities data-science-south-data predict-newspapers README.md titanic
# list each item on one line
$ exa -1
bp-historical-data
cities
data-science-south-data
predict-newspapers
README.md
titanic
# list as a table - same as `ls -l`
$ exa -l
drwxr-xr-x - adam 26 Apr 20:20 bp-historical-data
drwxr-xr-x - adam 14 Feb 16:42 cities
drwxr-xr-x - adam 26 Apr 20:25 data-science-south-data
drwxr-xr-x - adam 28 Apr 14:52 predict-newspapers
.rw-r--r-- 124 adam 29 Apr 15:20 README.md
drwxr-xr-x - adam 26 Apr 17:31 titanic
$ exa --tree --level=2
├── bp-historical-data
│ ├── __pycache__
│ ├── dashboard.py
│ ├── data
│ ├── notebooks
│ ├── README.md
│ └── requirements.txt
├── README.md
└── titanic
├── data
├── requirements.txt
├── titanic.ipynb
├── titanic.md
└── titanic.py
นามแฝงของฉันสำหรับ Exa คือ:
alias ls = 'exa --long --icons --no-permissions --no-user --git --time-style long-iso --time=modified --group-directories-first -a'
alias tree = 'exa --tree'
Bat สำหรับการดูไฟล์
Batเป็นโปรแกรมดูไฟล์ที่เขียนด้วย Rustซึ่งเป็นทางเลือกแทน cat
โปรแกรมดูไฟล์คือโปรแกรมที่แสดงเนื้อหาของไฟล์
Bat มีฟังก์ชันการทำงาน เช่น การเน้นไวยากรณ์ การรวม Git และการเพจไฟล์อัตโนมัติ
Bat ใช้โดยชี้โปรแกรมไปที่ไฟล์ข้อความ:
$ bat path/to/file
เศร้าสำหรับการแทนที่ข้อความ
Sadเป็นตัวแก้ไขสตรีมที่เขียนด้วย Rustซึ่งเป็นทางเลือกแทน sed หรือ awk
ตัวแก้ไขสตรีมดำเนินการค้นหาและแทนที่การดำเนินการกับสตรีมข้อความหรือไฟล์ข้อความ
Sad (Space Age seD) แสดงสิ่งทดแทนที่เสนอก่อนที่จะนำไปใช้ ช่วยให้คุณตรวจสอบและเลือกสิ่งทดแทนที่จะทำก่อนที่จะยอมรับ
Sad ใช้เป็นโปรแกรมบรรทัดคำสั่ง:
$ sad '<pattern>' '<replacement>'
$ cat README.md
# Data Science South Projects
Example projects for the courses at [Data Science South](https://www.datasciencesouth.com/).
$ exa -1 | sad "courses" "modules"
$ cat README.md
# Data Science South Projects
Example projects for the modules at [Data Science South](https://www.datasciencesouth.com/).
jq สำหรับการทำงานกับ JSON
jqเป็นโปรเซสเซอร์ JSON ที่เขียนด้วยภาษา Cซึ่งเป็นทางเลือกแทน fx, jp หรือประมวลผล JSON ในภาษาเช่น Python
jq ช่วยให้คุณสามารถกรอง แปลง และจัดการข้อมูล JSON ซึ่งมีประโยชน์สำหรับการทำงานกับการตอบสนองของ API ไฟล์การกำหนดค่า และที่เก็บข้อมูล
แนวคิดหลักใน jq คือตัวกรอง ซึ่งใช้กับอินพุต JSON:
$ jq 'filter_expression' input.json
.key
- แยกค่าของคีย์.[]
- แยกค่าทั้งหมดจากอาร์เรย์.[2]
- แยกค่าที่สามออกจากอาร์เรย์
# extract the `name` key
$ echo '{"name": "Alice", "data": [6, 12]}' | jq '.name'
"Alice"
# extract the second element from the `data` list
$ echo '{"name": "Alice", "data": [6, 12]}' | jq '.data[1]'
12
zoxide สำหรับการนำทาง
zoxideเป็นโปรแกรมอรรถประโยชน์การนำทางเทอร์มินัลที่เขียนด้วยภาษา Rustซึ่งเป็นทางเลือกแทน cd, pushd และ popd
zoxide ข้ามไปยังไดเร็กทอรีจากประวัติการเยี่ยมชมของคุณ โดยจะกำหนดคะแนนให้กับแต่ละไดเร็กทอรีตามความถี่และล่าสุดที่มีการเข้าชม
zoxide ใช้เป็นโปรแกรมบรรทัดคำสั่ง:
# move to a folder that best matches `code`
$ z code
Tig สำหรับการดูประวัติ Git
Tigเป็นโปรแกรมดูประวัติ Git ที่เขียนด้วยภาษา Cซึ่งเป็นทางเลือกแทนการใช้ Git CLI หรือ Lazygit
Tig จัดเตรียมส่วนต่อประสานรหัสสีที่นำทางได้สำหรับการเรียกดูประวัติการคอมมิต Git ของคุณ ช่วยให้ค้นหาคอมมิชชัน ดูกราฟคอมมิชชัน และแสดงไฟล์ ณ เวลาต่างๆ ได้
Tig ทำงานเป็นโปรแกรมบรรทัดคำสั่ง:
$ tig
direnv สำหรับการจัดการตัวแปรสภาพแวดล้อม
direnvโหลดและยกเลิกการโหลดตัวแปรสภาพแวดล้อมเชลล์ - เขียนใน Go ซึ่งเป็นทางเลือกแทนการใช้$ source .env
.
direnv โหลดและยกเลิกการโหลดตัวแปรสภาพแวดล้อมโดยอัตโนมัติเมื่อคุณนำทางระหว่างไดเร็กทอรีโครงการต่างๆ
การใช้ direnv หลีกเลี่ยงการโหลดตัวแปรสภาพแวดล้อมด้วยตนเอง และป้องกันตัวแปรสภาพแวดล้อมจากโปรเจ็กต์หนึ่งที่ตั้งค่าไว้ในอีกโปรเจ็กต์หนึ่ง
direnv ใช้.envrc
ไฟล์เพื่อเก็บตัวแปรเฉพาะสำหรับโครงการของคุณ ซึ่งรันเป็นเชลล์สคริปต์:
# .envrc
export PROJECT_NAME="alpha"
$ direnv allow .
แนวทางปฏิบัติทั่วไปคือการเลือกที่จะโหลดความลับหรือส่วนตัว.envrc
:
source_env_if_exists .envrc.secret
เคล็ดลับ — ใช้direnv exec <path> <command>
เพื่อเรียกใช้คำสั่งโดยโหลดสภาพแวดล้อมสำหรับไดเร็กทอรีเฉพาะโดยไม่ต้องไปที่ไดเร็กทอรีนั้น
Lazydocker สำหรับนักเทียบท่า
Lazydockerจัดการคอนเทนเนอร์และอิมเมจของ Dockerซึ่งเขียนด้วย Go ซึ่งเป็นทางเลือกแทน Docker Desktop หรือ Docker CLI
Lazydocker ทำให้ง่ายต่อการดู เริ่ม หยุด และลบคอนเทนเนอร์และรูปภาพผ่าน UI ของเทอร์มินัล นอกจากนี้ยังสามารถให้ภาพรวมตามเวลาจริงของสถานะคอนเทนเนอร์ บันทึก และการใช้ทรัพยากร
Lazydocker ใช้เป็นโปรแกรมบรรทัดคำสั่ง:
$ lazydocker
Markserv สำหรับการดูตัวอย่าง Markdown
Markservแสดงไฟล์ Markdown ในเบราว์เซอร์ — เขียนใน Node.js ซึ่งเป็นทางเลือกแทน Grip หรือ Markdown Preview
Markserv แสดงผล Markdown เป็น HTML แบบเรียลไทม์ โดยจะแสดงการเปลี่ยนแปลงโดยอัตโนมัติเมื่อคุณดำเนินการ
Markserv รองรับ Markdown ที่ปรุงรสด้วย GitHub ซึ่งหมายความว่าจะจัดรูปแบบบล็อคโค้ดและตารางเหมือนกับ Github Markserv นั้นยอดเยี่ยมสำหรับการดูตัวอย่างREADME.md
ไฟล์โดยไม่ต้องพุชไปที่ Github
ในการเริ่มเซิร์ฟเวอร์ Markserv บนพอร์ต 8010:
$ markserv -p 8010
Ngrok สำหรับการแบ่งปันเซิร์ฟเวอร์ภายในเครื่อง
ngrokสร้างอุโมงค์ไปยังเซิร์ฟเวอร์ภายในของคุณ — ซึ่งเขียนด้วยภาษา Go ซึ่งเป็นทางเลือกแทน Serveo, LocalTunnel หรือ PageKite
ngrok เปิดเผยเซิร์ฟเวอร์ภายในที่อยู่เบื้องหลัง NAT หรือไฟร์วอลล์ไปยังอินเทอร์เน็ต สิ่งนี้มีประโยชน์สำหรับการแบ่งปันเซิร์ฟเวอร์การพัฒนากับทีมของคุณ
คุณสามารถเริ่มอุโมงค์ไปยังพอร์ต 8000 ได้โดยเรียกใช้:
$ ngrok http 8000
สรุป
กล่องเครื่องมือเทอร์มินัลไฮเปอร์โมเดิร์นคือ:
- คิตตี้สำหรับ GPU ที่เร่งความเร็ว เทอร์มินัลที่ปรับแต่งได้สูง
- Zshสำหรับเชลล์ & Preztoสำหรับการกำหนดค่า Zsh
- Neovimเป็นโปรแกรมแก้ไขข้อความ
- Tmuxสำหรับจัดการเทอร์มินัลหลายเครื่อง
- เอ็นเตอร์ไพรส์สำหรับพรอมต์สวย
- Ripgrepสำหรับค้นหาไฟล์ข้อความ
- fzfสำหรับการค้นหาแบบคลุมเครือ
- Exaสำหรับรายชื่อไฟล์
- แบตสำหรับดูไฟล์
- เศร้าสำหรับการค้นหาและแทนที่ในไฟล์ข้อความ
- jqสำหรับการทำงานกับ JSON
- zoxideสำหรับการนำทาง
- Tigสำหรับการดูประวัติ Git
- direnvสำหรับการจัดการตัวแปรสภาพแวดล้อม
- Lazydockerสำหรับนักเทียบท่า
- Markservสำหรับดูตัวอย่าง Markdown
- ngrokสำหรับการเปิดเผยเซิร์ฟเวอร์ท้องถิ่นกับอินเทอร์เน็ต
เรียนรู้ทีละเครื่องมืออย่างต่อเนื่องเพื่อเป็นเทอร์มินัลมาสเตอร์
เผยแพร่ครั้งแรกที่https://www.datasciencesouth.com
เพิ่มระดับการเข้ารหัส
ขอบคุณที่เป็นส่วนหนึ่งของชุมชนของเรา! ก่อนที่คุณจะไป:
- ปรบมือให้กับเรื่องราวและติดตามผู้เขียน
- ดูเนื้อหาเพิ่มเติมในสิ่งพิมพ์ Level Up Coding
- หลักสูตรสัมภาษณ์การเข้ารหัสฟรี ⇒ ดูหลักสูตร
- ติดตามเรา: Twitter | LinkedIn | จดหมายข่าว