Commit Graph

23 Commits

Author SHA1 Message Date
Vladimir Zhelezov
9569cfc8f3 Style: unset compopt filenames if completing command or option
This is about the looks of the completion list -- if we have a
directory with the name of a subcommand it will be presented with
a trailing slash. This avoids that.
2021-02-28 08:33:16 +01:00
Vladimir Zhelezov
dfc8796b25 Style: replace $cur with $subcommand
It changes nothing but spells out intention more clearly
2021-02-28 08:33:16 +01:00
Vladimir Zhelezov
689ad83668 More option argument completions
Added handlers for:
--output-format
--close-acct
--open-acct
--debug

Added --drop to blocking list
2021-02-28 08:33:16 +01:00
Vladimir Zhelezov
fc89340c93 Add optional arguments $prefix and $match to _hledger_compgen()
This allows more flexibility when generating completion candidates
and we don't need to resort to external help from `sed` or others.
_hledger_compgen's arguments become:

$1 -> $wordlist:
   a newline separated wordlist with completion cadidates
$2 -> $prefix:
   (optional) a prefix string to add to generated completions
$3 -> $match:
   (optional) a word to match instead of $cur, the default.

If $match is null and $prefix is defined the match is done against $cur
stripped of $prefix. If both $prefix and $match are null we match against
$cur and no prefix is added to completions. Of course you can also pass
an empty string as $prefix and set $match to whatever you wish.
2021-02-28 08:33:16 +01:00
Vladimir Zhelezov
10cc8b72b9 Use _init_completion()
This handles a lot that we have to do manually otherwise. Without
this we need to handle e.g. redirections to get completion for say:
> hledger payees > <TAB>

Also because this function assumes that we use `cur`, `prev`, `words`
and `cword` and sets them up for us, `wordToComplete`, `COMP_WORDS`
and `COMP_CWORD` are renamed accordingly. Those names are pretty much
hard-coded in bash completion so it is easier to follow the lead than
go with custom variable names.
2021-02-28 08:33:16 +01:00
Vladimir Zhelezov
3706636a76 Fix or silence shellcheck warnings
There are a couple of places where (un)quoting is intentionally
skipped so make those explicit.
2021-02-28 08:33:16 +01:00
Vladimir Zhelezov
31f7a32e36 Query filter completion for amt, real and status; clean whitespace 2021-02-28 08:33:16 +01:00
Vladimir Zhelezov
812a525acf Basic settings for major editors: prevent mixing tabs and spaces 2021-02-28 08:33:16 +01:00
Vladimir Zhelezov
dee25d4811 Fix: pass *all* accounts and rules files to hledger calls
_hledger_optarg() is used to parse the options on the command line
and provide their arguments for context aware completion suggestions
2021-02-28 08:33:16 +01:00
Vladimir Zhelezov
d98ff3b93d Fix quoted/escaped file path handling in _hledger()
When reading hledger (rules-)file from COMP_WORDS we need to unescape it
first. For once compgen is doing exactly what we need :)
2021-02-28 08:33:16 +01:00
Vladimir Zhelezov
72b737a42f Fix #1404, and more...
This was supposed to be just a fix for #1404 but upon visiting the source
several issues became apparent and that is why the commit grew a bit more than
expected. A complete list of changes bellow:

* Fix #1404
No more orphaned temporary directories. Commands, options, etc. that used to be
stored in there are included at build-time as here documents in the source.

* Fix artifacts in =/tmp= after build
Upon fixing the above I became aware that the build itself was leaving behind a
heap of artifacts in =/tmp= that were not taken care of with a ~make clean~.
Fixed by using temporary files and directories in the build directory. Makefile
and build scripts adjusted.

* Produce command aliases
Regular expressions in build scripts changed to produce all command aliases
except single letter ones (see below)

* Do not propose single letters completions
It is simply not useful and adds a lot of noise. It makes completion slower as
well because you need to hit yes on the prompt:
> Display all 200 possibilities? (y or n)
=output-options.sh= now excludes those.

* Query filters simplified
Keep only the prefix of the filter with the colon in =query-filters.txt=. This
change has two reasons:
- Single letter completions are not useful (see above)
- It allows for completion suggestions specific to each
- Bonus reason: it's a completion engine, not a user manual.

