LinFAQ
313 subscribers
23 photos
4 videos
3 files
54 links
GNU/Linux FAQ

Advertise : @LinAdvertise

By @LinAcademy
Download Telegram
#روزی_یک_نکته با دلاتو

دسته‌بندی: #آموزشی #کاربردی

یه سری دستور برای جستجو و نصب و حذف راحت تر پکیج ها داخل پکمن با کمک
fzf
(فقط چون با fzf ردیف شدن جای alias باید با function ردیفشون کرد):

https://wiki.archlinux.org/title/fzf

https://wiki.archlinux.org/title/pacman/Tips_and_tricks#Browsing_packages

🔅@LinFAQ
🔅@LinAcademy
#روزی_یک_نکته با دلاتو

دسته‌بندی: #آموزشی #کاربردی

راجب statusline و احتمالا چند تا مورد دیگه داخل (نئو)ویم:

همونطور که میدونید
ویم (vim)
و
نئوویم (nvim)

وقتی laststaus روی مقدار 2 یا 3 باشه یه statusline رو پایین صفحه نمایش میدن.
به صورت پیش فرض (بدون هیچ کانفیگ و پلاگینی)

این statusline اطلاعات نسبتا زیادی شامل فایل و مسیر، فلگ ها مثل read only، وضعیت فایل که ویرایش شده یا نه، خطی که روش هستیم و... رو نمایش میده.
خب برای شخصی سازیش میشه تو 40/50 لاین یه استیتوس لاین کامل تر ساخت یا یه پلاگین نصب کرد یا هزار راه دیگه.
نحوه ساختش هم اینطوری هست که میگیم

set statusline=something

و بعد مقادیر رو در ادامش اضافه میکنیم، اگه بخوایم موردی رو هم به statusline موجود اضافه کنیم از
=+
به جای
=

استفاده میکنیم، داخل لوا هم وضعیت کم و بیش همینه:
vim.o.statusline = 'something'
vim.o.statusline = vim.o.statusline .. 'something'


خب یه سوالی پیش میاد:
اگه بخوایم statusline دیفالت رو نگه داریم و یکی 2 آپشن بهش اضافه کنیم نمیتونیم از همین شیوه بالا پیش بریم و فقط مقدار دهی اولیه رو انجام ندیم؟
مثلا بخوایم شماره بافر رو به statusline مون اضافه کنیم ولی بقیش دیفالت بمونه نمیتونیم از

vim.o.statusline = vim.o.statusline .. ' %n'

استفاده کنیم؟
و نکته امروز به اینجا ختم میشه که جواب خیلی شیک و مجلسی "نه" هست، ظاهرا هیچ مقدار دهی اولیه ای برای statusline وجود نداره و بعد انجام دستور بالا
(در صورتی که پلاگین یا کانفیگی برای statusline انجام نداده باشید)

تنها چیزی که داخل statusline میبینید شماره بافر فعلی هست.

🔅@LinFAQ
🔅@LinAcademy
👍1
#روزی_یک_نکته (این سری) با mohammad.b

دسته‌بندی: #آموزشی #کاربردی

برای نوشتن استرینگ چند خطی داخل bash

یک فایل temp میسازه و محتوای بین بلاکو توش میذاره و میده به برنامه مثل:

cat <<test_multistring
hi world
test
test_multistring

معادل:
echo -e "hi world\ntest" > /tmp/test.txt

cat /tmp/test.txt && rm /tmp/test.txt


و بلاک اخرش(توی اینجا test_multistring) here doc ها باید بدون space/tab باشه.

source

🔅@LinFAQ
🔅@LinAcademy
#روزی_یک_نکته با دلاتو (با تغییر)

#آموزشی #کاربردی
بعد نصب دوبار توزیع ارچ در یک روز داشتم و دیدم برای کسی دیگه هم پیش اومده که فولدر های
Downloads
Desktop
Music
و...
ساخته نمیشه فک میکردم باگی چیزی باشه ولی خب نفهمیدم آخر برای چیه ولی خب دلاتو این پکیج معرفی کرد

xdg-user-dirs

که با این دستور

xdg-user-dirs-update

کار می‌کنه طبیعتا دستی هم اجرا میشه ولی باید
داخل این مسیر

~/.config/user-dirs.dirs

به این صورت وارد کنی

XDG_DESKTOP_DIR="$HOME/Desktop"
XDG_DOCUMENTS_DIR="$HOME/Documents"
XDG_DOWNLOAD_DIR="$HOME/Downloads"
XDG_MUSIC_DIR="$HOME/Music"
XDG_PICTURES_DIR="$HOME/Pictures"
XDG_PUBLICSHARE_DIR="$HOME/Public"
XDG_TEMPLATES_DIR="$HOME/Templates"
XDG_VIDEOS_DIR="$HOME/Videos"

یه سری فایل کانفیگ با محتوای خاص میسازه که محتوای یکی از اون فایلا تعیین میکنه چه دایرکتوری هایی با چه نام هایی ساخته بشه.
به صورت کلی صرفا با نصب پکیج و ریست سیستم، خودش بقیه چیز هارو ردیف میکنه.
و اگه پکیج نصب بود و بعد ریست سیستم فایل کانفیگ و در نتیجه یوزر دایرکتوری ها درست نشد، چک کنید ببینید سرویسش فعال هست یا نه.


