mirror of
https://github.com/zed-industries/zed.git
synced 2024-12-29 04:20:46 +00:00
Merge pull request #1281 from zed-industries/open-default-key-bindings
Add application menu item to open default key bindings
This commit is contained in:
commit
7ea128951f
3 changed files with 74 additions and 25 deletions
|
@ -891,6 +891,43 @@ impl Workspace {
|
||||||
&self.project
|
&self.project
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Call the given callback with a workspace whose project is local.
|
||||||
|
///
|
||||||
|
/// If the given workspace has a local project, then it will be passed
|
||||||
|
/// to the callback. Otherwise, a new empty window will be created.
|
||||||
|
pub fn with_local_workspace<T, F>(
|
||||||
|
&mut self,
|
||||||
|
cx: &mut ViewContext<Self>,
|
||||||
|
app_state: Arc<AppState>,
|
||||||
|
mut callback: F,
|
||||||
|
) -> T
|
||||||
|
where
|
||||||
|
T: 'static,
|
||||||
|
F: FnMut(&mut Workspace, &mut ViewContext<Workspace>) -> T,
|
||||||
|
{
|
||||||
|
if self.project.read(cx).is_local() {
|
||||||
|
callback(self, cx)
|
||||||
|
} else {
|
||||||
|
let (_, workspace) = cx.add_window((app_state.build_window_options)(), |cx| {
|
||||||
|
let mut workspace = Workspace::new(
|
||||||
|
Project::local(
|
||||||
|
false,
|
||||||
|
app_state.client.clone(),
|
||||||
|
app_state.user_store.clone(),
|
||||||
|
app_state.project_store.clone(),
|
||||||
|
app_state.languages.clone(),
|
||||||
|
app_state.fs.clone(),
|
||||||
|
cx,
|
||||||
|
),
|
||||||
|
cx,
|
||||||
|
);
|
||||||
|
(app_state.initialize_workspace)(&mut workspace, &app_state, cx);
|
||||||
|
workspace
|
||||||
|
});
|
||||||
|
workspace.update(cx, callback)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn worktrees<'a>(
|
pub fn worktrees<'a>(
|
||||||
&self,
|
&self,
|
||||||
cx: &'a AppContext,
|
cx: &'a AppContext,
|
||||||
|
|
|
@ -26,6 +26,10 @@ pub fn menus() -> Vec<Menu<'static>> {
|
||||||
name: "Open Key Bindings",
|
name: "Open Key Bindings",
|
||||||
action: Box::new(super::OpenKeymap),
|
action: Box::new(super::OpenKeymap),
|
||||||
},
|
},
|
||||||
|
MenuItem::Action {
|
||||||
|
name: "Open Default Key Bindings",
|
||||||
|
action: Box::new(super::OpenDefaultKeymap),
|
||||||
|
},
|
||||||
MenuItem::Action {
|
MenuItem::Action {
|
||||||
name: "Select Theme",
|
name: "Select Theme",
|
||||||
action: Box::new(theme_selector::Toggle),
|
action: Box::new(theme_selector::Toggle),
|
||||||
|
|
|
@ -6,12 +6,13 @@ pub mod settings_file;
|
||||||
pub mod test;
|
pub mod test;
|
||||||
|
|
||||||
use anyhow::{anyhow, Context, Result};
|
use anyhow::{anyhow, Context, Result};
|
||||||
|
use assets::Assets;
|
||||||
use breadcrumbs::Breadcrumbs;
|
use breadcrumbs::Breadcrumbs;
|
||||||
pub use client;
|
pub use client;
|
||||||
pub use contacts_panel;
|
pub use contacts_panel;
|
||||||
use contacts_panel::ContactsPanel;
|
use contacts_panel::ContactsPanel;
|
||||||
pub use editor;
|
pub use editor;
|
||||||
use editor::Editor;
|
use editor::{Editor, MultiBuffer};
|
||||||
use gpui::{
|
use gpui::{
|
||||||
actions,
|
actions,
|
||||||
geometry::vector::vec2f,
|
geometry::vector::vec2f,
|
||||||
|
@ -21,7 +22,6 @@ use gpui::{
|
||||||
};
|
};
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
pub use lsp;
|
pub use lsp;
|
||||||
use project::Project;
|
|
||||||
pub use project::{self, fs};
|
pub use project::{self, fs};
|
||||||
use project_panel::ProjectPanel;
|
use project_panel::ProjectPanel;
|
||||||
use search::{BufferSearchBar, ProjectSearchBar};
|
use search::{BufferSearchBar, ProjectSearchBar};
|
||||||
|
@ -30,6 +30,7 @@ use serde_json::to_string_pretty;
|
||||||
use settings::{keymap_file_json_schema, settings_file_json_schema, Settings};
|
use settings::{keymap_file_json_schema, settings_file_json_schema, Settings};
|
||||||
use std::{
|
use std::{
|
||||||
path::{Path, PathBuf},
|
path::{Path, PathBuf},
|
||||||
|
str,
|
||||||
sync::Arc,
|
sync::Arc,
|
||||||
};
|
};
|
||||||
use util::ResultExt;
|
use util::ResultExt;
|
||||||
|
@ -51,6 +52,7 @@ actions!(
|
||||||
DebugElements,
|
DebugElements,
|
||||||
OpenSettings,
|
OpenSettings,
|
||||||
OpenKeymap,
|
OpenKeymap,
|
||||||
|
OpenDefaultKeymap,
|
||||||
IncreaseBufferFontSize,
|
IncreaseBufferFontSize,
|
||||||
DecreaseBufferFontSize,
|
DecreaseBufferFontSize,
|
||||||
ResetBufferFontSize,
|
ResetBufferFontSize,
|
||||||
|
@ -106,6 +108,32 @@ pub fn init(app_state: &Arc<AppState>, cx: &mut gpui::MutableAppContext) {
|
||||||
open_config_file(&KEYMAP_PATH, app_state.clone(), cx);
|
open_config_file(&KEYMAP_PATH, app_state.clone(), cx);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
cx.add_action({
|
||||||
|
let app_state = app_state.clone();
|
||||||
|
move |workspace: &mut Workspace, _: &OpenDefaultKeymap, cx: &mut ViewContext<Workspace>| {
|
||||||
|
workspace.with_local_workspace(cx, app_state.clone(), |workspace, cx| {
|
||||||
|
let project = workspace.project().clone();
|
||||||
|
let buffer = project.update(cx, |project, cx| {
|
||||||
|
let text = Assets::get("keymaps/default.json").unwrap().data;
|
||||||
|
let text = str::from_utf8(text.as_ref()).unwrap();
|
||||||
|
project
|
||||||
|
.create_buffer(text, project.languages().get_language("JSON"), cx)
|
||||||
|
.expect("creating buffers on a local workspace always succeeds")
|
||||||
|
});
|
||||||
|
let buffer = cx.add_model(|cx| {
|
||||||
|
MultiBuffer::singleton(buffer, cx).with_title("Default Key Bindings".into())
|
||||||
|
});
|
||||||
|
workspace.add_item(
|
||||||
|
Box::new(
|
||||||
|
cx.add_view(|cx| {
|
||||||
|
Editor::for_multibuffer(buffer, Some(project.clone()), cx)
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
cx,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
cx.add_action(
|
cx.add_action(
|
||||||
|workspace: &mut Workspace, _: &DebugElements, cx: &mut ViewContext<Workspace>| {
|
|workspace: &mut Workspace, _: &DebugElements, cx: &mut ViewContext<Workspace>| {
|
||||||
let content = to_string_pretty(&cx.debug_elements()).unwrap();
|
let content = to_string_pretty(&cx.debug_elements()).unwrap();
|
||||||
|
@ -348,29 +376,9 @@ fn open_config_file(
|
||||||
|
|
||||||
workspace
|
workspace
|
||||||
.update(&mut cx, |workspace, cx| {
|
.update(&mut cx, |workspace, cx| {
|
||||||
if workspace.project().read(cx).is_local() {
|
workspace.with_local_workspace(cx, app_state, |workspace, cx| {
|
||||||
workspace.open_paths(vec![path.to_path_buf()], false, cx)
|
workspace.open_paths(vec![path.to_path_buf()], false, cx)
|
||||||
} else {
|
})
|
||||||
let (_, workspace) = cx.add_window((app_state.build_window_options)(), |cx| {
|
|
||||||
let mut workspace = Workspace::new(
|
|
||||||
Project::local(
|
|
||||||
false,
|
|
||||||
app_state.client.clone(),
|
|
||||||
app_state.user_store.clone(),
|
|
||||||
app_state.project_store.clone(),
|
|
||||||
app_state.languages.clone(),
|
|
||||||
app_state.fs.clone(),
|
|
||||||
cx,
|
|
||||||
),
|
|
||||||
cx,
|
|
||||||
);
|
|
||||||
(app_state.initialize_workspace)(&mut workspace, &app_state, cx);
|
|
||||||
workspace
|
|
||||||
});
|
|
||||||
workspace.update(cx, |workspace, cx| {
|
|
||||||
workspace.open_paths(vec![path.to_path_buf()], false, cx)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
Ok::<_, anyhow::Error>(())
|
Ok::<_, anyhow::Error>(())
|
||||||
|
@ -386,7 +394,7 @@ mod tests {
|
||||||
use gpui::{
|
use gpui::{
|
||||||
executor::Deterministic, AssetSource, MutableAppContext, TestAppContext, ViewHandle,
|
executor::Deterministic, AssetSource, MutableAppContext, TestAppContext, ViewHandle,
|
||||||
};
|
};
|
||||||
use project::ProjectPath;
|
use project::{Project, ProjectPath};
|
||||||
use serde_json::json;
|
use serde_json::json;
|
||||||
use std::{
|
use std::{
|
||||||
collections::HashSet,
|
collections::HashSet,
|
||||||
|
|
Loading…
Reference in a new issue