* Fix completion impacts on global environment
The completion script was making a couple of changes to the global environment
which had an impact for the rest of the shell session.

~set -o pipefail~: the change is hidden from the user and could lead to subtle
errors throughout the shell session

COMP_WORDBREAKS=" ": this affects subsequent completions for us and other
programs too. I exclude the colon =:= from its value and use
~compopt -o filenames~ to handle escaping of special characters for us. I would
like to find a solution without messing with COMP_WORDBREAKS but it is not
straight forward.

* Fix hiding of legit subcommands
Completion was hiding all possibilities if a subcommand happens to be the prefix
of another. On typing ~balance~, one should be proposed ~balancesheet~ and
~balancesheetequity~ as well.

* Return early
Try to complete depending on the current context and return immediately if
successful. Keep completion list relevant and as short as possible.

* Context aware completion
- Add handlers for option parameter completion, see _hledger_compreply_optarg()
- Add handlers for query filters:, see _hledger_compreply_query()
- Use --file and --rules-file arguments when proposing completions for the
  above, see _hledger()
- Propose only top level accounts at first. Again, keep it short and focused.

* Custom ~compgen~ wrapper
~compgen~ is fairly complicated. There is no way to feed it a word list with
literals. It will mangle your input in so many ways that we cannot trust it. To
work around this several wrappers are used: _hledger_compgen() works with
_hledger_quote_by_ref() to process and escape newline separated input which is
then fed to ~compgen~ and finally in ~COMPREPLY~ through _hledger_compreply()
and _hledger_compreply_append(). It sounds messy and I guess it is, I would like
to find a more straight forward way to do it. I think it is still a way better
and safer interface with ~readline~ than trying to ~grep~ our way through.

* Replace ~declare~ with ~local~
Again, this script is sourced by the shell -- keep variable scopes as narrow as
possible.

* Use ~compopt -o nosort~
Often I resort to using it to keep different groups of completions together.
Whether this is more ergonomic or not is subjective. But our input lists are
already sorted at build-time so why not. Sort manually =query-filters.txt= when
changing it.

* Remove irrelevant comments
And add some new ones :)

I think that is all. Give it a spin, try to abuse it, in and outside of quotes,
with some funky accounts, payees, tags, whatever, and tell me where it breaks or
behaves unexpectedly.
2021-02-28 08:33:16 +01:00
Simon Michael
37e49ada70 cli: rename --infer-value to --infer-market-price
For clarity; infer-value was too vague. The old spelling remains
supported for compatibility, but is now deprecated.
When typing, --infer-market or even --infer (for now) is sufficient.
2021-02-05 15:16:39 -08:00
Jakob Schöttl
1fb6f17bb2 Update shell completion for current master (v1.19) 2020-09-06 17:11:59 -07:00
Simon Michael
4db14ef70f ;api: another round of hledger-api purging; fix the build 2019-09-11 14:49:22 -07:00
Jakob Schöttl
1bc246681f Update shell completion script 2019-06-30 10:38:06 +02:00
Jakob Schöttl
7bf71e709c Bugfix: long options must start with a letter 2019-02-16 06:52:21 -08:00
Jakob Schöttl
ea21d45d3f Make completions work for hledger-* 2019-02-16 06:52:21 -08:00
Jakob Schöttl
966d949807 Update completion 2019-02-16 06:52:21 -08:00
Jakob Schöttl
f989d6124d Update bash completion script
This removes duplicate options from the completion, does not list -h as
command anymore, and adds the latest options (i.e. register --invert).
2019-02-16 06:52:21 -08:00
Jakob Schöttl
3f407a326d Add completions for query filters 2019-01-23 16:46:17 -08:00
Jakob Schöttl
f19eb04e8d Update completion script artifact 2019-01-23 16:46:17 -08:00
Jakob Schöttl
65ec51c3d9 Apply naming convention for function and variable name
It seems to be convention to start the completion function name with an
underscore. I also prepend an underscore to the global variable.

(I still don't understand why  env  does not show this global variable
defined in the hledger-completion.bash script.)
2019-01-23 16:46:17 -08:00
Jakob Schöttl
84eaf20f9b Add bash completion script (an artifact) 2019-01-23 16:46:17 -08:00