برای خود من که با دستور

xdg-user-dirs-update

درست شد

لینک ویکی ارچ : source

🔅@LinFAQ
🔅@LinAcademy
#روزی_یک_نکته با mohammad.b

دسته‌بندی: #آموزشی #کاربردی

عکس توی ترمینال
نمیشه بشه هم چیز خوبی در نمیاد (یکم پیچیده میشه و باید ترمینالت ساپورت کنه) چون ترمینالا فقط کاراکتر میشناسن (ascii, unicode)
پس چطور این ابزارا مثل
libsixel
icat
ueberzug
کار میکنن:
libsixel
icat (kitty):
یک پروتکل خاص دارن و میان از

control characters

استفاده میکنن. بعد ترمینالت وقتی فلان کنترل کاراکتر رو میگیره میفهمه این عکسه و فلان پیکسلارو فلان جا باید یه رنگی بکنه برای همین برای این دوتا باید ترمینالت ساپورت کنه.
ueberzug (rip):
میاد مستقیم به X server میگه یک پنجره توی x, y ترمینالت بسازه و عکسو توش بزار برای همینم نیازی به ساپورت ترمینالت نداره

Source

توضیح سایت kitty راجبش

🔅@LinFAQ
🔅@LinAcademy
🔥2
#روزی_یک_نکته با دلاتو

دسته‌بندی: #آموزشی #کاربردی

راجب فرق
mapleader

maplocalleader

خب میدونیم داخل (نئو)ویم leader به صورت دیفالت backslash هست و میشه تغییرش داد، 2 گزینه پیش میاد:
mapleader و maplocalleader،

که ظاهرا گزینه دوم (maplocalleader) برای کی بایند هایی هست که به بافر محدود هستن.
ظاهرا برای filetype plugin ها اگه کی بایندی بخوان ردیف کنن که از leader استفاده میکنه، پیشنهاد میشه از مقدار localleader براش استفاده کنن.

اطلاعات بیشتر:

mapleader

maplocalleader


🔅@LinFAQ
🔅@LinAcademy
👍1
#روزی_یک_نکته با دلاتو

دسته‌بندی: #آموزشی #کاربردی #neovim

راجب ذخیره مکان cursor داخل نئوویم:

یه فیچری که دیفالت داخل ویم وجود داره اما نئوویم نه،
ذخیره کردن مکان cursor هست که اجازه میده بعد از خروج از فایل و ورود دوباره بهش مکان cursor به آخرین جایی که بوده برگرده.
داخل help نئوویم اگه سرچ کنید restore-cursor یه دستور برای حلش گفته، اما با vimscript هست.
برای همین از vim.cmd استفاده کردم تا بتونم مستقیم داخل init.lua قرارش بدم که نتیجه این شد:


-- :h restore-cursor: {{{
vim.cmd([[
autocmd BufRead * autocmd FileType <buffer> ++once
\ if &ft !~# 'commit\|rebase' && line("'\"") > 1 && line("'\"") <= line("$") | exe 'normal! g
"' | endif
]])
-- }}}

در مورد این که چرا این فیچر به صورت پیش فرض داخل نئوویم نیست و همینطور معادل هایی که به جای قرار دادن vimscript داخل vim.cmd، کامل از لوا استفاده کردن میتونید لینک زیر رو چک کنید:
https://github.com/neovim/neovim/issues/16339

یه بحثی هم راجب عملکرد و بهینه شدن این روش تو گروه شد آخرش به این نتیجه رسیدیم.

vim.api.nvim_create_autocmd({ "BufReadPost" }, {
pattern = { "*" },
callback = function()
vim.api.nvim_exec('silent! normal! g`"zv', false)
end,
})


روش دوم ایده پاکروح بود.
روش اول دلاتو

(پست ادیت شد)

🔅@LinFAQ
🔅@LinAcademy
👍1
#داستان_های_FOSS

دسته‌بندی: #داستان #آموزشی

این قسمت نحوه آشنا شدن دلاتو با
#neovim

پارت 1:
سوییچ به ویم ):
این سری قراره یکم متفاوت باشه

(حدود 2 هفته ای هست که پدرم از دنیا رفته و وقت نکردم برم پشت سیستم و خب دارم یه چیزی مینویسم که کم کم برگردم سراغ نکات)


و قضیه راجب وقتی هست که اومدم سراغ (نئو)ویم:
تا این که سراغ vscode رفتم رو میرم جلو، یعنی میرم زمانی که از netbeans به eclipse به intellij به vscode سوییچ کردم (دلیل سوییچم به vscode ساپورت از چندین زبان و سرعت بیشترش نسبت به intellij بود).

بعد از اون اومدم لینوکس، بعد وارد گروه لین اسک و لین چت شدم.

