Saltar al contenido

PopClip Change Case - el atajo definitivo para camelCase snake_case y compañía

Si escribes código, redactas para un CMS o trabajas con APIs, ya sabes el ritual: tienes una variable userFirstName y necesitas pasarla a user_first_name para una migración SQL, a USER_FIRST_NAME para una constante, a user-first-name para una URL, o a User First Name para un título. Lo haces a mano. O abres una web tipo Convert Case y pegas. O buscas un atajo en tu editor que solo cubre la mitad de los casos.

Por eso he construido JL Change Case: una extensión gratuita y open source para PopClip que convierte el texto seleccionado entre 21 estilos diferentes desde un único botón en el menú flotante.

  1. Selecciona cualquier texto en cualquier app (Notas, VS Code, Mail, Safari, lo que sea).
  2. En el menú PopClip aparece el botón Change Case (icono Aa).
  3. Se abre un cuadro de diálogo nativo de macOS con las 21 opciones:

┌──────────────────────────┐
│ JL Change Case │
│ Select a transformation: │
│ │
│ camelCase │
│ Capital Case │
│ CONSTANT_CASE │
│ dot.case │
│ Header-Case │
│ ... │
└──────────────────────────┘
  1. Eliges una y la selección se reemplaza in-place por la versión transformada. Cancelas y no toca nada.

Tomando como ejemplo el texto helloWorld_foo-Bar:

#EstiloResultado
1camelCasehelloWorldFooBar
2Capital CaseHello World Foo Bar
3CONSTANT_CASEHELLO_WORLD_FOO_BAR
4dot.casehello.world.foo.bar
5Header-CaseHello-World-Foo-Bar
6lower casehello world foo bar
7lower FirsthelloWorld_foo-Bar (solo la primera letra)
8no casehello world foo bar
9kebab-casehello-world-foo-bar
10KEBAB-UPPER-CASEHELLO-WORLD-FOO-BAR
11PascalCaseHelloWorldFooBar
12Pascal_Snake_CaseHello_World_Foo_Bar
13path/casehello/world/foo/bar
14AlTeRnAtInG cAsEHeLlOwOrLd FoO bAr
15rAndOm cAsEHelLOWoRLd foO BAr
16Sentence caseHello world foo bar
17snake_casehello_world_foo_bar
18sWAP cASEHELLO wORLD fOO bAR (invierte la capitalización original)
19Title CaseHello World Foo Bar
20UPPER CASEHELLO WORLD FOO BAR
21Upper firstHelloWorld_foo-Bar (solo la primera letra)
  • Programando: camelCase, PascalCase, snake_case, kebab-case, CONSTANT_CASE, Pascal_Snake_Case cubren las convenciones de prácticamente todos los lenguajes mainstream (JavaScript, Python, Go, Rust, Ruby, etc.).
  • URLs y slugs: kebab-case para slugs amigables, path/case para rutas.
  • Bases de datos y APIs: snake_case (PostgreSQL/Ruby), camelCase (JavaScript/JSON), CONSTANT_CASE (env vars).
  • Documentación y prosa: Sentence case, Title Case, Capital Case, Header-Case.
  • Limpieza rápida: lower case y UPPER CASE para normalizar texto pegado.
  • Para reírse o despistar a un compañero: AlTeRnAtInG cAsE, rAndOm cAsE y sWAP cASE. Ya que están, las dejamos.
  1. Clona el repositorio o descarga el zip:

    Ventana de terminal
    git clone https://github.com/usblsb/popclip-change-case.git
  2. Doble clic sobre la carpeta JlChangeCase.popclipext.

  3. PopClip pregunta si quieres instalarla → confirmar.

No hay dependencias externas: la extensión solo usa herramientas que vienen con macOS (bash, osascript, python3). No instala nada en tu sistema y no requiere conexión a internet.

  • El algoritmo de separación de palabras es una reimplementación del que usa la popular librería change-case de Blake Embrey: dos pasadas de regex insertan separadores en los límites lowercase→Uppercase y dentro de runs de mayúsculas (HTTPSConnection se separa correctamente en HTTPS, Connection).
  • Restaura el foco de la app original tras cerrar el diálogo. Sin este detalle, System Events (la app que abre el diálogo) quedaría como app frontmost y el paste-result de PopClip aterrizaría ahí en vez de en tu editor — provocando un molesto sonido “pop” sin pegar nada.
  • Title Case simplificado: capitaliza cada palabra. La versión “real” con palabras pequeñas en minúscula (a, an, the, of…) requeriría un diccionario; queda fuera del alcance de v1.
  • lower First, Upper first, sWAP cASE, AlTeRnAtInG cAsE y rAndOm cAsE operan carácter a carácter sobre el texto original sin pre-procesar, para preservar las posiciones.

Inspirado en la extensión Change Case de Raycast y en la librería change-case.

La extensión es MIT, sin telemetría, sin red, sin dependencias. Si la usas y echas en falta alguna transformación o pulir alguna, abre un issue en el repo.