thảo luận Anh em sử dụng Obsidian

obsidian mà sync lên mobile bằng app ngoài dropbox, drive,... thì nó cũng thành offile trên mobile đúng không mấy thím? hay không có mạng thì không dùng được như notion?
Đúng rồi fen, nó là mấy file text thôi mà, không có mạng vẫn xài bình thường ...
7WYibTl.gif
 
Đúng rồi fen, nó là mấy file text thôi mà, không có mạng vẫn xài bình thường ...
7WYibTl.gif
vậy mình đơn giản là đưa file trên pc vô dropbox rồi trên mobile cũng mở trực tiếp file trên đó luôn hay có phải làm gì khác không thím?
 
android thím, mà mình chưa dùng, chỉ muốn hỏi ae đã dùng để cân nhắc vì thấy việc xem được trên mobile cũng có một số lợi ích nhất định
Nói chung obsidian bác cứ hiểu là nó tạo 1 folder có các file text bth, nó chỉ là quản lý mấy file đó thôi (tức là k có mạng, hoặc thậm chí k có Ob vẫn coi đc). Nên mục tiêu là sync folder giữa PC và mobile. Điều này icloud best. Còn android em chưa tìm ra cách để sync trực tiếp qua dịch vụ cloud.
Có 2 cách mà k tối ưu lắm:
  1. bác xài syncthing để đồng bộ folder PC với mobile. (cái này em chưa xài)
  2. app Folder Sync, th này thì có add được cloud để sync, nhưng để tự auto sync thì vừa hao pin vừa dễ bị android khoá chạy nền. Ngoài ra sync rất ngu, mỗi lần nó phải index lại hết file -> ngày càng nhiều file sync càng chậm
 
