Erlang interpreter: Vi mode - erlang

I'm currently trying to get my hands dirty with Erlang. Also, in the (zsh) shell, I have got accustomed to using vi mode for line editing (set -o vi).
So: Is there a way to make the Erlang interpreter use more vi-like keybindings?

Yes! Just call it as
rlwrap erl -oldshell
NOTE: you may need to install rlwrap (readline wrapper) and adjust your .inputrc (set editing-mode vi)

No!
Well you could write your own line edit module and use that.

Related

Changing the homebrew editor

I would like to change my HOMEBREW_EDITOR. Sadly I do not have a ~/.bash_profile as I am using a Mac. Instead I have a ~/.zprofile which usually does the job. Now I added HOMEBREW_EDITOR=nano to this profile and typed in source ~/.zprofile but nothing changes. What can I do?
Thanks,
Emil
I was expecting nano to open when typing in brew edit but vim opened again.
Having a ~/.bash_profile is unrelated to you using a Mac or not: you can create it if you want. However if you used ~/.zprofile in the past for such thing indicates you are using Zsh instead of Bash, so your configuration should go in ~/.zprofile (or ~/.zrc) rather than ~/.bash_profile (or ~/.bashrc).
The part you are missing is the export keyword:
export HOMEBREW_EDITOR=nano
Without export, the variable would be set for your shell but wouldn’t be passed to child processes such as Homebrew.

Why VI always starts in insert mode?

At some point, whenever I use vi from the command line (windows 10/WSL) it starts up in insert mode, meaning that everything I usually do to navigate ends up adding stuff to the file, wasting time having to clean it up.
I didn't have a vimrc file, and there doesn't seem to be anything in my bash rc files to modify vi behavior. Any ideas what I may have done or any ideas how to stop this behavior? I'm using Ubuntu-20.04
FWIW, adding a .vimrc file with tab related settings didn't change it's behavior. I looked at the /etc/vimrc file, and nothing inside it seemed relevant.
After plowing through google search and trying everything I understand about configuring 'vim' and doing comparison tests, I think:
This behavior is specific to Windows Terminal when opening a WSL terminal. Using WSL's "native" terminal (i.e., clicking the "Ubuntu 20.04 LTS" menu in the "Start" menu) doesn't have this problem.
My original motivation for switching to Windows Terminal is for its multi-tab feature. But this new behavior is crazy -- it works against years of my muscle memory of using "vi", and I'm almost certain that one day I'll accidentally update some configuration file while reading it in "vi". And, I cannot re-train a new muscle memory because all the rest of the UNIX world (e.g., when I SSH into a remote server) hasn't changed. This is like constantly switching between a Mac keyboard and a PC keyboard where the Ctrl key, etc., are in different places.
My solution: I switched to MobaXterm. It has multi-tab support, and is actually richer in features compared to Windows Terminal.
Please run the following:
alias | grep vim
sudo find / -name .vimrc 2>/dev/null
These commands should show you all the places to check, change the alias or fix the .vimrc files found.
Do you find it always going into edit mode, when you vim a file directly and when you use vim as the git commit editor for example?
EDIT:
You could also try which -a vim or whereis vim to see if you have multiple versions. Or failing that sudo find / -name vim 2>/dev/null
here is a better solution. I downloaded the binary.
https://github.com/lxhillwind/vim-bin/releases/tag/v9.0.0978
Put the vim command in /usr/bin/vi
Put the runtime in:
/usr/local/share/vim/runtim
sudo apt remove vim vim-common vim-runtime vim-tiny
sudo apt purge vim vim-common vim-doc vim-runtime vim-tiny
The second line actually gets rid of residual-defaults.
There is also a defaults.vim someplace on the system. I just nuked it.
I went through and made sure there were no aliases or vi or vim configuration files, but still no luck.
This is a horrible solution, but the only thing that is keeping my sanity right now.
vi -c ":imap jj "
You can alias it in your .bashrc. Looking into better solutions.

how to do vi style navigation in rail console

