aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlukeflo2025-06-30 16:33:01 +0200
committerlukeflo2025-06-30 16:33:01 +0200
commit3a40bbb367a79dc3660c12aa7f62e3efc378ea22 (patch)
tree3dfa3e13207b0bb134765d8a9288ff28b10e2a14
parent8ea28b55f0c6ba210ddcd6a964c8f56d3e6e25ff (diff)
downloadbibiman-3a40bbb367a79dc3660c12aa7f62e3efc378ea22.tar.gz
bibiman-3a40bbb367a79dc3660c12aa7f62e3efc378ea22.zip
update README: note feature
-rw-r--r--README.md33
-rw-r--r--src/app.rs2
-rw-r--r--src/bibiman.rs32
-rw-r--r--src/bibiman/entries.rs5
-rw-r--r--src/config.rs4
-rw-r--r--src/tui/ui.rs39
6 files changed, 78 insertions, 37 deletions
diff --git a/README.md b/README.md
index 5bc40b3..4f0e505 100644
--- a/README.md
+++ b/README.md
@@ -213,6 +213,16 @@ file_prefix = "/some/path/prefix"
# of the format "citekey.pdf". Other PDF basenames are not accepted.
# Use absolute paths (~ for HOME works). Otherwise, loading might not work.
pdf_path = "/path/to/pdf-folder"
+## Path to folder (with subfolders) containing note files with the basename of
+## the format "citekey.extension". Other basenames are not accepted. The possible
+## extensions can be set through the "note_extensions" array.
+note_path = "path/to/note-files"
+note_extensions = [ "md", "txt" ]
+
+## Symbols/chars to show if not has specific attachement
+ file_symbol = " "
+ link_symbol = "󰌹 "
+ note_symbol = "󰧮"
```
`bibfiles`
@@ -246,13 +256,14 @@ pdf_path = "/path/to/pdf-folder"
created through the `pdf_path` variable. Thus, it is safe to mix both
approaches if wanted!
-`pdf_path`
+`pdf_path` and `note_path`
-: The `pdf_path` is used as path wich is recursivley searched for files which
- basename consists of the an entrys `citekey` plus a `.pdf` ending
- (case-insensitive). Every file which matches this pattern for an existing
- `citekey` is associated with the particular entry for the current `bibiman`
- session and can be opened from within.
+: The `pdf_path`/`note_path` is used as path wich is recursivley searched for
+ files which basename consists of the an entrys `citekey` plus a `.pdf` ending
+ or one of the specified note endinfs (case-insensitive). Every file which
+ matches this pattern for an existing `citekey` is associated with the
+ particular entry for the current `bibiman` session and can be opened from
+ within.
### Color Configuration<a name="color-configuration"></a>
@@ -272,6 +283,12 @@ warn_color = "124"
bar_bg_color = "234"
popup_bg_color = "234"
selected_row_bg_color = "237"
+note_color = "123"
+file_color = "209"
+link_color = "27"
+author_color = "38"
+title_color = "37"
+year_color = "135"
```
Colors can be set through three different methods:
@@ -309,7 +326,7 @@ These are the current features, the list will be updated:
- [x] **Add Entry via DOI**.
- [x] **Implement config file** for setting some default values like main
bibfile, PDF-opener, or editor
-- [ ] **Open related notes file** for specific entry.
+- [x] **Open related notes file** for specific entry.
- [ ] **Support Hayagriva(`.yaml`)** format as input (_on hold for now_, because
the Hayagriva Yaml style doesn't offer keywords; s. issue in
[Hayagriva repo](https://github.com/typst/hayagriva/issues/240)).
@@ -346,7 +363,7 @@ Use the following keybindings to manage the TUI:
There are some shortcuts to select an item from the opening/yanking popup
without navigating the list:
-- `o-o`|`o-l`: directly opens the first file/link for the selected entry.
+- `o-o`|`o-l`|`o-n`: directly opens the first file|link|note for the selected entry.
- `y-y`: directly yanks the citekey of the selected entry to the clipboard.
## Search<a name="search"></a>
diff --git a/src/app.rs b/src/app.rs
index 496896a..18a97e6 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -83,7 +83,7 @@ impl App {
} else if let Some(PopupKind::YankItem) | Some(PopupKind::OpenRes) =
self.bibiman.popup_area.popup_kind
{
- self.bibiman.fast_selection(cfg, key_event.code)?;
+ self.bibiman.fast_selection(cfg, &mut tui, key_event.code)?;
}
let command = if self.input_mode {
CmdAction::Input(InputCmdAction::parse(key_event, &self.input))
diff --git a/src/bibiman.rs b/src/bibiman.rs
index e1e97ed..9cc9280 100644
--- a/src/bibiman.rs
+++ b/src/bibiman.rs
@@ -367,9 +367,9 @@ impl Bibiman {
.entry_table_state
.selected_column()
.unwrap()
- == 3
+ == 4
{
- self.entry_table.entry_table_state.select_first_column();
+ self.entry_table.entry_table_state.select_column(Some(1));
} else {
self.entry_table.entry_table_state.select_next_column();
}
@@ -396,7 +396,7 @@ impl Bibiman {
.entry_table_state
.selected_column()
.unwrap()
- == 0
+ == 1
{
self.entry_table.entry_table_state.select_last_column();
} else {
@@ -788,11 +788,17 @@ impl Bibiman {
///
/// `o` -> opens the first file of the `filepath` `Vec` for the current entry
/// `l` -> opens the link of the current entry
+ /// `n` -> opens the first note
///
/// **Yanking popup**
///
/// `y` -> yanks the citekey for the current entry
- pub fn fast_selection(&mut self, cfg: &BibiConfig, key_code: KeyCode) -> Result<()> {
+ pub fn fast_selection(
+ &mut self,
+ cfg: &BibiConfig,
+ tui: &mut Tui,
+ key_code: KeyCode,
+ ) -> Result<()> {
if let CurrentArea::PopupArea = self.current_area {
let entry_idx = self.entry_table.entry_table_state.selected().unwrap();
match self.popup_area.popup_kind {
@@ -817,6 +823,24 @@ impl Bibiman {
}
}
}
+ KeyCode::Char('n') => {
+ let file = self.entry_table.entry_table_items[entry_idx].notes.clone();
+ if file.is_some() {
+ let file = expand_home(&PathBuf::from(file.unwrap()[0].clone()));
+ // let object: OsString = popup_entry.into();
+ if file.is_file() {
+ self.open_connected_note(cfg, tui, &file.into_os_string())?;
+ self.close_popup();
+ } else {
+ self.open_popup(
+ PopupKind::MessageError,
+ Some("No valid file path: "),
+ Some(file.to_str().unwrap()),
+ None,
+ )?;
+ }
+ }
+ }
KeyCode::Char('l') => {
if self.entry_table.entry_table_items[entry_idx]
.doi_url
diff --git a/src/bibiman/entries.rs b/src/bibiman/entries.rs
index e0c230b..9b536fd 100644
--- a/src/bibiman/entries.rs
+++ b/src/bibiman/entries.rs
@@ -47,8 +47,9 @@ impl EntryTable {
// entry_table
let entry_table_state = TableState::default()
.with_selected(0)
- .with_selected_column(0)
- .with_selected_cell(Some((0, 0)));
+ .with_selected_column(1)
+ // other two values above are ignored, if selected cell isn't fitting
+ .with_selected_cell(Some((0, 1)));
let entry_scroll_state = ScrollbarState::new(entry_table_items.len());
let entry_info_scroll_state = ScrollbarState::default();
Self {
diff --git a/src/config.rs b/src/config.rs
index f67cb9d..278f4b1 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -85,7 +85,7 @@ const DEFAULT_CONFIG: &str = r##"
# selected_row_bg_color = "237"
# note_color = "123"
# file_color = "209"
-# link_color = "27"
+# link_color = "39"
# author_color = "38"
# title_color = "37"
# year_color = "135"
@@ -215,7 +215,7 @@ impl BibiConfig {
selected_row_bg_color: Color::Indexed(237),
note_color: Color::Indexed(123),
file_color: Color::Indexed(209),
- link_color: Color::Indexed(33),
+ link_color: Color::Indexed(39),
author_color: Color::Indexed(38),
title_color: Color::Indexed(37),
year_color: Color::Indexed(135),
diff --git a/src/tui/ui.rs b/src/tui/ui.rs
index ac44d09..3c83935 100644
--- a/src/tui/ui.rs
+++ b/src/tui/ui.rs
@@ -580,7 +580,7 @@ pub fn render_entrytable(app: &mut App, cfg: &BibiConfig, frame: &mut Frame, rec
.bg(cfg.colors.bar_bg_color);
let header = Row::new(vec![
- // Cell::from(Line::from("")).bg(cfg.colors.bar_bg_color),
+ Cell::from(Line::from("")).bg(cfg.colors.bar_bg_color),
Cell::from(
Line::from(vec![{ Span::raw("Author") }, {
if let Some(EntryTableColumn::Authors) =
@@ -704,21 +704,30 @@ pub fn render_entrytable(app: &mut App, cfg: &BibiConfig, frame: &mut Frame, rec
let mut symbol_vec = vec![];
if let Some(f) = &item.symbols[0] {
- symbol_vec.push(Span::styled(f, Style::new().fg(cfg.colors.file_color)));
+ symbol_vec.push(Span::styled(
+ f,
+ Style::new().fg(cfg.colors.file_color).bold(),
+ ));
}
if let Some(l) = &item.symbols[1] {
- symbol_vec.push(Span::styled(l, Style::new().fg(cfg.colors.link_color)));
+ symbol_vec.push(Span::styled(
+ l,
+ Style::new().fg(cfg.colors.link_color).bold(),
+ ));
}
if let Some(n) = &item.symbols[2] {
- symbol_vec.push(Span::styled(n, Style::new().fg(cfg.colors.note_color)))
+ symbol_vec.push(Span::styled(
+ n,
+ Style::new().fg(cfg.colors.note_color).bold(),
+ ))
}
let row = Row::new(vec![
+ Cell::from(Line::from(symbol_vec)),
Cell::from(Line::from(item.authors)),
Cell::from(Line::from(item.title)),
Cell::from(Line::from(item.year)),
Cell::from(Line::from(item.pubtype)),
- Cell::from(Line::from(symbol_vec)),
]);
// let row = item
@@ -738,6 +747,11 @@ pub fn render_entrytable(app: &mut App, cfg: &BibiConfig, frame: &mut Frame, rec
let entry_table = Table::new(
rows,
[
+ Constraint::Length(
+ (cfg.general.file_symbol.chars().count()
+ + cfg.general.link_symbol.chars().count()
+ + cfg.general.note_symbol.chars().count()) as u16,
+ ),
Constraint::Percentage(20),
Constraint::Fill(1),
Constraint::Length(
@@ -750,12 +764,6 @@ pub fn render_entrytable(app: &mut App, cfg: &BibiConfig, frame: &mut Frame, rec
},
),
Constraint::Percentage(10),
- Constraint::Length(
- (cfg.general.file_symbol.chars().count()
- + cfg.general.link_symbol.chars().count()
- + cfg.general.note_symbol.chars().count()
- + 1) as u16,
- ),
],
)
.block(block)
@@ -917,15 +925,6 @@ pub fn render_selected_item(app: &mut App, cfg: &BibiConfig, frame: &mut Frame,
),
]));
}
- // if cur_entry.filepath.is_some() {
- // lines.push(Line::from(vec![
- // Span::styled("File: ", style_value),
- // Span::styled(
- // cur_entry.filepath().to_string_lossy(),
- // Style::new().fg(cfg.colors.main_text_color),
- // ),
- // ]));
- // }
lines.push(Line::from(""));
lines.push(Line::from(vec![Span::styled(
cur_entry.abstract_text.clone(),