Hi các bác, em có đoạn code dataviewjs để reference file và heading file đó được nhắc tới. Em không phải coder, chỉ đọc doc để làm thôi. Nên nhờ cái bác ai rành Javascript sửa giúp cho ok. Với lại cái bảng nó tạo ra trồi sụt, mà em thì không biết CSS :(
JavaScript:
```dataviewjs
const groups = ["terminology","topic","book","course","other"];
const pages = dv.pages();
function getHeading(page){
    let con = [];
    for (let l of page.file.lists){
        let cri = l.text.includes(dv.current().file.name);
        if (cri){
            let s_link = "'"+l.section+"'";
            let link_text = l.section.toString().slice(2,-2);
            let link_split = link_text.split("|");
            let alias = link_split[1].slice(link_split[1].lastIndexOf(">")+1);
            let link = dv.fileLink(link_split[0],false,alias);
            let arr = dv.array([page.file.link, link , page.file.cday]);
            con = con.concat(arr);  
        }          
    }
    return con;
}
for (let group of groups){
    dv.header(2, group.charAt(0).toUpperCase() + group.slice(1).replace("y","ie") + "s");
    let list = [];
    for (let page of pages){
        let con1 = page.file.lists.text.filter((t) => t.includes(dv.current().file.name)).length > 0;
        let con2 = page.file.tags.filter(t => t.includes(group)).length > 0;
        let con3 = page.file.tags.every(t => groups.slice(0,-1).filter(g => t.includes(g)).length == 0);
        if (group != 'other' && con1 && con2){  
            let test = getHeading(page);
            list = list.concat(test);  
        }else if(group == 'other' && con1 && con3){
            let test = getHeading(page);
            list = list.concat(test);
        }  
    }
    dv.table(["File","Heading","Created Day"],list);
}
```
Nó ra như hình dưới
1697095608750.png
 
Last edited:
Nay vô tình tìm được cách cho nó thẳng hàng, em share full code cho ai cần. Code này có chú thích để thay đổi điều kiện theo ý. Mục đích của code là list ra Tên note và heading của note nhắc tới note hiện tại (trừ được nhắc trong task). Vì dùng dataviewjs nên muốn nó nhận mention phải cho cái mention vào list (". ", hoăc "1. ",....)
Code:
const groups = ["terminology","topic","book","project","other","course","function"];
const pages = dv.pages();
for (let group of groups){
    let list = [];
    for (let page of pages){
        //con for check contain mentioned in both in note's name and aliases (bc alias link also head filename)
        let con1 = page.file.lists.text.filter(t => t.includes(dv.current().file.name)).length > 0;
        //con for check contain tag in note
        let con2 = page.file.tags.filter(t => t.includes(group)).length > 0;
        // con for check tag in note is not in given group for other
        let con3 = page.file.tags.every(t => groups.filter(g => t.includes(g) && g !== "other").length == 0);
        // con for remove self mentioned
        let con4 = page.file.name != dv.current().file.name;
        //check file aliases
        //let con5 = dv.current().file.aliases.filter(a => page.file.lists.text.filter(t => t.includes(a)).length > 0).length > 0;
        if (group != 'other' && con1 && con2 && con4 ){    
            let test = getHeading(page);
            list = list.concat(test);    
        }else if(group == 'other' && con1 && con3 && con4){
            let test = getHeading(page);
            list = list.concat(test);
        }   
    }
    //unique values
    let ulist = dv.array(list).distinct();
    //print out table    
    if (ulist.length > 0){
        dv.header(4, group.charAt(0).toUpperCase() + group.slice(1).replace("y","ie") + "s");
        dv.table(["File","Heading","Created Day"],ulist);
    this.container.querySelectorAll(".table-view-table td").forEach(s => s.style.width ="300px");
    }
}
// for working with heading and each row
function getHeading(page){
    let con = [];
    for (let l of page.file.lists){
        //cri for check if list in heading contain mentions (this is why can't use normal query)
        let cri = l.text.includes(dv.current().file.name);
        if (cri){
            //convert link object to text with remove square bracket (format \[\[note_name#heading|note_name > heading]])
            let link_text = l.section.toString().slice(2,-2);
            // splite link to array of link and title by |
            let link_split = link_text.split("|");
            // generate alias (for note without heading) or heading by slicing in title string
            let alias = link_split[1].slice(link_split[1].lastIndexOf(">")+1);
            // regenerate link with only Heading or Filename for the title
            let link = dv.fileLink(link_split[0],false,alias);
            // combine link of file, link of heading, created day into row
            let arr = dv.array([page.file.link, link , page.file.cday]);
            con = con.concat(arr);    
        }            
    }
    return con;
}
1701943015394.png
Nhu cầu như hình dưới
1701943158634.png

p/s: bác nào muốn tiện thì tạo 1 cái quickadd xài cho nhanh, hoặc bỏ vào templater
 
Con hàng này còn nhiều bug với hạn chế.
Chưa so được với Notion.
Sơ sơ thì:
1. Bug: bôi đen text, chuột phải, di chuột đến cái icon cuối cùng trong trình đơn hiện ra -> cái app treo cứng luôn.
2. Không/chưa hỗ trợ import từ Notion hoặc 1 thằng .md nào tương tự. Hoặc là mình chưa biết cách.
3. Copy/paste ảnh trực tiếp từ web vào nó không hiện ảnh. Phải tải ảnh về rồi paste vô mới nhận.
4. Chưa có heading toggle như Notion.
......
 
Con hàng này còn nhiều bug với hạn chế.
Chưa so được với Notion.
Sơ sơ thì:
1. Bug: bôi đen text, chuột phải, di chuột đến cái icon cuối cùng trong trình đơn hiện ra -> cái app treo cứng luôn.
2. Không/chưa hỗ trợ import từ Notion hoặc 1 thằng .md nào tương tự. Hoặc là mình chưa biết cách.
3. Copy/paste ảnh trực tiếp từ web vào nó không hiện ảnh. Phải tải ảnh về rồi paste vô mới nhận.
4. Chưa có heading toggle như Notion.
......
Dùng Obsidian vẫn hơn Notion chứ! :(
 
Có cái nào hỗ trợ import từ obsidian k các thím.
Thằng này app desktop giật đùng đùng như điên ấy
 
Đá lên :ah: !
Dùng obisdian để làm file báo cáo bằng ngôn ngữ latex công nhận đỉnh vãi :ah:
Biết 1 chút python + markdown là ok :shame:

1706184475709.png
 
Làm ntn vậy bác :angry:
Thím cài Python ,pandoc , mirktex (nhớ cài bản đầy đủ)
xong thím cài pip vào và cài 2 gói unidecode với python-frontmatter của python :big_smile:
Thím tải script python tại đây, lưu về đổi tên thành convert.py tên gì tuỳ thích.

Xong thím tạo 1 file markdown để test thử trước khi làm bước tiếp theo.
Lưu ý, file markdown thím tạo BẮT BUỘC phải có frontmatter
---
title: <tên thích tuỳ thím>
author: <tên của thím>
---
[nội dung]
----
Thím test thử trên terminal. Nếu ưng ý thì qua bước thứ 2 là tích hợp script này vào vault của thím.
Thím vào vault của thím, tạo 1 folder gọi là scripts <hay tuỳ ý thím>, bỏ file python vào.

Xong thím cài plugin Shell command trong Obsidian và config như hình

1706189097744.png

Lưu ý :
Code:
python3 [đường dẫn đến thư mục script trong vault]\[tên-file].py {{file_path:absolute}}

Xong mỗi khi thím cần output ra pdf thì bấm ctrl + p, chọn Shell là nó chạy
u98EDuO.png
 
Thím cài Python ,pandoc , mirktex (nhớ cài bản đầy đủ)
xong thím cài pip vào và cài 2 gói unidecode với python-frontmatter python :big_smile:
Xong thím dùng script python tại đây, lưu về đổi tên thành convert.py tên gì tuỳ thích.
Xong thím tạo 1 file markdown để test thử trước khi làm bước tiếp theo.
Lưu ý, file markdown thím tạo phải có frontmatter
Ví dụ:
---
title: <tên thích tuỳ thím>
author: <tên của thím>
---
[nội dung]
----
Thím test thử trên terminal. Nếu ưng ý thì qua bước thứ 2 là tích hợp script này vào vault của thím.
Thím vào vault của thím, tạo 1 folder gọi là script <hay tuỳ ý thím>, bỏ file script của thím vào.

Xong thím cài plugin Shell command trong Obsidian và config như hình
View attachment 2308335
Lưu ý :
Code:
python3 [đường dẫn đến thư mục script trong vault]\main.py {{file_path:absolute}}

Phần em bôi đậm chính là đường dẫn.
Xong mỗi khi thím cần output ra pdf thì bấm ctrl + p, chọn Shell là nó chạy
u98EDuO.png
Quào h mới biết shell command được, tk bác.
 
Back
Top