این تایمی که میگم manjaro xfce داشتم با vscode.
همه چیز با vscode اوکی بود، دیدم یه سری از دوستان یه ادیتور دارن که ظاهرش خیلی ساده هست و عجیب میزد برام (اون موقع کانفیگ های آماده ای مثل lunarvim یا اصلا init.lua و... نبود و ظاهر پلاگین ها خیلی ساده تر و ابتدایی تر بود)، میپرسیدم "چی هست؟" و میگفتن "vim".
خب از یه طرف کنجکاو شده بودم و از یه طرف فکر میکردم ممکنه ویم امکاناتی که میخوام رو نداشته باشه یا...

(البته بگم این موقعی که میگم و حتی الان خیلی توی برنامه نویسی شاخ نبودم... کارم حتی الان هم با ابزاری به سادگی notepad راه میفته)


مرتب توی گروه نظر سنجی میذاشتم و ادیتور هارو میپرسیدم، ظاهری که ویم
(اون موقع رو نمیشه با الان در مورد ظاهر مقایسه کرد)

داشت باعث میشد به این که برام مناسب باشه شک کنم، از طرفی یه سری از دوستان ازش استفاده میکردن و واقعا راجبش کنجکاو بودم.
طی یه سری سوال پرسش ها یه کانفیگ آماده (تنها کانفیگ آماده محبوب اون موقع بود فکر کنم) spacevim رو پیدا کردم و طبق مراحل پیش رفتم و روی توزیعم ردیفش کردم، یه فایل رو باهاش باز کردم و دیدم حتی نمیتونم درست تایپ کنم
(قضیه normal mode و...)

ترمینال رو بستم و کلا بیخیالش شدم.
به مرور راجب mode ها از دوستان سوال کردم و یه چیزایی فهمیدم

(و سوییچ بین

hjkl


insert mode

و
normal mode
و نحوه سیو یا خروج از ادیتور)


اما بازم سراغ ویم نرفتم.
حدود 6 ماه بعد سوییچ به لینوکس سعی کردم distro hop کنم، اما آخرش دست از پا دراز تر برگشتم manjaro xfce

(میخواستم kde بزنم که قابلیت شخصی سازیش بالاست اما خب با سیستمم خیلی سازگاری نداشت. گفتم چون نتونستم سراغ قابل کانفیگ ترین دسکتاپ برم، میرم سراغ قابل کانفیگ ترین ویندو منیجر: awesome).


دیدم راحت ترین ابزاری که اینجا میشه باز کرد ترمیناله (super enter) که یه جورایی عادت ایجاد میکنه که ناخواسته مرتب ترمینال باز کنی، همین باعث شد بیشتر راجب ترمینال و ابزار های تحت ترمینال و در نتیجه vim فکر کنم، مخصوصا وقتی وارد مسیری میشدم و میخواستم فایلی رو برای ویرایش باز کنم (مخصوصا کانفیگ awesome) و vscode برای این کار واقعا رو مخ بود

(
loading time
و این که باید دستی مسیر رو عوض میکردم و این که اصلا رابطش و منو ها و... به ویندو منیجر نمیومد و...).


در نتیجه کم کم برای ویرایش فایل ها به خصوص کانفیگ awesome شروع کردم به استفاده از ویم با کانفیگ دیفالتش...

🔅@LinAsk
🔅@LinAcademy
2
LinFAQ
این قسمت نحوه آشنا شدن دلاتو با
#neovim

پارت 1:
#داستان_های_FOSS

دسته‌بندی: #داستان #آموزشی

پارت 2:
راجب آشناییم با (نئو)ویم و یادگیری نحوه کار با (نئو)ویم):

خب تو پارت 1 به اینجا رسیدیم که کم کم اومدم سراغ استفاده از ویم، ولی خیلی محدود بود و همونطور که قبل تر گفتم در حد hjkl و i/esc و wq میدونستم، ولی همین برای ویرایش متن کافی بود، هر وقت کی بایندی نیاز داشتم مثل undo یا redo میرفتم توی اینترنت سرچش میکردم، اما هنوز سراغ کانفیگش نیومدم، البته که یادگیریش اثر منفی ای نداشت، به 2 دلیل:
1- اون موقع فقط برای ویرایش فایل های کانفیگ ازش استفاده میکردم پس فیچر خاصی نیاز نداشتم و
2- کی بایند ها رو به مرور و با سرچ هر وقت که نیاز میشد یاد میگرفتم، در نتیجه زمان خاصی نمیبرد.
کم کم حس کردم که "اوکی، راحت میتونم از ویم استفاده کنم و با کی بایند هاش در حد نیاز راحت هستم، حالا میخوام برم سراغ کانفیگ کردنش"،
تقریبا همون موقع ها هومان (نمیدونم میشناسینش یا نه) راجب کانفیگ (نئو)ویم یه ویدئویی ردیف کرد و...
(اون موقع نه init.lua بود و حتی کانفیگ با لوا هم رایج نبود، در نتیجه خیلی ویم و نئوویم از نظر کانفیگ فرق خاصی نداشتن و تقریبا کل کانفیگ یکیشون با کپی پیست رو اون یکی جواب بود)

