brkn

brkn

My env and context

  • Elixir 1.19.1
  • Erlang 28.1.1
  • Editor: vscodium (Basically same as vscode)
  • Vscodium Extension: ElixirLS v0.30.0
  • Not sure if it matters: zsh, macos arm
  • I’m a beginner in elixir and beam

My problem

I have a language agnostic repo, and I’m trying to get my editor to format my script files.

Example scripts/upcase

  #!/usr/bin/env elixir

  case System.argv() do
    [] -> IO.read(:stdio, :all)
    args -> Enum.join(args, " ")
  end
  |> String.upcase()
  |> IO.puts()

When I open this file on my editor, it detects the language and syntax highlights correctly but format file command doesn’t work.

So I thought I could do it via mix format but that didn’t work either, silently exits without formatting.

What I tried

  1. mix format scripts/upcase is silently exiting, no changes.
  2. Could it be because my lang agnostic repo doesn’t have .formatter.exs file?
    1. mix format –-dot-formatter ~/.formatter.exs scripts/upcase
    2. ❯ cat ~/.formatter.exs                                        
      [
        inputs: ["scripts/upcase"]
      ]
      
    3. still silently exiting, file is not changed.
  3. After reading the mix format docs carefully, I realized I can pipe string into mix format -
    1.   mix format - < scripts/upcase > /tmp/temp && mv /tmp/temp scripts/upcase
      
    2. Yes this works, but it’s very clunky.

Why could this be?

So I dived into the source, and I think this block is the culprit

defp find_formatter_for_file(file, formatter_opts) do
  # ...
  cond do
    # ...
    ext in ~w(.ex .exs) ->
        &elixir_format(&1, [file: file] ++ formatter_opts)
    true ->
        & &1
  end
  # ...
end

Can I create a formatter plugin for extensionless files?

I thought this could be a solution, but I am not sure what’s the best way to do this since elixir_format/2 is a private method, see on github.

Should I copy the method’s body, and use Code.format_string!/2 ?

Showing Posts 1 to 3

Eiji

Eiji

I would not recommend writing Elixir scripts without extension. I understand that you don’t want to type .exs, but you can create a shell aliases for such cases. You can even write a simple look that would iterate all of your projects, enter the scripts directory, read files and create alias for each of them. In my opinion that the best you can do.

However it’s not the limit of your possibilities. If you are fine with a workaround then you can add a custom plugin for your formatter.exs configuration. Such plugin can register itself to "" (empty string) as one of allowed extensions. Since Path.extname/1 returns empty string only if a string does not have extension your plugin should always work only for the scripts you wanted.

The rest is to call the standard formatter inside your plugin as you already did in your 3rd point in the shell.

For more information please take a look at the following documentation pages:

  1. Plugins | mix format (task) @ mix documentation
  2. System.cmd/3 @ Elixir documentation
  3. Path.extname/1 @ Elixir documentation
derek-zhou

derek-zhou

I’d recommend to keep the .exs for source file, and make a separate installation of the scripts by:

  • copy to a well known dir, such as ~/bin, with extension drpped
  • chmod a+x it

The same can be done for any scripting languages, not just elixir.

brkn

brkn OP

I know that I can copy, or even better create symlinks, but I would rather not.

It’s not impossible, vscode’s official typescript extension can handle this just fine. Try it yourself, it works for both unsaved editor or extensionless file.

#! /usr/bin/env node

console.log(
        "white space is way off"
    )
— All posts loaded —

Where Next? Top

Trending in Questions Top

stjefim
Hello! Suppose you are building workflow (order / task / payment) processing system with the following requirements: Each workflow con...
New
water
I’m aware of 2 such projects, are there others? git: GitHub - team-alembic/realworld: A fullstack Phoenix LiveView application with back...
New
itzmidinesh
Hi all, I’m working on a Phoenix project where I need to make external HTTP requests and I’m trying to choose between Req and HTTPoison....
New
pragdave
How do I tell Hologram not to escape HTML when substituting into templates? {Textile.render(@product.long_description)} escapes the HTM...
New
rlipscombe
I’d like to create a file with 600 permissions (rw-------), but there’s a race condition if I create it and then change the permissions. ...
New
leoschweizer
Hi, we run different LLM models across a cluster, with each node loading a configurable subset. Model-specific queues let nodes consume ...
New
rlipscombe
When I use Mix.install with a git dependency, using git@github.com:... how do I change the SSH identity used? I’ve got two Github accoun...
New

Other Trending Topics Top

dominicletz
Hey there, I haven’t seen a list of useful Elixir specific skills for the popular AI tools yet so I’m starting one here with my first. ...
New
raa-ziq
Hi everyone :waving_hand: I wanted to share something I’ve been building — NowBlind, a random chat app designed to help people discover ...
New
mudasobwa
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
OndrejValenta
(I just needed to vent somewhere and LinkedIn is full of hope, or hype, I’m not sure which exactly) AI dream has many faces, but general...
New
kip
Localize is the next generation localisation library for Elixir. Think of it as ex_cldr version 3.0. The first version will be released ...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews