Commit Graph

68 Commits

Author SHA1 Message Date
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
4db14ef70f ;api: another round of hledger-api purging; fix the build 2019-09-11 14:49:22 -07:00
Jakob Schöttl
ea21d45d3f Make completions work for hledger-* 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
1ee13bff66 Fix comments 2019-01-23 16:46:17 -08:00
Jakob Schöttl
43b3fb3cae Bugfix: use proper built-in file completion with support for subfolders 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
e491f34ddf Bugfix and remove unused code
Bug was: Account names with spaces were broken into single completion
suggestions, not line by line.
2019-01-23 16:46:17 -08:00
Jakob Schöttl
90257a1729 Fix comments 2019-01-23 16:46:17 -08:00
Jakob Schöttl
e747b9fa8c Remove useless case 2019-01-23 16:46:17 -08:00
Jakob Schöttl
637ab8855d Bugfix for --file=... case 2019-01-23 16:46:17 -08:00
Jakob Schöttl
1cd979ae18 Bugfix: Must use array here because of word splitting 2019-01-23 16:46:17 -08:00
Jakob Schöttl
e3826be379 Cosmetic changes 2019-01-23 16:46:17 -08:00
Jakob Schöttl
dc73b55b7b Add files for bash completion 2019-01-23 16:46:17 -08:00