علاوه بر این، ویدئو how to configure vim like vscode از ben awad و ویدئو های chris@machine راجب کانفیگ (نئو)ویم خیلی محبوب شده بودن، با دیدن این منابع و یه سری سوال پرسش راجب فرق ویم و نئوویم، از ویم به نئوویم سوییچ کردم و شروع کردم به کانفیگش.
البته که حتی اون موقع هم هنوز کانفیگ آماده درست و حسابی ای نبود و منم تحت تاثیر اون ویدئو هایی که دیدم تا میشد پلاگین اضافه کردم و در نتیجه هم loading time ش در حد vscode بالا رفت و هم یه سری مسائل (مثل indent) رو هر کاری میکردم درست عمل نمیکرد
(اما خب به لطف همون COC (منظورم clash of clans نیست P:) تونستم راحت چند تا پروژه مزخرف از تر مزخرف برای درس های دانشگاهم با cpp بزنم که خب یعنی مفید بود).

این موقع هم هنوز builtin lsp و حتی فکر کنم init.lua نیومده بودن.
یه مدت کانفیگم رو بررسی و تست کردم و هر جوری سعی کردم نتونستم با سرعت load و پیروی نکردن ادیتور از تنظیمات indent ام کنار بیام، در نتیجه کل کانفیگ رو فرستادم روی گیت هاب و شروع کردم به کانفیگ نئوویم از صفر بدون پلاگین...

🔅@LinAsk
🔅@LinAcademy
1
#داستان_های_FOSS

دسته‌بندی: #داستان #آموزشی

پارت 3.1 :
راجب آشناییم با (نئو)ویم (پارت 3: بازنویسی کانفیگم و فیچر های جدید نئوویم)

موقع نوشتن این متن استفاده کردن یا نکردن از پلاگین فرق خاصی روی سرعت ایجاد نمیکنه و پلاگین های جدید امکانات زیادی دارن، تنها دلیلی که هنوز سراغ پلاگین ها نرفتم این هست که

1- کانفیگ کردن نئوویم بدون پلاگین نسبتا متفاوته
2- حتی بدون پلاگین هم میشه امکانات زیادی در حد debugger و completion و ظاهر بهتر statusline و... رو به نئوویم اضافه کرد):
خب تو پارت قبل (2) به اونجایی رسیدیم که کانفیگم رو فرستادم گیت هاب و شروع کردم به بازنویسی کانفیگ نئوویم اما بدون پلاگین، اول فقط در حد ست کردن line number و tabstop و save cursor position بود، بعد کم کم شروع کردم به اضافه کردن فیچر هایی مثل تغییر رنگ استیتوس بار موقع سوییچ بین نرمال مد و اینزرت مد و آشنایی با x mode
(داخل اینزرت مد ctrl x رو بزنید میبینیدش)،

بعد از اون هم شروع کردم به تغییر یه سری highlight ها و تحقیق راجب نحوه کانفیگ statusline
(چند تا مقاله راجبش خوندم)

که در نتیجه یکم کانفیگش کردم و یه سری از مد ها رو داخل استیتوس لاین نمایش میداد.
تقریبا همین موقع ها init.lua و builtin lsp اومده بودن، اما بخاطر عدم آشنایی کافی با نحوه کانفیگ نئوویم با لوا و نبود داکیومنت های زیاد راجبش و تازه بودن builtin lsp
(البته که هنوزم سراغ lsp نرفتم)

سراغشون نرفتم، جدای از اون مهم ترین بخش کانفیگم که استیتوس لاین بود چون کل مد ها (مخصوصا term) رو نمایش نمیداد، اگه به اون مد ها سوییچ میکردم کلا ارور میداد و میرفت استیتوس بار دیفالت، و دیگه حال و حوصله درست کردن و کامل کردن امکانات استیتوس بار
(صرفا mode و path و file type رو نمایش میداد)

