Coder Social home page Coder Social logo

pycmd's People

Contributors

bdumitriu avatar clackwell avatar horeah avatar santagada avatar spavid04 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

pycmd's Issues

Cd to an inexistent folder crashes PyCMD

C:\U\leonardo.santagada> cd Idon'texist


************************************
PyCmd has encountered a fatal error!

Traceback (most recent call last):
  File "PyCmd.py", line 555, in internal_cd
FileNotFoundError: [WinError 2] The system cannot find the file specified: b"Idon'texist"

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "PyCmd.py", line 774, in <module>
  File "PyCmd.py", line 526, in main
  File "PyCmd.py", line 587, in run_command
  File "PyCmd.py", line 558, in internal_cd
AttributeError: 'str' object has no attribute 'decode'

Crash report written to:
  C:\Users\leonardo.santagada\AppData\Roaming\PyCmd\crash-20230110_161154.log

Press any key to exit...
************************************

Interactive directory history

In order to allow for a longer directory history PyCmd should use an interactive, searchable Window (similar to the one used for zsh-style completions) when Alt-D is pressed.

Support emacs-style keybindings in interactive selection windows

In the selection window (e.g. when listing completions), accept Ctrl-P/N/F/B as an alternative to Up/Down/Right/Left and Ctrl-V/Alt-V as an alternative do PgDn/PgUp.

In addition: "entering" the interactive window after pressing Tab is now performed using the "Down" key; Ctrl-N should be accepted as an alternative.

Note: implementation-wise, I would go for a match-case statement. This might be a nice preview/proof-of-concept for using a match-case in the main key-dispatching loop in PyCmd.py (currently kind of messy)

use prompt-toolkit

Hi,

Has prompt-toolkit been considered? It would give most of fish shell features missing, vim keybindings and more. The downside is moving token parsing and other infrastructure code to it.

I can give it a try next weekend if this an interesting path.

Access is denied.

Every time I start this application, this was printed in the screen:

Access is denied.
Access is denied.
Access is denied.

Welcome to PyCmd 20240206-x64!


F:\Downloads\PC-20240206-w64\PyCmd>

The message "Access is denied." is also printed 3 times after every command that I run inside PyCmd!

App Version: 20240206
OS Version: Windows 10 x64

  • The last version (20230829) works fine!

Thanks.

Ctrl+r for search

Hi,

Thanks so much for porting PyCMD to python 3 and moving to github!

I've tried the latest release here and while most seem to work it seems like Ctrl+R is not bind to search, and Shift + F3 also doesn't seem to work. Together with ctrl + a and ctrl + e and general up and down for history, history search on ctrl+r is my most used keybinding on bash. Is there a reason for it not being set?

PyCmd on Linux (running on top of bash)

As an experiment, PyCmd can now also run on Linux (or WSL) as a front-end for bash; this issue is for collecting and tracking related feedback.

Rationale: while shells focused on user interaction do exist in the Linux world (e.g. fish, and also zsh in some regards) and they are way more advanced than PyCmd, there are still a few areas that PyCmd/Linux covers better (at least in my opinion):

  • Runs straight on top of bash, and therefore can directly run bash commands, source bash scripts etc. This means bash users (the vast majority of shell users in the world, for what it's worth) can use it straight-away with no additional learning or adaption.
  • Offers consistent interaction (appearance, completion, shortcuts etc.) across Windows (running on top of cmd) and Linux (running on top of bash). For users who need both (like I do for my $DAYJOB) this makes for reduced cognitive overhead.
  • The command search (both immediate filtering with the "Up" arrow and the modal "Ctrl-R" search) is more powerful and intuitive than what I (for one) have seen in other shells.
  • Completing wildcards is much more useful than the typical shell: the matching files are listed and can be selected interactively from the completion list.
  • The directory history (fish also offers some of this, but in a more rudimentary form).
  • Git & SVN-aware prompt out of the box
  • Friendlier editing (selection, undo, token expansion with Alt-/)
  • Pressing Esc pushes the command to the history; this doesn't sound like a lot but for me it is very helpful in practice (I often start typing a command, then realize I am in the wrong folder; I can press Esc, then cd to the correct directory, then use the Up arrow to retrieve the half-typed command).

There are a lot of things that are currently not working or need to be improved, of course; the most important ones are listed here:

  • Multi-line commands are not really supported
  • Running commands that produce a lot of output is much slower compared to a typical shell; this is because the output is intercepted by PyCmd and therefore processed in Python (this does open opportunities for interesting new features though; e.g. a shortcut that would copy the output of the previous command to the Clipboard).
  • Using the clipboard directly from PyCmd doesn't work for now; one must use the terminal copy/paste functionality like with any other shell
  • Shell variables (as opposed to exported variables) are not expanded when completing
  • Internal commands are not completed
  • Quoting is not properly accounted for when completing
  • Bracketed paste is disabled
  • ... more will probably be discovered along the way

One can try it out using release bundle "20230424-linux64", or by checking out branch "mesh" -- note that I consider this a "private" branch for now and might be still amending/rebasing; if someone wants to contribute, some prior coordination will be needed.

Provide a way to remove commands from history

Sometimes it is desirable to delete some earlier command from the history (e.g. it might contain sensitive information, or maybe it's just plain wrong and we don't want it to "pollute" the history).

This action could be triggered by some key combination (Ctrl-Shift-K?) while navigating the history (either via the current paradigm "type filter string, then Up" or possibly during incremental search as proposed by #1).

Implementing this is complicated because it requires cooperation between multiple running PyCmd instances: deleting from the current instance is not enough, as the other instances will still have it and save it in the history file. This is why the only manual workaround is currently to close all PyCmd processes for the current user, then manipulate the %APPDATA%\history file using some editor.

Ideas on how to implement this (ideally: in a simple way) are welcome ๐Ÿ˜„

Use actual Unicode width when computing the cell-width of strings printed to the terminal

This was initially reported by @santagada in the context of the incremental history search (#1) but applies to several other places in the code: assuming that the number of terminal cells is equal to the number of characters in the printed string is incorrect for certain classes of Unicode characters!

The suggested solution is to use a package like wcwidth (https://pypi.org/project/wcwidth/) whenever terminal sizes and offsets are being computed.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.