diff --git a/CHANGELOG.md b/CHANGELOG.md index 2786a06..c13bcce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Pass through return code 1 from selection tool +- (!) Number of displayed recent emoji can be set with `-P` option. This replaces previous `-P` + history flag toggle. Use number to set amount of recent entries to display, `-P3`. To + completely hide history use `-P0` ### Changed diff --git a/README.md b/README.md index 9100016..6211079 100644 --- a/README.md +++ b/README.md @@ -118,10 +118,10 @@ By default, bemoji will sort the list it displays by your most frequently and mo To disable this behavior, execute bemoji like the following: ```bash -bemoji -P +bemoji -P 0 ``` -This will stop bemoji from re-ordering your emoji lists before displaying them. +This will stop bemoji from adding recently used emoji before displaying the list. You can also stop bemoji from adding any emoji to your history in the first place: @@ -133,20 +133,30 @@ This will not add any of the emoji you pick to your recent emojis. Put both together to completely ignore the recent emoji feature of the program: ```bash -bemoji -Pp +bemoji -p -P0 ``` Like this, you'll be hiding any recent personal emoji and no one will know that you always type 👄🍆💦. +To limit the number of your recently used emoji that are shown without hiding them completely simply increase the number to however many you wish to display. +For example, to display only the top 4 recently used emoji: + +```bash +bemoji -P 4 +``` + The recent list will also contain emoji that are *not* usually on your lists, so kept in single-use lists for example. If you don't wish those to show up, make use of these options. -### Setting custom directories +### Setting custom directories and editing history By default bemoji stores your recent history in `$XDG_STATE_HOME/bemoji-history.txt`, so most often in `~/.local/state/bemoji-history.txt` +You can edit this file in any text editor to change your recent history, +removing, adding or changing the emoji appearing there. + You can overwrite the directories bemoji uses for its emoji lists and history files with the following two environment variables: ``` @@ -248,16 +258,16 @@ What follows is a list of all environment variables bemoji understands, with their default settings ```bash -BEMOJI_DB_LOCATION=$XDG_DATA_HOME/bemoji # where the emoji lists reside -BEMOJI_HISTORY_LOCATION=$XDG_STATE_HOME # where the state file resides +BEMOJI_DB_LOCATION="$XDG_DATA_HOME/bemoji" # where the emoji lists reside +BEMOJI_HISTORY_LOCATION="$XDG_STATE_HOME" # where the state file resides BEMOJI_CUSTOM_LIST="" # the custom emoji list to display BEMOJI_DOWNLOAD_LIST="" # the default emoji lists to download to database -BEMOJI_DEFAULT_COMMAND= # which command to invoke by default -BEMOJI_PICKER_CMD=bemenu # which picker tool to use -BEMOJI_CLIP_CMD=wl-copy # which clipboard tool to use -BEMOJI_TYPE_CMD=wtype # which typing tool to use (ydotool will NOT work) +BEMOJI_DEFAULT_COMMAND="" # which command to invoke by default +BEMOJI_PICKER_CMD="bemenu" # which picker tool to use +BEMOJI_CLIP_CMD="wl-copy" # which clipboard tool to use +BEMOJI_TYPE_CMD="wtype" # which typing tool to use (ydotool will NOT work) BEMOJI_PRIVATE_MODE=false # whether to save new entries -BEMOJI_IGNORE_RECENT=false # whether to display recent entries +BEMOJI_LIMIT_RECENT="" # whether to display recent entries BEMOJI_ECHO_NEWLINE=true # whether to end the output with a newline character ``` diff --git a/bemoji b/bemoji index 10ce980..f054141 100755 --- a/bemoji +++ b/bemoji @@ -18,7 +18,7 @@ bm_echo_newline=${BEMOJI_ECHO_NEWLINE:-true} # Do not save choices bm_private_mode=${BEMOJI_PRIVATE_MODE:-false} # Do not sort results -bm_ignore_recent=${BEMOJI_IGNORE_RECENT:-false} +bm_limit_recent="$BEMOJI_LIMIT_RECENT" # Report usage usage() { @@ -35,7 +35,7 @@ usage() { echo " Other options:" echo " -n Do not print a newline after the picked emoji." echo " -p Do not save picked emoji to recent history." - echo " -P Do not order emoji by recently used." + echo " -P Limit number of recent emoji to display." echo " -D Choose from default lists to download." echo " Valid choices: all|none|emoji|math (multiple choices possible)." echo " -f Use a custom emoji database. Can be a url which will be retrieved." @@ -51,7 +51,7 @@ version() { } # Get Options -while getopts ":f:D:tcenpPhv" o; do +while getopts ":f:D:tcenpP:hv" o; do case "${o}" in f) BEMOJI_CUSTOM_LIST="${OPTARG}" ;; t) bm_cmds+=(_typer) ;; @@ -60,7 +60,7 @@ while getopts ":f:D:tcenpPhv" o; do n) bm_echo_newline=false ;; D) BEMOJI_DOWNLOAD_LIST="${OPTARG}" ;; p) bm_private_mode=true ;; - P) bm_ignore_recent=true ;; + P) bm_limit_recent="${OPTARG}" ;; h) usage 0 ;; v) version ;; *) usage 1 ;; @@ -117,25 +117,33 @@ gather_emojis() { result=$(cat "$bm_db_location"/*.txt) fi - if [ "$bm_ignore_recent" = true ]; then + if [ -n "$bm_limit_recent" ] && [ "$bm_limit_recent" -eq 0 ]; then printf "%s" "$result" - else - printf "%s\n%s" "$(get_most_recent)" "$result" | cat -n - | sort -uk2 | sort -n | cut -f2- + return fi + + printf "%s\n%s" "$(get_most_recent "$bm_limit_recent")" "$result" | cat -n - | sort -uk2 | sort -n | cut -f2- } get_most_recent() { + limit=${1} recent_file="$bm_history_file" if [ ! -f "$recent_file" ]; then touch "$recent_file" fi # TODO improve this messy line - sed -e '/^$/d' "$recent_file" | + local result + result=$(sed -e '/^$/d' "$recent_file" | sort | uniq -c | - sort -rn | + sort -k1rn | sed -e 's/^\s*//' | - cut -d' ' -f2- + cut -d' ' -f2-) + if [ -z "$limit" ]; then + echo "$result" + else + echo "$result" | head -n "$limit" + fi } add_to_recent() { diff --git a/test/bemoji_history.bats b/test/bemoji_history.bats new file mode 100644 index 0000000..82d7394 --- /dev/null +++ b/test/bemoji_history.bats @@ -0,0 +1,57 @@ +#!/usr/bin/env bash + +setup_file() { + # make bemoji executable from anywhere relative to current testfile + TEST_DIR="$( cd "$( dirname "$BATS_TEST_FILENAME" )" >/dev/null 2>&1 && pwd )" + PATH="$TEST_DIR/..:$PATH" +} + +setup() { + load 'test_helper/bats-support/load' + load 'test_helper/bats-assert/load' + + # mock out interactive picker for static emoji return + export BEMOJI_PICKER_CMD="echo ❤️" + + # set up small default set of test emoji for each test + export BEMOJI_DB_LOCATION="$BATS_TEST_TMPDIR/database" + export BEMOJI_HISTORY_LOCATION="$BATS_TEST_TMPDIR/history" + mkdir -p "$BEMOJI_DB_LOCATION" "$BEMOJI_HISTORY_LOCATION" + cat "$BATS_TEST_DIRNAME/resources/test_emoji.txt" > "$BEMOJI_DB_LOCATION/emoji.txt" +} + +@test "sorts by frecency" { + echo -e "there\nhello\nhello" > "$BEMOJI_HISTORY_LOCATION/bemoji-history.txt" + echo -e "database" > "$BEMOJI_DB_LOCATION/emoji.txt" + BEMOJI_CLIP_CMD="cat -" BEMOJI_PICKER_CMD="cat -" run bemoji 3>&- + assert_output "hellotheredatabase" +} + +@test "history limiting uses sorted results" { + echo -e "zany\nmy\nisee\nonomatopeia" > "$BEMOJI_HISTORY_LOCATION/bemoji-history.txt" + echo -e "database" > "$BEMOJI_DB_LOCATION/emoji.txt" + BEMOJI_CLIP_CMD="cat -" BEMOJI_PICKER_CMD="cat -" run bemoji -P 1 3>&- + assert_output "iseedatabase" +} + +@test "history limiting takes frecency into account" { + echo -e "there\nfriend\nhello\nhello" > "$BEMOJI_HISTORY_LOCATION/bemoji-history.txt" + echo -e "database" > "$BEMOJI_DB_LOCATION/emoji.txt" + BEMOJI_CLIP_CMD="cat -" BEMOJI_PICKER_CMD="cat -" run bemoji -P 1 3>&- + assert_output "hellodatabase" +} + +@test "-P 0 disables history" { + echo -e "there\nfriend\nhello\nhello" > "$BEMOJI_HISTORY_LOCATION/bemoji-history.txt" + echo -e "database" > "$BEMOJI_DB_LOCATION/emoji.txt" + BEMOJI_CLIP_CMD="cat -" BEMOJI_PICKER_CMD="cat -" run bemoji -P 0 3>&- + assert_output "database" +} + +@test "BEMOJI_LIMIT_RECENT=0 disables history" { + echo -e "there\nfriend\nhello\nhello" > "$BEMOJI_HISTORY_LOCATION/bemoji-history.txt" + echo -e "database" > "$BEMOJI_DB_LOCATION/emoji.txt" + BEMOJI_LIMIT_RECENT=0 BEMOJI_CLIP_CMD="cat -" BEMOJI_PICKER_CMD="cat -" run bemoji 3>&- + assert_output "database" +} +