رو نداشتم.
کلا کانفیگ نصفه رو گذاشتم کنار، بعد یه مدت که یوتیوبر ها شروع کردن به بازنویسی کانفیگشون به لوا، با دیدن کانفیگ های نمونه یکم از کانفیگ با لوا سر در آوردم و بعد از چند وقت یه کانفیگ نئوویم از صفر با init.lua ردیف کردم، البته خیلی ساده و در حد چند تا set و keybind بود، به همون قانع شدم چون برام کافی بود و دیگه ادامش ندادم.
اول تابستون یه گندی زدم و بعدش توفیق اجباری شد و سوییچ کردم به آرچ، کانفیگ قبلیم رو برگردوندم و برای این که یکم فعالیت علمیم رو بیشتر کنم شروع کردم به کانفیگ دوباره ابزار ها و همینطور گفتن نکاتی که هر روز بدست میارم داخل لینچت
(که #روزی_یک_نکته با دلاتو ایجاد شدن)،

آخرین تغییری که تا موقع نوشتن این متن داخل کانفیگم ایجاد شده بود اضافه کردن دوباره restore-cursor اما این بار داخل init.lua بود که یه نکته هم راجبش نوشتم، اما به 5 روز نکشید که پدرم از دنیا رفت
(تقریبا همین موقع ها، دقیق یادم نیست اما یکی 2 روز قبل یا بعد این ماجرا linux dabbler ویدئویی با اسم pluginless neovim رو داخل یوتیوب قرار داد)،

از خونه خارج شدیم تا حال و هوامون عوض بشه و خب دیگه نرسیدم کانفیگ کنم، اما برای این که بتونم توی لحظه زندگی کنم بعد از چند روز شروع کردم به خوندن مقاله های مختلف و...
فهمیدم امکانات عجیب و زیاد دیگه ای رو نئوویم بدون پلاگین داره که ازش خبر نداشتم، مثل دیباگر که از gdb استفاده میکنه، ctags که برای go to definition و... مناسبه، کامند make که برای کامپایل و سوییچ بین ارور های موقع کامپایل از داخل (نئو)ویم مناسبه و...
(2 مورد آخر رو از ویدئو How to Do 90% of What Plugins Do (With Just Vim) متوجه شدم)،

همینطور بیشتر راجب کانفیگ استیتوس بار با لوا تحقیق کردم
(دقیق تر بگم اون ویدئو linux dabbler بیشتر توضیح رو داد)



🔅@LinFAQ
🔅@LinAcademy
1
LinFAQ
پارت 3.1 :
ادامه پارت قبل

پارت 3.2 :
اما خب هنوز پشت سیستم نرفتم که تستشون کنم تا بتونم نکته ای راجبشون بگم، رسیدیم زمان نوشتن این متن.
این که کسی به ویم سوییچ کنه یا نه، با پلاگین یا بدون پلاگین کانفیگش کنه و... انتخاب خودشه، اینطوری نیست که بتونم بگم "باید همه از ویم یا ایمکس یا... استفاده کنن"، بنظرم هم این که برای یکی دلیل بیارم که چرا باید به (نئو)ویم یا... سوییچ کنه، خیلی کار موثر یا مفید یا جالبی نیست، چون
1- انگار دارم نگاه و دلایل خودم رو که ممکنه برای اون شخص صدق نکنه استفاده میکنم و
2- در نهایت ویم ویرایشگر متن نسبتا متفاوت تری هست و اگه شخص انگیزه ای برای یادگیری و کانفیگش نداشته باشه، با مسائلی که براش پیش میاد (تنها جمله ای که مناسب این موقعیت پیدا کردم:) فقط روی اعصاب خودش و بقیه میره.
پس به جای آوردن دلیل، تجربه خودم و دلیل سوییچم بهش و این که چه پروسه ای رو برای یادگیری و کانفیگ ابزار طی کردم، بهترین توضیحیه که میتونم برای
1- شخص خودش بتونه تشخیص بده که (نئو)ویم مناسبش هست یا نه و 2- ارزش وقتش رو داره یا اصلا چقدر زمان میگیره، ارائه بدم.
در انتها اگه این مطلب براتون مفید بود و دلتون خواست، لطفا برای شادی روح یحیی تجری فرزند حسین یه فاتحه بخونید.

🔅@LinFAQ
🔅@LinAcademy
🙏1
#روزی_یک_نکته با دلاتو
دسته‌بندی: #آموزشی #کاربردی
راجب ctags (پیش زمینه نکته بعدی):

اول چند گام قبل تر رو توضیح بدم: ctags یه ابزاری هست که... ویکی پدیا رو بخونید بهتره، اینجا بخشی که باهاش کار داریم یکی از کاربرد هاشه (بقیه رو نمیدونم، میتونید ویکی پدیا رو چک کنید) برای completion داخل ویرایشگر های متن هست. ctags زبان های مختلفی رو هم ساپورت میکنه.
در کل به عنوان یه نمونه ساده و با نصب راحت جهت completion بهش نگاه کنید که تنها بخش رو مخش ساخت فایل tags هست.
نحوه نصب داخل توزیعات آرچ بیس:
sudo pacman -S ctags
و احتمالا توی توزیعات دیگه هم با اسم مشابه هست.

بعد داخل دایرکتوری ای که پروژه تون هست دستور
ctags -R
رو اجرا میکنید (که اون R برای recursive عه) و فایل tags ساخته میشه.

🔅@LinFAQ
🔅@LinAcademy
👍1
LinFAQ
پیش زمینه نکته بعدی
#روزی_یک_نکته با دلاتو

دسته‌بندی: #آموزشی #کاربردی

راجب نمایش template ها موقع completion با ctags داخل (نئو)ویم:

بحث اصلی امروز از اینجاست: حالا داخل (نئو)ویم داخل insert mode با کی بایند

ctrl-x ctrl-j


لیست suggestion هایی که ctags ارائه میده رو ببینید
(اگه رو مخه کی بایندش، راحت میتونید به هر چیزی خواستید map ش کنید:
vim.keymap.set('i', '<C-]>', '<C-X><C-]>')
مثال برای لوا).


بعد آپشن showfulltag رو از طریق
:set showfulltag
فعال کنید.
دوباره از داخل insert mode بیاید suggestion ها رو چک کنید و با حالت قبل مقایسه کنید
(تصاویری که دادم تفاوتشون قبل و بعد ست کردن showfulltag هست).


ظاهرا امروز 2 نکته شد P:

در انتها اگه این مطلب براتون مفید بود و دلتون خواست، لطفا برای شادی روح یحیی تجری فرزند حسین یه فاتحه بخونید.

🔅@LinFAQ
🔅@LinAcademy
👍2
#روزی_یک_نکته با دلاتو

دسته‌بندی: #آموزشی #کاربردی #emacs

راجب دووم آوردن داخل ایمکس تو روز اول، پارت اول:
برای اجرا از دستور زیر استفاده کردم:
emacsclient -c -e '(eshell)' -a ''
توضیحش: اون emacsclient برای اجرای ایمکس به صورت daemon/ client هست که خب مزایاش مثل کاهش زمان لود رو میدونید؛ فلگ بعدی برای اجرای برنامه داخل یه پنجره گرافیکی جدا، بعدی برای اجرای دستور داخل quote ها، که میگه eshell رو اجرا کنه
(انگار bash ای هست که lisp رو میفهمه؟ شاید دارم عالی بیانش نمیکنم، سرچ کنید منبع راجب توضیحش زیاده)؛

اون فلگ بعدی که آخرین فلگه برای اینه که اگه emacsclient نتونست اجرا بشه
(مثلا daemon ران نباشه)

چی کار کنه، اگه مقدار بین quote ها رو خالی بذاریم اول میاد سعی میکنه daemon رو اجرا کنه و بعد دوباره تلاش کنه.

خب حالا وارد ایمکس شدید، یه صفحه سفید با یه منویی که هیچی نمیشه ازش فهمید و کی بایند هایی که موفق باشید بفهمیدشون، اما نکته مثبت: با اون دستور طومار وار بالا الان یه شل تو دسترس دارید و راحت میتونید به هر جایی خواستید cd کنید یا...، صرفا 2 دستور رو حضور ذهن داشته باشید:
find-file <filename>
رو هر فایلی بزنید اون رو از داخل emacs باز میکنه، اگه وجود نداشته باشه dired رو باز میکنه.
dired
که ظاهرا فایل منیجر ایمکس هست رو باز میکنه.

🔅@LinFAQ
🔅@LinAcademy
👍2
#روزی_یک_نکته با دلاتو

دسته‌بندی: #کاربردی #آموزشی #emacs

راجب دووم آوردن داخل ایمکس تو روز اول، پارت دوم:
گام بعدی و واجب برای بقا در این محیط خشن، رسیدن به آتش برای تامین غ... منظورم اینه کی بایند هاست، خب لیست از کی بایند هایی که نیازم شد رو سعی میکنم این وسط جا بدم
(M منظور alt و C منظور ctrl هست، پس C-a مثلا یعنی ctrl a):

رفتن به ابتدای لاین: C-a
رفتن به انتهای لاین: C-e
مشابه visual mode برای انتخاب: C-SPC
(منظور از SPC همون space هست).

کات کردن: C-w
کپی کردن: C-W
پیست کردن: C-y
جا به جایی مشابه hjkl داخل متن:
C-b, C-n, C-p, C-f
جا به جایی به یک کلمه بعد یا قبل:
M-b, M-f
سرچ از مکان فعلی کرسر تا انتهای فایل: C-s
سرچ از مکان فعلی کرسر تا ابتدای فایل: C-r
مشابه command mode داخل ویم: M-x
برای help موارد مختلف: C-h
سیو کردن: C-x C-s
خروج: C-x C-c
برای سوییچ بین بافر ها
(همون eshell ای که اول باز کردید یکیشونه):

C-x b
بستن بافر: C-x k
ایجاد split:
C-x 2, C-x 3
برای سوییچ بین split ها: C-x o
بستن سایر split ها: C-x 1
بستن split فعلی: C-x 0
برای undo و redo کردن: C-x u
(برای redo باید undo رو undo کنید P:)
برای تغییر زوم، اول C-x میزنید، بعد با موارد زیر زوم رو کم و زیاد میکنید:
C-=, C--
برای حذف کاراکتر: C-d
برای حذف کلمه: M-d
برای حذف از مکان فعلی کرسر تا انتهای لاین: C-k
برای رفتن به ابتدا و انتهای فایل:
M->, M-<
فکر کنم این کی بایند ها برای دووم آوردن داخل ایمکس برای روز اول کافی باشن.

اضافه کنم: اگه درست یادم باشه
(تست نکردم)

میشه با C-u و بعد عدد کی بایند ها رو تکرار کرد، مثلا:
C-u 3 M-f
3 کلمه کرسر رو به جلو حرکت میده.

در انتها اگه این مطلب براتون مفید بود و دلتون خواست، لطفا برای شادی روح یحیی تجری فرزند حسین یه فاتحه بخونید.

🔅@LinFAQ
🔅@LinAcademy
👍31
#روزی_یک_نکته این قسمت با خودم (رضا)

دسته‌بندی: #کاربردی #آموزشی #wayland

میخواستم یه اسکرین شات بگیرم ولی از اونجایی که لپتاپ به مانیتور وصل بود از جفت صفحه ها اسکرین شات میگرفت
و چون از sway wm استفاده میکنم
(ویلند عه)

و تنها ابزاری که میشناختم اسکرین شات بگیره grim بود

رفتم دنبالش ببینم باید چیکار کنم تا با موس قسمتی که select میکنم اسکرین شات بگیره
که با Slurp آشنا شدم احتمالا خیلی هاتون میدونید چیه و یا کار هم کردید باهاش ولی ،
یه سری آپشن ها داره که منطقه ای که select می‌کنی رو مختصات اون مکان رو میگه و یا به عنوان color picker هم میتونید استفاده کنید و خیلی کارهای دیگه

و خب معلومه باید این ابزار رو داخل grim استفاده کنیم
برای مثال
grim -g "$(slurp)"
و خب میتونیم بیشتر دسترسی کاستوم کردن تو فایل نهایی عکس داشته باشیم
مثلا کامند زیر از مانیتور فوکوس شده میگیره
(همونی که الان آیکون موس روشه و پنجره ها فعال)


grim -o $(swaymsg -t get_outputs | jq -r '.[] | select(.focused) | .name')
یا مثال دیگه با این کامند با استفاده از
image magick
کار
Color picker
انجام میدیم

grim -g "$(slurp -p)" -t ppm - | convert - -format '%[pixel:p{0,0}]' txt:-

Source
نکته: jq رو یادتون نره نصب کنید

🔅@LinFAQ
🔅@LinAcademy
#روزی_یک_نکته با دلاتو

دسته‌بندی: #کاربردی #آموزشی

راجب وارد کردن محتوای چند فایل به stdin:
بعضی مواقع یه اسکریپت یا دستوری دارید (مثل دستور
sudo pacman -Syu --needed - < packages.txt
که داخل یکی از نکات قبلی بیان شد) و نیازه که به جای یه فایل، چند فایل رو به عنوان ورودی بهش بدید
(تو همین مورد بالا به عنوان مثال بخواید لیست پکیج هاتون رو داخل فایل های مختلف قرار بدید و دسته بندی کنید).

اولین چیزی که به ذهن میرسه اینه که شخص کل اون فایل ها رو پشت هم لیست کنه، اما جواب نمیده و فقط یکیشون رو به عنوان ورودی ارائه میکنه (فکر کنم مورد آخر؟). راه حلش هم ساده هست، مثال:
cat < <(cat file.txt file2.txt)
که دستور بالا محتوای هر 2 فایل رو نمایش میده، اما اگه تست کنید
cat < file.txt file2.txt
فقط محتوای فایل دوم نمایش داده میشه و اگه از
cat < cat file.txt file2.txt
استفاده کنید احتمالا
(اگه فایلی به اسم cat تو اون مسیر نداشته باشید P:)

با خطای "no such file or directory" مواجه میشید
(پس بین این 3 مورد فقط مورد اول درست جواب میده).

در نهایت تاکید کنم اون cat ابتدای 3 دستور بالا صرفا جهت بررسی صحت مقدار stdin از طریق پرینتش هست و طبیعتا باید با دستور یا اسکریپت مد نظرتون جایگزین بشه.

منابع بیشتر:
https://stackoverflow.com/questions/33157198/multiple-input-text-files-as-stdin-under-unix

https://unix.stackexchange.com/questions/20285/shorthand-for-feeding-contents-of-multiple-files-to-the-stdin-of-a-script

https://stackoverflow.com/questions/1487319/submitting-multiple-files-from-shell-script-through-standard-input

https://stackoverflow.com/questions/44552188/redirect-multiple-files-to-stdin

🔅@LinFAQ
🔅@LinAcademy
#روزی_یک_نکته با دلاتو

دسته‌بندی: #آموزشی #کاربردی #emacs

یه سری منابع برای mu4e
(هنوز سراغش نرفتم، صرفا تحقیقه):


راستی یه کپی از emacswiki راجب mu4e برم:
mu4e is an email client for Emacs. It’s based on the mu email indexer/searcher.

- قبلا یه ویدئو distrotube راجبش داده:

Setting Up The Mu4e Email Client In Doom Emacs

https://youtu.be/LKp3hQP2VxQ

کم و بیش درسته، فقط اون mbsync-git رو تا جایی که میدونم نیاز نیست نصب کنید، isync داخل مخازن رسمی هست.
اگه میخواید راجب isync بیشتر مطالعه کنید
(به صورت کلی چیز جالبیه، بنظرم به چک کردنش میرزه):

https://wiki.archlinux.org/title/isync
منابع بیشتر راجب mu4e:
https://www.emacswiki.org/emacs/mu4e
اسکرین شات ها و منبع رسمی:
https://www.djcbsoftware.nl/code/mu/mu4e.html
میتونید کانفیگ gavin رو هم راجبش چک کنید:
https://github.com/Gavinok/emacs.d/blob/main/lisp/mu4e-config.el

🔅@LinFAQ
🔅@LinAcademy
#روزی_یک_نکته با دلاتو

دسته‌بندی: #آموزشی #کاربردی #emacs

راجب hook و فعال کردن لاین نامبر در مد های مورد نیاز داخل ایمکس:
وقتی میخوان یه فانکشن بعد از یه رویدادی
(مثل اجرای یه فانکشن دیگه یا مد خاصی یا...)

اجرا بشه، از hook استفاده میکنن
(یا حداقل برداشت من از hook اینطوری بوده).


یه نمونه هم ازش بخوام بگم این هست:
(add-hook 'prog-mode-hook 'display-line-numbers-mode)

که  در واقع داره میگه اگه major mode بافر جزو prog-mode بود، بیاد لاین نامبر رو هم فعال کنه.
اینطوری داخل چیز هایی مثل dired که مدیر فایل هست یا کلا هر جایی که کد نیست، لاین نامبر رو هم نمیبینیم.

کلا major mode هایی که زبان برنامه نویسی هستن توی این دسته قرار میگیرن (در کل مفهوم major mode مشابه file type داخل (نئو)ویم هست).


حالا کد زیر رو داریم:
(use-package display-line-numbers
  :hook org-mode prog-mode
  )

تو اینجا داریم از use-package استفاده میکنیم، برای همین اسم پکیجی که فانکشن display-line-numbers-mode شامل میشه رو به کار میبریم، بعد بهش میگیم که تو کدوم پکیج ها قراره لاین نامبر نمایش داده بشه، اینطوری ۲ سود داره:
1- به جای اسم فانکشن ها، اسم پکیج ها رو به کار میبریم که عموما کوتاه تره.
2- همونطور که میبینید میتونم با یه بار نوشتن hook، داخل هر چند مدی که میخوام لاین نامبر رو نمایش بدم. مثلا اینجا علاوه بر prog-mode، داخل فایل هایی که org هستن هم لاین نامبر نمایش داده میشه.
راجب use-package بخوام مختصر بگم، برای کانفیگ ساده تر ازش استفاده میشه و پیش فرض توی نسخه های جدید ایمکس نصب هست.

جهت فهمیدن این که function یا variable مربوط به کدوم پکیج هست میتونید کی بایند C-h f یا C-h v رو بسته به function یا variable بودن بزنید و بعد اسمش رو وارد کنید، همون چند خط اول نوشته که برای کدوم پکیج هست، میتونید از طریق پسوند el تشخیص بدید.


اگه توی نکته ایرادی بود پیشاپیش عذر میخوام، به دلیل آشنایی کمم با ایمکس هست چون کلا یه هفته هست که دارم ازش استفاده میکنم و تو این یه هفته هم شاید بیشتر از ۱۰ ساعت ازش استفاده نکردم، ضمنا خوشحال میشم اگه خواستید ایراد رو اصلاح و بیان کنید.

در انتها اگه این مطلب براتون مفید بود و دلتون خواست، لطفا برای شادی روح یحیی تجری فرزند حسین یه فاتحه بخونید.

🔅@LinFAQ
🔅@LinAcademy
1
#روزی_یک_نکته با دلاتو

دسته‌بندی: #کاربردی #آموزشی #makefile

راجب make:
احتمالا تا حالا Makefile رو دیده باشید
مخصوصا اگه از ابزارا suckless استفاده کردید.

تعریفم شاید دقیق نباشه، اما سعی میکنم واضح بیانش کنم: make یه ابزار هست که محتوای Makefile رو میخونه و بر اساس آرگومانی که بهش میدیم، میاد یه کاری رو انجام میده.
طوری که بهش نگاه میکنم: یه جورایی Makefile انگار یه فایل با یه سری switch case هست که وجود یا بروز بودن یه فایل یا یه case دیگه رو نگاه میکنه و بر اساس اون آرگومانی که بهش میدید، یه سری دستوراتی رو انجام میده.
کاربرد اصلیش بیلد کردن پکیج ها و کامپایل، اکسپورت کردن و... هست
مثلا جای این که بنویسید gcc... میاید میزنید make و تمام.

و خاصیتش اتومات کردن کار، سادگی تایپ، سرعت بالا تر
خودش چک میکنه اگه فایلی بروز بود دیگه دستش نمیزنه و... سر همین پروسه زمان کمتری میبره.

و عدم تکرار اسم فایل ها و... هست.
میتونید متغیر براش تعریف کنید.

نمونه کار های خلاقانه دیگه ای که براش دیدم میشه از مدیریت کانفیگ ها گفت:
How To Manage Your Dotfiles With Make

خودم خیلی باهاش کار نکردم، پس هم در حد پایه گفتم و هم خیلی اعتبار این نکته بالا نیست، اما قابل بیان دونستمش، اگه توضیح کامل میخواید منبع رسمی شاید بهترین گزینه باشه.

داخل یوتیوب هم آموزش راجبش زیاد هست، 2 تا آموزش کوتاه و یه نکته ای که نسبتا باید حواستون بهش باشه رو اضافه میکنم:
How to Create a Simple Makefile - Introduction to Makefiles

Learn make in 60 seconds.

Why that "Perfect" Makefile Doesn't Work.

چون 3 لینک بالا رو اضافه کردم و توضیحاتشون رو بیشتر از دانش خودم دونستم، پس نحوه نوشتن Makefile رو دیگه توضیح نمیدم. صرفا یه نمونه که برای نیاز خودم نوشتم رو ضمیمه این پست میکنم.

در انتها اگه این مطلب براتون مفید بود و دلتون خواست، لطفا برای شادی روح یحیی تجری فرزند حسین یه فاتحه بخونید.

🔅@LinFAQ
🔅@LinAcademy
👍3