[![coBib](https://gitlab.com/mrossinek/cobib/-/raw/master/logo/cobib_logo.svg)](https://mrossinek.gitlab.io/cobib/cobib.html)
# coBib
[![pipeline](https://gitlab.com/mrossinek/cobib/badges/master/pipeline.svg)](https://gitlab.com/mrossinek/cobib/-/pipelines)
[![coverage](https://gitlab.com/mrossinek/cobib/badges/master/coverage.svg)](https://gitlab.com/mrossinek/cobib/-/graphs/master/charts)
[![PyPI](https://img.shields.io/pypi/v/cobib)](https://pypi.org/project/cobib/)
coBib is a simple, command-line based bibliography management tool.
It is the result of the need for an easy-to-use alternative to full-blown reference managers like Mendeley or Zotero.
As such it follows some basic design goals:
* **plain-text database**: which means you get full access and control over the database.
* **git-integration**: as a benefit of the above, you can keep track of your database through version control.
* **centralized database, location-independent library**: this means, that coBib *only* manages the
database file in a centralized fashion but allows you to spread the actual contents of your
library across the entire file system (this is the major different to
[papis](https://papis.readthedocs.io/en/latest/library_structure.html)).
* **command-line and TUI support**: all features are available through the command-line as well as a curses-based TUI.
### **News:** coBib v4.0 will come with a new UI!
The plan is to switch to [rich][rich] and [textual][textual] instead of the current curses TUI.
This will open up some great possibilities for a much more modern UI.
However, this change will require some *major* refactoring including breaking changes of the API
and some of the user configuration options. It will also be a rather drastic change in style.
Thus, I will attempt to support v3.5 with bugfix releases until 1.1.2023
It will likely take a few months until v4.0 gets released but I am starting development on it now.
You can follow the progress here: <https://gitlab.com/mrossinek/cobib/-/issues/78>
[rich]: https://github.com/Textualize/rich
[textual]: https://github.com/Textualize/textual
## Installation
For all common purposes you can install coBib via `pip`:
```
pip install cobib
```
Note: Use `pip3` if you still have Python 2 installed.
If you would also like to install the man-page and (crude!) Zsh completion,
you need to download the source code and do the following:
```
git clone https://gitlab.com/mrossinek/cobib
cd cobib
make install_extras
```
### Arch Linux
coBib is packaged in the AUR.
* [cobib](https://aur.archlinux.org/packages/cobib/)
* [cobib-git](https://aur.archlinux.org/packages/cobib-git/)
### Windows
Windows is **only partially** supported!
This is due to the fact that [Python under Windows does not ship with the `curses` module][1].
Thus, you cannot run coBib's _TUI_ on Windows.
However, if you are using Windows 10 you should be able to install and use coBib's full
functionality within the Linux subsystem.
## Getting started
To get started, you must initialize the database:
```
cobib init
```
If you would like to enable the git-integration, you should run:
```
cobib init --git
```
*and* enable `config.database.git` (see also [configuration](#configuration)).
Be sure to check out my [Quickstart blog post](https://mrossinek.gitlab.io/programming/introducing-cobib/)
for a more guided introduction compared to the following section!
### Importing your library
coBib provides an `import` command through which you can easily import your library
from another bibliography manager. For more details check out:
```
cobib import --help
```
So far, coBib knows how to import your library from Zotero by simply running:
```
cobib import --zotero
```
Check out the following command, the man page or the online documentation for more details:
```
cobib import --zotero -- --help
```
## Usage
### Adding new entries
You can now add new entries to your database (see also `cobib.commands.add`[^1]):
```
cobib add --bibtex some_biblatex_file.bib
cobib add --arxiv <some arXiv ID>
cobib add --doi <some DOI>
cobib add --isbn <some ISBN>
```
**Note**: when adding data from a `.bib` file, make sure that it is in the Bib**La**Tex format!
### Viewing your database and entries
You can view the contents of your database with (see also `cobib.commands.list`):
```
cobib list
```
You can show a specific entry with (see also `cobib.commands.show`):
```
cobib show <some entry label>
```
You can open an associated file of an entry with (see also `cobib.commands.open`):
```
cobib open <some entry label>
```
You can even search through your database with (see also `cobib.commands.search`):
```
cobib search "some text"
```
### Editing your database
You can delete an entry with (see also `cobib.commands.delete`):
```
cobib delete <some entry label>
```
You can edit an entry manually with (see also `cobib.commands.edit`):
```
cobib edit <some entry label>
```
You can also apply simple modifications to multiple entries at once with (see also
`cobib.commands.modify`):
```
cobib modify tags:private -- <some entry label> <another entry label> ...
```
### Exporting your database
You can export your database with (see also `cobib.commands.export`):
```
cobib export --bibtex my_bibliography.bib
cobib export --zip my_library.zip
```
### Integrated version control
If you have enabled the git-integration, you can undo and re-apply changes to your database with
(see also `cobib.commands.undo` and `cobib.commands.redo`):
```
cobib undo
cobib redo
```
### Getting help
Each subcommand provides additional help via:
```
cobib <subcommand> --help
```
and you can find extensive information in the online documentation (linked above) and the man-page:
```
man cobib
```
### TUI
Finally, you can also use coBib's TUI for a more interactive experience (see also `cobib.tui`), by
simply typing
```
cobib
```
## Configuration
You can overwrite the default configuration by placing a `config.py` file in `~/.config/cobib/`.
The easiest way to get started with this file is by copying [`example.py`](https://gitlab.com/mrossinek/cobib/-/blob/master/src/cobib/config/example.py)
or by using:
```
cobib _example_config > ~/.config/cobib/config.py
```
You can then modify it to your liking.
You may also specify a different config file at runtime by using the `-c` or `--config` command line argument or by specifying a custom path in the `COBIB_CONFIG` environment variable.
You can also disable loading of _any_ configuration file be setting this environment variable to one of the following values: `"", 0, "f", "false", "nil", "none"`.
Finally, be sure to take a look at the man page (`man cobib`) and/or the online documentation for more information.
## Documentation
coBib's documentation is hosted [here](https://mrossinek.gitlab.io/cobib/cobib.html).
If you would like to generate a local version during development, you need to clone the source code, and install [`pdoc`](https://github.com/mitmproxy/pdoc) in order to generate it:
```
git clone https://gitlab.com/mrossinek/cobib.git
cd cobib
pip install pdoc
pdoc -d google -e cobib=https://gitlab.com/mrossinek/cobib/-/blob/master/src/cobib/ -t html -o docs src/cobib tests
```
You can then browse the documentation from `docs/cobib.html`.
## History
I have started this project when I was looking into alternatives to popular reference managers such as Mendeley,
which has more features than I use on a regular basis and does not allow me to work from the command line which is where I spent most of the time that I spent on the computer.
Hence, I have decided to make it my own task of implementing a simple, yet fast, reference manager.
coBib is written in Python and uses a YAML file to store its bibliography in a plain text format.
### Changelog
You can find the detailed changes throughout coBib's history in [the Changelog](https://gitlab.com/mrossinek/cobib/-/blob/master/CHANGELOG.md).
## License
coBib is licensed under the [MIT License](https://gitlab.com/mrossinek/cobib/-/blob/master/LICENSE.txt).
[^1]: References like this one get interpreted by the documentation generator. If you are reading this as the README page, you may find the [online documentation](https://mrossinek.gitlab.io/cobib/cobib.html) more enjoyable.
[1]: https://docs.python.org/3/howto/curses.html#what-is-curses
[//]: # ( vim: set ft=markdown: )
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
## [3.5.5] - 2023-04-11
Pypi: https://pypi.org/project/cobib/3.5.5/
### Fixed
- opening of non-list type fields (#100)
## [3.5.4] - 2022-12-26
Pypi: https://pypi.org/project/cobib/3.5.4/
### Fixed
- missing files encountered during searching will log warnings gracefully instead of harshly
- handle newline characters in the TUI (#98)
## [3.5.3] - 2022-11-16
Pypi: https://pypi.org/project/cobib/3.5.3/
### Fixed
- incorrect author concatenation in ISBN Parser
- using the disambiguated label for the names of downloaded files (#96)
## [3.5.2] - 2022-05-22
Pypi: https://pypi.org/project/cobib/3.5.2/
### Fixed
- run TUI on BSD platforms (!52)
## [3.5.1] - 2022-04-25
Pypi: https://pypi.org/project/cobib/3.5.1/
### Fixed
- safely check cache existence before attempting to write (#94)
## [3.5.0] - 2022-01-13
Pypi: https://pypi.org/project/cobib/3.5.0/
### **News:** coBib v4.0 will come with a new UI!
The plan is to switch to [rich][rich] and [textual][textual] instead of the current curses TUI.
This will open up some great possibilities for a much more modern UI.
However, this change will require some *major* refactoring including breaking changes of the API
and some of the user configuration options. It will also be a rather drastic change in style.
Thus, I will attempt to support v3.5 with bugfix releases until 1.1.2023
It will likely take a few months until v4.0 gets released but I am starting development on it now.
You can follow the progress here: <https://gitlab.com/mrossinek/cobib/-/issues/78>
[rich]: https://github.com/Textualize/rich
[textual]: https://github.com/Textualize/textual
### Added
- the configuration loading can be disabled via the environment variable `COBIB_CONFIG`
- values which disable the loading entirely are: `"", 0, f, false, nil, none`
- you can also specify a custom path to a configuration file in this variable
### Removed
- the `INI`-style configuration got fully removed (as deprecated in [3.0.0] - 2021-04-10)
## [3.4.0] - 2021-12-01
Pypi: https://pypi.org/project/cobib/3.4.0/
- coBib now requires the `requests-oauthlib` package
- technically this is an optional dependency for now, but it will likely become a requirement soon
### Added
- the new `config.parsers.yaml.use_c_lib_yaml` setting which significantly improves loading performance
- this setting will change its default value to `True` in version 4.0.0
* the `Import` command (#86,!49):
- can be used to import libraries from other bibliography managers (see next bullet)
- see `cobib import --help` for more information
- the `cobib.importers` module:
- provides importer classes for various other bibliography managers
- these get registered at runtime under the `cobib import` command
- this release provides the `--zotero` importer
- see `cobib import --zotero -- --help` for more information
- the `config.logging.cache` option, specifying the location of a simple json cache
- the `config.commands.open.fields` option, specifying the names of the data fields which are checked for openable URLs (#89)
### Changed
- the `PreFileDownload` event now takes an additional argument: `headers: Optional[Dict[str, str]]`
### Fixed
- downloaded file names will not duplicate the `.pdf` suffix
## [3.3.2] - 2021-11-17
Pypi: https://pypi.org/project/cobib/3.3.2/
### Fixed
- re-enable the terminal keypad during resize event
- this ensures proper arrow-key behavior after returning from an external editor
- clear screen after closing TUI to remove all screen artifacts
### Security
- remove warning when using the DOI parser because the upstream issue related to #91 got fixed
## [3.3.1] - 2021-10-19
Pypi: https://pypi.org/project/cobib/3.3.1/
### Fixed
- erroneous label disambiguation of Entry labels which already conform with `config.database.format.default_label_format` (#87,!47)
- do not add empty file list when unifying database
### Security
- log warning when using the DOI parser because of (#91)
## [3.3.0] - 2021-10-04
Pypi: https://pypi.org/project/cobib/3.3.0/
### Added
- print Changelog since the last run version (cached in `config.logging.version`) (#82)
- the `AddCommand` now has a new `--update` option (#79,!41)
- the `_lint_database` utility now takes the `--format` argument, which automatically resolves all lint messages (#81,!42)
- the new `URLParser` (available via `cobib add --url <URL>` (#84,!44)
- it attempts importing from a plain URL
- simultaneously the arXiv, DOI, and ISBN parsers now also support URL containing a matching identifier directly
- the `--dry` argument of the `ModifyCommand` to prevent errors during large bulk modifications
* the `config.database.format.label_default` and `config.database.format.label_suffix` options (#85,!45)
- labels will automatically be formatted according to the default option
- if labels conflict with existing ones, the suffix option will be used for disambiguation
- the `AddCommand` has a new `--skip-existing` option which disables automatic label disambiguation
- use `cobib _unify_labels --apply` to unify all labels in your database
- subscribable events (#71,!46)
- allows registering of hooks to be executed in certain situation
- more information is provided at the [online documentation](https://mrossinek.gitlab.io/cobib/cobib/config/event.html)
### Changed
- when an unknown variable is encountered in the modification of the `modify` command it falls back to an empty string rather than the name of the attempted variable
### Removed
- the `-s` option of the `AddCommand` is no longer available. You need to write out `--skip-download`
- the `ID` filter argument on the `list` command (deprecated in v3.2.0 in favor of the `label` filter)
## [3.2.1] - 2021-07-15
Pypi: https://pypi.org/project/cobib/3.2.1/
### Fixed
- when adding multiple entries at once, continue adding after encountering a single duplicate (#83)
## [3.2.0] - 2021-06-26
Pypi: https://pypi.org/project/cobib/3.2.0/
### Added
- basic auto-downloading of PDF files for arXiv IDs and configured DOIs (#25,!35,!39):
- the default download location can be configured via `config.utils.file_downloader.default_location`
- on a per addition basis, this default can be overwritten via the `--path` keyword option of the `AddCommand`
- if a file already exists in this location of the file system, the download will be skipped
- download for DOI entries must configure URL patterns in `config.utils.file_downloader.url_map`
- on a per addition basis, the entire automatic download can be skipped with `--skip-download`
- automatic journal abbreviations (#62,!36):
- users can configure a list of journal abbreviations via `config.utils.journal_abbreviations`
- if present, coBib will store the journal in its elongated form
- a user can then automatically convert to abbreviated forms during exporting (see the new `--abbreviate` and `--dotless` arguments)
- Tentative Windows support by disabling the TUI
- a `--preserve-files` argument was added to the following commands. Unless it is given, these will delete/rename associated files of affected entries:
- `DeleteCommand`
- `EditCommand`
- `ModifyCommand`
### Changed
- the `modifications` of a `ModifyCommand` get interpreted as f-strings (#77,!37):
- available variables are the entry's label and data fields
- any `ListCommand` filter gets interpreted as a regex pattern (#76)
### Deprecated
- the `ID` filter argument was fully replaced by `label`, unifying the CLI API. Support will be dropped in v3.3.0
### Fixed
- Removed (most) duplication of log messages
## [3.1.1] - 2021-05-25
Pypi: https://pypi.org/project/cobib/3.1.1/
### Fixed
- Pypi package metadata
## [3.1.0] - 2021-05-24
Pypi: https://pypi.org/project/cobib/3.1.0/
### Added
- the YAML format of the database has been extended to support the following: (#55)
- numbers can be stored as integers
- the `ID` field is no longer required and will be properly inferred from the label
- the following fields can be stored as lists: `file`, `tags`, `url`
- three new configuration options were added to complement the above list format options:
- `config.database.stringify.list_separator.file`
- `config.database.stringify.list_separator.tags`
- `config.database.stringify.list_separator.url`
- the `_lint_database` shell utility has been added which can be used to detect possible improvements for the database
- the append-mode of the `ModifyCommand` was implemented (#60):
- specifying `-a`/`--add` will add the modification value to the field of the entries rather than overwrite it
- this can be used for string or list concatenation and even number addition on numeric fields
### Changed
- use file paths relative to user-home (achieved by replacing `os.path` with `pathlib`) (#69)
- the shell helper `_list_tags` has been renamed to `_list_labels`
- (DEV): the `logging` and `zsh_helper` modules have been relocated to the `cobib.utils` package
- `+` symbols will no longer be stripped from tags (this was a left-over artifact from pre-v1.0.0)
### Deprecated
- the `config.database.format.month` setting is deprecated in favor of proper three-letter code encoding to support common citation style macros (!34)
### Fixed
- renaming the label during the `edit` command does not leave the previous label entry behind:
- a followup also ensured that renaming entries happens in-place (#75)
- the sorting of the `list` command
## [3.0.0] - 2021-04-10
Pypi: https://pypi.org/project/cobib/3.0.0/
- From now on, `coBib` is the official way of spelling!
### Added
- coBib's documentation is now generated by [`pdoc`](https://pdoc.dev/) and hosted at https://mrossinek.gitlab.io/cobib/cobib.html
- (DEV): the `cobib.database.Database`-Singleton has been added to centrally manage the bibliographic runtime data (!28)
- the new option `config.database.format.suppress_latex_warnings`
- the new option `config.commands.edit.editor` which takes precedence over the `$EDITOR` variable
### Changed
- the `INI`-style configuration is replaced with a `Python`-based configuration (#54,!25)
- for guidance on how to migrate an existing configuration please read https://mrossinek.gitlab.io/programming/cobibs-new-configuration/
- (DEV): `cobib.parser.Entry` has been moved to `cobib.database.Entry`
- the `cobib.parsers` module has been extracted (prep for #49, !28)
- the filenames of the associated files are preserved when exporting to a Zip file
- when trying to add an entry with an existing label, the database is not written to and a warning is raised early
- month conversion and special character escaping are only done upon saving entries to the database
- the path to the default logfile can now be configured via `config.logging.logfile` and defaults to `~/.cache/cobib/cobib.log`
### Deprecated
- the `INI`-style configuration is deprecated
- new configuration options will not be added to this style
- only bugs which fully break usability will be fixed with regards to this configuration style
- legacy-support will be fully removed on 1.1.2022
### Fixed
- the ZSH helper utilities now respect the `-c`, `-l`, and `-v` command line options
- the `RedoCommand` should only revert a previously `UndoCommand` operation (#65)
- the `SearchCommand` got some contexts improvements and correctly splits grep results
- unwrapping does not crash the TUI if the cursor was multiple lines below the new buffer height
- line continuation guides are not swallowed by current line highlighting
- ensure the TUI's top line does not become negative
- the TUI's handler for resizing events
- `JSONDecodeError`s thrown by the `ISBNParser` are caught and handled gracefully
### Removed
- the functions `read_database()` and `write_database()` are no longer available (!28)
## [2.6.1] - 2021-02-05
Pypi: https://pypi.org/project/cobib/2.6.1/
Note: [2.6.1] was not released from the `master`-branch, which resulted in a non-linear development.
### Changed
- `init --git` will not initialize a repository unless git has configured both, `name` and `email`
### Fixed
- TUI no longer crashes when aborting to quit (#64)
## [2.6.0] - 2020-12-31
Pypi: https://pypi.org/project/cobib/2.6.0/
### Added
- Git integration (#44, !20):
- will automatically track any changes done to the database file with git
- must be enabled by setting the `DATABASE/git` option to `True` **and** running `cobib init --git`
- Note, that you must have at least set a `name` and `email` in the git config!
- Undo/Redo commands to operate on git history of the database (#59,!23)
- for obvious reasons these commands require the Git integration (see above) to be enabled
- the `Prompt` command inside of the TUI:
- allows executing arbitrary CoBib CLI commands
- the default key binding is `:`
- the `Modify` command: (#60,!24)
- allows bulk modification of multiple entries in a `<field>:<value>` format
- for now, this will **always** overwrite the field with the new value!
- an extension to appending values is planned for a later release
- the set of entries to be modified can be specified just like with the `export` command through `list`-command filters or manual selection (by setting the `--selection` flag)
### Changed
- the viewport history is preserved correctly (#21,!22)
- this allows performing a search while showing an entry and reverts back to the correct view after quitting the search
- the changes mainly involved refactoring of the `cobib/tui` module
- the **positional** argument of the `modify` and `search` has been renamed internally from `list_arg` to `filter`
- this should not have any visible effect to an end-user but may be relevant to developers
### Fixed
- gracefully handle multiple terminal sizing issues with regards to popups (#58)
- catch messages on `stdout` during deletion from TUI
- added missing help strings to the TUI help menu
### Removed
- The `--force` argument to the `init` command has now been removed (after being deprecated in v2.5.0).
## [2.5.0] - 2020-12-08
Pypi: https://pypi.org/project/cobib/2.5.0/
### Added
- support for multiple associated files (#42,!19)
- interactive menu when opening an entry with multiple associated files (!19)
### Deprecated
- The `--force` argument to the `init` command has been deprecated. I don't think there is any
benefit to providing the user the option to nuke their database file from the CLI. Instead,
they can simply edit the file manually.
### Fixed
- always store years as strings to be compatible with bibtexparser
- handle invalid arXiv or DOI IDs gracefully (#57)
## [2.4.1] - 2020-11-01
Pypi: https://pypi.org/project/cobib/2.4.1/
### Fixed
- ISBN parser was missing the ENTRYTYPE and did not use strings for number fields
- the ISBN parser can now handle empty entries (#53)
- the TUI will not crash on stdout/stderr messages exceeding the window width
- the TUI respects quoted strings in the prompt handler (#52)
## [2.4.0] - 2020-10-14
Pypi: https://pypi.org/project/cobib/2.4.0/
### Added
- the `FORMAT/default_entry_type` option used for manual entry addition
- a **manual** insertion mode available through `edit -a new_label` and `add -l new_label`
- a ISBN-based parser for adding new entries (#45)
- the TUI-based `select` command (and corresponding settings) (#8,!18)
- the `--selection` argument for the `export` command (!18)
### Changed
- TUI color highlighting is now prioritized (!17)
### Fixed
- support URLs in file field during `open` command (#47)
- the TUI no longer crashes when encountering long prompt inputs (#48)
- the `edit` command can handle labels which start with common substrings (#46)
- support multiple ANSI colors on a single line (#50)
## [2.3.4] - 2020-09-14
Pypi: https://pypi.org/project/cobib/2.3.4/
### Fixed
- another AUR package installation error
## [2.3.3] - 2020-09-14
Pypi: https://pypi.org/project/cobib/2.3.3/
### Fixed
- AUR package installation error
## [2.3.2] - 2020-09-10
Pypi: https://pypi.org/project/cobib/2.3.2/
### Added
- option to default to case-insensitive searching (`DATABASE/search_ignore_case`)
### Changed
- clearing the prompt, aborts the command execution
### Fixed
- search command correctly handles missing arguments in TUI (#43)
## [2.3.1] - 2020-09-10
Pypi: https://pypi.org/project/cobib/2.3.1/
### Fixed
- faulty Pypi package
## [2.3.0] - 2020-09-10
Pypi: https://pypi.org/project/cobib/2.3.0/
### Added
- Logging functionality has been added. The verbosity level can be controlled via `-v` (INFO) and `-vv` (DEBUG).
As soon as the TUI starts, all logging output is redirected to `/tmp/cobib.log`.
- Command line argument `-l` or `--logfile` can be used to specify the output path of the log. This will overwrite the `/tmp/cobib.log` location.
- the `TUI/scroll_offset` setting was added. It defaults to `3` and behaves similar to Vim's `scrolloff` setting.
- Configuration validation has been added. This extends the logging functionality to support more runtime debug information.
- popup window support: stdout and stderr messages are presented in a popup similarly to the help window
### Changed
- `-v` command line argument now refers to `--verbose` rather than `--version`
- Performance of the `add` command has been improved by not refreshing the database when outside of the TUI.
### Fixed
- bug when resizing causes the window width to become greater than the buffer width (#39)
- do not escape special characters in labels (#40)
- avoid special character encoding in file paths
## [2.2.2] - 2020-08-13
Pypi: https://pypi.org/project/cobib/2.2.2/
### Fixed
- current line highlight if viewport is wider than buffer was not correctly reset
- the `ignore_non_standard_types` setting had no effect
## [2.2.1] - 2020-08-10
Pypi: https://pypi.org/project/cobib/2.2.1/
### Changed
- when wrapping the TUI lines, indent until after the label column (#26)
- renamed `default.ini` to `example.ini` in the documentation folder
### Fixed
- current line highlight after viewport width was not correctly reset
- correctly convert boolean configuration options (#34)
- fix crash of TUI in wrap command when viewport is empty (#37)
- default configuration settings are managed centrally and consistently (#35)
## [2.2.0] - 2020-07-12
Pypi: https://pypi.org/project/cobib/2.2.0/
### Added
- allow configuring the program used to `open` associated files
- prompt user before actually quitting CoBib (#33)
- implements the Search command (#7, !12)
### Fixed
- the default value of the `open` command was not set correctly
## [2.1.0] - 2020-06-14
Pypi: https://pypi.org/project/cobib/2.1.0/
### Added
- added half- and full-page scrolling (#22)
### Changed
- importing from `bibtex` data defaults to **not** ignored non-standard entry types (#28)
- suppress LaTex encoding warnings except when adding entries (#29)
- `Search` and `Select` print warnings to the prompt while not implemented
### Fixed
- `init` command ensures directory of database file exists
- remove window artifacts after `help` menu is closed (#20)
- configuration file detection was missing a user home expansion (#31)
## [2.0.0] - 2020-06-06
Pypi: https://pypi.org/project/cobib/2.0.0/
### Fixed
- respect sort order reversing and filter `XOR`ing from the TUI (#18)
- `edit` command on Mac OS (#19)
### Changed
- made `init` command safe against database overwriting
- TUI: list entries in reverse order by default (config: TUI/reverse_order)
## [2.0.0b4] - 2020-05-16
Pypi: https://pypi.org/project/cobib/2.0.0b4/
### Fixed
- reset viewport position when updating buffer
## [2.0.0b3] - 2020-05-16
Pypi: https://pypi.org/project/cobib/2.0.0b3/
### Fixed
- properly assert valid current line number
## [2.0.0b2] - 2020-05-16
Pypi: https://pypi.org/project/cobib/2.0.0b2/
### Fixed
- fixed TUI startup
## [2.0.0b1] - 2020-05-16
**Warning**: do NOT use! The TUI is broken in this release!
Pypi: https://pypi.org/project/cobib/2.0.0b1/
### Fixed
- TUI does not crash when opening an entry with no associated file
- correctly reset current line positions after filtering and editing
## [2.0.0b0] - 2020-04-28
Pypi: https://pypi.org/project/cobib/2.0.0b0/
### Changed
- _internal_: refactored the config into a class
- centralized the database handling to improve performance (#12,!9)
### Fixed
- the `Show` command does not break after scrolling the viewport (#13)
## [2.0.0a2] - 2020-04-27
Pypi: https://pypi.org/project/cobib/2.0.0a2/
### Added
- user configuration options for:
- TUI colors
- TUI key bindings
- TUI default list arguments
- help window highlighting
### Changed
- sorting and filtering commands remain persistent when updating the list view
## [2.0.0a1] - 2020-04-23
Pypi: https://pypi.org/project/cobib/2.0.0a1/
### Added
- Added a basic curses-based TUI (#5,!7)
### Changed
- _internal_: refactored commands into separate module
## [1.1.0] - 2020-03-28
Pypi: https://pypi.org/project/cobib/1.1.0/
### Added
- add `FORMAT.month` configuration option to configure the default type for
month fields (defaults to `int`) (#3,!4)
- escape special LaTeX characters (#2,!5)
### Fixed
- `list` no longer breaks with a `KeyError` when a queried field does not exist
in any bibliography entry (!2)
- `--label` can now correctly overwrite the ID (#4,!3)
### Changed
- `set_config()` and global `CONFIG` exported to separate module
## [1.0.2] - 2020-01-12
Pypi: https://pypi.org/project/cobib/1.0.2/
Note: this removal is not seen as a MINOR version bump because this is
essentially a long out-standing bug fix
### Removed/Fixed
- doi extraction from pdf files (476efc4f)
- also removes the ability to add entries directly via pdf files
## [1.0.1] - 2020-01-12
Pypi: https://pypi.org/project/cobib/1.0.1/
### Changed
- metadata for pypi
## [1.0.0] - 2020-01-12
First MAJOR release. Also available via Pypi: https://pypi.org/project/cobib/1.0.0/
The project was renamed from `CReMa` to `CoBib`
### Added
- allow sorting the list output (2a5a94f1)
- crude and slow (!!!) zsh completion (9f28f441)
- support Darwin's `open` command
### Changed
- suppress list output when exporting
- add used tags to columns when listing
- sort YAML database entries by keys (d2af42d2)
### Fixed
- fixed arxiv parser (7ce3726f)
## [0.2] - 2019-09-02
Note: this release was not marked MAJOR because this is still a WIP and early
alpha release.
### Added
- complete rewrite to use a plain-text `yaml` database instead of `sqlite3` !1
### Removed
- `sqlite3` database
## [0.1] - 2019-04-29
### Added
- initial version with a basic `sqlite3`-based database
[Unreleased]: https://gitlab.com/mrossinek/cobib/-/compare/v3.5.5...master
[3.5.5]: https://gitlab.com/mrossinek/cobib/-/compare/v3.5.5
[3.5.4]: https://gitlab.com/mrossinek/cobib/-/compare/v3.5.4
[3.5.3]: https://gitlab.com/mrossinek/cobib/-/compare/v3.5.3
[3.5.2]: https://gitlab.com/mrossinek/cobib/-/compare/v3.5.2
[3.5.1]: https://gitlab.com/mrossinek/cobib/-/compare/v3.5.1
[3.5.0]: https://gitlab.com/mrossinek/cobib/-/compare/v3.5.0
[3.4.0]: https://gitlab.com/mrossinek/cobib/-/compare/v3.4.0
[3.3.2]: https://gitlab.com/mrossinek/cobib/-/compare/v3.3.2
[3.3.1]: https://gitlab.com/mrossinek/cobib/-/compare/v3.3.1
[3.3.0]: https://gitlab.com/mrossinek/cobib/-/compare/v3.3.0
[3.2.1]: https://gitlab.com/mrossinek/cobib/-/compare/v3.2.1
[3.2.0]: https://gitlab.com/mrossinek/cobib/-/compare/v3.2.0
[3.1.1]: https://gitlab.com/mrossinek/cobib/-/compare/v3.1.1
[3.1.0]: https://gitlab.com/mrossinek/cobib/-/compare/v3.1.0
[3.0.0]: https://gitlab.com/mrossinek/cobib/-/compare/v3.0.0
[2.6.1]: https://gitlab.com/mrossinek/cobib/-/compare/v2.6.1
[2.6.0]: https://gitlab.com/mrossinek/cobib/-/tags/v2.6.0
[2.5.0]: https://gitlab.com/mrossinek/cobib/-/tags/v2.5.0
[2.4.1]: https://gitlab.com/mrossinek/cobib/-/tags/v2.4.1
[2.4.0]: https://gitlab.com/mrossinek/cobib/-/tags/v2.4.0
[2.3.4]: https://gitlab.com/mrossinek/cobib/-/tags/v2.3.4
[2.3.3]: https://gitlab.com/mrossinek/cobib/-/tags/v2.3.3
[2.3.2]: https://gitlab.com/mrossinek/cobib/-/tags/v2.3.2
[2.3.1]: https://gitlab.com/mrossinek/cobib/-/tags/v2.3.1
[2.3.0]: https://gitlab.com/mrossinek/cobib/-/tags/v2.3.0
[2.2.2]: https://gitlab.com/mrossinek/cobib/-/tags/v2.2.2
[2.2.1]: https://gitlab.com/mrossinek/cobib/-/tags/v2.2.1
[2.2.0]: https://gitlab.com/mrossinek/cobib/-/tags/v2.2.0
[2.1.0]: https://gitlab.com/mrossinek/cobib/-/tags/v2.1.0
[2.0.0]: https://gitlab.com/mrossinek/cobib/-/tags/v2.0.0
[2.0.0b4]: https://gitlab.com/mrossinek/cobib/-/tags/v2.0.0b4
[2.0.0b3]: https://gitlab.com/mrossinek/cobib/-/tags/v2.0.0b3
[2.0.0b2]: https://gitlab.com/mrossinek/cobib/-/tags/v2.0.0b2
[2.0.0b1]: https://gitlab.com/mrossinek/cobib/-/tags/v2.0.0b1
[2.0.0b0]: https://gitlab.com/mrossinek/cobib/-/tags/v2.0.0b0
[2.0.0a2]: https://gitlab.com/mrossinek/cobib/-/tags/v2.0.0a2
[2.0.0a1]: https://gitlab.com/mrossinek/cobib/-/tags/v2.0.0a1
[1.1.0]: https://gitlab.com/mrossinek/cobib/-/tags/v1.1.0
[1.0.2]: https://gitlab.com/mrossinek/cobib/-/tags/v1.0.2
[1.0.1]: https://gitlab.com/mrossinek/cobib/-/tags/v1.0.1
[1.0.0]: https://gitlab.com/mrossinek/cobib/-/tags/v1.0.0
[0.2]: https://gitlab.com/mrossinek/cobib/-/tags/v0.2
[0.1]: https://gitlab.com/mrossinek/cobib/-/tags/v0.1