How can I do VI style navigation in rails console?
In my .bash_profile i do set -o vi and then in my terminals I enjoy vi style navigation.
I can do dd to delete a line, cmd+$ to jump to end of line, etc etc.
I want to get the same thing in rails console?
You need to set the editing-mode to vi.
The easiest way to do that is simply creating the file .inputrc in your home folder and add the mode:
$ echo "set editing-mode vi" >> ~/.inputrc
And voilá!
I had the same issue although using inputrc didn't work. The reason it didn't work though is because I was using zsh as my shell. Zsh does NOT use inputrc for setting the input mode. Hence if you want to use vi editing mode in rails console and you're using zsh as your shell do the following:
Add the following to your ~/.zshrc
bindkey -v
References:
https://wiki.archlinux.org/index.php/Zsh#Key_bindings
http://zsh.sourceforge.net/Guide/zshguide04.html
just wanted to point out that there is a gem called
rb-readline
this gem breaks rails console's ability to work in vi mode
(my project had bundled it because this gem was once necessary for byebug to work)

How to pass env variables to GNOME

I want to replace some utilities(like telnet) with transparent wrappers(with loggers).
At first I used aliases, that worked nicely at the command line but gnome doesn't understand shell aliases so that when people would launch the utilities as the shell for a gnome-terminal profile it would run the actual utility instead of the wrapper.
Then I tried adding new folder with symlinks and prepended it to PATH(security isn't a huge concern plus its a special folder just for these symlinks) in ~/.bashrc but they still run the original(I'm guessing gnome doesn't run .bashrc since it works from the command line). Any ideas where setting path needs to go?
Maybe update-alternatives fits your needs?
I found two ways to do this that seem to work like I want(sourcing scripts for gnome env).
First putting it in ${HOME}/.gnomerc (but I found some places that say you should manually exec gnome session afterwards and others that don't(It seems to work fine without it) and I'm afraid of breaking login.)
Putting it in ~/.profile seems to work so I just
echo 'PATH=~/.symlink_dir/:${PATH}' > ~/.profile
(note that this is ignored by bash if a ~/.bash_profile exists so you may want to manually source it from ~/.bash_profile just in case
echo 'source ~/.profile' >> ~/.bash_profile).
If you really want to use your replacement utilities throughout, you could put symlinks to your replacements in /usr/bin/ (or wherever as appropriate) and move the originals to /usr/bin/originals/ (or wherever).
If you do that, you'd better make sure that your wrappers are rock solid though. Depending on what you're replacing, errors might prevent booting, which is generally undesirable.
It might not be what you are asking, but have you tried changing the commands of the launchers from the menu editor.
If you are using Gnome 3 you will have to download the alacarte package.

Run erlang application without terminal depending

I have erlang application: *.app file and some *.erl files. I compile all of them. In terminal i start erl and there application:start(my_application)., all ok, but if i closed terminal application close too. How can i run application without terminal depending?
Thank you.
You likely want to use the -noshell option to erl. The syntax is
erl -noshell -s Module Function Arguments
So in your case, this might be
erl -noshell -s application start my_application
This should allow you (for example if you are on Unix/Linux) to start your application as a background process and leave it running.
One useful variation is to also call the stop/0 function of the init module so that the Erlang environment will stop when it has finished running your function. This comes in handy if you want to run a simple one-use function and pipe the output to some other process.
So, for example, to pipe to more you could do
erl -noshell -s mymodule myfunction -s init stop | more
Finally, you might also be able to use the escript command to run your Erlang code as scripts rather than compiled code if it makes sense for your situation.
Hope that helps.
The proper way to handle this situation, is building a release containing your app and running the system as so called embedded one.
This release is going to be completely independent (it will hold erts and all the libs like, kernel, std, mnesia etc.).
On start, the new process will not be connected to shell process.
It will be OS process, so you can attach to it with pipes. All script are included in OTP.
Here is some info: http://www.erlang.org/doc/design_principles/release_structure.html
It may seem to be complicated, but tools like rebar do everything for you.

Resources